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; }
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!"); }
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; }
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."); } } } }
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); }
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()); }
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); }