示例#1
0
 private function _putId($id, $fields)
 {
     if (null == ($sensor = DAO_Sensor::get($id))) {
         return false;
     }
     // Set the updated date to now by default
     if (!isset($fields[DAO_Sensor::UPDATED_DATE])) {
         $fields[DAO_Sensor::UPDATED_DATE] = time();
     }
     // Autmatically manage the fail count
     if (isset($fields[DAO_Sensor::STATUS])) {
         switch ($fields[DAO_Sensor::STATUS]) {
             case 0:
                 // OK
             // OK
             case 1:
                 // WARNING
                 $fields[DAO_Sensor::FAIL_COUNT] = 0;
                 break;
             case 2:
                 // CRITICAL
                 $fields[DAO_Sensor::FAIL_COUNT] = $sensor->fail_count + 1;
                 break;
         }
     }
     if (!empty($fields)) {
         DAO_Sensor::update($sensor->id, $fields);
     }
     return true;
 }
示例#2
0
 function run()
 {
     $logger = DevblocksPlatform::getConsoleLog();
     $logger->info("[Sensors] Starting...");
     // Only pull enabled sensors with an extension_id
     $sensors = DAO_Sensor::getWhere(sprintf("%s=%d", DAO_Sensor::IS_DISABLED, 0));
     $sensor_types = DevblocksPlatform::getExtensions('portsensor.sensor', true);
     if (is_array($sensors)) {
         foreach ($sensors as $sensor) {
             if (!empty($sensor->extension_id) && isset($sensor_types[$sensor->extension_id])) {
                 // Skip external sensors
                 if ('sensor.external' == $sensor->extension_id) {
                     continue;
                 }
                 $runner = $sensor_types[$sensor->extension_id];
                 $output = sprintf("%s (%s)", $sensor->name, $sensor->extension_id);
                 if (method_exists($runner, 'run')) {
                     $fields = array();
                     $success = $runner->run($sensor, $fields);
                     $fields[DAO_Sensor::UPDATED_DATE] = time();
                     $fields[DAO_Sensor::FAIL_COUNT] = $success ? 0 : intval($sensor->fail_count) + 1;
                     DAO_Sensor::update($sensor->id, $fields);
                 }
                 $logger->info("[Sensors] Running {$output}... {$result}");
             }
         }
     }
     // Sensor Runner Event
     $eventMgr = DevblocksPlatform::getEventService();
     $eventMgr->trigger(new Model_DevblocksEvent('cron.sensors.post', array()));
     $logger->info("[Sensors] Finished!");
 }
示例#3
0
 function viewRunNowAction()
 {
     @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string'));
     @($ids = DevblocksPlatform::importGPC($_REQUEST['row_id'], 'array'));
     $sensor_types = DevblocksPlatform::getExtensions('portsensor.sensor', true);
     if (is_array($ids) && !empty($ids)) {
         try {
             $sensors = DAO_Sensor::getWhere(sprintf("%s IN (%s)", DAO_Sensor::ID, implode(',', $ids)));
             if (is_array($sensors)) {
                 foreach ($sensors as $sensor) {
                     if (isset($sensor_types[$sensor->extension_id])) {
                         // Skip external sensors
                         if ('sensor.external' == $sensor->extension_id) {
                             continue;
                         }
                         $runner = $sensor_types[$sensor->extension_id];
                         // [TODO] This duplicates cron
                         if (method_exists($runner, 'run')) {
                             $fields = array();
                             $success = $runner->run($sensor, $fields);
                             $fields[DAO_Sensor::UPDATED_DATE] = time();
                             $fields[DAO_Sensor::FAIL_COUNT] = $success ? 0 : intval($sensor->fail_count) + 1;
                             DAO_Sensor::update($sensor->id, $fields);
                         }
                     }
                 }
             }
         } catch (Exception $e) {
             // ...
         }
     }
     $view = Ps_AbstractViewLoader::getView($view_id);
     $view->render();
     return;
 }
示例#4
0
 private function _handleCronSensorsPost($event)
 {
     $logger = DevblocksPlatform::getConsoleLog();
     $translate = DevblocksPlatform::getTranslationService();
     $sensors = DAO_Sensor::getAll();
     // Check that all external sensors aren't over their M.I.A. time
     if (is_array($sensors)) {
         foreach ($sensors as $sensor) {
             /* @var $sensor Model_Sensor */
             // Only external sensors
             if ('sensor.external' != $sensor->extension_id) {
                 continue;
             }
             // Skip if the sensor hasn't run once yet
             if (0 == $sensor->updated_date) {
                 continue;
             }
             $mia_secs = intval($sensor->params->mia_secs);
             $elapsed = time() - $sensor->updated_date;
             if ($mia_secs && $elapsed > $mia_secs) {
                 $fields = array(DAO_Sensor::STATUS => 2, DAO_Sensor::FAIL_COUNT => intval($sensor->fail_count) + 1, DAO_Sensor::METRIC => $translate->_('sensor.status.mia'), DAO_Sensor::OUTPUT => $translate->_('sensor.status.mia'));
                 DAO_Sensor::update($sensor->id, $fields);
                 $logger->info($sensor->name . " is M.I.A. for {$elapsed} seconds.");
             }
         }
     }
 }
示例#5
0
 function doBulkUpdate($filter, $do, $ids = array())
 {
     @set_time_limit(600);
     // [TODO] Temp!
     $change_fields = array();
     $custom_fields = array();
     if (empty($do)) {
         return;
     }
     if (is_array($do)) {
         foreach ($do as $k => $v) {
             switch ($k) {
                 //				case 'is_disabled':
                 //					$change_fields[DAO_Sensor::IS_DISABLED] = intval($v);
                 //					break;
                 default:
                     // Custom fields
                     if (substr($k, 0, 3) == "cf_") {
                         $custom_fields[substr($k, 3)] = $v;
                     }
                     break;
             }
         }
     }
     $pg = 0;
     if (empty($ids)) {
         do {
             list($objects, $null) = DAO_Sensor::search(array(), $this->params, 100, $pg++, SearchFields_Sensor::ID, true, false);
             $ids = array_merge($ids, array_keys($objects));
         } while (!empty($objects));
     }
     $batch_total = count($ids);
     for ($x = 0; $x <= $batch_total; $x += 100) {
         $batch_ids = array_slice($ids, $x, 100);
         DAO_Sensor::update($batch_ids, $change_fields);
         // Custom Fields
         self::_doBulkSetCustomFields(PsCustomFieldSource_Sensor::ID, $custom_fields, $batch_ids);
         unset($batch_ids);
     }
     unset($ids);
 }
示例#6
0
 private function _postPostAction($stack, Model_Monitor $monitor)
 {
     $xmlstr = $this->getPayload();
     $xml_in = simplexml_load_string($xmlstr);
     $devices = array();
     // Monitor
     if (empty($monitor)) {
         // Unknown monitor
         $this->_error(sprintf("Access denied! (Unknown monitor)"));
         return;
     }
     DAO_Monitor::update($monitor->id, array(DAO_Monitor::LAST_UPDATED => time()));
     // Load up all the sensors this monitor has provided in the past
     $monitor_stale_sensors = DAO_Sensor::getWhere(sprintf("%s = %d", DAO_Sensor::MONITOR_ID, $monitor->id));
     foreach ($xml_in->xpath('/sensors/sensor') as $eSensor) {
         $sensor = new stdClass();
         $sensor->name = (string) $eSensor->name;
         $sensor->device = (string) $eSensor->device;
         $sensor->status = (int) $eSensor->status;
         $sensor->metric = (string) $eSensor->metric;
         $sensor->output = (string) $eSensor->output;
         $sensor->runtime = (string) $eSensor->runtime;
         if (null == ($device = DAO_Device::getByGUID($sensor->device))) {
             continue;
         }
         // invalid device
         // New sensor instance
         if (null == ($lookup = DAO_Sensor::getWhere(sprintf("%s = '%s' AND %s = %d", DAO_Sensor::NAME, addslashes($sensor->name), DAO_Sensor::DEVICE_ID, $device->id)))) {
             $fields = array(DAO_Sensor::NAME => $sensor->name, DAO_Sensor::DEVICE_ID => $device->id, DAO_Sensor::STATUS => $sensor->status, DAO_Sensor::METRIC => $sensor->metric, DAO_Sensor::OUTPUT => $sensor->output, DAO_Sensor::LAST_UPDATED => $sensor->runtime, DAO_Sensor::MONITOR_ID => $monitor->id);
             $sensor_id = DAO_Sensor::create($fields);
             DAO_SensorEvent::log($sensor_id, $device->id, $sensor->status, $sensor->metric);
         } else {
             // Updating an existing sensor
             $parent_sensor = array_shift($lookup);
             // This updated sensor is not stale
             unset($monitor_stale_sensors[$parent_sensor->id]);
             $fields = array(DAO_Sensor::STATUS => $sensor->status, DAO_Sensor::METRIC => $sensor->metric, DAO_Sensor::OUTPUT => $sensor->output, DAO_Sensor::LAST_UPDATED => $sensor->runtime, DAO_Sensor::MONITOR_ID => $monitor->id);
             DAO_Sensor::update($parent_sensor->id, $fields);
             if ($parent_sensor->status != $sensor->status) {
                 DAO_SensorEvent::log($parent_sensor->id, $device->id, $sensor->status, $sensor->metric);
             }
         }
         if ($sensor->status !== 0) {
             // push notification
             $this->_pushNotification($sensor);
         }
     }
     // Purge any sensors no longer provided by this monitor
     // [TODO] We need to consider if any monitors won't always send a full update
     if (!empty($monitor_stale_sensors)) {
         DAO_Sensor::delete(array_keys($monitor_stale_sensors));
     }
     $xml_out = new SimpleXMLElement("<success></success>");
     $this->_render($xml_out->asXML());
 }
示例#7
0
 function saveConfig(Model_Sensor $sensor)
 {
     @($host = DevblocksPlatform::importGPC($_POST['host'], 'string', ''));
     @($port = DevblocksPlatform::importGPC($_POST['port'], 'integer', 0));
     $fields = array(DAO_Sensor::PARAMS_JSON => json_encode(array('host' => $host, 'port' => $port)));
     DAO_Sensor::update($sensor->id, $fields);
 }