libretime/utils/airtime-check-system.php

271 lines
9.8 KiB
PHP

<?php
AirtimeCheck::ExitIfNotRoot();
date_default_timezone_set("UTC");
$sapi_type = php_sapi_name();
$showColor = !in_array("--no-color", $argv);
//detect if we are running via the command line
if (substr($sapi_type, 0, 3) == 'cli') {
//we are running from the command-line
$airtimeIni = AirtimeCheck::GetAirtimeConf();
$apiKey = $airtimeIni['general']['api_key'];
$baseUrl = $airtimeIni['general']['base_url'];
$base_port = $airtimeIni['general']['base_port'];
$base_dir = $airtimeIni['general']['base_dir'];
$status = AirtimeCheck::GetStatus($baseUrl, $base_port, $base_dir, $apiKey);
AirtimeCheck::PrintStatus($baseUrl, $base_port, $status);
//AirtimeCheck::PrintStatus($baseUrl, $status);
}
class AirtimeCheck {
private static $AIRTIME_STATUS_OK = true;
CONST UNKNOWN = "UNKNOWN";
/**
* Ensures that the user is running this PHP script with root
* permissions. If not running with root permissions, causes the
* script to exit.
*/
public static function ExitIfNotRoot()
{
// Need to check that we are superuser before running this.
$euid = posix_geteuid();
$user = exec('whoami');
if($euid != 0 && $user != "www-data"){
echo "Must be root user.\n";
exit(1);
}
}
public static function GetCpuInfo()
{
$command = "cat /proc/cpuinfo |grep -m 1 'model name' ";
exec($command, $output, $rv);
if ($rv != 0 || !isset($output[0]))
return self::UNKNOWN;
$choppedStr = explode(":", $output[0]);
if (!isset($choppedStr[1]))
return self::UNKNOWN;
$status = trim($choppedStr[1]);
return $status;
}
public static function GetAirtimeConf()
{
$ini = parse_ini_file("/etc/airtime/airtime.conf", true);
if ($ini === false){
echo "Error reading /etc/airtime/airtime.conf.".PHP_EOL;
exit;
}
return $ini;
}
public static function CheckOsTypeVersion(){
exec("lsb_release -ds", $output, $rv);
if ($rv != 0 || !isset($output[0])){
$os_string = self::UNKNOWN;
} else {
$os_string = $output[0];
}
unset($output);
// Figure out if 32 or 64 bit
exec("uname -m", $output, $rv);
if ($rv != 0 || !isset($output[0])){
$machine = self::UNKNOWN;
} else {
$machine = $output[0];
}
return $os_string." ".$machine;
}
public static function GetServerType($p_baseUrl, $p_basePort)
{
$headerInfo = get_headers("http://$p_baseUrl:$p_basePort",1);
if (!isset($headerInfo['Server'][0])) {
return self::UNKNOWN;
} else if (is_array($headerInfo['Server'])) {
return $headerInfo['Server'][0];
} else {
return $headerInfo['Server'];
}
}
public static function GetStatus($p_baseUrl, $p_basePort, $p_baseDir, $p_apiKey){
if ($p_baseDir == '/') {
$url = "http://$p_baseUrl:$p_basePort/api/status/format/json/api_key/%%api_key%%";
} else {
$url = "http://$p_baseUrl:$p_basePort/$p_baseDir"."api/status/format/json/api_key/%%api_key%%";
}
self::output_status("AIRTIME_STATUS_URL", $url);
$url = str_replace("%%api_key%%", $p_apiKey, $url);
$ch = curl_init($url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$data = curl_exec($ch);
//$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $data;
}
public static function PrintStatus($p_baseUrl, $p_basePort, $p_status){
if ($p_status === false){
self::output_status("AIRTIME_SERVER_RESPONDING", "FAILED");
} else {
self::output_status("AIRTIME_SERVER_RESPONDING", "OK");
$p_status = json_decode($p_status);
if (isset($p_status->status)) {
$data = $p_status->status;
} else {
$data = array();
}
if (isset($data->platform)) {
self::output_status("KERNEL_VERSION", $data->platform->release);
self::output_status("MACHINE_ARCHITECTURE", $data->platform->machine);
self::output_status("TOTAL_MEMORY_MBYTES", $data->platform->memory);
self::output_status("TOTAL_SWAP_MBYTES", $data->platform->swap);
self::output_status("AIRTIME_VERSION", $data->airtime_version);
} else {
self::output_status("KERNEL_VERSION", "UNKNOWN");
self::output_status("MACHINE_ARCHITECTURE", "UNKNOWN");
self::output_status("TOTAL_MEMORY_MBYTES", "UNKNOWN");
self::output_status("TOTAL_SWAP_MBYTES", "UNKNOWN");
self::output_status("AIRTIME_VERSION", "UNKNOWN");
}
self::output_status("OS", self::CheckOsTypeVersion());
self::output_status("CPU", self::GetCpuInfo());
self::output_status("WEB_SERVER", self::GetServerType($p_baseUrl, $p_basePort));
if (isset($data->services)) {
$services = $data->services;
} else {
$services = array();
}
if (isset($services->pypo) && $services->pypo->process_id != "FAILED") {
self::output_status("PLAYOUT_ENGINE_PROCESS_ID", $data->services->pypo->process_id);
self::output_status("PLAYOUT_ENGINE_RUNNING_SECONDS", $data->services->pypo->uptime_seconds);
self::output_status("PLAYOUT_ENGINE_MEM_PERC", $data->services->pypo->memory_perc);
self::output_status("PLAYOUT_ENGINE_CPU_PERC", $data->services->pypo->cpu_perc);
} else {
self::output_status("PLAYOUT_ENGINE_PROCESS_ID", "FAILED");
self::output_status("PLAYOUT_ENGINE_RUNNING_SECONDS", "0");
self::output_status("PLAYOUT_ENGINE_MEM_PERC", "0%");
self::output_status("PLAYOUT_ENGINE_CPU_PERC", "0%");
$log = "/var/log/airtime/pypo/pypo.log";
self::show_log_file($log);
}
if (isset($services->liquidsoap) && $services->liquidsoap->process_id != "FAILED") {
self::output_status("LIQUIDSOAP_PROCESS_ID", $data->services->liquidsoap->process_id);
self::output_status("LIQUIDSOAP_RUNNING_SECONDS", $data->services->liquidsoap->uptime_seconds);
self::output_status("LIQUIDSOAP_MEM_PERC", $data->services->liquidsoap->memory_perc);
self::output_status("LIQUIDSOAP_CPU_PERC", $data->services->liquidsoap->cpu_perc);
} else {
self::output_status("LIQUIDSOAP_PROCESS_ID", "FAILED");
self::output_status("LIQUIDSOAP_RUNNING_SECONDS", "0");
self::output_status("LIQUIDSOAP_MEM_PERC", "0%");
self::output_status("LIQUIDSOAP_CPU_PERC", "0%");
$log = "/var/log/airtime/pypo-liquidsoap/ls_script.log";
self::show_log_file($log);
}
if (isset($services->media_monitor) && $services->media_monitor->process_id != "FAILED") {
self::output_status("MEDIA_MONITOR_PROCESS_ID", $data->services->media_monitor->process_id);
self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", $data->services->media_monitor->uptime_seconds);
self::output_status("MEDIA_MONITOR_MEM_PERC", $data->services->media_monitor->memory_perc);
self::output_status("MEDIA_MONITOR_CPU_PERC", $data->services->media_monitor->cpu_perc);
} else {
self::output_status("MEDIA_MONITOR_PROCESS_ID", "FAILED");
self::output_status("MEDIA_MONITOR_RUNNING_SECONDS", "0");
self::output_status("MEDIA_MONITOR_MEM_PERC", "0%");
self::output_status("MEDIA_MONITOR_CPU_PERC", "0%");
$log = "/var/log/airtime/media-monitor/media-monitor.log";
self::show_log_file($log);
}
}
if (self::$AIRTIME_STATUS_OK){
self::output_comment("Your installation of Airtime looks OK!");
exit(0);
} else {
self::output_comment("There appears to be a problem with your Airtime installation.");
self::output_comment("Please visit http://wiki.sourcefabric.org/x/HABQ");
exit(1);
}
}
public static function show_log_file($log) {
self::output_comment("Check the log file $log");
self::output_comment("");
}
public static function output_comment($comment){
if (!is_array($comment)) {
$comment = array($comment);
}
foreach ($comment as $c) {
echo "-- $c".PHP_EOL;
}
}
public static function output_status($key, $value){
global $showColor;
$RED = "[0;31m";
$ORANGE = "[0;33m";
$GREEN = "[1;32m";
$color = $GREEN;
if ($value == "FAILED"){
$color = $RED;
self::$AIRTIME_STATUS_OK = false;
} else if ($value == "NOT MONITORED"){
$color = $ORANGE;
self::$AIRTIME_STATUS_OK = false;
}
if ($showColor)
echo sprintf("%-31s= %s", $key, self::term_color($value, $color)).PHP_EOL;
else
echo sprintf("%-31s= %s", $key, $value).PHP_EOL;
}
public static function term_color($text, $color){
if($color == ""){
$color = "[0m";
}
return chr(27)."$color$text".chr(27)."[0m";
}
}