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