You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

179 lines
5.1 KiB

#!/usr/bin/php
<?php
$message = '';
$err_state = 0;
function help()
{
echo <<<EOHELP
Tiki monitoring for Nagios/Icinga/Shinken
Syntax:
php check_tiki.php -u <URL> [-c <check>] [--bccwarn <percent> --bcccrit <percent>] [--sirwarn <seconds> --sircrit <seconds>] [--user <user> --pass <password>]
-u URL of tiki-monitor.php to use
-c Command to execute, one of:
bcc
db
searchindex
If left empty, all checks will be performed.
--bccwarn Byte Code Cache memory warning percentage
--bcccrit Byte Code Cache memory critical percentage
--sirwarn Search Index age warning threshold in seconds
--sircrit Search Index age critical threshold in seconds
--user User for HTTP authentication
--pass Password for HTTP authentication
EOHELP;
}
function get_opts()
{
$short_opts = "u:c:h::";
$long_opts = [
"bccwarn:",
"bcccrit:",
"sirwarn:",
"sircrit:",
"user:",
"pass:",
];
$options = getopt($short_opts, $long_opts);
return($options);
}
function get_data($options)
{
$crl = curl_init();
$timeout = 5;
curl_setopt($crl, CURLOPT_URL, $options['u']);
curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($crl, CURLOPT_CONNECTTIMEOUT, $timeout);
if (! empty($options['user'])) {
curl_setopt($crl, CURLOPT_USERPWD, $options['user'] . ":" . $options['pass']);
}
$ret = curl_exec($crl);
curl_close($crl);
$ret = json_decode($ret);
$ret = get_object_vars($ret);
return $ret;
}
function update_err_state($new_state, $new_message)
{
global $err_state, $message;
$err_state = max($new_state, $err_state);
if (empty($message)) {
$message = "$new_message";
} else {
$message .= " - $new_message";
}
}
function report()
{
global $message, $err_state;
switch ($err_state) {
case 0:
$message = "TIKI OK - " . $message;
break;
case 1:
$message = "TIKI WARNING - " . $message;
break;
case 2:
$message = "TIKI CRITICAL - " . $message;
break;
case 3:
$message = "TIKI UNKNOWN - " . $message;
break;
}
fwrite(STDOUT, $message . PHP_EOL);
exit($err_state);
}
function displayError($message)
{
echo $message . PHP_EOL;
exit(3);
}
function check_bcc($data, $options)
{
global $message;
if (empty($options['bccwarn']) or empty($options['bcccrit'])) {
displayError("--bccwarn and --bcccrit need to be set");
}
$warn = $options['bccwarn'];
$crit = $options['bcccrit'];
if ($warn > $crit) {
displayError("--bcccrit needs to be bigger than --bccwarn");
}
$OPCodeCache = $data['OPCodeCache'];
if (is_null($OPCodeCache)) {
update_err_state(3, "OpCodeCache: None");
} else {
$OPCodeStats = get_object_vars($data['OpCodeStats']);
$mem_used = $OPCodeStats['memory_used'] * 100;
if ($mem_used > $crit) {
update_err_state(2, "OpCodeCache: $OPCodeCache $mem_used% mem used");
} elseif ($mem_used > $warn) {
update_err_state(1, "OpCodeCache: $OPCodeCache $mem_used% mem used");
} elseif ($mem_used < $warn) {
update_err_state(0, "OpCodeCache: $OPCodeCache $mem_used% mem used");
}
}
}
function check_db($data, $options)
{
if ($data['DbRequiresUpdate'] === true) {
update_err_state(2, "DB UPDATE NEEDED");
} elseif ($data['DbRequiresUpdate'] === false) {
update_err_state(0, "DB up to date");
} else {
update_err_state(3, "DB state unknown");
}
}
function check_searchindex($data, $options)
{
if (empty($options['sirwarn']) or empty($options['sircrit'])) {
displayError("--sircrit and --sirwarn need to be set");
}
$warn = $options['sirwarn'];
$crit = $options['sircrit'];
if ($warn > $crit) {
displayError("--sircrit needs to be bigger than --sirwarn");
}
$iCurrentEpoch = date('U');
$iDiffEpoch = $iCurrentEpoch - $data['SearchIndexRebuildLast'];
if (empty($data['SearchIndexRebuildLast'])) {
update_err_state(3, "Search Index never built");
} elseif ($data['SearchIndexRebuildLast'] < ($iCurrentEpoch - $crit)) {
update_err_state(1, "Search Index older than $crit sec|time=" . $iDiffEpoch . "s;;;0");
} elseif ($data['SearchIndexRebuildLast'] < ($iCurrentEpoch - $warn)) {
update_err_state(1, "Search Index older than $warn sec|time=" . $iDiffEpoch . "s;;;0");
} elseif ($data['SearchIndexRebuildLast'] > ($iCurrentEpoch - $warn)) {
update_err_state(0, "Search Index is fresh|time=" . $iDiffEpoch . "s;;;0");
} else {
update_err_state(3, "Search index state unknown");
}
}
$options = get_opts();
if (empty($options) or isset($options['h'])) {
help();
exit(1);
}
$data = get_data($options);
if (isset($options['c'])) {
$check = 'check_' . $options['c'];
$check($data, $options);
} else {
check_bcc($data, $options);
check_db($data, $options);
check_searchindex($data, $options);
}
report();