diff --git a/src/amcli.php b/src/amcli.php index a64660aaad43ce3b3f24ef4f569394afa98d7d38..feeef5462e3dd144841c75d35bcf8022cd2c574d 100755 --- a/src/amcli.php +++ b/src/amcli.php @@ -2,20 +2,20 @@ <?php chdir(__DIR__); -$FLAG_DEBUG=0; -$VERSION="0.0.1"; +$FLAG_DEBUG = 0; +$VERSION = "0.0.1"; // ---MARK---INCLUDE-CHECKS---START--- -if(! file_exists("include_checks.php")){ - echo "ERROR: File 'include_checks.php' does not exisr yet..\n"; - echo "Run the ../installer.php first!\n"; - exit(1); +if (!file_exists("include_checks.php")) { + echo "ERROR: File 'include_checks.php' does not exist yet..\n"; + echo "Run the ../installer.php first!\n"; + exit(1); } -if(!include "include_checks.php"){ - echo "ERROR: Include of generated 'include_checks.php' failed.\n"; - echo "Check its generation by installer or run the installer again.\n"; - exit(2); +if (!include "include_checks.php") { + echo "ERROR: Include of generated 'include_checks.php' failed.\n"; + echo "Check its generation by installer or run the installer again.\n"; + exit(2); } // ---MARK---INCLUDE-CHECKS---END @@ -27,19 +27,54 @@ if(!include "include_checks.php"){ // -------------------------------------------------------------------- -function _wd($s):void +/** + * Call $oMonitor-><METHODNAME> with 1 or 2 params. + * This function was introduced to shorten the code. + * + * @param string $sMethod method name of appmonitor class + * @param mixed $value + * @param mixed $value2 + * @return void + */ +function _set(string $sMethod, mixed $value = null, mixed $value2 = null) +{ + global $oMonitor; + if (!isset($value)) { + _wd("SKIP \$oMonitor->$sMethod(<no_value>)"); + + } else { + if (!isset($value2)) { + _wd("calling \$oMonitor->$sMethod('$value')"); + $oMonitor->$sMethod($value); + } else { + _wd("calling \$oMonitor->$sMethod('$value', '$value2')"); + $oMonitor->$sMethod($value, $value2); + } + } +} + +/** + * Write debug output if FLAG_DEBUG is true (use -v or --verbose on command line) + * @param string $s message to show; a prefix "DEBUG:" will be added in front + * @return void + */ +function _wd($s): void { global $FLAG_DEBUG; - if($FLAG_DEBUG){ + if ($FLAG_DEBUG) { // echo "DEBUG: $s\n"; fwrite(STDERR, "DEBUG: $s\n"); } } +/** + * Show help text + * @return void + */ function _showHelp(): void { global $VERSION; - $_self=basename(__FILE__); + $_self = basename(__FILE__); echo "IML Appmonitor as CLI client $VERSION This client performs appmonitor checks and puts the results as JSON to stdout. @@ -52,9 +87,11 @@ You can use the compiled binary on non PHP systems. SYNTAX: $_self [OPTIONS] OPTIONS: + -h, --help Print this help and exit + -i, --ini Set an INI File to parse + -l, --list list available checks and exit; --ini will be ignored -v, --verbose Verbose output - -h, --help Print this help - -i, --ini INI File + -V, --version Show version and exit "; } @@ -66,60 +103,121 @@ OPTIONS: // -------------------------------------------------------------------- // put params to $ARGS -if($argc>1){ - parse_str(implode('&',array_slice($argv, 1)), $ARGS); +if ($argc > 1) { + parse_str(implode('&', array_slice($argv, 1)), $ARGS); } // check params if (isset($ARGS['-v']) || isset($ARGS['--verbose'])) { - $FLAG_DEBUG=1; + $FLAG_DEBUG = 1; +} +_wd("CLI ARGS: " . print_r($ARGS ?? [], 1)); + +// show version +if (isset($ARGS['-V']) || isset($ARGS['--version'])) { + _wd("Showing version"); + echo "$VERSION\n"; + exit(0); } -_wd("CLI ARGS: ".print_r($ARGS, 1)); +// show help if (isset($ARGS['-h']) || isset($ARGS['--help'])) { _wd("Showing help"); _showHelp(); - exit(0); + exit(0); } +// ---------------------------------------------------------------------- + +_wd("Initializing appmonitor class"); + +$oMonitor = new appmonitor(); + +// show builtin checks +if (isset($ARGS['-l']) || isset($ARGS['--list'])) { + echo implode("\n", $oMonitor->listChecks()); + exit(0); +} -$inifile=$ARGS["--ini"]??($ARGS["-i"]??"simple.ini"); + +$inifile = $ARGS["--ini"] ?? ($ARGS["-i"] ?? "simple.ini"); _wd("Using ini file '$inifile'."); -if(!file_exists($inifile)){ +if (!file_exists($inifile)) { echo "ERROR: INI File '$inifile' does not exist.\n"; exit(1); } -$aIni=parse_ini_file($inifile); -if(!is_array($aIni)){ +$aIni = parse_ini_file($inifile, true); +if (!is_array($aIni)) { echo "ERROR: INI File '$inifile' could not be parsed.\n"; exit(1); } -_wd("Parsed INI data: ".print_r($aIni, 1)); + +_wd("Parsed INI data: " . print_r($aIni, 1)); // ---------------------------------------------------------------------- -_wd("Initializing appmonitor class"); +// set metadata +_set("setHost", $aIni['meta']['host'] ?? null); +_set("setWebsite", $aIni['meta']['website'] ?? null); +_set("setTtl", $aIni['meta']['ttl'] ?? null); + +foreach ($aIni['notification']['email'] ?? [] as $sValue) { + _set("addEmail", $sValue); +} +foreach ($aIni['notification']['slack'] ?? [] as $sValue) { + $sChannel = preg_filter('/,.*/', '', $sValue); + $sWebhook = preg_filter('/^.*,/', '', $sValue); + + _set("addSlackWebhook", $sChannel, $sWebhook); +} + +// loop over checks +$aChecks = $aIni; +unset($aChecks["meta"]); +unset($aChecks["notification"]); + +foreach ($aChecks as $sKey => $aCheck) { + $aChecks[$sKey]['name'] = $aCheck['name'] ?? $sKey; + if ($aCheck['params']) { + $aArray = json_decode($aCheck['params'], 1); + if (!is_array($aArray)) { + echo "ERROR: key 'params' for check [$sKey] must be JSON.\n"; + echo "Value in $inifile: $aCheck[params]\n"; + exit(1); + } + } + + _wd("Execute Check '$sKey'"); + $oMonitor->addCheck([ + "name" => $aCheck['name'] ?? $sKey, + "description" => $aCheck['description'], + "check" => [ + "function" => $aCheck['function'], + "params" => $aArray, + ], + ]); + + /* + $oMonitor->addCheck( + [ + "name" => "hello plugin", + "description" => "Test a plugin ... plugins/checks/hello.php", + "check" => [ + "function" => "Hello", + "params" => [ + "message" => "Here I am", + ], + ], + ] + ); + */ + +} -$oMonitor = new appmonitor(); -$oMonitor->addEmail('sysadmin@example.com'); -$oMonitor->addSlackWebhook("mywebhook", "https://hooks.slack.com/services/(...)"); - -$oMonitor->addCheck( - [ - "name" => "hello plugin", - "description" => "Test a plugin ... plugins/checks/hello.php", - "check" => [ - "function" => "Hello", - "params" => [ - "message" => "Here I am", - ], - ], - ] -); // ---------------------------------------------------------------------- // send the response diff --git a/src/simple.ini b/src/simple.ini index da29d0ba42e871abd6f194a056a04a8d128184e4..61897d1cd7cc631df46d84792de0dce98daf7dff 100644 --- a/src/simple.ini +++ b/src/simple.ini @@ -1,5 +1,45 @@ +; ======================================================================= +; +; APPMONITOR CLI CLIENT +; +; to understand the entries of metadata see JSON in +; <https://os-docs.iml.unibe.ch/appmonitor/Client/Description_of_response.html> +; +; for the checks see its parameters +; <https://os-docs.iml.unibe.ch/appmonitor/PHP_client/Plugins/Checks/index.html> +; +; ======================================================================= + + +; ----------------------------------------------------------------------- +; METADATA +; ----------------------------------------------------------------------- + [meta] host = "www.example.com" website = "Company website" ttl = 300 tags[]="monitoring" + + +[notification] +email[]="support@example.com" +email[]="webmaster@example.com" + +; for slack use the following format +; <channelname> + comma + <webhook url> +slack[]="#support-channel,https://hooks.slack.com/services/XXXXXX/YYYYYY/ZZZZZ" + + +; ----------------------------------------------------------------------- +; CHECKS +; ----------------------------------------------------------------------- + +["hello plugin"] +description="I sust wann say hello" +function="hello" +params='{ +"message": "Here I am" +}' + +; -----------------------------------------------------------------------