From 29df4d112964ae1b4760164f8a7bd8ca038e5d98 Mon Sep 17 00:00:00 2001 From: hahn <axel.hahn@iml.unibe.ch> Date: Thu, 16 May 2019 10:05:53 +0100 Subject: [PATCH] public_html/appmonitor update appmonitor client and added checks --- .../appmonitor/appmonitor-checks.class.php | 343 ------------------ .../appmonitor/appmonitor-client.class.php | 289 --------------- 2 files changed, 632 deletions(-) delete mode 100644 public_html/appmonitor/appmonitor-checks.class.php delete mode 100644 public_html/appmonitor/appmonitor-client.class.php diff --git a/public_html/appmonitor/appmonitor-checks.class.php b/public_html/appmonitor/appmonitor-checks.class.php deleted file mode 100644 index 198a4ded..00000000 --- a/public_html/appmonitor/appmonitor-checks.class.php +++ /dev/null @@ -1,343 +0,0 @@ -<?php - -define("RESULT_OK", 0); -define("RESULT_UNKNOWN", 1); -define("RESULT_WARNING", 2); -define("RESULT_ERROR", 3); -/** - * APPMONITOR CLIENT CHECKS<br> - * <br> - * THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE <br> - * LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR <br> - * OTHER PARTIES PROVIDE THE PROGRAM ?AS IS? WITHOUT WARRANTY OF ANY KIND, <br> - * EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED <br> - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE <br> - * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. <br> - * SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY <br> - * SERVICING, REPAIR OR CORRECTION.<br> - * <br> - * --------------------------------------------------------------------------------<br> - * <br> - * --- HISTORY:<br> - * 2014-10-24 0.5 axel.hahn@iml.unibe.ch<br> - * 2015-04-08 0.9 axel.hahn@iml.unibe.ch added sochket test: checkPortTcp<br> - * --------------------------------------------------------------------------------<br> - * @version 0.9 - * @author Axel Hahn - * @link TODO - * @license GPL - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL 3.0 - * @package IML-Appmonitor - */ -class appmonitorcheck { - - // ---------------------------------------------------------------------- - // CONFIG - // ---------------------------------------------------------------------- - - /** - * config container - * @var array - */ - private $_aConfig = array(); - - /** - * data of all checks - * @var array - */ - private $_aData = array(); - - // ---------------------------------------------------------------------- - // CONSTRUCTOR - // ---------------------------------------------------------------------- - - /** - * constructor (nothing) - */ - public function __construct() { - - } - - // ---------------------------------------------------------------------- - // PRIVATE FUNCTIONS - // ---------------------------------------------------------------------- - - /** - * create basic array values for metadata - * @return boolean - */ - private function _createDefaultMetadata() { - - $this->_aData = array( - "name" => $this->_aConfig["name"], - "description" => $this->_aConfig["description"], - "result" => RESULT_UNKNOWN, - "value" => false, - ); - return true; - } - - /** - * set a result value of a check - * @param type $iResult - * @return type - */ - private function _setResult($iResult) { - return $this->_aData["result"] = (int) $iResult; - } - - /** - * set a result value of a check - * @param type $iResult - * @return type - */ - private function _setOutput($s) { - return $this->_aData["value"] = (string) $s; - } - - /** - * set result and output - * @param type $iResult - * @param type $s - * @return boolean - */ - private function _setReturn($iResult, $s) { - $this->_setResult($iResult); - $this->_setOutput($s); - return true; - } - - private function _checkArrayKeys($aConfig, $sKeyList) { - foreach (explode(",", $sKeyList) as $sKey) { - if (!array_key_exists($sKey, $aConfig)) { - die('ERROR in ' . __CLASS__ . "<br>array requires the keys [$sKeyList] - but key '$sKey' was not found in config array <pre>" . print_r($aConfig, true)); - } - if (is_null($aConfig[$sKey])) { - die('ERROR in ' . __CLASS__ . "<br> key '$sKey' is empty in config array <pre>" . print_r($aConfig, true)); - } - } - return true; - } - - // ---------------------------------------------------------------------- - // PUBLIC FUNCTIONS - // ---------------------------------------------------------------------- - - /** - * perform a check - * @param type $aConfig - * Array - * ( - * [name] => Dummy - * [description] => Dummy Test - * [check] => array( - * [function] => [check function] // i.e. Simple - * [params] => [array] // optional; arguments for Check function - * // its keys depend on the function - * ) - * ) - * - * @return array - */ - public function makeCheck($aConfig) { - $this->_checkArrayKeys($aConfig, "name,description,check"); - $this->_checkArrayKeys($aConfig["check"], "function"); - - $this->_aConfig = $aConfig; - $this->_createDefaultMetadata(); - - $sCheck = "check" . $this->_aConfig["check"]["function"]; - if (!method_exists($this, $sCheck)) { - die(__CLASS__ . " check not found: $sCheck <pre>" . print_r($aConfig, true)); - } - $aParams = array_key_exists("params", $this->_aConfig["check"]) ? $this->_aConfig["check"]["params"] : array(); - - // call the check ... - call_user_func(array($this, $sCheck), $aParams); - - // echo "<pre>"; print_r($this->listChecks()); die(); - // ... and send response - return $this->respond(); - } - - /** - * list all available check functions. This is a helper class you cann call - * to get an overview overbuilt in functions. You get a flat array with - * all function names. - * @return array - */ - public function listChecks() { - $aReturn = array(); - $class = new ReflectionClass($this); - foreach ($class->getMethods(ReflectionMethod::IS_PRIVATE) as $oReflectionMethod) { - if (strpos($oReflectionMethod->name, "check") === 0) { - $aReturn[] = (string) $oReflectionMethod->name; - } - } - return $aReturn; - } - - /** - * final call of class: send response (data array) - * @return type - */ - public function respond() { - return $this->_aData; - } - - // ---------------------------------------------------------------------- - // CHECK FUNCTIONS (private) - // ---------------------------------------------------------------------- - - /** - * most simple check: set values - * @return type - */ - private function checkSimple($aParams) { - $aHelp = array( - "result" => "(integer) result value", - "value" => "(string) explaination" - ); - $this->_checkArrayKeys($aParams, "result,value"); - return $this->_setReturn((int) $aParams["result"], $aParams["value"]); - } - - /** - * make http request and test response body - * @param array $aParams - * array( - * "url" url to fetch - * "contains" string that must exist in response body - * ) - */ - private function checkHttpContent($aParams, $iTimeout = 5) { - $this->_checkArrayKeys($aParams, "url,contains"); - if (!function_exists("curl_init")) { - die("ERROR: PHP CURL module is not installed."); - } - $ch = curl_init($aParams["url"]); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); - curl_setopt($ch, CURLOPT_TIMEOUT, $iTimeout); - $res = curl_exec($ch); - curl_close($ch); - - if (!$res) { - $this->_setReturn(RESULT_ERROR, 'ERROR: failed to fetch ' . $aParams["url"] . '.'); - } else { - if (!strpos($res, $aParams["contains"]) === false) { - $this->_setReturn(RESULT_OK, 'OK: The text "' . $aParams["contains"] . '" was found in response of ' . $aParams["url"] . '.'); - } else { - $this->_setReturn(RESULT_ERROR, 'ERROR: The text ' . $aParams["contains"] . ' was NOT found in response of ' . $aParams["url"] . '.'); - } - } - return $res; - } - - /** - * check mysql connection to a database - * @param array $aParams - * array( - * "server" - * "user" - * "password" - * "db" - * ) - */ - private function checkMysqlConnect($aParams) { - $this->_checkArrayKeys($aParams, "server,user,password,db"); - $db = mysqli_connect( - $aParams["server"], $aParams["user"], $aParams["password"], $aParams["db"] - ); - if ($db) { - $this->_setReturn(RESULT_OK, "OK: Mysql database " . $aParams["db"] . " was connected"); - return true; - } else { - $this->_setReturn(RESULT_ERROR, "ERROR: Mysql database " . $aParams["db"] . " was not connected. " . mysqli_connect_error()); - return false; - } - } - - /** - * check sqlite connection - * @param array $aParams - * array( - * "db" - * ) - * @return boolean - */ - private function checkSqliteConnect($aParams) { - $this->_checkArrayKeys($aParams, "db"); - if (!file_exists($aParams["db"])) { - $this->_setReturn(RESULT_ERROR, "ERROR: Sqlite database file " . $aParams["db"] . " does not exist."); - return false; - } - try { - // $db = new SQLite3($sqliteDB); - // $db = new PDO("sqlite:".$sqliteDB); - $o = new PDO("sqlite:" . $aParams["db"]); - $this->_setReturn(RESULT_OK, "OK: Sqlite database " . $aParams["db"] . " was connected"); - return true; - } catch (Exception $exc) { - $this->_setReturn(RESULT_ERROR, "ERROR: Sqlite database " . $aParams["db"] . " was not connected. " . mysqli_connect_error()); - return false; - } - } - - - /** - * check if system is listening to a given port - * @param array $aParams - * array( - * "port" - * "host" (optional: 127.0.0.1 is default) - * ) - * @return boolean - */ - private function checkPortTcp($aParams) { - $this->_checkArrayKeys($aParams, "port"); - - $sHost=array_key_exists('host',$aParams)?$aParams['host']:'127.0.0.1'; - $iPort=(int)$aParams['port']; - - // from http://php.net/manual/de/sockets.examples.php - - $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); - if ($socket === false) { - $this->_setReturn(RESULT_UNKNOWN, "ERROR: $sHost:$iPort was not checked. socket_create() failed: " . socket_strerror(socket_last_error())); - return false; - } - - $result = socket_connect($socket, $sHost, $iPort); - if ($result === false) { - $this->_setReturn(RESULT_ERROR, "ERROR: $sHost:$iPort failed. " . socket_strerror(socket_last_error($socket))); - socket_close($socket); - return false; - } else { - $this->_setReturn(RESULT_OK, "OK: $sHost:$iPort was connected."); - socket_close($socket); - return true; - } - } - /** - * DEPRECATED - use checkPortTcp instead - * check if system is listening to a given port - * @param array $aParams - * array( - * "port" - * ) - * @return boolean - */ - private function checkListeningIp($aParams) { - $this->_checkArrayKeys($aParams, "port"); - $sResult = exec('netstat -tulen | grep ":' . $aParams["port"] . ' "'); - if ($sResult) { - $this->_setReturn(RESULT_OK, "OK: Port " . $aParams["port"] . " was found: " . $sResult); - return true; - } else { - $this->_setReturn(RESULT_ERROR, "ERROR: Port " . $aParams["port"] . " is not in use."); - return false; - } - } - -} diff --git a/public_html/appmonitor/appmonitor-client.class.php b/public_html/appmonitor/appmonitor-client.class.php deleted file mode 100644 index a800565f..00000000 --- a/public_html/appmonitor/appmonitor-client.class.php +++ /dev/null @@ -1,289 +0,0 @@ -<?php -/** - * APPMONITOR CLIENT<br> - * <br> - * THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE <br> - * LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR <br> - * OTHER PARTIES PROVIDE THE PROGRAM ?AS IS? WITHOUT WARRANTY OF ANY KIND, <br> - * EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED <br> - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE <br> - * ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. <br> - * SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY <br> - * SERVICING, REPAIR OR CORRECTION.<br> - * <br> - * --------------------------------------------------------------------------------<br> - * <br> - * --- HISTORY:<br> - * 2014-10-24 0.5 axel.hahn@iml.unibe.ch<br> - * 2014-11-21 0.6 axel.hahn@iml.unibe.ch removed meta::ts <br> - * --------------------------------------------------------------------------------<br> - * @version 0.6 - * @author Axel Hahn - * @link TODO - * @license GPL - * @license http://www.gnu.org/licenses/gpl-3.0.html GPL 3.0 - * @package IML-Appmonitor - */ -class appmonitor { - - /** - * config: default ttl for server before requesting the client check again - * value is in seconds - * @var int - */ - private $_iDefaultTtl = 300; - - /** - * internal counter: greatest return value of all checks - * @var type - */ - private $_iMaxResult = false; - - /** - * responded metadata of a website - * @see _createDefaultMetadata() - * @var array - */ - private $_aMeta = array(); - - /** - * repended array of all checks - * @see addCheck() - * @var array - */ - private $_aChecks = array(); - - /** - * @var array - */ - private $_aMustKeysChecks = array("name", "description", "result", "value"); - - /** - * constructor: init data - */ - public function __construct() { - $this->_createDefaultMetadata(); - } - - // ---------------------------------------------------------------------- - // private function - // ---------------------------------------------------------------------- - - /** - * create basic array values for metadata - * @return boolean - */ - private function _createDefaultMetadata() { - $this->_aMeta = array( - "host" => false, - "website" => false, - "ttl" => false, - "result" => false - ); - - // fill with default values - $this->setHost(); - $this->setWebsite(); - $this->setTTL(); - - return true; - } - - // ---------------------------------------------------------------------- - // setter - // ---------------------------------------------------------------------- - - /** - * set a host for metadata - * @param string $s hostname - * @return bool - */ - public function setHost($s = false) { - if (!$s) { - $s = php_uname("n"); - } - return $this->_aMeta["host"] = $s; - } - - /** - * set a vhost for metadata - * @param string $sNewHost hostname - * @return bool - */ - public function setWebsite($s = false) { - if (!$s) { - $s = $_SERVER["HTTP_HOST"]; - } - return $this->_aMeta["website"] = $s; - } - - /** - * set a ttl value for - * @param int $iTTl TTL value in sec - * @return boolean - */ - public function setTTL($iTTl = false) { - if (!$iTTl) { - $iTTl = $this->_iDefaultTtl; - } - return $this->_aMeta["ttl"] = $iTTl; - } - - /** - * set final result in meta data; if no value was given then it - * sets the biggest value of any check. - * @param integer $iResult set resultcode - * @return boolean - */ - public function setResult($iResult = false) { - if ($iResult === false) { - $iResult = $this->_iMaxResult; // see addCheck() - } - return $this->_aMeta["result"] = $iResult; - } - - /** - * add a check array; - * @param type $aJob - * @return type - */ - public function addCheck($aJob = array()) { - - require_once 'appmonitor-checks.class.php'; - $oCheck = new appmonitorcheck(); - // print_r($aJob); die(); - $aCheck = $oCheck->makecheck($aJob); - - if (!$this->_iMaxResult || $aCheck["result"] > $this->_iMaxResult) { - $this->_iMaxResult = $aCheck["result"]; - } - return $this->_aChecks[] = $aCheck; - } - - // ---------------------------------------------------------------------- - // getter - // ---------------------------------------------------------------------- - - /** - * list all available check functions. This is a helper class you cann call - * to get an overview overbuilt in functions. You get a flat array with - * all function names. - * @return array - */ - public function listChecks() { - require_once 'appmonitor-checks.class.php'; - $oCheck = new appmonitorcheck(); - return $oCheck->listChecks(); - } - - // ---------------------------------------------------------------------- - // checks - // ---------------------------------------------------------------------- - - /** - * verify array values and abort with all found errors - */ - private function _checkData() { - $aErrors = array(); - - if (!count($this->_aChecks)) { - $aErrors[] = "No checks have been defined."; - } - - if ($this->_aMeta["result"] === false) { - $aErrors[] = "method setResult was not used to set a final result for all checks."; - } - - - if (count($aErrors)) { - echo "<h1>Errors detected</h1><ol><li>" . implode("<li>", $aErrors) . "</ol><hr>"; - echo "<pre>" . print_r($this->_generateOutputArray(), true) . "</pre><hr>"; - die("ABORT"); - } - } - - // ---------------------------------------------------------------------- - // output - // ---------------------------------------------------------------------- - - /** - * get full array for response with metadata and Checks - * @return type - */ - private function _generateOutputArray() { - return array( - "meta" => $this->_aMeta, - "checks" => $this->_aChecks, - ); - } - - /** - * output appmonitor values as JSON - * @param bool $bPretty turn on pretty print; default is false - * @param bool $bHighlight print syntax highlighted html code; $bPretty must be true to enable - */ - public function render($bPretty = false, $bHighlight = false) { - $this->_checkData(); - - // JSON_PRETTY_PRINT reqires PHP 5.4 - if (!defined('JSON_PRETTY_PRINT')) { - $bPretty=false; - } - if (!$bPretty) { - $bHighlight=false; - $sOut = json_encode($this->_generateOutputArray()); - } else { - $sOut = json_encode($this->_generateOutputArray(), JSON_PRETTY_PRINT); - if ($bHighlight) { - $aMsg=array( - 0=>"OK", - 1=>"UNKNOWN", - 2=>"WARNING", - 3=>"ERROR" - ); - foreach(array_keys($aMsg) as $iCode){ - $sOut = preg_replace('/(\"result\":\ '.$iCode.')/', '$1 <span class="result'.$iCode.'"> <--- '.$aMsg[$iCode].' </span>', $sOut); - } - - $sOut = preg_replace('/:\ \"(.*)\"/U', ': "<span style="color:#66e;">$1</span>"', $sOut); - $sOut = preg_replace('/:\ ([0-9]*)/', ': <span style="color:#3a3; font-weight: bold;">$1</span>', $sOut); - $sOut = preg_replace('/\"(.*)\":/U', '"<span style="color:#840;">$1</span>":', $sOut); - - $sOut = preg_replace('/([{\[])/', '$1<blockquote>', $sOut); - $sOut = preg_replace('/([}\]])/', '</blockquote>$1', $sOut); - $sOut = str_replace(' ', '', $sOut); - // $sOut = preg_replace('/([{}])/', '<span style="color:#a00; ">$1</span>', $sOut); - // $sOut = preg_replace('/([\[\]])/', '<span style="color:#088; ">$1</span>', $sOut); - - $sOut = '<!DOCTYPE html><html><head>' - . '<style>' - - . 'body{background:#e0e8f8; color:#235; font-family: verdana,arial;}' - . 'blockquote{background:rgba(0,0,0,0.03); border-left: 0px solid rgba(0,0,0,0.06); margin: 0 0 0 3em; padding: 0; border-radius: 1em; border-top-left-radius: 0;}' - . 'blockquote blockquote:hover{; }' - . 'blockquote blockquote blockquote:hover{border-color: #808;}' - . 'pre{background:rgba(0,0,0,0.05); padding: 1em; border-radius: 1em;}' - . '.result0{background:#aca; border-right: 0em solid #080;}' - . '.result1{background:#666; border-right: 0em solid #ccc;}' - . '.result2{background:#fc9; border-right: 0em solid #860;}' - . '.result3{background:#800; border-right: 0em solid #f00;}' - - . '</style>' - . '<title>'.__CLASS__.'</title>' - . '</head><body>' - . '<h1>'.__CLASS__.' :: debug</h1>' - . '<pre>' - . $sOut - . '</pre></body></html>'; - } - } - if (!$bHighlight) { - header('Content-type: application/json'); - header('Cache-Control: cache'); - header('max-age: ' . $this->_aMeta["ttl"]); - } - echo $sOut; - return $sOut; - } - -} -- GitLab