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