public static function create($report_) { Logger::debug('main', 'Abstract_ReportSession::create'); if (Abstract_ReportSession::exists($report_->getID())) { Logger::error('main', 'Abstract_ReportSession::create(\'' . $report_->getID() . '\') report already exists'); return false; } $sql = SQL::getInstance(); $res = $sql->DoQuery('INSERT INTO @1 (@2,@3,@4,@5) VALUES (%6,%7,%8,%9)', SESSIONS_HISTORY_TABLE, 'id', 'user', 'server', 'data', $report_->getID(), $report_->user, $report_->server, ''); return $res; }
public function run() { switch ($this->ev->status) { /* session created */ case Session::SESSION_STATUS_CREATED: $token = $this->ev->id; if (!Abstract_ReportSession::exists($token)) { if (!Abstract_Session::exists($token)) { Logger::error('main', "SessionStatusChangedReport::run failed session '{$token}' does not exist"); return false; } $session = Abstract_Session::load($token); $sessitem = new SessionReportItem($session->id, $session->user_login, $session->server, $session->start_time); $ret = Abstract_ReportSession::create($sessitem); if (!$ret) { Logger::error('main', "SessionStatusChangedReport::run failed to save SessionReportItem({$token})"); return false; } } return true; break; /* session ended */ /* session ended */ case Session::SESSION_STATUS_WAIT_DESTROY: case Session::SESSION_STATUS_DESTROYED: $token = $this->ev->id; if (!Abstract_Session::exists($token)) { Logger::error('main', "SessionStatusChangedReport::run failed session '{$token}' does not exist"); return false; } $session = Abstract_Session::load($token); $sessitem = Abstract_ReportSession::load($token); if (!is_object($sessitem)) { Logger::error('main', "SessionStatusChangedReport::run failed to load SessionReportItem({$token})"); return false; } $sessitem->end($session); Abstract_ReportSession::update_on_session_end($sessitem); return true; break; default: return true; break; } }
public function setServerStatus($server_, $status_, $reason_ = NULL, $server_role_ = NULL) { $states = array(Session::SESSION_STATUS_CREATING => -1, Session::SESSION_STATUS_CREATED => 0, Session::SESSION_STATUS_INIT => 1, Session::SESSION_STATUS_READY => 2, Session::SESSION_STATUS_ACTIVE => 3, Session::SESSION_STATUS_INACTIVE => 3, Session::SESSION_STATUS_WAIT_DESTROY => 4, Session::SESSION_STATUS_DESTROYING => 5, Session::SESSION_STATUS_DESTROYED => 6, Session::SESSION_STATUS_ERROR => 6, Session::SESSION_STATUS_UNKNOWN => 6); if ($server_role_ == NULL) { $server_role_ = Server::SERVER_ROLE_APS; } if (!array_key_exists($server_, $this->servers[$server_role_])) { return false; } // no such Server $current_status = $this->servers[$server_role_][$server_]['status']; if ($status_ == $current_status) { Abstract_Session::save($this); return false; // status is already the same... } if (array_key_exists($status_, $states) && array_key_exists($current_status, $states)) { if ($states[$status_] < $states[$current_status]) { return false; } // avoid switching Session to a previous status... } Logger::debug('main', 'Starting Session::setServerStatus for \'' . $this->id . '\''); Logger::debug('main', 'Status set to "' . $status_ . '" (' . $this->textStatus($status_) . ') for server \'' . $server_ . '\' on session \'' . $this->id . '\' for role ' . $server_role_); $this->servers[$server_role_][$server_]['status'] = $status_; Abstract_Session::save($this); switch ($status_) { case Session::SESSION_STATUS_INIT: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); $this->setStatus(Session::SESSION_STATUS_INIT); break; case Session::SESSION_STATUS_READY: $all_ready = true; $all_servers = array(); if (array_key_exists(Server::SERVER_ROLE_APS, $this->servers)) { foreach ($this->servers[Server::SERVER_ROLE_APS] as $server_id => $data) { $all_servers[$server_id . Server::SERVER_ROLE_APS] = $data['status']; } } if (array_key_exists(Server::SERVER_ROLE_WEBAPPS, $this->servers)) { foreach ($this->servers[Server::SERVER_ROLE_WEBAPPS] as $server_id => $data) { $all_servers[$server_id . Server::SERVER_ROLE_WEBAPPS] = $data['status']; } } foreach ($all_servers as $server_id => $server_status) { if ($server_id != $server_ . $server_role_ && $server_status != Session::SESSION_STATUS_READY) { $all_ready = false; break; } } if ($all_ready) { Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - All servers are "' . $status_ . '", switching Session status to "' . $status_ . '"'); $this->setStatus(Session::SESSION_STATUS_READY); } break; case Session::SESSION_STATUS_ACTIVE: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); $this->setStatus(Session::SESSION_STATUS_ACTIVE); break; case Session::SESSION_STATUS_INACTIVE: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); if ($this->mode == self::MODE_DESKTOP && $this->server != $server_) { // External apps session status is not the global session status. break; } $this->setStatus(Session::SESSION_STATUS_INACTIVE); break; case Session::SESSION_STATUS_WAIT_DESTROY: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); $this->setStatus(Session::SESSION_STATUS_WAIT_DESTROY, Session::SESSION_END_STATUS_LOGOUT); break; case Session::SESSION_STATUS_DESTROYING: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); if (Abstract_ReportSession::exists($this->id)) { $session_report = Abstract_ReportSession::load($this->id); if (is_object($session_report) && !is_null($session_report->getStopWhy())) { $reason_ = $session_report->getStopWhy(); } } $this->setStatus(Session::SESSION_STATUS_DESTROYING, $reason_); break; case Session::SESSION_STATUS_DESTROYED: $all_destroyed = true; $all_servers = array(); if (array_key_exists(Server::SERVER_ROLE_APS, $this->servers)) { foreach ($this->servers[Server::SERVER_ROLE_APS] as $server_id => $data) { $all_servers[$server_id . Server::SERVER_ROLE_APS] = $data['status']; } } if (array_key_exists(Server::SERVER_ROLE_WEBAPPS, $this->servers)) { foreach ($this->servers[Server::SERVER_ROLE_WEBAPPS] as $server_id => $data) { $all_servers[$server_id . Server::SERVER_ROLE_WEBAPPS] = $data['status']; } } foreach ($all_servers as $server_id => $server_status) { if ($server_id != $server_ . $server_role_ && $server_status != Session::SESSION_STATUS_DESTROYED) { $all_destroyed = false; break; } } if ($all_destroyed) { Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - All servers are "' . $status_ . '", switching Session status to "' . $status_ . '"'); if (Abstract_ReportSession::exists($this->id)) { $session_report = Abstract_ReportSession::load($this->id); if (is_object($session_report) && !is_null($session_report->getStopWhy())) { $reason_ = $session_report->getStopWhy(); } } $this->setStatus(Session::SESSION_STATUS_DESTROYED, $reason_); } break; case Session::SESSION_STATUS_ERROR: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); $this->setStatus(Session::SESSION_STATUS_WAIT_DESTROY, Session::SESSION_END_STATUS_ERROR); break; case Session::SESSION_STATUS_UNKNOWN: Logger::debug('main', 'Session::setServerStatus(' . $server_ . ', ' . $status_ . ') - Server "' . $server_ . '" is now "' . $status_ . '", switching Session status to "' . $status_ . '"'); $this->setStatus(Session::SESSION_STATUS_WAIT_DESTROY, Session::SESSION_END_STATUS_ERROR); break; } return true; }
public function session_report_remove($id_) { $this->check_authorized('manageReporting'); if (!Abstract_ReportSession::exists($id_)) { Logger::error('api', sprintf('Unknown archived session "%s"', $id_)); return false; } $ret = Abstract_ReportSession::delete($id_); if ($ret !== true) { Logger::error('api', sprintf('Unable to delete archived session "%s"', $id_)); return false; } $this->log_action('session_report_remove', array('id' => $id_)); return true; }
function parse_monitoring_XML($xml_) { if (!$xml_ || strlen($xml_) == 0) { return false; } $dom = new DomDocument('1.0', 'utf-8'); $buf = @$dom->loadXML($xml_); if (!$buf) { return false; } if (!$dom->hasChildNodes()) { return false; } $server_node = $dom->getElementsByTagName('server')->item(0); if (is_null($server_node)) { return false; } if (!$server_node->hasAttribute('name')) { return false; } if (!Abstract_Server::exists($server_node->getAttribute('name'))) { die; } // An unknown Server should not send monitoring, so we reject it... $server = Abstract_Server::load($server_node->getAttribute('name')); if (!$server) { return false; } if (!$server->isAuthorized()) { return false; } $ret = array('server' => $server_node->getAttribute('name')); $cpu_node = $dom->getElementsByTagName('cpu')->item(0); if (is_null($cpu_node)) { return false; } if (!$cpu_node->hasAttribute('load')) { return false; } $ret['cpu_load'] = $cpu_node->getAttribute('load'); $ram_node = $dom->getElementsByTagName('ram')->item(0); if (is_null($ram_node)) { return false; } if (!$ram_node->hasAttribute('used')) { return false; } $ret['ram_used'] = $ram_node->getAttribute('used'); $role_nodes = $dom->getElementsByTagName('role'); foreach ($role_nodes as $role_node) { if (!$role_node->hasAttribute('name')) { return false; } switch ($role_node->getAttribute('name')) { case 'ApplicationServer': $ret['sessions'] = array(); $session_nodes = $dom->getElementsByTagName('session'); foreach ($session_nodes as $session_node) { $ret['sessions'][$session_node->getAttribute('id')] = array('id' => $session_node->getAttribute('id'), 'server' => $_SERVER['REMOTE_ADDR'], 'status' => $session_node->getAttribute('status'), 'instances' => array()); $childnodes = $session_node->childNodes; foreach ($childnodes as $childnode) { if ($childnode->nodeName != 'instance') { continue; } $ret['sessions'][$session_node->getAttribute('id')]['instances'][$childnode->getAttribute('id')] = $childnode->getAttribute('application'); } $token = $session_node->getAttribute('id'); if (Abstract_ReportSession::exists($session_node->getAttribute('id'))) { $report = Abstract_ReportSession::load($session_node->getAttribute('id')); if (is_object($report)) { $report->update($session_node); } } } $sri = new ServerReportItem($ret['server'], $xml_); $sri->save(); break; case 'FileServer': $size_node = $dom->getElementsByTagName('size')->item(0); if (is_null($size_node)) { break; } $ret['disk_size'] = array('total' => NULL, 'free' => NULL); if ($size_node->hasAttribute('total')) { $ret['disk_size']['total'] = $size_node->getAttribute('total'); } if ($size_node->hasAttribute('free')) { $ret['disk_size']['free'] = $size_node->getAttribute('free'); } $ret['shares'] = array(); $share_nodes = $dom->getElementsByTagName('share'); foreach ($share_nodes as $share_node) { $ret['shares'][$share_node->getAttribute('id')] = array('id' => $share_node->getAttribute('id'), 'status' => $share_node->getAttribute('status'), 'users' => array()); $user_nodes = $share_node->getElementsByTagName('user'); foreach ($user_nodes as $user_node) { $ret['shares'][$share_node->getAttribute('id')]['users'][] = $user_node->getAttribute('login'); } } break; } } return $ret; }