Exemple #1
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());
 }