306 lines
12 KiB
PHP
306 lines
12 KiB
PHP
#!/usr/bin/php
|
|
<?php
|
|
/* ----------------------------------------------------------------------------
|
|
NagiosQL
|
|
-------------------------------------------------------------------------------
|
|
(c) 2005-2023 by Martin Willisegger
|
|
|
|
Project : NagiosQL
|
|
Component : Scripting API
|
|
Website : https://sourceforge.net/projects/nagiosql/
|
|
Version : 3.5.0
|
|
GIT Repo : https://gitlab.com/wizonet/NagiosQL
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
/*
|
|
To enable scripting functionality - comment out the line below
|
|
*/
|
|
exit;
|
|
//
|
|
use functions\MysqliDbClass;
|
|
use functions\NagConfigClass;
|
|
use functions\NagDataClass;
|
|
use functions\NagImportClass;
|
|
use functions\NagVisualClass;
|
|
|
|
/**
|
|
* Class and variable includes
|
|
* @var MysqliDbClass $myDBClass MySQL database class
|
|
* @var NagVisualClass $myVisClass Visual content class
|
|
* @var NagDataClass $myDataClass NagiosQL data class
|
|
* @var NagImportClass $myImportClass NagiosQL content class
|
|
* @var NagConfigClass $myConfigClass NagiosQL configuration class
|
|
*/
|
|
/*
|
|
Include preprocessing file
|
|
*/
|
|
$preAccess = 0;
|
|
$preNoMain = 1;
|
|
require str_replace('scripts', '', __DIR__) . 'functions/prepend_scripting.php';
|
|
/*
|
|
Process post parameters
|
|
*/
|
|
$argFunction = isset($argv[1]) ? htmlspecialchars($argv[1], ENT_QUOTES, 'utf-8') : 'none';
|
|
$argDomain = isset($argv[2]) ? htmlspecialchars($argv[2], ENT_QUOTES, 'utf-8') : 'none';
|
|
$argObject = isset($argv[3]) ? htmlspecialchars($argv[3], ENT_QUOTES, 'utf-8') : 'none';
|
|
if ((($argDomain === 'none')) || (($argFunction === 'write') && ($argObject === 'none')) ||
|
|
(($argFunction !== 'write') && ($argFunction !== 'check') && ($argFunction !== 'restart') && ($argFunction !== 'import'))) {
|
|
echo 'Usage: ' . htmlspecialchars($argv[0], ENT_QUOTES, 'utf-8') . " function domain [object]\n";
|
|
echo "function = write/check/restart/import\n";
|
|
echo "domain = domain name like 'localhost'\n";
|
|
echo "object = object name, see below:\n";
|
|
echo "import: object = file name like 'hostgroups.cfg' or 'localhost.cfg'\n";
|
|
echo "write: object = table name like 'tbl_contact' or simplier 'contact' without 'tbl_'\n";
|
|
echo "Attention: import function replaces existing data!\n";
|
|
echo "Note that the new backup and configuration files becomes the UID/GID\nfrom the calling user and probably ";
|
|
echo "can't be deleted via web GUI anymore!\n";
|
|
exit(1);
|
|
}
|
|
/*
|
|
Get domain ID
|
|
*/
|
|
$strSQL = "SELECT `targets` FROM `tbl_datadomain` WHERE `domain`='$argDomain'";
|
|
$intTarget = $myDBClass->getFieldData($strSQL);
|
|
$strSQL = "SELECT `id` FROM `tbl_datadomain` WHERE `domain`='$argDomain'";
|
|
$intDomain = $myDBClass->getFieldData($strSQL);
|
|
if ($intDomain === '') {
|
|
echo "Domain '" . $argDomain . "' doesn not exist\n";
|
|
exit(1);
|
|
}
|
|
if ($intDomain === '0') {
|
|
echo "Domain '" . $argDomain . "' cannot be used\n";
|
|
exit(1);
|
|
}
|
|
$myDataClass->intDomainId = $intDomain;
|
|
$myConfigClass->intDomainId = $intDomain;
|
|
$myImportClass->intDomainId = $intDomain;
|
|
$strMethod = '';
|
|
$intMethod = 0;
|
|
/* Get connection method */
|
|
if ($myConfigClass->getConfigData($intTarget, 'method', $strMethod) === 0) {
|
|
$intMethod = (int)$strMethod;
|
|
}
|
|
/*
|
|
Process form variables
|
|
*/
|
|
if ($argFunction === 'check') {
|
|
$myConfigClass->getConfigData($intTarget, 'binaryfile', $strBinary);
|
|
$myConfigClass->getConfigData($intTarget, 'basedir', $strBaseDir);
|
|
$myConfigClass->getConfigData($intTarget, 'nagiosbasedir', $strNagiosBaseDir);
|
|
$myConfigClass->getConfigData($intTarget, 'conffile', $strConffile);
|
|
if ($intMethod === 1) {
|
|
if (file_exists($strBinary) && is_executable($strBinary)) {
|
|
$resFile = popen($strBinary . ' -v ' . $strConffile, 'r');
|
|
} else {
|
|
echo "Cannot find the Nagios binary or no execute permissions!\n";
|
|
exit(1);
|
|
}
|
|
} elseif ($intMethod === 2) {
|
|
$booReturn = 0;
|
|
if (empty($myConfigClass->conFTPConId)) {
|
|
$booReturn = $myConfigClass->getFTPConnection($intTarget);
|
|
}
|
|
if ($booReturn === 1) {
|
|
$myVisClass->processMessage($myDataClass->strErrorMessage, $strErrorMessage);
|
|
} else {
|
|
$intErrorReporting = error_reporting();
|
|
error_reporting(0);
|
|
if (!($resFile = ftp_exec($myConfigClass->conFTPConId, $strBinary . ' -v ' . $strConffile))) {
|
|
echo "Remote execution (FTP SITE EXEC) is not supported on your system!\n";
|
|
error_reporting($intErrorReporting);
|
|
exit(1);
|
|
}
|
|
ftp_close($myConfigClass->conFTPConId);
|
|
error_reporting($intErrorReporting);
|
|
}
|
|
} elseif ($intMethod === 3) {
|
|
$booReturn = 0;
|
|
if (empty($myConfigClass->resSSHConId) || !is_resource($myConfigClass->resSSHConId)) {
|
|
$booReturn = $myConfigClass->getSSHConnection($intTarget);
|
|
}
|
|
if ($booReturn === 1) {
|
|
echo 'SSH connection failure: ' . str_replace('::', "\n", $myConfigClass->strErrorMessage);
|
|
exit(1);
|
|
}
|
|
$intRet1 = $myConfigClass->sendSSHCommand('ls ' . $strBinary, $arrRet1);
|
|
$intRet2 = $myConfigClass->sendSSHCommand('ls ' . $strConffile, $arrRet2);
|
|
if (($intRet1 === 0) && ($intRet2 === 0) && is_array($arrRet1) && is_array($arrRet2)) {
|
|
$intRet3 = $myConfigClass->sendSSHCommand($strBinary . ' -v ' . $strConffile, $arrResult);
|
|
if ($intRet3 !== 0) {
|
|
echo "Remote execution of nagios verify command failed (remote SSH)!\n";
|
|
exit(1);
|
|
}
|
|
} else {
|
|
echo "Nagios binary or configuration file not found (remote SSH)!\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
if ($argFunction === 'restart') {
|
|
/* Read config file */
|
|
$myConfigClass->getConfigData($intTarget, 'commandfile', $strCommandfile);
|
|
$myConfigClass->getConfigData($intTarget, 'pidfile', $strPidfile);
|
|
/* Check state nagios demon */
|
|
clearstatcache();
|
|
if ($intMethod === 1) {
|
|
if (file_exists($strPidfile)) {
|
|
if (file_exists($strCommandfile) && is_writable($strCommandfile)) {
|
|
$strCommandString = '[' . time() . '] RESTART_PROGRAM;' . time() . "\n";
|
|
$timeout = 3;
|
|
$old = ini_set('default_socket_timeout', $timeout);
|
|
$resCmdFile = fopen($strCommandfile, 'wb');
|
|
ini_set('default_socket_timeout', $old);
|
|
stream_set_timeout($resCmdFile, $timeout);
|
|
stream_set_blocking($resCmdFile, 0);
|
|
if ($resCmdFile) {
|
|
fwrite($resCmdFile, $strCommandString);
|
|
fclose($resCmdFile);
|
|
echo "Restart command successfully send to Nagios\n";
|
|
exit(0);
|
|
}
|
|
}
|
|
echo "Restart failed - Nagios command file not found or no execute permissions\n";
|
|
exit(1);
|
|
}
|
|
echo "Nagios daemon is not running, cannot send restart command!\n";
|
|
exit(1);
|
|
}
|
|
if ($intMethod === 2) {
|
|
echo "Nagios restart is not possible via FTP remote connection!\n";
|
|
exit(1);
|
|
}
|
|
if ($intMethod === 3) {
|
|
$booReturn = 0;
|
|
if (empty($myConfigClass->resSSHConId) || !is_resource($myConfigClass->resSSHConId)) {
|
|
$booReturn = $myConfigClass->getSSHConnection($intTarget);
|
|
}
|
|
if ($booReturn === 1) {
|
|
$myVisClass->processMessage($myDataClass->strErrorMessage, $strErrorMessage);
|
|
} else {
|
|
$intRet1 = $myConfigClass->sendSSHCommand('ls ' . $strCommandfile, $arrRet1);
|
|
if (($intRet1 === 0) && is_array($arrRet1)) {
|
|
$strCommandString = '[' . time() . '] RESTART_PROGRAM;' . time() . "\n";
|
|
$strCommand = 'echo "' . $strCommandString . '" >> ' . $strCommandfile;
|
|
$intRet2 = $myConfigClass->sendSSHCommand($strCommand, $arrResult);
|
|
if ($intRet2 !== 0) {
|
|
echo "Restart failed - Nagios command file not found or no rights to execute (remote SSH)!\n";
|
|
exit(1);
|
|
}
|
|
echo "Nagios daemon successfully restarted (remote SSH)\n";
|
|
exit(0);
|
|
}
|
|
echo "Nagios command file not found (remote SSH)!\n";
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
if ($argFunction === 'write') {
|
|
if (substr_count($argObject, 'tbl_') !== 0) {
|
|
$argObject = str_replace('tbl_', '', $argObject);
|
|
}
|
|
if (substr_count($argObject, '.cfg') !== 0) {
|
|
$argObject = str_replace('.cfg', '', $argObject);
|
|
}
|
|
if ($argObject === 'host') {
|
|
/* Write host configuration */
|
|
$strInfo = "Write host configurations ...\n";
|
|
$strSQL = "SELECT `id` FROM `tbl_host` WHERE `config_id` = $intDomain AND `active`='1'";
|
|
$myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
|
|
$intError = 0;
|
|
if ($intDataCount !== 0) {
|
|
foreach ($arrData as $data) {
|
|
$intReturn = $myConfigClass->createConfigSingle('tbl_host', $data['id']);
|
|
if ($intReturn === 1) {
|
|
$intError++;
|
|
}
|
|
}
|
|
}
|
|
if ($intError === 0) {
|
|
$strInfo .= "Host configuration files successfully written!\n";
|
|
} else {
|
|
$strInfo .= "Cannot open/overwrite the configuration file (check the permissions)!\n";
|
|
}
|
|
} elseif ($argObject === 'service') {
|
|
/* Write service configuration */
|
|
$strInfo = "Write service configurations ...\n";
|
|
$strSQL = 'SELECT `id`, `config_name` FROM `tbl_service` '
|
|
. "WHERE `config_id` = $intDomain AND `active`='1' GROUP BY `config_name`";
|
|
$myDBClass->hasDataArray($strSQL, $arrData, $intDataCount);
|
|
$intError = 0;
|
|
if ($intDataCount !== 0) {
|
|
foreach ($arrData as $data) {
|
|
$intReturn = $myConfigClass->createConfigSingle('tbl_service', $data['id']);
|
|
if ($intReturn === 1) {
|
|
$intError++;
|
|
}
|
|
}
|
|
}
|
|
if ($intError === 0) {
|
|
$strInfo .= "Service configuration file successfully written!\n";
|
|
} else {
|
|
$strInfo .= "Cannot open/overwrite the configuration file (check the permissions)!\n";
|
|
}
|
|
} else {
|
|
$strInfo = 'Write ' . $argObject . ".cfg ...\n";
|
|
$booReturn = $myConfigClass->createConfig('tbl_' . $argObject);
|
|
if ($booReturn === 0) {
|
|
$strInfo .= 'Configuration file ' . $argObject . ".cfg successfully written!\n";
|
|
} else {
|
|
echo $myConfigClass->strErrorMessage;
|
|
$strInfo .= 'Cannot open/overwrite the configuration file ' . $argObject . '.cfg (check the permissions or '
|
|
. 'probably tbl_' . $argObject . " does not exists)!\n";
|
|
}
|
|
}
|
|
echo $strInfo;
|
|
}
|
|
if ($argFunction === 'import') {
|
|
$strInfo = "Importing configurations ...\n";
|
|
$intReturn = $myImportClass->fileImport($argObject, $intTarget, '1');
|
|
if ($intReturn !== 0) {
|
|
$strInfo .= $myImportClass->strErrorMessage;
|
|
} else {
|
|
$strInfo .= $myImportClass->strInfoMessage;
|
|
}
|
|
$strInfo = strip_tags($strInfo);
|
|
echo str_replace('::', "\n", $strInfo);
|
|
}
|
|
/*
|
|
Output processing
|
|
*/
|
|
if (isset($resFile) && ($resFile !== false)) {
|
|
$intError = 0;
|
|
$intWarning = 0;
|
|
$strOutput = '';
|
|
while (!feof($resFile)) {
|
|
$strLine = fgets($resFile, 1024);
|
|
if (substr_count($strLine, 'Error:') !== 0) {
|
|
$intError++;
|
|
}
|
|
if (substr_count($strLine, 'Warning:') !== 0) {
|
|
$intWarning++;
|
|
}
|
|
$strOutput .= $strLine;
|
|
}
|
|
pclose($resFile);
|
|
echo $strOutput."\n";
|
|
if (($intError === 0) && ($intWarning === 0)) {
|
|
echo "Written configuration files are valid, Nagios can be restarted!\n\n";
|
|
}
|
|
} elseif (isset($arrResult) && is_array($arrResult)) {
|
|
$intError = 0;
|
|
$intWarning = 0;
|
|
$strOutput = '';
|
|
foreach ($arrResult as $elem) {
|
|
if (substr_count($elem, 'Error:') !== 0) {
|
|
$intError++;
|
|
}
|
|
if (substr_count($elem, 'Warning:') !== 0) {
|
|
$intWarning++;
|
|
}
|
|
$strOutput .= $elem."\n";
|
|
}
|
|
echo $strOutput."\n";
|
|
if (($intError === 0) && ($intWarning === 0)) {
|
|
echo "Written configuration files are valid, Nagios can be restarted!\n\n";
|
|
}
|
|
} |