You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

254 lines
8.9 KiB

<?php
class api extends CI_Controller {
public function index()
{
redirect('welcome');
}
public function cron($key = NULL, $option = NULL)
{
// Control of key
if (! is_null($key))
{
$this->load->model('api_model');
$result = $this->api_model->check_key($key);
if (! $result)
{
echo "Not authorized!";
} else {
$this->update_servers($option);
}
} else {
echo "No key!";
}
}
private function update_servers($option = NULL)
{
// Load settings model
$this->load->model('config_model');
$data['setting'] = $this->config_model->get_settings();
// Load server model
$this->load->model('servers_model');
$data['servers'] = $this->servers_model->get_servers_cron();
if ($option == 'refresh') {
echo "<meta http-equiv='refresh' content='60'>";
}
if ($option == 'debug') {echo "<pre>\n";}
foreach ($data['servers'] as $server)
{
if ($option == 'debug') {echo $server['hostname'].": start checking server\n";}
if ($server['defaultproxy'] == '1') {
// Override the proxy settings
if ($option == 'debug') {echo $server['hostname'].": Using default proxy\n";}
$server['proxyhost'] = $data['setting']['proxyhost'];
$server['proxyport'] = $data['setting']['proxyport'];
$server['proxytype'] = $data['setting']['proxytype'];
$server['proxyuser'] = $data['setting']['proxyuser'];
$server['proxypassword'] = $data['setting']['proxypassword'];
}
// Check all the monit servers.
if ($server['type'] == '1') {
if ($option == 'debug') {echo $server['hostname'].": Servertype is monit \n";}
$result = $this->check_server_monit($server['hostname'], $server['port'], $server['username'], $server['password'],$server['proxyhost'] , $server['proxyport'], $server['proxytype'], $server['proxyhost']);
if (! $result) {
if ($option == 'debug') {echo $server['hostname'].": Connection error\n";}
// Update server status
$this->servers_model->update_server_status($server['id'], 'na');
// Update logbook
$this->save_logitem($server['id'], '', 'na', 'Connection error');
} else {
if ($option == 'debug') {echo $server['hostname'].": Connection ok \n";}
$this->parse_server_monit($server, $result, $option);
}
} else {
if ($option == 'debug') {echo $server['hostname'].": Servertype is unknown\n";}
// Update logbook
$this->save_logitem($server['id'], '', 'na', 'Servertype is unknown');
// Update server status
$this->servers_model->update_server_status($server['id'], 'na');
}
}
}
private function check_server_monit($server, $port, $username = NULL, $password = NULL, $proxyhost = NULL, $proxyport = NULL, $proxytype = NULL, $proxyuser = NULL, $proxypassword = NULL)
{
$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL,'http://' . $server . ':' . $port . '/_status?format=xml');
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,2);
curl_setopt($curl_handle,CURLOPT_TIMEOUT,10);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
if ($username && $password) {
curl_setopt($curl_handle,CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl_handle,CURLOPT_USERPWD, $username . ':' . $password);
}
if ($proxyhost && $proxyport && $proxytype) {
$proxy = $proxyhost.':'.$proxyport;
curl_setopt($curl_handle,CURLOPT_PROXY, $proxy);
if ($proxytype == 'socks5') {
curl_setopt($curl_handle,CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
}
if ($proxyuser && $proxypassword) {
$proxyauth = $proxyuser.':'.$proxypassword;
curl_setopt($curl_handle,CURLOPT_PROXYUSERPWD, $proxyauth);
}
}
$buffer = curl_exec($curl_handle);
if (curl_errno($curl_handle)) {
return FALSE;
} else {
$info = curl_getinfo($curl_handle);
if ($info['http_code'] != '200') {
return FALSE;
} else {
$return = $buffer;
}
}
curl_close($curl_handle);
return $return;
}
private function parse_server_monit($server, $data, $option = NULL)
{
if ($option == 'debug') {echo $server['hostname'].": Parsing data\n";}
$this->load->helper('xml2array');
$serverdata = xml2array($data);
if ($option == 'showxml') {
echo "<pre>";
print_r($serverdata);
echo "</pre>";
}
// In some cases the swapspace is zero, but don't exists in the array.
if (!isset($serverdata['monit']['platform']['swap'])) {$serverdata['monit']['platform']['swap'] = '0';}
// Update the serverinfo.
$this->load->model('serverinfo_model');
$this->serverinfo_model->update($server['id'],
$serverdata['monit']['platform']['name'],
$serverdata['monit']['platform']['release'],
$serverdata['monit']['platform']['machine'],
$serverdata['monit']['platform']['cpu'],
$serverdata['monit']['platform']['memory'],
$serverdata['monit']['platform']['swap']);
// A server is healty at this moment.
$serverstatus = 'ok';
foreach ($serverdata['monit']['service'] as $service) {
// Insert new service if not exists.
$this->load->model('services_model');
if (!$this->services_model->check_service($server['id'], $service['name'])) {
$this->services_model->new_service($server['id'], $service['name']);
if ($option == 'debug') {echo $server['hostname'].": Service ".$service['name']." inserted\n";}
}
// Get service id number
$this->load->model('services_model');
$serviceinfo = $this->services_model->get_serviceid($server['id'], $service['name']);
// check if service is disabled.
if ($service['monitor'] == '0') {
if ($option == 'debug') {echo $server['hostname'].": Service ".$service['name']." disabled.\n";}
$servicestatusmsg = 'Service is set to not monitored';
$servicestatus = 'na';
} else {
// Check if service contains the statistical data.
if ($service['name'] == $serverdata['monit']['server']['localhostname']) {
if ($service['system']['cpu']['wait']) {
$this->save_stats($server['id'],
$service['system']['load']['avg01'],
$service['system']['load']['avg05'],
$service['system']['load']['avg15'],
$service['system']['cpu']['user'],
$service['system']['cpu']['system'],
$service['system']['cpu']['wait'],
$service['system']['memory']['kilobyte'],
$service['system']['swap']['kilobyte']);
} else {
$this->save_stats($server['id'],
$service['system']['load']['avg01'],
$service['system']['load']['avg05'],
$service['system']['load']['avg15'],
$service['system']['cpu']['user'],
$service['system']['cpu']['system'],
'0',
$service['system']['memory']['kilobyte'],
$service['system']['swap']['kilobyte']);
}
}
// If status = 0, then everything is ok.
if ($service['status'] == '0') {
if ($option == 'debug') {echo $server['hostname'].": Service ".$service['name']." OK\n";}
$servicestatus = 'ok';
$servicestatusmsg = 'Servicestatus changed to ok';
// Warning for special items.
} elseif ($service['status'] == '2' || $service['status'] == '32768') {
if ($option == 'debug') {echo $server['hostname'].": Service ".$service['name']." Warning\n";}
if ($serverstatus != 'error') {$serverstatus = 'warning';}
$servicestatus = 'warning';
$servicestatusmsg = $service['status_message'];
// The rest is an error.
} else {
if ($option == 'debug') {echo $server['hostname'].": Service ".$service['name']." Error\n";}
$serverstatus = 'error';
$servicestatus = 'error';
$servicestatusmsg = $service['status_message'];
}
}
// Update the servicestatus information
$this->save_logitem($server['id'], $serviceinfo['id'], $servicestatus, $servicestatusmsg);
$this->services_model->update_service_status($serviceinfo['id'], $servicestatus);
}
// Update the server information
$this->load->model('servers_model');
$this->save_logitem($server['id'], '0', $serverstatus, 'Serverstatus changed to '.$serverstatus);
$this->servers_model->update_server_status($server['id'], $serverstatus);
}
private function save_logitem($serverid, $serviceid, $status, $message)
{
$this->load->model('logbook_model');
$lastitem = $this->logbook_model->get_lastitem($serverid, $serviceid);
if ((!$lastitem) || ($lastitem['status'] != $status)) {
$this->logbook_model->save_logitem($serverid, $serviceid, $status, $message);
}
}
private function save_stats($serverid, $avg01, $avg05, $avg15, $user, $system, $wait, $memory, $swap)
{
$this->load->model('stats_model');
$this->stats_model->update_memory($serverid, $memory, $swap);
$this->stats_model->update_load($serverid, $avg01, $avg05, $avg15);
$this->stats_model->update_cpu($serverid, $user, $system, $wait);
}
}