You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
410 lines
14 KiB
410 lines
14 KiB
#!/usr/bin/perl |
|
# |
|
# This tool provides a way to perform actions on a host that normally are handled by other processes, like |
|
# marking a system as configure, etc. This will likely grow constantly over time. |
|
# |
|
# Supported switches; |
|
# --mark-configured, --mark-unconfigured |
|
# - Set / unset the 'system::configured' flag for the host. |
|
# --database-active, --database-inactive |
|
# - On Striker, mark the local database as active / inactive |
|
# |
|
|
|
use strict; |
|
use warnings; |
|
use Anvil::Tools; |
|
|
|
my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0]; |
|
my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0]; |
|
if (($running_directory =~ /^\./) && ($ENV{PWD})) |
|
{ |
|
$running_directory =~ s/^\./$ENV{PWD}/; |
|
} |
|
|
|
my $anvil = Anvil::Tools->new(); |
|
|
|
# Read switches |
|
$anvil->Get->switches({list => [ |
|
"age-out-database", |
|
"check-configured", |
|
"check-database", |
|
"check-network-mapping", |
|
"database-active", |
|
"database-inactive", |
|
"disable-network-mapping", |
|
"enable-network-mapping", |
|
"mark-configured", |
|
"mark-unconfigured", |
|
"resync-database"], man => $THIS_FILE}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => $anvil->data->{switches}}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0115", variables => { program => $THIS_FILE }}); |
|
|
|
$anvil->Database->connect(); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, secure => 0, key => "log_0132"}); |
|
if (not $anvil->data->{sys}{database}{connections}) |
|
{ |
|
# No databases, we can't do anything. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 0, priority => "err", key => "error_0077"}); |
|
$anvil->nice_exit({exit_code => 1}); |
|
} |
|
|
|
if (($anvil->data->{switches}{'mark-configured'}) or ($anvil->data->{switches}{'mark-unconfigured'}) or ($anvil->data->{switches}{'check-configured'})) |
|
{ |
|
update_config($anvil); |
|
} |
|
elsif (($anvil->data->{switches}{'database-active'}) or ($anvil->data->{switches}{'database-inactive'}) or ($anvil->data->{switches}{'check-database'})) |
|
{ |
|
update_database($anvil); |
|
} |
|
elsif (($anvil->data->{switches}{'enable-network-mapping'}) or ($anvil->data->{switches}{'disable-network-mapping'}) or ($anvil->data->{switches}{'check-network-mapping'})) |
|
{ |
|
update_network_mapping($anvil); |
|
} |
|
elsif ($anvil->data->{switches}{'age-out-database'}) |
|
{ |
|
age_out_data($anvil); |
|
} |
|
elsif ($anvil->data->{switches}{'resync-database'}) |
|
{ |
|
resync_database($anvil); |
|
} |
|
else |
|
{ |
|
# Show the options. |
|
print $anvil->Words->string({key => "message_0282"})."\n"; |
|
} |
|
|
|
$anvil->nice_exit({exit_code => 0}); |
|
|
|
|
|
############################################################################################################# |
|
# Functions # |
|
############################################################################################################# |
|
|
|
sub age_out_data |
|
{ |
|
my ($anvil) = @_; |
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0285"}); |
|
$anvil->Database->_age_out_data({debug => 2}); |
|
|
|
return(0); |
|
} |
|
|
|
sub resync_database |
|
{ |
|
my ($anvil) = @_; |
|
|
|
if ($anvil->data->{sys}{database}{connections} == 1) |
|
{ |
|
# No reason to proceed. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0283"}); |
|
return(0); |
|
} |
|
|
|
# Before we reconnect, make sure all scan agent tables are loaded. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0286"}); |
|
$anvil->ScanCore->_scan_directory({directory => $anvil->data->{path}{directories}{scan_agents}}); |
|
my $tables = ""; |
|
foreach my $agent_name (sort {$a cmp $b} keys %{$anvil->data->{scancore}{agent}}) |
|
{ |
|
my $agent_path = $anvil->data->{scancore}{agent}{$agent_name}; |
|
my $agent_words = $agent_path.".xml"; |
|
my $schema_file = $agent_path.".sql"; |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { |
|
agent_name => $agent_name, |
|
agent_path => $agent_path, |
|
agent_words => $agent_words, |
|
schema_file => $schema_file, |
|
}}); |
|
|
|
if (-e $schema_file) |
|
{ |
|
# See that it's loaded. |
|
$tables = $anvil->Database->get_tables_from_schema({schema_file => $schema_file}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { tables => $tables }}); |
|
foreach my $table (@{$tables}) |
|
{ |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { table => $table }}); |
|
} |
|
$anvil->Database->check_agent_data({ |
|
agent => $agent_name, |
|
tables => $tables, |
|
}); |
|
} |
|
} |
|
|
|
# Disconnect and reconnect. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0284"}); |
|
$anvil->data->{sys}{database}{resync_needed} = 1; |
|
$anvil->Database->resync_databases({debug => 2}); |
|
|
|
return(0); |
|
} |
|
|
|
sub update_database |
|
{ |
|
my ($anvil) = @_; |
|
|
|
# Are we a striker? |
|
my $host_type = $anvil->Get->host_type(); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { host_type => $host_type }}); |
|
if ($host_type ne "striker") |
|
{ |
|
# Nope. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "error_0358"}); |
|
$anvil->nice_exit({exit_code => 1}); |
|
} |
|
|
|
my $host_uuid = $anvil->Get->host_uuid(); |
|
my $variable_name = "database::".$host_uuid."::active"; |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { |
|
host_uuid => $host_uuid, |
|
variable_name => $variable_name, |
|
}}); |
|
|
|
# Read if it's active or inactive yet. |
|
my ($active_value, undef, undef) = $anvil->Database->read_variable({variable_name => "database::".$host_uuid."::active"}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { active_value => $active_value }}); |
|
if ($anvil->data->{switches}{'check-database'}) |
|
{ |
|
if ($active_value) |
|
{ |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0277"}); |
|
} |
|
else |
|
{ |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0276"}); |
|
} |
|
return(0); |
|
} |
|
|
|
# Are we enabling or disabling the database? |
|
if ($active_value) |
|
{ |
|
if ($anvil->data->{switches}{'database-active'}) |
|
{ |
|
# Already active. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0279"}); |
|
} |
|
else |
|
{ |
|
# Mark inactive |
|
my $variable_uuid = $anvil->Database->insert_or_update_variables({ |
|
variable_name => $variable_name, |
|
variable_value => "0", |
|
variable_default => "0", |
|
variable_description => "striker_0294", |
|
variable_section => "database", |
|
variable_source_uuid => "NULL", |
|
variable_source_table => "", |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { variable_uuid => $variable_uuid }}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0280"}); |
|
} |
|
} |
|
else |
|
{ |
|
if ($anvil->data->{switches}{'database-inactive'}) |
|
{ |
|
# Already inactive |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0281"}); |
|
} |
|
else |
|
{ |
|
# Mark active |
|
my $variable_uuid = $anvil->Database->insert_or_update_variables({ |
|
variable_name => $variable_name, |
|
variable_value => "1", |
|
variable_default => "0", |
|
variable_description => "striker_0294", |
|
variable_section => "database", |
|
variable_source_uuid => "NULL", |
|
variable_source_table => "", |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { variable_uuid => $variable_uuid }}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0278"}); |
|
} |
|
} |
|
|
|
return(0); |
|
} |
|
|
|
sub update_network_mapping |
|
{ |
|
my ($anvil) = @_; |
|
|
|
my $variable_name = "config::map_network"; |
|
my ($map_network_value, $map_network_uuid, $map_network_mtime, $map_network_modified_date) = $anvil->Database->read_variable({ |
|
variable_name => $variable_name, |
|
variable_source_table => "hosts", |
|
variable_source_uuid => $anvil->data->{sys}{host_uuid}, |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { |
|
's1:variable_name' => $variable_name, |
|
's2:map_network_value' => $map_network_value, |
|
's3:map_network_mtime' => $map_network_mtime, |
|
's4:map_network_modified_date' => $map_network_modified_date, |
|
's5:map_network_uuid' => $map_network_uuid, |
|
}}); |
|
if ($anvil->data->{switches}{'check-configured'}) |
|
{ |
|
# We'll run for a day (should be cancelled by the program when the user's done, so this |
|
# shouldn't fire in practice). |
|
my $expire_age = 86400; |
|
my $map_network_age = 0; |
|
if ($map_network_uuid) |
|
{ |
|
$map_network_age = time - $map_network_mtime; |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => { map_network_age => $map_network_age }}); |
|
} |
|
if ($map_network_value) |
|
{ |
|
# How long ago was it set? |
|
$anvil->data->{switches}{'clear-mapping'} = "" if not defined $anvil->data->{switches}{'clear-mapping'}; |
|
if (($map_network_age >= $expire_age) or ($anvil->data->{switches}{'clear-mapping'})) |
|
{ |
|
# Clear it. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "log_0470"}); |
|
$anvil->Database->insert_or_update_variables({ |
|
debug => 3, |
|
variable_value => 0, |
|
variable_uuid => $map_network_uuid, |
|
update_value_only => 1, |
|
}); |
|
} |
|
else |
|
{ |
|
# Mark it so we only track the network. |
|
my $say_age = $anvil->Convert->add_commas({number => $expire_age}); |
|
my $timeout = $anvil->Convert->add_commas({number => ($expire_age - $map_network_age)}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0471", variables => { |
|
age => $say_age, |
|
timeout => $timeout, |
|
}}); |
|
} |
|
} |
|
return(0); |
|
} |
|
|
|
if ($anvil->data->{switches}{'enable-network-mapping'}) |
|
{ |
|
if ($map_network_value) |
|
{ |
|
# Nothing to do. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0353"}); |
|
} |
|
else |
|
{ |
|
# Enable network configuring. |
|
my $variable_uuid = $anvil->Database->insert_or_update_variables({ |
|
variable_name => $variable_name, |
|
variable_value => 1, |
|
variable_default => "", |
|
variable_description => "striker_0202", |
|
variable_section => "config", |
|
variable_source_uuid => $anvil->Get->host_uuid, |
|
variable_source_table => "hosts", |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { variable_uuid => $variable_uuid }}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0354"}); |
|
} |
|
} |
|
|
|
if ($anvil->data->{switches}{'disable-network-mapping'}) |
|
{ |
|
if ($map_network_value) |
|
{ |
|
# Disable network configuring. |
|
my $variable_uuid = $anvil->Database->insert_or_update_variables({ |
|
variable_name => $variable_name, |
|
variable_value => 0, |
|
variable_default => "", |
|
variable_description => "striker_0202", |
|
variable_section => "config", |
|
variable_source_uuid => $anvil->Get->host_uuid, |
|
variable_source_table => "hosts", |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { variable_uuid => $variable_uuid }}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0356"}); |
|
} |
|
else |
|
{ |
|
# Nothing to do. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0355"}); |
|
} |
|
} |
|
|
|
return(0); |
|
} |
|
|
|
sub update_config |
|
{ |
|
my ($anvil) = @_; |
|
|
|
# Check if it's already configured. |
|
my $configured = $anvil->System->check_if_configured({debug => 2}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { configured => $configured }}); |
|
|
|
if ($anvil->data->{switches}{'check-configured'}) |
|
{ |
|
if ($configured) |
|
{ |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0275"}); |
|
} |
|
else |
|
{ |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0274"}); |
|
} |
|
return(0); |
|
} |
|
|
|
if ($configured) |
|
{ |
|
if ($anvil->data->{switches}{'mark-configured'}) |
|
{ |
|
# Nothing to do. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0271"}); |
|
} |
|
else |
|
{ |
|
# Mark UN configures. |
|
my $variable_uuid = $anvil->Database->insert_or_update_variables({ |
|
variable_name => "system::configured", |
|
variable_value => 0, |
|
variable_default => "", |
|
variable_description => "striker_0048", |
|
variable_section => "system", |
|
variable_source_uuid => $anvil->Get->host_uuid, |
|
variable_source_table => "hosts", |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { variable_uuid => $variable_uuid }}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0272"}); |
|
} |
|
} |
|
else |
|
{ |
|
if ($anvil->data->{switches}{'mark-unconfigured'}) |
|
{ |
|
# Nothing to do. |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0273"}); |
|
} |
|
else |
|
{ |
|
# Mark configures. |
|
my $variable_uuid = $anvil->Database->insert_or_update_variables({ |
|
variable_name => "system::configured", |
|
variable_value => 1, |
|
variable_default => "", |
|
variable_description => "striker_0048", |
|
variable_section => "system", |
|
variable_source_uuid => $anvil->Get->host_uuid, |
|
variable_source_table => "hosts", |
|
}); |
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { variable_uuid => $variable_uuid }}); |
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "message_0270"}); |
|
} |
|
} |
|
|
|
return(0); |
|
}
|
|
|