Added Separate check when server is down (#844)

Future request - separate checks when down.
Closes #755.
This commit is contained in:
Petr Suchy 2020-02-04 16:41:34 +01:00 committed by GitHub
parent 3568a5700b
commit 442f9d115e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 88 additions and 9 deletions

View File

@ -28,6 +28,9 @@
namespace {
// include main configuration and functionality
use psm\Router;
use psm\Util\Server\UpdateManager;
require_once __DIR__ . '/../src/bootstrap.php';
if (!psm_is_cli()) {
@ -81,21 +84,79 @@ namespace {
// however if the cron has been running for X mins, we'll assume it died and run anyway
// if you want to change PSM_CRON_TIMEOUT, have a look in src/includes/psmconfig.inc.php.
// or you can provide the --timeout=x argument
$status = null;
if (PHP_SAPI === 'cli') {
$shortOptions = 's:'; // status
$longOptions = [
'status:'
];
$options = getopt($shortOptions, $longOptions);
$possibleValues = [
'on' => 'on',
'1' => 'on',
'up' => 'on',
'off' => 'off',
'0' => 'off',
'down' => 'off'
];
if (
true === array_key_exists('status', $options) &&
true === array_key_exists(strtolower($options['status']), $possibleValues)
) {
$status = $possibleValues[$options['status']];
} elseif (
true === array_key_exists('s', $options) &&
true === array_key_exists(strtolower($options['s']), $possibleValues)
) {
$status = $possibleValues[$options['s']];
}
}
if ($status === 'off') {
$confPrefix = 'cron_off_';
} else {
$confPrefix = 'cron_';
}
$time = time();
if (
psm_get_conf('cron_running') == 1
psm_get_conf($confPrefix . 'running') == 1
&& $cron_timeout > 0
&& ($time - psm_get_conf('cron_running_time') < $cron_timeout)
&& ($time - psm_get_conf($confPrefix . 'running_time') < $cron_timeout)
) {
die('Cron is already running. Exiting.');
}
if (!defined('PSM_DEBUG') || !PSM_DEBUG) {
psm_update_conf('cron_running', 1);
psm_update_conf($confPrefix . 'running', 1);
}
psm_update_conf('cron_running_time', $time);
psm_update_conf($confPrefix . 'running_time', $time);
/** @var Router $router */
/** @var UpdateManager $autorun */
$autorun = $router->getService('util.server.updatemanager');
$autorun->run(true);
psm_update_conf('cron_running', 0);
if ($status !== 'off') {
$autorun->run(true, $status);
} else {
set_time_limit(60);
if (false === defined('CRON_DOWN_INTERVAL')) {
define('CRON_DOWN_INTERVAL', 5); // every 5 second call update
}
$start = time();
$i = 0;
while ($i < 59) {
$autorun->run(true, $status);
if ($i < (59 - CRON_DOWN_INTERVAL)) {
time_sleep_until($start + $i + CRON_DOWN_INTERVAL);
}
$i += CRON_DOWN_INTERVAL;
}
}
psm_update_conf($confPrefix . 'running', 0);
}

View File

@ -92,6 +92,16 @@ Please note that some distros have user-specific crontabs (e.g. Debian). If that
*/15 * * * * /usr/bin/php /var/www/html/phpservermon/cron/status.cron.php
If you want to check in different intervals online and offline servers you can use attribute `-s` (or `--status`) with value `on` or `off`.
So for example you want to check your servers which are online every 10 minutes and offline every 5 seconds. So configure two cron jobs::
*/10 * * * * /usr/bin/php /var/www/html/phpservermon/cron/status.cron.php -s on
*/1 * * * * /usr/bin/php /var/www/html/phpservermon/cron/status.cron.php -s off
By default `off` servers are checked every 5 seconds. If you want to change it add into your config file this constant with required value in seconds::
define('CRON_DOWN_INTERVAL', 1); // every 1 second call update
The update script has been designed to prevent itself from running multiple times. It has a maximum timeout of 10 minutes.
After that the script is assumed dead and the cronjob will run again.
If you want to change the 10 minutes timeout, find the constant "PSM_CRON_TIMEOUT" in src/includes/psmconfig.inc.php.
@ -144,3 +154,4 @@ If you have problems setting up or accessing your monitor and do not know why, e
To enable debug mode, add the following line to your config.php file::
define('PSM_DEBUG', true);

View File

@ -178,7 +178,9 @@ class Installer
('show_update', '1'),
('last_update_check', '0'),
('cron_running', '0'),
('cron_running_time', '0');";
('cron_running_time', '0'),
('cron_off_running', '0'),
('cron_off_running_time', '0');";
$this->execSQL($queries);
}

View File

@ -49,9 +49,14 @@ class UpdateManager implements ContainerAwareInterface
* Go :-)
*
* @param boolean $skip_perms if TRUE, no user permissions will be taken in account and all servers will be updated
* @param string|null $status If all servers (null), or just `on` or `off` should be checked.
*/
public function run($skip_perms = false)
public function run($skip_perms = false, $status = null)
{
if (false === in_array($status, ['on', 'off'], true)) {
$status = null;
}
// check if we need to restrict the servers to a certain user
$sql_join = '';
@ -67,7 +72,7 @@ class UpdateManager implements ContainerAwareInterface
`s`.`header_value`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover`,`s`.`telegram`
FROM `" . PSM_DB_PREFIX . "servers` AS `s`
{$sql_join}
WHERE `active`='yes' ";
WHERE `active`='yes' " . ($status !== null ? ' AND `status` = \'' . $status . '\'' : '');
$servers = $this->container->get('db')->query($sql);