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;
 }
示例#2
0
 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;
     }
 }
示例#3
0
 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;
 }
示例#4
0
 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;
 }
示例#5
0
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;
}