diff --git a/utils/airtime-check-system.php b/utils/airtime-check-system.php new file mode 100644 index 000000000..0c05b52ee --- /dev/null +++ b/utils/airtime-check-system.php @@ -0,0 +1,248 @@ + 0 bytes. + +echo "*** Airtime System Check Script ***".PHP_EOL; + +set_error_handler("myErrorHandler"); + +AirtimeCheck::CheckOsTypeVersion(); + +AirtimeCheck::CheckConfigFilesExist(); +$airtimeIni = AirtimeCheck::GetAirtimeConf(); +$pypoCfg = AirtimeCheck::GetPypoCfg(); + +AirtimeCheck::GetDbConnection($airtimeIni); +AirtimeCheck::CheckRabbitMqVersion(); +AirtimeCheck::CheckRabbitMqConnection($airtimeIni); + +AirtimeCheck::CheckApacheVHostFiles(); + +AirtimeCheck::GetAirtimeServerVersion($pypoCfg); + + +class AirtimeCheck{ + + public static function CheckPypoRunning(){ + //check using svstat + } + + public static function CheckLiquidsoapRunning(){ + //connect via telnet + } + + public static function CheckConfigFilesExist(){ + echo PHP_EOL."Verifying Config Files in /etc/airtime".PHP_EOL; + $confFiles = array("airtime.conf", + "liquidsoap.cfg", + "pypo.cfg", + "recorder.cfg"); + + foreach ($confFiles as $cf){ + $fullPath = "/etc/airtime/$cf"; + echo "\t".$fullPath." ... "; + if (file_exists($fullPath)){ + echo "[OK]".PHP_EOL; + } else { + echo "Not Found!".PHP_EOL; + exit; + } + } + } + + 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 GetPypoCfg(){ + $ini = parse_ini_file("/etc/airtime/pypo.cfg", false); + + if ($ini === false){ + echo "Error reading /etc/airtime/pypo.cfg.".PHP_EOL; + exit; + } + + return $ini; + } + + public static function GetDbConnection($airtimeIni){ + $host = $airtimeIni["database"]["host"]; + $dbname = $airtimeIni["database"]["dbname"]; + $dbuser = $airtimeIni["database"]["dbuser"]; + $dbpass = $airtimeIni["database"]["dbpass"]; + + $dbconn = pg_connect("host=$host port=5432 dbname=$dbname user=$dbuser password=$dbpass"); + + echo PHP_EOL."Verifying Airtime Database".PHP_EOL; + + if ($dbconn === false){ + echo "\tConnection ... [Failed!]".PHP_EOL; + exit; + } else { + echo "\tConnection ... [OK]".PHP_EOL; + } + } + + public static function CheckDbTables(){ + + } + + /* The function tests for whether the rabbitmq-server package is + * installed. RabbitMQ could be installed manually via tarball + * and this function will fail to detect it! Unfortunately there + * seems to be no other way to check RabbitMQ version. Will update + * this function if I find a more universal solution. */ + public static function CheckRabbitMqVersion(){ + echo PHP_EOL."Checking RabbitMQ Version".PHP_EOL; + + $command = "dpkg -l | grep rabbitmq-server"; + exec($command, $output, $result); + + if (count($output) > 0){ + //version string always starts at character 45. Lets find + //the end of this version string by looking for the first space. + $start = 45; + $end = strpos($output[0], " ", $start); + + $version = substr($output[0], $start, $end-$start); + + echo "\t$version ... [OK]".PHP_EOL; + } else { + echo "\trabbitmq-server package not found. [Failed!]".PHP_EOL; + } + } + + public static function CheckRabbitMqConnection($airtimeIni){ + echo PHP_EOL."Verifying RabbitMQ Service".PHP_EOL; + try { + $conn = new AMQPConnection($airtimeIni["rabbitmq"]["host"], + $airtimeIni["rabbitmq"]["port"], + $airtimeIni["rabbitmq"]["user"], + $airtimeIni["rabbitmq"]["password"]); + } catch (Exception $e){ + echo "\tConnection ... [Failed!]".PHP_EOL; + exit; + } + echo "\tConnection ... [OK]".PHP_EOL; + } + + public static function GetAirtimeServerVersion($pypoCfg){ + + echo PHP_EOL."Checking Airtime Server Version".PHP_EOL; + echo "\tConnecting to http://localhost/api/version".PHP_EOL; + + $baseUrl = $pypoCfg["base_url"]; + $basePort = $pypoCfg["base_port"]; + $apiKey = $pypoCfg["api_key"]; + + $rh = fopen("http://$baseUrl:$basePort/api/version/api_key/$apiKey", "r"); + + if ($rh !== false){ + while (($buffer = fgets($rh)) !== false) { + $json = json_decode(trim($buffer), true); + if (is_null($json)){ + echo "NULL STRING".PHP_EOL; + + } else { + echo "\t\tAirtime Version ".$json["version"]." ... [OK] ".PHP_EOL; + } + } + } else { + echo "\t\tConnection ... [Failed!]".PHP_EOL; + exit; + } + + function handleError($errno, $errstr,$error_file,$error_line) + { + echo "Error: [$errno] $errstr - $error_file:$error_line"; + echo "
"; + echo "Terminating PHP Script"; + die(); + } + + } + + public static function CheckApacheVHostFiles(){ + echo PHP_EOL."Checking for Airtime Apache config files".PHP_EOL; + + $fileNames = array("/etc/apache2/sites-available/airtime", + "/etc/apache2/sites-enabled/airtime"); + + foreach ($fileNames as $fn){ + echo "\tChecking $fn ... "; + if (file_exists($fn)){ + echo '[OK]'.PHP_EOL; + } else { + echo "[Failed!]".PHP_EOL; + exit; + } + } + + //Since apache2 loads config files in alphabetical order + //from the sites-enabled directory, we need to check if + //airtime is lexically the first file in this directory. + + //get sorted array of files + $arr = scandir("/etc/apache2/sites-enabled"); + + foreach ($arr as $a){ + if ($a == "." || $a == ".."){ + continue; + } + if ($a == "airtime"){ + break; + } else { + echo "\t\t*Warning, the file \"$a\" is lexically ahead of the file \"airtime\" in".PHP_EOL; + echo"\t\t /etc/apache2/sites-enabled and preventing airtime from being loaded".PHP_EOL; + } + } + } + + public static function CheckOsTypeVersion(){ + echo PHP_EOL."Checking operating system.".PHP_EOL; + + if (file_exists("/etc/lsb-release")){ + + $ini = parse_ini_file("/etc/lsb-release", false); + + //lsb-release existing implies a Ubuntu installation. + echo "\tUbuntu based distribution found: ".$ini["DISTRIB_DESCRIPTION"].PHP_EOL; + } else if (file_exists("/etc/debian_version")) { + //if lsb-release does not exist, lets check if we are + //running on Debian. Look for file /etc/debian_version + $handler = fopen("/etc/debian_version", "r"); + + $version = trim(fgets($handler)); + + echo "\tDebian based distribution found: ".$version.PHP_EOL; + } else { + echo "\tWARNING: Unknown OS Type".PHP_EOL; + } + } +} + + +// error handler function +function myErrorHandler($errno, $errstr, $errfile, $errline) +{ + if ($errno == E_WARNING){ + if (strpos($errstr, "401") !== false){ + echo "\t\tServer is running but could not find Airtime".PHP_EOL; + } else if (strpos($errstr, "Connection refused") !== false){ + echo "\t\tServer does not appear to be running".PHP_EOL; + } else { + //echo $errstr; + } + } + + /* Don't execute PHP internal error handler */ + return true; +}