_processObservation(); } /** * Adds additional editor fields to the Contentserv interface * * @param CSGuiEditor $editor * @param CSMonitorObserver $observer */ public function prepareEditor(CSGuiEditor $editor, CSMonitorObserver $observer) { $editor->addField("ActiveScripts_INFO", 'Info', 'html', CS::translate('CSALIVE_ACTIVE_SCRIPTS_INFO', 'csalive'), FALSE, array( 'PaneTitle' => CS::translate('REST_GUI_EDIT_SETTINGS') )); $editor->addField("ActiveScriptsSetName", CS::translate('CSALIVE_ACTIVE_SCRIPTS_SETNAME', 'csalive'), $this->getSetNames(), 'Job1', FALSE, array( 'PaneTitle' => CS::translate('REST_GUI_EDIT_SETTINGS') )); $editor->addField("ActiveScripts", CS::translate('CSALIVE_ACTIVE_SCRIPTS', 'csalive'), CSActiveScript::getActiveScriptNames(), 0, FALSE, array( 'PaneTitle' => CS::translate('REST_GUI_EDIT_SETTINGS'), 'multiple' => true )); $editor->addField("ActiveScriptsWaitingProcesses", CS::translate('CSALIVE_ACTIVE_SCRIPTS_CHECK_WAITING_PROCESS', 'csalive'), 'number', 0, FALSE, array( 'PaneTitle' => CS::translate('REST_GUI_EDIT_SETTINGS') )); $editor->addField("ActiveScriptsLastSucessRun", CS::translate('CSALIVE_ACTIVE_SCRIPTS_CHECK_LAST_SUCCESS_RUN', 'csalive'), 'number', 1440, FALSE, array( 'PaneTitle' => CS::translate('REST_GUI_EDIT_SETTINGS') )); $editor->addField("ActiveScriptsHasErrors", CS::translate('CSALIVE_ACTIVE_SCRIPTS_CHECK_HAS_ERRORS', 'csalive'), 'checkbox', 1, FALSE, array( 'PaneTitle' => CS::translate('REST_GUI_EDIT_SETTINGS') )); $this->_observer = $observer; } ///// PROTECTED METHODS ////////////////////////////////////////////////////// /** * Creates an array of 10 share names to choose from. * So that they don't overwrite each other accidentally * * @return array List of all selectable shares */ private function getSetNames() { $arrSelectableShares = array(); for ($intI = 1; $intI <= 10; $intI++) { $arrSelectableShares['Job' . $intI] = 'Jobset ' . $intI; } return $arrSelectableShares; } protected function _processObservation() { $arrExecs = $this->getInspectProcesses(); foreach ((array) $arrExecs as $strFunctionName => $strName) { if (!method_exists($this, $strFunctionName)) { continue; } $strService = 'Core.' . $this->_observer->getValue('ActiveScriptsSetName'). '.' . substr($strFunctionName, 4); $mixedReturnValue = $this->$strFunctionName(); if ($mixedReturnValue !== NULL) { $this->saveReturnValue($mixedReturnValue['value'], $strService . 'Value', $mixedReturnValue['unit'], $mixedReturnValue['warn'], $mixedReturnValue['crit']); } } } ///// PRIVATE METHODS ////////////////////////////////////////////////////// /** * Is called when a function has a return value. * Saves the return value in the database with the Unit "Count" * * @param mixed $mixedReturnValue * @param String $strService */ private function saveReturnValue($mixedReturnValue, $strService, $strUnit = 's', $intWarn = 1, $intCrit = 2) { $observation = CSMonitor::createObservation($this->_observer->getID(), $strService); $observation->setMeasuredValue($mixedReturnValue); $observation->setTimestamp(CS::getDate()); $observation->setUnit($strUnit); $state = CSMonitor::MONITOR_GUI_NOTIFICATION_NONE_ID; $observation->setState($state); $observation->setWarningValue($intWarn); $observation->setCriticalValue($intCrit); $observation->store(); } /** * Returns an array of Strings of all processes the plugin can monitor * * @return array all processes possible to be inspect */ private function getInspectProcesses() { $arrClassMethods = get_class_methods($this); $strSearchWord = 'exec'; $arrMatches = array_filter((array) $arrClassMethods, function($var) use ($strSearchWord) { return preg_match("/$strSearchWord/i", $var); }); foreach ((array) $arrMatches as $value) { $arrTranslatedMatches[$value] = CS::translate($value, 'csalive'); } return (array) $arrTranslatedMatches; } /** * Checks if count of database entries in the Log table * * * @return int value of the count */ private function execActiveScripts() { $strScripts = $this->_observer->getValue('ActiveScripts'); if (!$strScripts) return array(); $arrScripts = explode(",", $strScripts); $arrStatsAll = array(); foreach($arrScripts as $iJob){ $table = CS::getTable('ActiveScriptJob', 'ActiveScriptID = '.(int)$iJob, 'ActiveScriptJobID LIMIT 1000'); $objLogJobs = array(); foreach ($table->records as $record) { $objLogJobs[$record->getID()] = CSActiveScript::getActiveScriptJob($record); } $arrStats = ['Waiting' => 0, 'LastRun' => '', 'LastSuccessRun' => '', 'ErrorsSinceLastRun' => 0]; foreach($objLogJobs as $objLogJobs){ //$objLog = CSActiveScript::getActiveScriptLog($oRecord); // echo "\nStatus:".$objLogJobs->getStatus(true); if ($objLogJobs->getStatus(true) == CSActiveScript::ACTIVE_SCRIPT_STATUS_NOT_YET_STARTED){ $arrStats['Waiting']++; } if (!$arrStats['LastRun'] && $objLogJobs->getStatus(true) != CSActiveScript::ACTIVE_SCRIPT_STATUS_NOT_YET_STARTED){ $arrStats['LastRun']= $objLogJobs->getEnd(); } if (!$arrStats['LastSuccessRun'] && $objLogJobs->getStatus(true) != CSActiveScript::ACTIVE_SCRIPT_STATUS_NOT_YET_STARTED && $objLogJobs->getStatus(true) == CSActiveScript::ACTIVE_SCRIPT_STATUS_OK){ $arrStats['LastSuccessRun']= $objLogJobs->getEnd(); } if (!$arrStats['LastSuccessRun'] && $objLogJobs->getStatus(true) != CSActiveScript::ACTIVE_SCRIPT_STATUS_NOT_YET_STARTED && $objLogJobs->getStatus(true) != CSActiveScript::ACTIVE_SCRIPT_STATUS_OK){ $arrStats['ErrorsSinceLastRun']++; } } $arrStatsAll[$iJob] = $arrStats; } $arrRetVal = $this->analyseSummary($arrStatsAll); return array('value' => $arrRetVal['State'], 'unit' => 'Pos', 'warn' => 0, 'crit' => 2); } private function analyseSummary($arrStats){ $bCheckErrors = $this->_observer->getValue('ActiveScriptsHasErrors'); $iLastSuccess = $this->_observer->getValue('ActiveScriptsLastSucessRun'); $iWaitingProcesses = $this->_observer->getValue('ActiveScriptsWaitingProcesses'); $strSetName = $this->_observer->getValue('ActiveScriptsSetName'); if (!$strSetName) $strSetName = 'Job1'; $arrStatsRet = array('State' => 2); foreach((array)$arrStats as $arrStat){ $iState = 2; if ($bCheckErrors && $arrStat['ErrorsSinceLastRun']){ $iState = 1; } if ($arrStat['LastSuccessRun'] && strtotime($arrStat['LastSuccessRun']) < (mktime()-$iLastSuccess)){ $iState = 1; } if ($arrStat['Waiting'] && $arrStat['Waiting'] > $iWaitingProcesses){ $iState = 1; } if ($iState < $arrStatsRet['State']){ $arrStatsRet['State'] = $iState; } } $arrStatsRet['Detail'] = $arrStats; return $arrStatsRet; } }