Added Separate check when server is down (#844)
Future request - separate checks when down. Closes #755.pull/851/head
parent
3568a5700b
commit
442f9d115e
|
@ -28,6 +28,9 @@
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
// include main configuration and functionality
|
// include main configuration and functionality
|
||||||
|
use psm\Router;
|
||||||
|
use psm\Util\Server\UpdateManager;
|
||||||
|
|
||||||
require_once __DIR__ . '/../src/bootstrap.php';
|
require_once __DIR__ . '/../src/bootstrap.php';
|
||||||
|
|
||||||
if (!psm_is_cli()) {
|
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
|
// 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.
|
// 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
|
// 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();
|
$time = time();
|
||||||
if (
|
if (
|
||||||
psm_get_conf('cron_running') == 1
|
psm_get_conf($confPrefix . 'running') == 1
|
||||||
&& $cron_timeout > 0
|
&& $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.');
|
die('Cron is already running. Exiting.');
|
||||||
}
|
}
|
||||||
if (!defined('PSM_DEBUG') || !PSM_DEBUG) {
|
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 = $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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
*/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.
|
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.
|
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.
|
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::
|
To enable debug mode, add the following line to your config.php file::
|
||||||
|
|
||||||
define('PSM_DEBUG', true);
|
define('PSM_DEBUG', true);
|
||||||
|
|
||||||
|
|
|
@ -178,7 +178,9 @@ class Installer
|
||||||
('show_update', '1'),
|
('show_update', '1'),
|
||||||
('last_update_check', '0'),
|
('last_update_check', '0'),
|
||||||
('cron_running', '0'),
|
('cron_running', '0'),
|
||||||
('cron_running_time', '0');";
|
('cron_running_time', '0'),
|
||||||
|
('cron_off_running', '0'),
|
||||||
|
('cron_off_running_time', '0');";
|
||||||
$this->execSQL($queries);
|
$this->execSQL($queries);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,9 +49,14 @@ class UpdateManager implements ContainerAwareInterface
|
||||||
* Go :-)
|
* Go :-)
|
||||||
*
|
*
|
||||||
* @param boolean $skip_perms if TRUE, no user permissions will be taken in account and all servers will be updated
|
* @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
|
// check if we need to restrict the servers to a certain user
|
||||||
$sql_join = '';
|
$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`
|
`s`.`header_value`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover`,`s`.`telegram`
|
||||||
FROM `" . PSM_DB_PREFIX . "servers` AS `s`
|
FROM `" . PSM_DB_PREFIX . "servers` AS `s`
|
||||||
{$sql_join}
|
{$sql_join}
|
||||||
WHERE `active`='yes' ";
|
WHERE `active`='yes' " . ($status !== null ? ' AND `status` = \'' . $status . '\'' : '');
|
||||||
|
|
||||||
$servers = $this->container->get('db')->query($sql);
|
$servers = $this->container->get('db')->query($sql);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue