From 7f1f71dcf00724bb72fc4a6c7c3a3d060370be02 Mon Sep 17 00:00:00 2001 From: Digimer Date: Mon, 11 Oct 2021 01:49:30 -0400 Subject: [PATCH] Updated scan-apc-pdu to remove PDUs that are associated with fence devices that have beed deleted. Updated scan-network to set a health score against an interface that has been missing for 1 minute, instead of waiting for 5 minutes. Signed-off-by: Digimer --- scancore-agents/scan-apc-pdu/scan-apc-pdu | 113 +++++++++++++++++- scancore-agents/scan-apc-pdu/scan-apc-pdu.xml | 3 +- scancore-agents/scan-network/scan-network | 4 +- 3 files changed, 111 insertions(+), 9 deletions(-) diff --git a/scancore-agents/scan-apc-pdu/scan-apc-pdu b/scancore-agents/scan-apc-pdu/scan-apc-pdu index 8199c023..940f75be 100755 --- a/scancore-agents/scan-apc-pdu/scan-apc-pdu +++ b/scancore-agents/scan-apc-pdu/scan-apc-pdu @@ -237,7 +237,7 @@ SELECT FROM scan_apc_pdus ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); my $count = @{$results}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { @@ -325,7 +325,7 @@ SELECT FROM scan_apc_pdu_phases ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); # Do the query against the source DB and loop through the results. $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); @@ -378,7 +378,7 @@ SELECT FROM scan_apc_pdu_outlets ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); $count = @{$results}; @@ -406,7 +406,7 @@ FROM # Which serial number does this phase belong to? my $scan_apc_pdu_serial_number = $anvil->data->{uuid_to_serial}{$scan_apc_pdu_outlet_scan_apc_pdu_uuid}; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { scan_apc_pdu_serial_number => $scan_apc_pdu_serial_number }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { scan_apc_pdu_serial_number => $scan_apc_pdu_serial_number }}); $anvil->data->{sql}{scan_apc_pdu_uuid}{$scan_apc_pdu_outlet_scan_apc_pdu_uuid}{scan_apc_pdu_outlets}{$scan_apc_pdu_outlet_number}{scan_apc_pdu_outlet_uuid} = $scan_apc_pdu_outlet_uuid; $anvil->data->{sql}{scan_apc_pdu_uuid}{$scan_apc_pdu_outlet_scan_apc_pdu_uuid}{scan_apc_pdu_outlets}{$scan_apc_pdu_outlet_number}{scan_apc_pdu_outlet_scan_apc_pdu_uuid} = $scan_apc_pdu_outlet_scan_apc_pdu_uuid; @@ -434,7 +434,7 @@ SELECT FROM scan_apc_pdu_variables ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); $count = @{$results}; @@ -2590,10 +2590,12 @@ FROM fences WHERE fence_agent LIKE 'fence_apc_%' +AND + fence_arguments != 'DELETED' ORDER BY fence_name ASC ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); my $count = @{$results}; @@ -2623,6 +2625,90 @@ ORDER BY "fences::fence_uuid::${fence_uuid}::name" => $anvil->data->{fences}{fence_uuid}{$fence_uuid}{name}, "fences::fence_uuid::${fence_uuid}::ip_address" => $anvil->data->{fences}{fence_uuid}{$fence_uuid}{ip_address}, }}); + + # If there are two or more entries in scan_apc_pdu for this fence UUID, remove the extras. + my $query = " +SELECT + scan_apc_pdu_uuid, + scan_apc_pdu_model_number +FROM + scan_apc_pdus +WHERE + scan_apc_pdu_fence_uuid = ".$anvil->Database->quote($fence_uuid)." +;"; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); + + my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); + my $count = @{$results}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { + results => $results, + count => $count, + }}); + if ($count > 1) + { + # Duplicate! Is one of them marked as DELETED? + foreach my $row (@{$results}) + { + # Is this one deleted? + my $scan_apc_pdu_uuid = $row->[0]; + my $scan_apc_pdu_model_number = $row->[1]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + scan_apc_pdu_uuid => $scan_apc_pdu_uuid, + scan_apc_pdu_model_number => $scan_apc_pdu_model_number, + }}); + + if ($scan_apc_pdu_model_number eq "DELETED") + { + # Take this one out. + my $variables = { + name => $fence_name, + uuid => $scan_apc_pdu_uuid, + }; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_apc_pdu_log_0002", variables => $variables}); + $anvil->Alert->register({ + alert_level => "notice", + message => "scan_apc_pdu_log_0002", + variables => $variables, + set_by => $THIS_FILE, + sort_position => $anvil->data->{'scan-apc-pdu'}{alert_sort}++, + }); + + delete_pdu($anvil, $scan_apc_pdu_uuid); + $count--; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }}); + } + last if $count == 1; + } + + # If count is still > 1, we need to arbitrarily delete an interface. + if ($count > 1) + { + foreach my $row (@{$results}) + { + # Is this one deleted? + my $scan_apc_pdu_uuid = $row->[0]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { scan_apc_pdu_uuid => $scan_apc_pdu_uuid }}); + + my $variables = { + name => $fence_name, + uuid => $scan_apc_pdu_uuid, + }; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_apc_pdu_log_0002", variables => $variables}); + $anvil->Alert->register({ + alert_level => "notice", + message => "scan_apc_pdu_log_0002", + variables => $variables, + set_by => $THIS_FILE, + sort_position => $anvil->data->{'scan-apc-pdu'}{alert_sort}++, + }); + delete_pdu($anvil, $scan_apc_pdu_uuid); + + $count--; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { count => $count }}); + } + last if $count == 1; + } + } } } @@ -2630,3 +2716,18 @@ ORDER BY $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { pdu_count => $pdu_count }}); return($pdu_count); } + +sub delete_pdu +{ + my ($anvil, $scan_apc_pdu_uuid) = @_; + + my $queries = [ + "DELETE FROM scan_apc_pdu_variables WHERE scan_apc_pdu_variable_scan_apc_pdu_uuid = ".$anvil->Database->quote($scan_apc_pdu_uuid).";", + "DELETE FROM scan_apc_pdu_phases WHERE scan_apc_pdu_phase_scan_apc_pdu_uuid = ".$anvil->Database->quote($scan_apc_pdu_uuid).";", + "DELETE FROM scan_apc_pdu_outlets WHERE scan_apc_pdu_outlet_scan_apc_pdu_uuid = ".$anvil->Database->quote($scan_apc_pdu_uuid).";", + "DELETE FROM scan_apc_pdus WHERE scan_apc_pdu_uuid = ".$anvil->Database->quote($scan_apc_pdu_uuid).";" + ]; + $anvil->Database->write({query => $queries, source => $THIS_FILE, line => __LINE__}); + + return(0); +} \ No newline at end of file diff --git a/scancore-agents/scan-apc-pdu/scan-apc-pdu.xml b/scancore-agents/scan-apc-pdu/scan-apc-pdu.xml index 9fd575ac..50f48ac3 100644 --- a/scancore-agents/scan-apc-pdu/scan-apc-pdu.xml +++ b/scancore-agents/scan-apc-pdu/scan-apc-pdu.xml @@ -21,6 +21,7 @@ NOTE: All string keys MUST be prefixed with the agent name! ie: 'scan_apc_pdu_lo Starting: [#!variable!program!#]. + [ Note ] - The APC PDU associated with the fence device: [#!variable!name!#] with 'scan_apc_pdu_uuid': [#!variable!uuid!#] is a duplicate, removing it from the database(s). No APC PDUs found as configured fence devices, nothing to do. @@ -44,7 +45,7 @@ NOTE: All string keys MUST be prefixed with the agent name! ie: 'scan_apc_pdu_lo The PDU: [#!variable!name!#] appears to have rebooted. The uptime changed from; [#!variable!old_uptime!#] to: [#!variable!new_uptime!#]. Was the power restored after a power outage? The wattage draw through the PDU: [#!variable!name!#] has changed from: [#!variable!old_total_wattage_draw!#] to: [#!variable!new_total_wattage_draw!#]. The phase number: [#!variable!phase!#] on the PDU: [#!variable!name!#] has returned. - The maximum amperage threshold on the phase: [#!variable!phase!#] of the PDU: [#!variable!name!#] has changed from: [#!variable!old_phase_max_amperage#] to: [#!variable!new_phase_max_amperage!#]. + The maximum amperage threshold on the phase: [#!variable!phase!#] of the PDU: [#!variable!name!#] has changed from: [#!variable!old_phase_max_amperage!#] to: [#!variable!new_phase_max_amperage!#]. The amperage draw on phase: [#!variable!phase!#] of the PDU: [#!variable!name!#] has changed from: [#!variable!old_phase_current_amperage!#] to: [#!variable!new_phase_current_amperage!#]. The amperage drawing through the phase: [#!variable!phase!#] of the PDU: [#!variable!name!#] is below the low-warning threshold. This is not a concern for the Anvil!, but would only happen if a user configured a low draw alert. So this could be a concern to a user of this Anvil! system. The amperage drawing through the phase: [#!variable!phase!#] of the PDU: [#!variable!name!#] has rised over the high critical alert threshold! diff --git a/scancore-agents/scan-network/scan-network b/scancore-agents/scan-network/scan-network index 333765b6..d44e1b07 100755 --- a/scancore-agents/scan-network/scan-network +++ b/scancore-agents/scan-network/scan-network @@ -3437,14 +3437,14 @@ AND } else { + # Has the interface been down for at least a minute? my $age = $anvil->Alert->check_condition_age({ debug => 2, name => $source_name, host_uuid => $anvil->Get->host_uuid, }); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { age => $age }}); - - if ($age > 300) + if ($age > 60) { # New, save. my ($health_uuid) = $anvil->Database->insert_or_update_health({