From fb04fb7d1f5a77ee9afe7c5c168f7ae8537b91c8 Mon Sep 17 00:00:00 2001 From: Mark Oudsen Date: Sat, 27 Feb 2021 15:40:01 +0100 Subject: [PATCH] Moved all configuration into config file --- .htaccess | 1 + config/config.json.template | 15 ++++ config/config.php | 141 ++++++++++++++++++++++++++++++++++++ mailGraph.php | 99 ++++++++++++++++--------- 4 files changed, 223 insertions(+), 33 deletions(-) create mode 100644 .htaccess create mode 100644 config/config.json.template create mode 100644 config/config.php diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..3830855 --- /dev/null +++ b/.htaccess @@ -0,0 +1 @@ +RedirectMatch 403 ^/config/.*$ diff --git a/config/config.json.template b/config/config.json.template new file mode 100644 index 0000000..5d38916 --- /dev/null +++ b/config/config.json.template @@ -0,0 +1,15 @@ +{ + "script_baseurl": "https:\/\/domain.com\/", + "cli_itemId": 0, + "cli_triggerId": 0, + "cli_eventId": 0, + "cli_eventValue": 0, + "cli_duration": 0, + "cli_recipient": "recipient@domain.com", + "cli_baseURL": "https:\/\/domain.com\/zabbix\/", + "zabbix_user": "alogicalusername", + "zabbix_pwd": "astrongpassword", + "zabbix_api_user": "alogicalusername", + "zabbix_api_pwd": "astrongpassword", + "mail_from": "sender@domain.com" +} diff --git a/config/config.php b/config/config.php new file mode 100644 index 0000000..23318c8 --- /dev/null +++ b/config/config.php @@ -0,0 +1,141 @@ + '.$cCRLF; + echo 'CREATE create a new config file'.$cCRLF; + echo "ADD '' '' add a new keypair to the config file".$cCRLF; + echo "REPLACE '' '' change value for a specific key".$cCRLF; + echo "REMOVE '' remove the specific key".$cCRLF; + echo "LIST list configured keys/values".$cCRLF; + die; + } + + function readConfig() + { + global $argv; + global $cCRLF; + global $data; + + if (!file_exists($argv[1])) + { + echo 'Config file not found. Create a new one with CREATE command or specify correct path?'.$cCRLF; + die; + } + + $content = file_get_contents($argv[1]); + $data = json_decode($content,TRUE); + + if ($data==NULL) + { + echo 'Invalid JSON format in config file?!'.$cCRLF; + die; + } + } + + function writeConfig() + { + global $argv; + global $data; + + $content = json_encode($data,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK); + file_put_contents($argv[1],$content); + } + + // config.php 1=file 2=command 3=key 4=value + + switch(strtolower($argv[2])) + { + ////////////////////////////////////////////////////////////////////////////////////////////////////// + case 'create': + if (file_exists($argv[1])) + { + echo 'Config file already exists.'.$cCRLF; + die; + } + + $contents = '{}'; + file_put_contents($argv[1],$contents); + echo 'New config file created'.$cCRLF; + break; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + case 'add': + readConfig(); + + if (isset($data[$argv[3]])) + { + echo 'Key already exists. Use REPLACE to modify value or REMOVE key first.'.$cCRLF; + die; + } + + if (!isset($argv[4])) + { + echo 'No value specified?'.$cCRLF; + die; + } + + $data[$argv[3]] = $argv[4]; + + writeConfig(); + break; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + case 'replace': + readConfig(); + + if (!isset($data[$argv[3]])) + { + echo 'Key does not exist. Use ADD to add a new key and value.'.$cCRLF; + die; + } + + if (!isset($argv[4])) + { + echo 'No value specified?'.$cCRLF; + die; + } + + $data[$argv[3]] = $argv[4]; + + writeConfig(); + break; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + case 'remove': + readConfig(); + + if (!isset($data[$argv[3]])) + { + echo 'Key does not exist.'.$cCRLF; + die; + } + + if (isset($argv[4])) + { + echo 'No value expected?'.$cCRLF; + die; + } + + unset($data[$argv[3]]); + + writeConfig(); + break; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + case 'list': + readConfig(); + + foreach($data as $aKey=>$aValue) + { + echo ' "'.$aKey.'" => "'.$aValue.'"'.$cCRLF; + } + + break; + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + default: + echo 'Unknown command?'.$cCRLF; + } +?> \ No newline at end of file diff --git a/mailGraph.php b/mailGraph.php index 4ee0bd8..9b6f73a 100644 --- a/mailGraph.php +++ b/mailGraph.php @@ -9,7 +9,8 @@ // // ------------------------------------------------------------------------------------------------------ // 1.00 2021/02/26 - Mark Oudsen - MVP version, ready for distribution - // 1.01 2021/02/27 - Mark Oudsen - Enhanced search for associated graphs to an item + // 1.01 2021/02/27 - Mark Oudsen - Enhanced search for associated graphs to an item // bug fixes + // 1.10 2021/02/27 - Mark Oudsen - Moved all configuration outside code // ------------------------------------------------------------------------------------------------------ // // (C) M.J.Oudsen, mark.oudsen@puzzl.nl @@ -40,17 +41,19 @@ $maskDateTime = 'Y-m-d H:i:s'; // DEBUG SETTINGS + // -- Should be FALSE for production level use - $cDebug = FALSE; // Comprehensive debug logging including log storage - $cDebugMail = FALSE; // Include log in the mail message? (attachments) + $cDebug = TRUE; // Comprehensive debug logging including log storage + $cDebugMail = TRUE; // Include log in the mail message? (attachments) $showLog = FALSE; // Display the log - !! switch to TRUE when performing CLI debugging only !!! // INCLUDE REQUIRED LIBRARIES (Composer) + // (configure at same location as the script is running or load in your own central library) // -- swiftmailer/swiftmailer https://swiftmailer.symfony.com/docs/introduction.html // -- twig/twig https://twig.symfony.com/doc/3.x/templates.html - // [CONFIGURE] - include('/path_to_my_libs/vendor/autoload.php'); + // [CONFIGURE] Change only required if you decide to use a local central library, otherwise leave as is + include(getcwd().'/vendor/autoload.php'); ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -199,6 +202,32 @@ if ($showLog) { echo $logString.$cCRLF; } } + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // Read configuration file + + function readConfig($fileName) + { + global $cCRLF; + + if (!file_exists($fileName)) + { + echo 'Config file not found. ('.$fileName.')'.$cCRLF; + die; + } + + $content = file_get_contents($fileName); + $data = json_decode($content,TRUE); + + if ($data==NULL) + { + echo 'Invalid JSON format in config file?! ('.$fileName.')'.$cCRLF; + die; + } + + return($data); + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// // API request ID counter - for best practice / debug purposes only @@ -256,27 +285,30 @@ // Initialize /////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// + // [CONFIGURE] Change only when you want to place your config file somewhere else ... + $config = readConfig(getcwd().'/config/config.json'); + + // Read POST data $problemJSON = file_get_contents('php://input'); $problemData = json_decode($problemJSON,TRUE); + // Facilitate CLI based testing if (isset($argc)) { - // [CONFIGURE] note: required only for debugging purpose, otherwise just leave as is - if (($argc>1) && ($argv[1]=='test')) { - // Insert the correct ids taken from an e-mail to provide debug capability via CLI + _log('# Invoked from CLI'); - $problemData['itemId'] = 0; - $problemData['triggerId'] = 0; - $problemData['eventId'] = 0; - $problemData['eventValue'] = 0; - $problemData['recipient'] = ''; - $problemData['baseURL'] = ''; - $problemData['duration'] = 10; + // Assumes that config.json file has the correct information + $problemData['itemId'] = $config['cli_itemId']; + $problemData['triggerId'] = $config['cli_triggerId']; + $problemData['eventId'] = $config['cli_eventId']; + $problemData['eventValue'] = $config['cli_eventValue']; + $problemData['recipient'] = $config['cli_recipient']; + $problemData['baseURL'] = $config['cli_baseURL']; + $problemData['duration'] = $config['cli_duration']; // Switch on CLI log display - $showLog = TRUE; } } @@ -317,35 +349,36 @@ _log('# Data passed from Zabbix'.$cCRLF.json_encode($problemData,JSON_PRETTY_PRINT|JSON_NUMERIC_CHECK)); // --- CONFIGURATION --- - // [CONFIGURE] - $z_url = ''; // Script URL location (for relative paths to images, templates, log, tmp) - $z_path = ''; // Absolute base path on the filesystem for this url - $z_url_image = $z_url.'images/'; // Images URL (included in plain message text) + // Script related settings + $z_url = $config['script_baseurl']; // Script URL location (for relative paths to images, templates, log, tmp) + $z_url_image = $z_url.'images/'; // Images URL (included in plain message text) // Absolute path where to store the generated images - note: script does not take care of clearing out old images! + $z_path = getcwd().'/'; // Absolute base path on the filesystem for this url $z_images_path = $z_path.'/images/'; $z_template_path = $z_path.'/templates/'; $z_tmp_cookies = $z_path.'//tmp/'; $z_log_path = $z_path.'/log/'; // Zabbix user (requires Super Admin access rights to access image generator script) - $z_user = 'graphreader'; - $z_pass = 'givemeastrongpassword'; + $z_user = $config['zabbix_user']; + $z_pass = $config['zabbix_user_pwd']; // Zabbix API user (requires Super Admin access rights) // TODO: Check if information retreival can be done with less rigths - $z_api_user = 'zabbixapi'; - $z_api_pass = 'givemeastrongpassword'; + $z_api_user = $config['zabbix_api_user']; + $z_api_pass = $config['zabbix_api_pwd']; // Mail sender - $mailFrom = array('myemailname.noreply@mydomain.com'=>'Zabbix Mailgraph'); + $mailFrom = array($config['mail_from']=>'Zabbix Mailgraph'); // Derived variables - do not change! $z_server = $p_URL; // Zabbix server URL from config $z_url_api = $z_server ."api_jsonrpc.php"; // Zabbix API URL // Check accessibility of paths and files + //TODO: Check write access? if (!file_exists($z_images_path)) { @@ -355,25 +388,25 @@ if (!file_exists($z_tmp_cookies)) { - echo 'Image path inaccessible?'.$cCRLF; + echo 'Cookies temporary path inaccessible?'.$cCRLF; die; } if (!file_exists($z_log_path)) { - echo 'Image path inaccessible?'.$cCRLF; + echo 'Log path inaccessible?'.$cCRLF; die; } if (!file_exists($z_template_path.'html.template')) { - echo 'INIT: HTML template missing?'.$cCRLF; + echo 'HTML template missing?'.$cCRLF; die; } if (!file_exists($z_template_path.'plain.template')) { - echo 'INIT: PLAIN template missing?'.$cCRLF; + echo 'PLAIN template missing?'.$cCRLF; die; } @@ -400,7 +433,7 @@ $token = ''; if (isset($result['result'])) { $token = $result['result']; } - if ($token=='') { echo 'Error logging in to Zabbix?'; die; } + if ($token=='') { echo 'Error logging in to Zabbix? ('.$z_url_api.')'; die; } _log('> Token = '.$token); @@ -484,9 +517,9 @@ // Look for graphs across all functions inside the item $itemIds = array(); - foreach($thisItem['result'][0]['functions'] as $aFunction) + foreach($thisTrigger['result'][0]['functions'] as $aFunction) { - $itemIds[] = $aFunction['itremid']; + $itemIds[] = $aFunction['itemid']; } $request = array('jsonrpc'=>'2.0', @@ -700,4 +733,4 @@ file_put_contents($z_log_path.'log.'.$p_eventId.'.dump',$content); } -?> +?> \ No newline at end of file