diff --git a/includes/functions.php b/includes/functions.php index b04a5f3..1504bac 100644 --- a/includes/functions.php +++ b/includes/functions.php @@ -3423,7 +3423,7 @@ function thold_check_threshold(&$thold_data) { } } - if (api_plugin_is_enabled('maint') && plugin_maint_check_cacti_host($thold_data['host_id'])) { + if (api_plugin_is_enabled('maint') && function_exists('plugin_maint_check_cacti_host') && plugin_maint_check_cacti_host($thold_data['host_id'])) { $maint_dev = true; } else { $maint_dev = false; diff --git a/includes/polling.php b/includes/polling.php index 51b6898..202ed2f 100644 --- a/includes/polling.php +++ b/includes/polling.php @@ -637,7 +637,7 @@ function thold_update_host_status() { $msg = thold_str_replace('', $host['notes'], $msg); $msg = thold_str_replace("\n", '
', $msg); - if (api_plugin_is_enabled('maint') && plugin_maint_check_cacti_host($host['id'])) { + if (api_plugin_is_enabled('maint') && function_exists('plugin_maint_check_cacti_host') && plugin_maint_check_cacti_host($host['id'])) { cacti_log('WARNING: Device[' . $host['id'] . '] Hostname[' . $host['hostname'] . '] is recovering! Only logging, maint device', true, 'THOLD'); } else { switch ($host['thold_send_email']) { @@ -764,7 +764,7 @@ function thold_update_host_status() { $alert_email = read_config_option('alert_email'); - if (api_plugin_is_enabled('maint') && plugin_maint_check_cacti_host($host['id'])) { + if (api_plugin_is_enabled('maint') && function_exists('plugin_maint_check_cacti_host') && plugin_maint_check_cacti_host($host['id'])) { cacti_log('WARNING: Device[' . $host['id'] . '] Hostname[' . $host['hostname'] . '] is DOWN. Only logging, maint device', true, 'THOLD'); } else { if (strtotime($host['status_fail_date']) > 192800 || strtotime($host['status_rec_date']) > 192800) { diff --git a/tests/Unit/MaintCheckGuardTest.php b/tests/Unit/MaintCheckGuardTest.php new file mode 100644 index 0000000..22b2531 --- /dev/null +++ b/tests/Unit/MaintCheckGuardTest.php @@ -0,0 +1,123 @@ +maintIncludesRoot(); + + set_error_handler(static fn (): bool => true); + ob_start(); + + try { + thold_update_host_status(); + } finally { + ob_end_clean(); + restore_error_handler(); + } + } + + /** + * A recovered device inside a maintenance window is logged, not alerted. + * + * @return void + */ + public function testRecoveringDeviceInMaintenanceIsLoggedNotAlerted(): void { + CactiStubs::willReturnFor('db_fetch_assoc', 'plugin_thold_host_failed', [['host_id' => 42]]); + CactiStubs::willReturnFor('db_fetch_row_prepared', 'FROM host WHERE id', [ + 'id' => 42, + 'hostname' => 'dev42', + 'description' => 'Device 42', + 'status' => HOST_UP, + 'snmp_community' => '', + 'snmp_username' => '', + 'snmp_version' => 0, + 'site_id' => 0, + 'location' => '', + 'notes' => '', + 'status_fail_date' => '0000-00-00 00:00:00', + 'availability' => 100, + 'total_polls' => 1, + 'failed_polls' => 0, + 'cur_time' => 0, + 'avg_time' => 0, + 'thold_send_email' => '0', + ]); + + $this->runHostStatus(); + + $this->assertContains( + 'WARNING: Device[42] Hostname[dev42] is recovering! Only logging, maint device', + CactiStubs::$log + ); + } + + /** + * A down device inside a maintenance window is logged, not alerted. + * + * @return void + */ + public function testDownDeviceInMaintenanceIsLoggedNotAlerted(): void { + CactiStubs::willReturnFor('db_fetch_assoc_prepared', 'availability_method', [[ + 'id' => 77, + 'hostname' => 'dev77', + ]]); + + $this->runHostStatus(); + + $this->assertContains( + 'WARNING: Device[77] Hostname[dev77] is DOWN. Only logging, maint device', + CactiStubs::$log + ); + } +} diff --git a/tests/bootstrap-unit.php b/tests/bootstrap-unit.php index ae80db4..bfffd08 100644 --- a/tests/bootstrap-unit.php +++ b/tests/bootstrap-unit.php @@ -669,6 +669,12 @@ if (!function_exists('number_format_i18n')) { } } +if (!function_exists('html_split_string')) { + function html_split_string($string, $length = 76, $forgiving = 10) { + return $string; + } +} + if (!defined('FILTER_VALIDATE_IS_REGEX')) { define('FILTER_VALIDATE_IS_REGEX', 99999); }