#!/usr/bin/php.cli
<?php

/*
 * Example Nagios configuration:
 * 
 * define command{
 * 		command_name		check_firebird
 * 		command_line			check_firebird.php -H $HOSTADDRESS$ -U '$ARG1$' -P '$ARG2$' -D '$ARG3$' -S '$ARG4$'
 * }
 * 
 * define service{
 * 		use								generic-service
 * 		host_name					dbsrv1
 * 		service_description	Query.database.fdb
 * 		contact_groups			admins
 * 		check_command		check_firebird!SYSDBA!masterkey!/path/to/database.fdb!SELECT first 10 DISTINCT RDB\$RELATION_NAME FROM RDB\$RELATION_FIELDS WHERE RDB\$SYSTEM_FLAG=0
 * }
 * 
 * define service{
 * 		use								generic-service
 * 		host_name					dbsrv2
 * 		service_description	Server.Firebird
 * 		contact_groups			admins
 * 		check_command		check_firebird!SYSDBA!masterkey
 * }
 * 
 * define service{
 * 		use								generic-service
 * 		host_name					dbsrv2
 * 		service_description	Service.Firebird
 * 		contact_groups			admins
 * 		check_command		check_firebird!SYSDBA!masterkey!/path/to/database.fdb
 * }
 */

$shortopts = "H:U:P:D:hS:";
$longopts = array("help", "host:", "username:", "password:", "database:", "sql:");
$ERROR_CODES = array('OK' => 0, 'WARNING' => 1, 'CRITICAL' => 2, 'UNKNOWN' => 3);
$ERROR_CODE = 2;

function printHelp() {
	$helpmsg = "Required arguments:\n";
	$helpmsg .= "-H, --host=HOST\n\thost to connect\n\n";
	$helpmsg .= "Optional arguments:\n";
	$helpmsg .= "-U, --username=USERNAME\n\tusername to connect with\n";
	$helpmsg .= "-P, --password=PASSWORD\n\tpassword to connect with\n";
	$helpmsg .= "-D, --database=DATABASE\n\tdatabase to connect\n";
	$helpmsg .= "-S, --sql=SQL\n\tsql query to run (returns output as \$LONGSERVICEOUTPUT\$)\n";
	$helpmsg .= "-h, --help\n\tthis message\n";
	echo "$helpmsg";
}

if ($argc <= 1) {
	echo "CRITICAL: WARNING: Wrong plugin configuration, check your Nagios files!\n";
	printHelp();
}

$opts = getopt($shortopts, $longopts);
if (array_key_exists("h", $opts) || array_key_exists("help", $opts)) {
	printHelp();
	exit($ERROR_CODE);
}
$optKeys = array_keys($opts);
$optSize = sizeof($opts);
$host = "";
$username = "";
$password = "";
$database = "";
$sql = 'SELECT DISTINCT RDB$RELATION_NAME FROM RDB$RELATION_FIELDS WHERE RDB$SYSTEM_FLAG=0;';
$ownSQL = false;
$longServiceOutput = "";

for ($i = 0; $i < $optSize; $i++) {
	$optKey = $optKeys[$i];

	switch ($optKey) {
		case 'H' :
		case 'host' :
			$host = $opts[$optKey];
			break;
		case 'U' :
		case 'username' :
			$username = $opts[$optKey];
			break;
		case 'P' :
		case 'password' :
			$password = $opts[$optKey];
			break;
		case 'D' :
		case 'database' :
			$database = $opts[$optKey];
			break;
		case 'S' :
		case 'sql' :
			if (strlen($opts[$optKey]) > 0) {
				$sql = $opts[$optKey];
				$ownSQL = true;
			}
			break;
	}
}
// Database engine information
if ($service = ibase_service_attach($host, $username, $password)) {
	$serverInfo = ibase_server_info($service, IBASE_SVC_SERVER_VERSION) . " / " . ibase_server_info($service, IBASE_SVC_IMPLEMENTATION);
	ibase_service_detach($service);
} else { // Connection to FirebirdSQL engine failed
	echo "CRITICAL: Firebird connection ERROR: " . ibase_errmsg() . "\n";
	exit($ERROR_CODES['CRITICAL']);
}

if (strlen($database) > 0) { // database as parameter
	$baseDN = $host . ":" . $database;
	// database connection
	if ($fbh = ibase_connect($baseDN, $username, $password)) {
		if ($fbQuery = ibase_query($fbh, $sql)) {
			if ($ownSQL) {// SQL as parameter, output of this query as $LONGSERVICEOUTPUT$
				$fbNumFields = ibase_num_fields($fbQuery);
				for ($i = 0; $i < $fbNumFields; $i++) {
					$fbFieldInfo = ibase_field_info($fbQuery, $i);
					$longServiceOutput .= $fbFieldInfo['alias'] . ";";
				}
				$longServiceOutput .= "\n";
				$fbRowsCount = 0;
				while ($fbRow = ibase_fetch_row($fbQuery)) {
					$rowSize = sizeof($fbRow);
					if ($rowSize > 0) {
						for ($i = 0; $i < $rowSize; $i++) {
							$longServiceOutput .= $fbRow[$i] . ";";
						}
						$longServiceOutput .= "\n";
					}
					$fbRowsCount++;
				}
				echo "OK: " . $baseDN . " @ " . $serverInfo . "|Records count: " . $fbRowsCount . "\n" . $longServiceOutput . "\n";
				$ERROR_CODE = $ERROR_CODES['OK'];
			} else {// default SQL
				echo "OK: " . $baseDN . " @ " . $serverInfo . "\n";
				$ERROR_CODE = $ERROR_CODES['OK'];
			}
		} else { // Database query failed
			echo "CRITICAL: $baseDN Database query error|" . ibase_errmsg() . "\n";
			$ERROR_CODE = $ERROR_CODES['CRITICAL'];
		}
		ibase_close($fbh);
	} else { // Database connection failed
		echo "ERROR: " . $baseDN . " @ " . $serverInfo . "|" . ibase_errmsg() . "\n";
		$ERROR_CODE = $ERROR_CODES['CRITICAL'];
	}

} else {
	echo "OK: " . $serverInfo . "\n";
	$ERROR_CODE = $ERROR_CODES['OK'];
}
exit($ERROR_CODE);
?>
