void RenderAf::wolWake( MonitorContainer * i_monitoring, const std::string & i_msg) { if( i_msg.size()) appendLog( i_msg); if( isOnline()) { appendLog("Can't wake up online render."); return; } if( isWOLFalling()) { appendLog("Can't wake up render which is just falling a sleep."); return; } if( m_netIFs.size() < 1) { appendLog("Can't perform Wake-On-Line operations. No network interfaces information."); return; } appendLog("Sending WOL wake request."); setWOLWaking( true); m_wol_operation_time = time( NULL); store(); if( i_monitoring ) i_monitoring->addEvent( af::Monitor::EVT_renders_change, m_id); std::ostringstream str; v_jsonWrite( str, af::Msg::TRendersList); SysJob::AddWOLCommand( str.str(), "", m_name, m_name); }
void JobAf::emitEvents(std::vector<std::string> events) { // Processing command for system job if some events happened: if( events.empty()) return; std::ostringstream str; str << "{"; str << "\n\"user\":"; m_user->v_jsonWrite( str, af::Msg::TUsersList); str << ",\n\"job\":"; v_jsonWrite( str, af::Msg::TJobsList); str << ",\n\"events\":["; for( int i = 0; i < events.size(); i++ ) { if( i ) str << ','; str << '"' << events[i] << '"'; } str << "]\n}"; SysJob::AddEventCommand( str.str(), "", // working directory - no matter m_user_name, m_name, events[0]); }
void RenderAf::wolSleep( MonitorContainer * monitoring) { if( isWOLSleeping()) { appendLog("Render is already sleeping."); return; } if( isWOLWaking()) { appendLog("Can't sleep waking up render."); return; } if( isOffline()) { appendLog("Can't sleep offline render."); return; } if( isBusy()) { appendLog("Can't perform Wake-On-Line operations. Render is busy."); return; } if( m_netIFs.size() < 1) { appendLog("Can't perform Wake-On-Line operations. No network interfaces information."); return; } setWOLFalling( true); appendLog("Sending WOL sleep request."); m_wol_operation_time = time( NULL); store(); if( monitoring ) monitoring->addEvent( af::Monitor::EVT_renders_change, m_id); std::ostringstream str; v_jsonWrite( str, af::Msg::TRendersList); m_re.m_instruction = "sleep"; m_re.m_command = str.str(); }
bool JobAf::initialize() { AF_DEBUG << "'" << m_name << "'[" << m_id << "]:"; // // Set job ID to blocks and progress classes: m_progress->setJobId( m_id); for( int b = 0; b < m_blocks_num; b++) { m_blocks_data[b]->setJobId( m_id); } // // Store job ( if not stored ) if( isFromStore() == false ) { setStoreDir( AFCommon::getStoreDirJob( *this)); initStoreDirs(); // Write blocks tasks data: for( int b = 0; b < m_blocks_num; b++) m_blocks[b]->storeTasks(); std::ostringstream ostr; v_jsonWrite( ostr, 0); std::string str = ostr.str(); AFCommon::writeFile( str.c_str(), str.size(), getStoreFile()); } // Create tasks store folder (if does not exists any) if(( af::pathIsFolder( m_store_dir_tasks) == false ) && ( af::pathMakePath( m_store_dir_tasks) == false )) { AFCommon::QueueLogError( std::string("Unable to create tasks store folder:\n") + m_store_dir_tasks); return false; } // // Executing pre commands ( if not from database ) if( isFromStore() == false ) { if( false == m_command_pre.empty()) { AFCommon::executeCmd( m_command_pre); appendLog( std::string("Job pre command executed:\n") + m_command_pre); } for( int b = 0; b < m_blocks_num; b++) { if( m_blocks_data[b]->hasCmdPre() ) { AFCommon::executeCmd( m_blocks_data[b]->getCmdPre()); appendLog( std::string("Block[") + m_blocks_data[b]->getName() + "] pre command executed:\n" + m_blocks_data[b]->getCmdPre()); } } appendLog("Initialized."); } else { appendLog("Initialized from database."); } // // Checking states for( int b = 0; b < m_blocks_num; b++) { int numtasks = m_blocks_data[b]->getTasksNum(); for( int t = 0; t < numtasks; t++) { uint32_t taskstate = m_progress->tp[b][t]->state; if( taskstate == 0 ) { taskstate = AFJOB::STATE_READY_MASK; } else if( taskstate & AFJOB::STATE_RUNNING_MASK && ( false == m_blocks_data[b]->isMultiHost())) { taskstate = taskstate | AFJOB::STATE_WAITRECONNECT_MASK; taskstate = taskstate & (~AFJOB::STATE_RUNNING_MASK ); m_progress->tp[b][t]->time_done = time(NULL); m_blocks[b]->m_tasks[t]->v_appendLog( "Task was running at server start. Waiting for render reconnect..."); } m_progress->tp[b][t]->state = taskstate; } } if(( m_state & AFJOB::STATE_DONE_MASK) == false ) m_state = m_state | AFJOB::STATE_WAITDEP_MASK; v_refresh( time(NULL), NULL, NULL); return true; }