From 4be943ebf34d9c6e41c144a78dfe3f9902a2b04a Mon Sep 17 00:00:00 2001 From: Digimer Date: Wed, 16 Sep 2020 01:19:21 -0400 Subject: [PATCH] * Finished (initial) testing of scan-hardware. The first M3 scan agent is done! * Updated Alert->check_alert_sent() and the 'alert_sent' table to remove 'alert_name' as it really isn't helpful given record_locator. * Created 'Database->purge_data' that takes an array of tables and, in reverse, purges them from the database(s). This also disables archiving and resync functions now. Signed-off-by: Digimer --- Anvil/Tools/Alert.pm | 19 -- Anvil/Tools/Database.pm | 141 +++++++++++-- Anvil/Tools/ScanCore.pm | 12 +- notes | 1 + scancore-agents/scan-hardware/scan-hardware | 188 ++++++++++-------- .../scan-hardware/scan-hardware.xml | 6 +- share/anvil.sql | 2 +- share/words.xml | 3 +- tools/test.pl | 16 ++ 9 files changed, 265 insertions(+), 123 deletions(-) diff --git a/Anvil/Tools/Alert.pm b/Anvil/Tools/Alert.pm index d348b51d..0e684ced 100644 --- a/Anvil/Tools/Alert.pm +++ b/Anvil/Tools/Alert.pm @@ -85,10 +85,6 @@ If there is a problem, C<< !!error!! >> is returned. Parameters; -=head3 name (required) - -This is the name of the alert. So for an alert related to a critically high temperature, this might get set to C<< temperature_high_critical >>. It is meant to compliment the C<< record_locator >> parameter. - =head3 record_locator This is a record locator, which generally allows a given alert to be tied to a given source. For example, an alert related to a temperature might use C<< an-a01n01.alteeve.com:cpu1_temperature >>. @@ -112,25 +108,15 @@ sub check_alert_sent my $anvil = $self->parent; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0125", variables => { method => "Alert->check_alert_sent()" }}); - my $name = defined $parameter->{name} ? $parameter->{name} : ""; my $record_locator = defined $parameter->{record_locator} ? $parameter->{record_locator} : ""; my $set_by = defined $parameter->{set_by} ? $parameter->{set_by} : ""; my $clear = defined $parameter->{clear} ? $parameter->{clear} : 0; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { - name => $name, record_locator => $record_locator, set_by => $set_by, clear => $clear, }}); - # Do we have an alert name? - if (not $name) - { - # Nope - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0020", variables => { method => "Alert->check_alert_sent()", parameter => "name" }}); - return("!!error!!"); - } - # Do we have an record locator? if (not $record_locator) { @@ -161,8 +147,6 @@ AND alert_set_by = ".$anvil->Database->quote($set_by)." AND alert_record_locator = ".$anvil->Database->quote($record_locator)." -AND - alert_name = ".$anvil->Database->quote($name)." ;"; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { query => $query }}); @@ -202,7 +186,6 @@ WHERE clear => $clear, set_by => $set_by, record_locator => $record_locator, - name => $name, }}); return("!!error!!"); } @@ -222,14 +205,12 @@ INSERT INTO alert_sent_host_uuid, alert_set_by, alert_record_locator, - alert_name, modified_date ) VALUES ( ".$anvil->Database->quote($anvil->Get->uuid).", ".$anvil->Database->quote($anvil->Get->host_uuid).", ".$anvil->Database->quote($set_by).", ".$anvil->Database->quote($record_locator).", - ".$anvil->Database->quote($name).", ".$anvil->Database->quote($anvil->data->{sys}{database}{timestamp})." ); "; diff --git a/Anvil/Tools/Database.pm b/Anvil/Tools/Database.pm index aa7236a6..48847f0b 100644 --- a/Anvil/Tools/Database.pm +++ b/Anvil/Tools/Database.pm @@ -497,10 +497,8 @@ sub check_agent_data $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0125", variables => { method => "Database->check_agent_data()" }}); my $agent = defined $parameter->{agent} ? $parameter->{agent} : ""; - my $tables = defined $parameter->{tables} ? $parameter->{tables} : ""; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { agent => $agent, - tables => $tables, }}); if (not $agent) @@ -511,10 +509,10 @@ sub check_agent_data my $schema_file = $anvil->data->{path}{directories}{scan_agents}."/".$agent."/".$agent.".sql"; my $loaded = $anvil->Database->check_for_schema({ - debug => 2, + debug => $debug, file => $schema_file, }); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { loaded => $loaded, schema_file => $schema_file, }}); @@ -528,7 +526,7 @@ sub check_agent_data record_locator => "schema_load_failure", set_by => $agent, }); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { changed => $changed }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { changed => $changed }}); if ($changed) { # Log and register an alert. This should never happen, so we set it as a @@ -554,7 +552,7 @@ sub check_agent_data set_by => $agent, clear => 1, }); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { changed => $changed }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { changed => $changed }}); if ($changed) { # Register an alert cleared message. @@ -576,7 +574,7 @@ sub check_agent_data foreach my $uuid (@{$loaded}) { my $host_name = $anvil->Database->get_host_from_uuid({short => 1, host_uuid => $uuid}); - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 2, key => "message_0183", variables => { + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => $debug, key => "message_0183", variables => { agent_name => $agent, host_name => $host_name, @@ -649,7 +647,7 @@ sub check_for_schema my $table = ""; my $schema = "public"; - my $body = $anvil->Storage->read_file({file => $file}); + my $body = $anvil->Storage->read_file({debug => $debug, file => $file}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { body => $body }}); foreach my $line (split/\n/, $body) { @@ -677,7 +675,7 @@ sub check_for_schema # Did we find a table? if (not $table) { - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0050"}); + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0097", variables => { file => $file}}); return("!!error!!"); } @@ -718,6 +716,7 @@ sub check_for_schema # Write out the schema now. $anvil->Database->write({ + debug => $debug, uuid => $uuid, transaction => 1, query => $body, @@ -11232,8 +11231,8 @@ sub log_connections }}); my $query = "SELECT system_identifier FROM pg_control_system();"; - my $identifier = $anvil->Database->query({uuid => $uuid, debug => ($debug + 1), query => $query, source => $THIS_FILE, line => __LINE__})->[0]->[0]; - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => ($debug + 1), key => "log_0540", variables => { + my $identifier = $anvil->Database->query({uuid => $uuid, debug => $debug, query => $query, source => $THIS_FILE, line => __LINE__})->[0]->[0]; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0540", variables => { uuid => $uuid, identifier => $identifier, }}); @@ -11746,6 +11745,114 @@ sub mark_active } +=head2 purge_data + +This method takes an array reference of table name and will delete them in reverse order. + +Specifically, it takes each table name and looks for an associated function called C<< history_() >> and calls a C<< DROP ... CASCADE; >> (which takes an associated TRIGGER with it), then looks to see if there is a table in the C<< history >> and C<< public >> schemas, DROP'ing them if found. + +This method is designed to allow ScanCore scan agents to be called with C<< --purge >> so that collected data can be purged from the database(s) without deleting non-ScanCore data. + +This method returns C<< !!error!! >> if there is a problem, and C<< 0 >> otherwise. + +Parameters; + +=head3 tables (required) + +This is an array reference of table tables to search more. There is no need to specify schema as both C<< public >> and C<< history >> schemas are checked automatically. + +This array is walked through in reverse order to allow the same array that is used to load and resync data to be used here. + +=cut +sub purge_data +{ + my $self = shift; + my $parameter = shift; + my $anvil = $self->parent; + my $debug = defined $parameter->{debug} ? $parameter->{debug} : 3; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0125", variables => { method => "Database->purge_data()" }}); + + my $tables = $parameter->{tables} ? $parameter->{tables} : ""; + + if (not $tables) + { + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0020", variables => { method => "Database->purge_data()", parameter => "tables" }}); + return("!!error!!"); + } + if (ref($tables) ne "ARRAY") + { + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0218", variables => { name => "tables", value => $tables }}); + return("!!error!!"); + } + + my $count = \@{$tables}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { count => $count }}); + foreach my $uuid (sort {$a cmp $b} keys %{$anvil->data->{cache}{database_handle}}) + { + my $vacuum = 0; + foreach my $table (reverse @{$tables}) + { + # Check for the function. + my $safe_table = $anvil->Database->quote($table); + $safe_table =~ s/^'(.*?)'$/$1/; + my $history_function = "history_".$table; + my $function_query = "SELECT COUNT(*) FROM pg_catalog.pg_proc WHERE proname = ".$anvil->Database->quote($history_function).";"; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0124", variables => { function_query => $function_query }}); + + my $function_count = $anvil->Database->query({query => $function_query, uuid => $uuid, source => $THIS_FILE, line => __LINE__})->[0]->[0]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { function_count => $function_count }}); + if ($function_count) + { + # Delete it. + $vacuum = 1; + $history_function =~ s/^'(.*?)'$/$1/; + my $query = "DROP FUNCTION ".$history_function."() CASCADE;"; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0124", variables => { query => $query }}); + $anvil->Database->write({debug => $debug, uuid => $uuid, query => $query, source => $THIS_FILE, line => __LINE__}); + } + + my $history_query = "SELECT COUNT(*) FROM pg_catalog.pg_tables WHERE tablename = ".$anvil->Database->quote($table)." AND schemaname='history';"; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0124", variables => { history_query => $history_query }}); + + my $history_count = $anvil->Database->query({query => $history_query, uuid => $uuid, source => $THIS_FILE, line => __LINE__})->[0]->[0]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { history_count => $history_count }}); + if ($history_count) + { + # Delete it. + $vacuum = 1; + my $query = "DROP TABLE history.".$safe_table.";"; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0124", variables => { query => $query }}); + $anvil->Database->write({debug => $debug, uuid => $uuid, query => $query, source => $THIS_FILE, line => __LINE__}); + } + + my $public_query = "SELECT COUNT(*) FROM pg_catalog.pg_tables WHERE tablename = ".$anvil->Database->quote($table)." AND schemaname='public';"; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0124", variables => { public_query => $public_query }}); + + my $public_count = $anvil->Database->query({query => $public_query, uuid => $uuid, source => $THIS_FILE, line => __LINE__})->[0]->[0]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { public_count => $public_count }}); + if ($public_count) + { + # Delete it. + $vacuum = 1; + my $query = "DROP TABLE public.".$safe_table.";"; + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0124", variables => { query => $query }}); + $anvil->Database->write({debug => $debug, uuid => $uuid, query => $query, source => $THIS_FILE, line => __LINE__}); + } + } + + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { vacuum => $vacuum }}); + if ($vacuum) + { + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0458"}); + my $query = "VACUUM FULL;"; + $anvil->Database->write({debug => $debug, uuid => $uuid, query => $query, source => $THIS_FILE, line => __LINE__}); + } + } + + return(0); +} + + =head2 query This performs a query and returns an array reference of array references (from C<< DBO->fetchall_arrayref >>). The first array contains all the returned rows and each row is an array reference of columns in that row. @@ -12116,6 +12223,8 @@ sub refresh_timestamp This will resync the database data on this and peer database(s) if needed. It takes no arguments and will immediately return unless C<< sys::database::resync_needed >> was set. +If C<< switches::purge >> is set, this method will also return without doing anything. + =cut sub resync_databases { @@ -12134,6 +12243,14 @@ sub resync_databases return(0); } + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { "switches::purge" => $anvil->data->{switches}{purge} }}); + if ((exists $anvil->data->{switches}{purge}) && ($anvil->data->{switches}{purge})) + { + # The user is calling a purge, so skip resync for now as the data might be about to all go away anyway. + delete $anvil->data->{sys}{database}{table}; + return(0); + } + #$anvil->data->{sys}{database}{log_transactions} = 1; # Archive old data before resync'ing @@ -12870,7 +12987,7 @@ sub _archive_table if (not $table) { - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0020", variables => { method => "Convert->_archive_table()", parameter => "table" }}); + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0020", variables => { method => "Database->_archive_table()", parameter => "table" }}); return("!!error!!"); } diff --git a/Anvil/Tools/ScanCore.pm b/Anvil/Tools/ScanCore.pm index a1abc2af..8d68f4b0 100755 --- a/Anvil/Tools/ScanCore.pm +++ b/Anvil/Tools/ScanCore.pm @@ -139,7 +139,7 @@ sub agent_startup } # Connect to DBs. - $anvil->Database->connect({debug => ($debug + 1)}); + $anvil->Database->connect({debug => $debug}); $anvil->Log->entry({source => $agent, line => __LINE__, level => $debug, secure => 0, key => "log_0132"}); if (not $anvil->data->{sys}{database}{connections}) { @@ -150,19 +150,19 @@ sub agent_startup # Make sure our schema is loaded. $anvil->Database->check_agent_data({ - debug => $debug, - agent => $agent, + debug => $debug, + agent => $agent, }); # Read in our word strings. my $words_file = $anvil->data->{path}{directories}{scan_agents}."/".$agent."/".$agent.".xml"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { words_file => $words_file }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { words_file => $words_file }}); my $problem = $anvil->Words->read({ - debug => ($debug + 1), + debug => $debug, file => $words_file, }); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { problem => $problem }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { problem => $problem }}); if ($problem) { diff --git a/notes b/notes index 249a6af1..73875c0d 100644 --- a/notes +++ b/notes @@ -3,6 +3,7 @@ ALTER TABLE history.recipients RENAME recipient_new_level TO recipient_level; ALTER TABLE history.recipients DROP COLUMN recipient_units; ALTER TABLE recipients RENAME recipient_new_level TO recipient_level; ALTER TABLE recipients DROP COLUMN recipient_units; +ALTER TABLE alert_sent DROP COLUMN alert_name; DROP FUNCTION history_recipients() CASCADE; CREATE FUNCTION history_recipients() RETURNS trigger diff --git a/scancore-agents/scan-hardware/scan-hardware b/scancore-agents/scan-hardware/scan-hardware index 723e11bc..4c1970cd 100755 --- a/scancore-agents/scan-hardware/scan-hardware +++ b/scancore-agents/scan-hardware/scan-hardware @@ -10,6 +10,7 @@ # # TODO: # - Decide if it's worth having a separate ScanCore.log file or just feed into anvil.log. +# use strict; use warnings; @@ -43,17 +44,31 @@ $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => " # Read switches $anvil->Get->switches; +# These are the tables used by this agent. The order matters as it controls to order the tables are created +# and sync'ed. For purges, this array is walked backwards. +$anvil->data->{scancore}{'scan-hardware'}{tables} = ["scan_hardware", "scan_hardware_ram_modules"]; + # Handle start-up tasks my $problem = $anvil->ScanCore->agent_startup({ - debug => 2, + debug => 3, agent => $THIS_FILE, - tables => ["scan_hardware", "scan_hardware_ram_modules"], + tables => $anvil->data->{scancore}{'scan-hardware'}{tables}, }); if ($problem) { $anvil->nice_exit({exit_code => 1}); } +if ($anvil->data->{switches}{purge}) +{ + # This can be called when doing bulk-database purges. + $anvil->Database->purge_data({ + debug => 2, + tables => $anvil->data->{scancore}{'scan-hardware'}{tables}, + }); + $anvil->nice_exit({exit_code => 0}); +} + # Read the data. collect_data($anvil); @@ -64,10 +79,10 @@ read_last_scan($anvil); find_changes($anvil); # Finally, process health weights. -process_health($anvil) +process_health($anvil); # Mark that we ran. -$anvil->Database->insert_or_update_updated({debug => 2, updated_by => $THIS_FILE}); +$anvil->Database->insert_or_update_updated({updated_by => $THIS_FILE}); $anvil->nice_exit({exit_code => 0}); @@ -84,18 +99,23 @@ sub collect_cpu_data my $total_threads = 0; my $cores = 0; my $threads = 0; + my $sockets = 0; my $in_cpu = ""; - my ($output, $return_code) = $anvil->System->call({level => 2, shell_call => $anvil->data->{path}{exe}{dmidecode}." --type processor", source => $THIS_FILE, line => __LINE__}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code }}); + my ($output, $return_code) = $anvil->System->call({shell_call => $anvil->data->{path}{exe}{dmidecode}." --type processor", source => $THIS_FILE, line => __LINE__}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { output => $output, return_code => $return_code }}); foreach my $line (split/\n/, $output) { - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { line => $line }}); if ($line =~ /Socket Designation: (.*+)$/) { $in_cpu = $1; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { in_cpu => $in_cpu }}); + $sockets++; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + in_cpu => $in_cpu, + sockets => $sockets, + }}); } elsif (not $line) { @@ -129,25 +149,24 @@ sub collect_cpu_data }}); } } - close $file_handle; # Read in /proc/cpuinfo. my $flags = ""; - my $flag_mismatch = 0; + my $flags_mismatch = 0; my $bugs = ""; my $bugs_mismatch = 0; my $model = ""; my $model_mismatch = 0; - my $cpu_info = $anvil->Storage->read_file({level => 2, file => $anvil->data->{path}{proc}{cpuinfo}}); - foreach my $line (split/,/, $cpu_info) + my $cpu_info = $anvil->Storage->read_file({debug => 3, file => $anvil->data->{path}{proc}{cpuinfo}}); + foreach my $line (split/\n/, $cpu_info) { $line = $anvil->Words->clean_spaces({string => $line}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { line => $line }}); - if ($line =~ /^flags: (.*?)$/) + if ($line =~ /^flags\s*: (.*?)$/) { my $these_flags = $1; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { these_flags => $these_flags }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { these_flags => $these_flags }}); if (not $flags) { $flags = $these_flags; @@ -156,8 +175,8 @@ sub collect_cpu_data elsif ($flags ne $these_flags) { # This should never happen. - $flag_mismatch = 1; - my $changed = $anvil->Alert->check_alert_sent({ + $flags_mismatch = 1; + my $changed = $anvil->Alert->check_alert_sent({ debug => 2, record_locator => "scan_hardware::cpu_flags_mismatch", set_by => $THIS_FILE, @@ -178,10 +197,10 @@ sub collect_cpu_data } } } - if ($line =~ /^bugs: (.*?)$/) + if ($line =~ /^bugs\s*: (.*?)$/) { my $these_bugs = $1; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { these_bugs => $these_bugs }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { these_bugs => $these_bugs }}); if (not $bugs) { $bugs = $these_bugs; @@ -190,9 +209,9 @@ sub collect_cpu_data elsif ($bugs ne $these_bugs) { # This should never happen... - $bugs_mismatch = 1; + $bugs_mismatch = 1; my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::cpu_bugs_mismatch", set_by => $THIS_FILE, }); @@ -212,10 +231,10 @@ sub collect_cpu_data } } } - if ($line =~ /^model name: (.*?)$/) + if ($line =~ /^model name\s*: (.*?)$/) { my $this_model = $1; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { this_model => $this_model }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { this_model => $this_model }}); if (not $model) { $model = $this_model; @@ -226,7 +245,7 @@ sub collect_cpu_data # This should never happen... $model_mismatch = 1; my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::cpu_model_mismatch", set_by => $THIS_FILE, }); @@ -252,7 +271,7 @@ sub collect_cpu_data if (not $flags_mismatch) { my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::cpu_flags_mismatch", set_by => $THIS_FILE, clear => 1, @@ -272,7 +291,7 @@ sub collect_cpu_data if (not $bugs_mismatch) { my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::cpu_bugs_mismatch", set_by => $THIS_FILE, clear => 1, @@ -292,7 +311,7 @@ sub collect_cpu_data if (not $model_mismatch) { my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::cpu_model_mismatch", set_by => $THIS_FILE, clear => 1, @@ -312,12 +331,14 @@ sub collect_cpu_data # Record what we found. $anvil->data->{summary}{cpu}{model} = $model; + $anvil->data->{summary}{cpu}{sockets} = $sockets; $anvil->data->{summary}{cpu}{cores} = $total_cores; $anvil->data->{summary}{cpu}{threads} = $total_threads; $anvil->data->{summary}{cpu}{bugs} = $bugs; $anvil->data->{summary}{cpu}{flags} = $flags; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { "summary::cpu::model" => $anvil->data->{summary}{cpu}{model}, + "summary::cpu::sockets" => $anvil->data->{summary}{cpu}{sockets}, "summary::cpu::cores" => $anvil->data->{summary}{cpu}{cores}, "summary::cpu::threads" => $anvil->data->{summary}{cpu}{threads}, "summary::cpu::bugs" => $anvil->data->{summary}{cpu}{bugs}, @@ -355,17 +376,22 @@ sub collect_led_states my $css_led = "unknown"; my $error_led = "unknown"; - my ($output, $return_code) = $anvil->System->call({level => 2, shell_call => $anvil->data->{path}{exe}{dmidecode}." --string system-manufacturer", source => $THIS_FILE, line => __LINE__}); + my ($output, $return_code) = $anvil->System->call({shell_call => $anvil->data->{path}{exe}{dmidecode}." --string system-manufacturer", source => $THIS_FILE, line => __LINE__}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code }}); foreach my $line (split/\n/, $output) { $manufacturer = lc($line); + # Dell can report as 'Dell Inc.'. + if ($manufacturer =~ /dell/) + { + $manufacturer = "dell"; + } $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { manufacturer => $manufacturer }}); } if ($manufacturer eq "fujitsu") { - my ($output, $return_code) = $anvil->System->call({level => 2, shell_call => $anvil->data->{path}{exe}{'ipmi-oem'}." Fujitsu get-system-status", source => $THIS_FILE, line => __LINE__}); + my ($output, $return_code) = $anvil->System->call({shell_call => $anvil->data->{path}{exe}{'ipmi-oem'}." Fujitsu get-system-status", source => $THIS_FILE, line => __LINE__}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code }}); foreach my $line (split/\n/, $output) { @@ -393,7 +419,7 @@ sub collect_led_states { ### TODO: When we get a dell, figure this out... ### TODO: There are a lot of useful bits here, including power load/headroom. Excellent data for the UI later. - #my ($output, $return_code) = $anvil->System->call({level => 2, shell_call => $anvil->data->{path}{exe}{'ipmi-oem'}." Dell get-system-status", source => $THIS_FILE, line => __LINE__}); + #my ($output, $return_code) = $anvil->System->call({shell_call => $anvil->data->{path}{exe}{'ipmi-oem'}." Dell get-system-status", source => $THIS_FILE, line => __LINE__}); #$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code }}); #foreach my $line (split/\n/, $output) #{ @@ -427,12 +453,12 @@ sub collect_ram_data my $part_number = ""; my $serial_number = ""; - my ($output, $return_code) = $anvil->System->call({level => 2, shell_call => $anvil->data->{path}{exe}{dmidecode}." --type memory", source => $THIS_FILE, line => __LINE__}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code }}); + my ($output, $return_code) = $anvil->System->call({shell_call => $anvil->data->{path}{exe}{dmidecode}." --type memory", source => $THIS_FILE, line => __LINE__}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { output => $output, return_code => $return_code }}); foreach my $line (split/\n/, $output) { $line = $anvil->Words->clean_spaces({string => $line}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { line => $line }}); if ($line =~ /^Locator: (.*?)$/) { @@ -504,7 +530,7 @@ sub collect_ram_data $manufacturer = ""; $part_number = ""; $serial_number = ""; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { "size" => $size, "locator" => $locator, "manufacturer" => $manufacturer, @@ -514,17 +540,18 @@ sub collect_ram_data } } - my $cpu_info = $anvil->Storage->read_file({level => 2, file => $anvil->data->{path}{proc}{meminfo}}); - foreach my $line (split/,/, $cpu_info) + my $cpu_info = $anvil->Storage->read_file({debug => 3, file => $anvil->data->{path}{proc}{meminfo}}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { cpu_info => $cpu_info }}); + foreach my $line (split/\n/, $cpu_info) { $line = $anvil->Words->clean_spaces({string => $line}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { line => $line }}); if ($line =~ /^(.*?):\s+(\d+.*?)$/) { my $variable = $1; my $size = $2; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { variable => $variable, size => $size, }}); @@ -534,22 +561,22 @@ sub collect_ram_data if ($variable eq "MemTotal") { $say_variable = "memory_total"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { say_variable => $say_variable }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { say_variable => $say_variable }}); } if ($variable eq "MemFree") { $say_variable = "memory_free"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { say_variable => $say_variable }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { say_variable => $say_variable }}); } if ($variable eq "SwapTotal") { $say_variable = "swap_total"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { say_variable => $say_variable }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { say_variable => $say_variable }}); } if ($variable eq "SwapFree") { $say_variable = "swap_free"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { say_variable => $say_variable }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { say_variable => $say_variable }}); } next if not $say_variable; @@ -799,16 +826,16 @@ sub find_changes { # This always changes, so it's an info-level alert $update = 1; - my $say_new_scan_hardware_memory_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $new_scan_hardware_memory_free})." (".$anvil->Convert->add_commas({number => $new_scan_hardware_memory_free})." #!string!scan_hardware_unit_0001!#)" - my $say_old_scan_hardware_memory_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $old_scan_hardware_memory_free})." (".$anvil->Convert->add_commas({number => $old_scan_hardware_memory_free})." #!string!scan_hardware_unit_0001!#)" + my $say_new_scan_hardware_memory_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $new_scan_hardware_memory_free})." (".$anvil->Convert->add_commas({number => $new_scan_hardware_memory_free})." #!string!scan_hardware_unit_0001!#)"; + my $say_old_scan_hardware_memory_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $old_scan_hardware_memory_free})." (".$anvil->Convert->add_commas({number => $old_scan_hardware_memory_free})." #!string!scan_hardware_unit_0001!#)"; $anvil->Alert->register({set_by => $THIS_FILE, alert_level => "info", message => "scan_hardware_alert_0018,!!new!".$say_new_scan_hardware_memory_free."!!,!!old!".$say_old_scan_hardware_memory_free."!!"}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_hardware_alert_0018", variables => { new => $say_new_scan_hardware_memory_free, old => $say_old_scan_hardware_memory_free}}); } if ($new_scan_hardware_swap_free ne $old_scan_hardware_swap_free) { $update = 1; - my $say_new_scan_hardware_swap_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $new_scan_hardware_swap_free})." (".$anvil->Convert->add_commas({number => $new_scan_hardware_swap_free})." #!string!scan_hardware_unit_0001!#)" - my $say_old_scan_hardware_swap_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $old_scan_hardware_swap_free})." (".$anvil->Convert->add_commas({number => $old_scan_hardware_swap_free})." #!string!scan_hardware_unit_0001!#)" + my $say_new_scan_hardware_swap_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $new_scan_hardware_swap_free})." (".$anvil->Convert->add_commas({number => $new_scan_hardware_swap_free})." #!string!scan_hardware_unit_0001!#)"; + my $say_old_scan_hardware_swap_free = $anvil->Convert->bytes_to_human_readable({'bytes' => $old_scan_hardware_swap_free})." (".$anvil->Convert->add_commas({number => $old_scan_hardware_swap_free})." #!string!scan_hardware_unit_0001!#)"; $anvil->Alert->register({set_by => $THIS_FILE, alert_level => "info", message => "scan_hardware_alert_0019,!!new!".$say_new_scan_hardware_swap_free."!!,!!old!".$say_old_scan_hardware_swap_free."!!"}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_hardware_alert_0019", variables => { new => $say_new_scan_hardware_swap_free, old => $say_old_scan_hardware_swap_free}}); @@ -833,9 +860,9 @@ sub find_changes { # It's high my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::high_swap", - set_by => $agent, + set_by => $THIS_FILE, }); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { changed => $changed }}); if ($changed) @@ -854,7 +881,7 @@ sub find_changes alert_level => "warning", message => "scan_hardware_alert_0020", message_variables => $variables, - set_by => $agent, + set_by => $THIS_FILE, }); } } @@ -862,9 +889,9 @@ sub find_changes { # It's low my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::high_swap", - set_by => $agent, + set_by => $THIS_FILE, clear => 1, }); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { changed => $changed }}); @@ -882,7 +909,7 @@ sub find_changes debug => 2, alert_level => "warning", message => "scan_hardware_alert_0021,!!say_used!".$say_used."!!,!!say_swap!".$say_swap."!!,!!swap_percent!".$new_swap_percent_used."!!", - set_by => $agent, + set_by => $THIS_FILE, }); } } @@ -937,7 +964,7 @@ WHERE ram_swap_total => $anvil->Convert->bytes_to_human_readable({'bytes' => $new_scan_hardware_swap_total})." (".$anvil->Convert->add_commas({number => $new_scan_hardware_swap_total})." #!string!scan_hardware_unit_0001!#)", ram_swap_free => $anvil->Convert->bytes_to_human_readable({'bytes' => $new_scan_hardware_swap_free})." (".$anvil->Convert->add_commas({number => $new_scan_hardware_swap_free})." #!string!scan_hardware_unit_0001!#)", }; - $anvil->Alert->register({debug => 2, alert_level => "notice", message => "scan_hardware_alert_0022", message_variables => $message_variables, set_by => $agent }); + $anvil->Alert->register({debug => 2, alert_level => "notice", message => "scan_hardware_alert_0022", message_variables => $message_variables, set_by => $THIS_FILE }); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_hardware_alert_0019", variables => $message_variables}); # INSERT @@ -985,7 +1012,6 @@ INSERT INTO $anvil->Database->write({query => $query, source => $THIS_FILE, line => __LINE__}); } - ### TODO: Left off here. # Now the RAM modules. foreach my $hardware_ram_module_locator (sort {$a cmp $b} keys %{$anvil->data->{ram}{dmi}{locator}}) { @@ -1001,12 +1027,13 @@ INSERT INTO new_scan_hardware_ram_module_serial_number => $new_scan_hardware_ram_module_serial_number, }}); - if ((exists $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator}) && ($anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator})) + if ((exists $anvil->data->{sql}{ram_module_locator_to_uuid}{$hardware_ram_module_locator}) && ($anvil->data->{sql}{ram_module_locator_to_uuid}{$hardware_ram_module_locator})) { # We've seen this module before, look for changes. - my $scan_hardware_ram_module_uuid = $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator}; + my $scan_hardware_ram_module_uuid = $anvil->data->{sql}{ram_module_locator_to_uuid}{$hardware_ram_module_locator}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sql::hardware_ram_module_uuid::${scan_hardware_ram_module_locator}" => $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator}, + scan_hardware_ram_module_locator => $hardware_ram_module_locator, + scan_hardware_ram_module_uuid => $scan_hardware_ram_module_uuid, }}); my $old_scan_hardware_ram_module_size = $anvil->data->{sql}{scan_hardware_ram_module}{scan_hardware_ram_module_uuid}{$scan_hardware_ram_module_uuid}{scan_hardware_ram_module_size}; @@ -1021,7 +1048,7 @@ INSERT INTO }}); # Delete the entry so we know we've processed this existing module. - delete $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator}; + delete $anvil->data->{sql}{ram_module_locator_to_uuid}{$hardware_ram_module_locator}; delete $anvil->data->{sql}{scan_hardware_ram_module}{scan_hardware_ram_module_uuid}{$scan_hardware_ram_module_uuid}; ### We check all at once for a single alert as it's easy to see what has changed. @@ -1044,7 +1071,7 @@ INSERT INTO old_serial_number => $old_scan_hardware_ram_module_serial_number, }; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "scan_hardware_alert_0023", variables => $variables}); - $anvil->Alert->register({debug => 2, alert_level => "warning", message => "scan_hardware_alert_0023", message_variables => $variables, set_by => $agent}); + $anvil->Alert->register({debug => 2, alert_level => "warning", message => "scan_hardware_alert_0023", message_variables => $variables, set_by => $THIS_FILE}); } else { @@ -1061,7 +1088,7 @@ INSERT INTO old_serial_number => $old_scan_hardware_ram_module_serial_number, }; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "scan_hardware_alert_0024", variables => $variables}); - $anvil->Alert->register({debug => 2, alert_level => "warning", message => "scan_hardware_alert_0024", message_variables => $variables, set_by => $agent}); + $anvil->Alert->register({debug => 2, alert_level => "warning", message => "scan_hardware_alert_0024", message_variables => $variables, set_by => $THIS_FILE}); } my $query = " @@ -1093,7 +1120,7 @@ WHERE serial_number => $new_scan_hardware_ram_module_serial_number, }; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 2, key => "scan_hardware_alert_0025", variables => $variables}); - $anvil->Alert->register({debug => 2, alert_level => "notice", message => "scan_hardware_alert_0025", message_variables => $variables, set_by => $agent}); + $anvil->Alert->register({debug => 2, alert_level => "notice", message => "scan_hardware_alert_0025", message_variables => $variables, set_by => $THIS_FILE}); # INSERT my $scan_hardware_ram_module_uuid = $anvil->Get->uuid(); @@ -1129,9 +1156,10 @@ INSERT INTO foreach my $hardware_ram_module_locator (keys %{$anvil->data->{sql}{scan_hardware_ram_module_uuid}}) { # Module vanished! - my $scan_hardware_ram_module_uuid = $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator}; + my $scan_hardware_ram_module_uuid = $anvil->data->{sql}{ram_module_locator_to_uuid}{$hardware_ram_module_locator}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sql::hardware_ram_module_uuid::${scan_hardware_ram_module_locator}" => $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator} + scan_hardware_ram_module_locator => $hardware_ram_module_locator, + scan_hardware_ram_module_uuid => $scan_hardware_ram_module_uuid, }}); my $old_scan_hardware_ram_module_size = $anvil->data->{sql}{scan_hardware_ram_module}{scan_hardware_ram_module_uuid}{$scan_hardware_ram_module_uuid}{scan_hardware_ram_module_size}; @@ -1146,7 +1174,7 @@ INSERT INTO }}); # Delete the entry so we know we've processed this existing module. - delete $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$hardware_ram_module_locator}; + delete $anvil->data->{sql}{ram_module_locator_to_uuid}{$hardware_ram_module_locator}; delete $anvil->data->{sql}{scan_hardware_ram_module}{scan_hardware_ram_module_uuid}{$scan_hardware_ram_module_uuid}; my $variables = { @@ -1157,7 +1185,7 @@ INSERT INTO old_serial_number => $old_scan_hardware_ram_module_serial_number, }; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 2, key => "scan_hardware_alert_0026", variables => $variables}); - $anvil->Alert->register({debug => 2, alert_level => "warning", message => "scan_hardware_alert_0026", message_variables => $variables, set_by => $agent}); + $anvil->Alert->register({debug => 2, alert_level => "warning", message => "scan_hardware_alert_0026", message_variables => $variables, set_by => $THIS_FILE}); my $query = " UPDATE @@ -1209,11 +1237,11 @@ sub process_health if ($peer_ram_total) { # We don't want to freak out unless the difference is at least 1GiB - my $hardware_ram_total = $an->data->{summary}{ram}{size}; + my $hardware_ram_total = $anvil->data->{summary}{ram}{size}; my $difference = $peer_ram_total - $hardware_ram_total; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - hardware_ram_total => $an->Readable->comma($hardware_ram_total)." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $hardware_ram_total}).")", - difference => $an->Readable->comma($difference)." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $difference}).")", + hardware_ram_total => $anvil->Convert->add_commas({number => $hardware_ram_total})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $hardware_ram_total}).")", + difference => $anvil->Convert->add_commas({number => $difference})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $difference}).")", }}); # greater than 1 GiB (default) or less than 128 MiB (default) @@ -1230,7 +1258,7 @@ sub process_health if ($age > 300) { my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::less_ram_than_peer", set_by => $THIS_FILE, }); @@ -1239,9 +1267,9 @@ sub process_health { # Register an alert. my $variables = { - local_ram => $anvil->Convert->bytes_to_human_readable({'bytes' => $hardware_ram_total})." (".$an->Readable->comma($hardware_ram_total)." #!string!suffix_0009!#)", - peer_ram => $anvil->Convert->bytes_to_human_readable({'bytes' => $peer_ram_total})." (".$an->Readable->comma($peer_ram_total)." #!string!suffix_0009!#)", - difference => $anvil->Convert->bytes_to_human_readable({'bytes' => $difference})." (".$an->Readable->comma($difference)." #!string!suffix_0009!#)", + local_ram => $anvil->Convert->bytes_to_human_readable({'bytes' => $hardware_ram_total})." (".$anvil->Convert->add_commas({number => $hardware_ram_total})." #!string!suffix_0009!#)", + peer_ram => $anvil->Convert->bytes_to_human_readable({'bytes' => $peer_ram_total})." (".$anvil->Convert->add_commas({number => $peer_ram_total})." #!string!suffix_0009!#)", + difference => $anvil->Convert->bytes_to_human_readable({'bytes' => $difference})." (".$anvil->Convert->add_commas({number => $difference})." #!string!suffix_0009!#)", }; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_hardware_alert_0027", variables => $variables}); $anvil->Alert->register({alert_level => "warning", message => "scan_hardware_alert_0027", message_variables => $variables, set_by => $THIS_FILE}); @@ -1264,7 +1292,7 @@ sub process_health host_uuid => $anvil->Get->host_uuid, }); my $changed = $anvil->Alert->check_alert_sent({ - debug => 2, + debug => 3, record_locator => "scan_hardware::less_ram_than_peer", set_by => $THIS_FILE, clear => 1, @@ -1274,7 +1302,7 @@ sub process_health { # Clear the alert. my $variables = { - ram => $anvil->Convert->bytes_to_human_readable({'bytes' => $hardware_ram_total})." (".$an->Readable->comma($hardware_ram_total)." #!string!suffix_0009!#)", + ram => $anvil->Convert->bytes_to_human_readable({'bytes' => $hardware_ram_total})." (".$anvil->Convert->add_commas({number => $hardware_ram_total})." #!string!suffix_0009!#)", }; $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "scan_hardware_alert_0028", variables => $variables}); $anvil->Alert->register({alert_level => "warning", message => "scan_hardware_alert_0028", message_variables => $variables, set_by => $THIS_FILE}); @@ -1325,7 +1353,7 @@ FROM WHERE scan_hardware_host_uuid = ".$anvil->Database->quote($anvil->Get->host_uuid)." ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); my $count = @{$results}; @@ -1352,7 +1380,7 @@ WHERE my $scan_hardware_led_css = $row->[12]; my $scan_hardware_led_error = $row->[13]; my $scan_hardware_modified_date = $row->[14]; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { "scan_hardware_uuid" => $scan_hardware_uuid, "scan_hardware_cpu_model" => $scan_hardware_cpu_model, "scan_hardware_cpu_cores" => $scan_hardware_cpu_cores, @@ -1425,7 +1453,7 @@ FROM WHERE scan_hardware_ram_module_host_uuid = ".$anvil->Database->quote($anvil->Get->host_uuid)." ;"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { query => $query }}); $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__}); $count = @{$results}; @@ -1443,7 +1471,7 @@ WHERE my $scan_hardware_ram_module_manufacturer = $row->[3]; my $scan_hardware_ram_module_model = $row->[4]; my $scan_hardware_ram_module_serial_number = $row->[5]; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { "scan_hardware_ram_module_uuid" => $scan_hardware_ram_module_uuid, "scan_hardware_ram_module_locator" => $scan_hardware_ram_module_locator, "scan_hardware_ram_module_size" => $scan_hardware_ram_module_size, @@ -1453,9 +1481,9 @@ WHERE }}); # Record the scan_hardware_ram_module_uuid in an easy to find place for later when looking for changes. - $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$scan_hardware_ram_module_locator} = $scan_hardware_ram_module_uuid; + $anvil->data->{sql}{ram_module_locator_to_uuid}{$scan_hardware_ram_module_locator} = $scan_hardware_ram_module_uuid; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sql::scan_hardware_ram_module_uuid::${scan_hardware_ram_module_locator}" => $anvil->data->{sql}{scan_hardware_ram_module_uuid}{$scan_hardware_ram_module_locator}, + "sql::ram_module_locator_to_uuid::${scan_hardware_ram_module_locator}" => $anvil->data->{sql}{ram_module_locator_to_uuid}{$scan_hardware_ram_module_locator}, }}); # Store the old data now. diff --git a/scancore-agents/scan-hardware/scan-hardware.xml b/scancore-agents/scan-hardware/scan-hardware.xml index 10779adb..06a86657 100644 --- a/scancore-agents/scan-hardware/scan-hardware.xml +++ b/scancore-agents/scan-hardware/scan-hardware.xml @@ -23,7 +23,7 @@ The differences are: #!variable!these_flags!# ==== - The issue with mismatched CPU flags has been resolved. + The issue with mismatched CPU flags has been resolved. For some reason, two (or more) CPU cores/threads returned different bugs. This should never happen: The differences are: The differences are: @@ -33,7 +33,7 @@ The differences are: #!variable!these_bugs!# ==== - The issue with mismatched CPU bugs has been resolved. + The issue with mismatched CPU bugs has been resolved. For some reason, two (or more) CPU cores/threads returned different model names. This should never happen: The differences are: The differences are: @@ -43,7 +43,7 @@ The differences are: #!variable!this_model!# ==== - The issue with mismatched CPU model name has been resolved. + The issue with mismatched CPU model name has been resolved. The CPU model has changed: - New: [#!variable!new!#] - Old: [#!variable!old!#] diff --git a/share/anvil.sql b/share/anvil.sql index 38e3471c..05f479fc 100644 --- a/share/anvil.sql +++ b/share/anvil.sql @@ -1819,6 +1819,7 @@ CREATE TRIGGER trigger_temperature -- This table records the last time a scan ran. It's sole purpose is to make sure at least one table's -- 'modified_date' changes per run, so that database resyncs can be triggered reliably. CREATE TABLE updated ( + updated_uuid uuid not null primary key, updated_host_uuid uuid not null, updated_by text not null, -- The name of the agent (or "ScanCore' itself) that updated. modified_date timestamp with time zone not null, @@ -1838,7 +1839,6 @@ CREATE TABLE alert_sent ( alert_sent_host_uuid uuid not null, -- The node associated with this alert alert_set_by text not null, -- name of the program that set this alert alert_record_locator text not null, -- String used by the agent to identify the source of the alert (ie: UPS serial number) - alert_name text not null, -- A free-form name used by the caller to identify this alert. modified_date timestamp with time zone not null, FOREIGN KEY(alert_sent_host_uuid) REFERENCES hosts(host_uuid) diff --git a/share/words.xml b/share/words.xml index d2f29e8c..45b0ba52 100644 --- a/share/words.xml +++ b/share/words.xml @@ -518,14 +518,13 @@ The database connection error was: [ Error ] - Failed to start the Postgres server. Please check the system logs for details. The database user: [#!variable!user!#] was created with UUID: [#!variable!id!#]. [ Error ] - Failed to add the database user: [#!variable!user!#]! Unable to proceed. - + [ Error ] - Failed to find any tables in: [#!variable!file!#]. Unable to check/load the agent's schema. [ Warning ] - Failed to set an alert because this host is not yet in the database. This can happen if the alert was set before this host was added to the database. * Details of the alert: - Type: ......... [#!variable!type!#] - Clear? ........ [#!variable!clear!#] - Record Locator: [#!variable!record_locator!#] -- Name: ......... [#!variable!name!#] - Timestamp: .... [#!variable!modified_date!#] [ Error ] - There is no #!string!brand_0002!# database user set for the local machine. Please check: [#!data!path::config::anvil.conf!#]'s DB entry: [#!variable!uuid!#]. diff --git a/tools/test.pl b/tools/test.pl index fa06fc34..ff1256fd 100755 --- a/tools/test.pl +++ b/tools/test.pl @@ -25,6 +25,22 @@ $anvil->Log->level({set => 2}); $anvil->Log->secure({set => 1}); $anvil->Get->switches; +my $array = ["1", "2", "a", "b"]; + +print "Normal:\n"; +foreach my $thing (@{$array}) +{ + print "- ".$thing."\n"; +} + +print "Reverse:\n"; +foreach my $thing (reverse @{$array}) +{ + print "- ".$thing."\n"; +} + +exit; + print "Connecting to the database(s);\n"; $anvil->Database->connect({debug => 3}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 2, secure => 0, key => "log_0132"});