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.
151 lines
5.0 KiB
151 lines
5.0 KiB
1 year ago
|
#!/usr/bin/perl
|
||
|
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
use Anvil::Tools;
|
||
|
use Data::Dumper;
|
||
|
use Text::Diff;
|
||
|
use Term::Cap;
|
||
|
use Time::Local;
|
||
|
|
||
|
$| = 1;
|
||
|
|
||
|
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();
|
||
|
|
||
|
# Get a list of all interfaces with IP addresses.
|
||
|
$anvil->Get->switches({debug => 3, list => []});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => $anvil->data->{switches}});
|
||
|
|
||
|
$anvil->Database->connect;
|
||
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 3, secure => 0, key => "log_0132"});
|
||
|
if (not $anvil->data->{sys}{database}{connections})
|
||
|
{
|
||
|
# No databases, exit.
|
||
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 0, secure => 0, key => "error_0003"});
|
||
|
$anvil->nice_exit({exit_code => 1});
|
||
|
}
|
||
|
|
||
|
my $t = Term::Cap->Tgetent;
|
||
|
|
||
|
print "Checking the state of all known machines. Please be patient.\n";
|
||
|
|
||
|
$anvil->Database->get_hosts();
|
||
|
foreach my $show_host_type ("striker", "node", "dr")
|
||
|
{
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { show_host_type => $show_host_type }});
|
||
|
if ($show_host_type eq "striker")
|
||
|
{
|
||
|
print "-=] Striker Dashboards;\n";
|
||
|
}
|
||
|
elsif ($show_host_type eq "node")
|
||
|
{
|
||
|
print "\n-=] Anvil! sub-nodes;\n";
|
||
|
}
|
||
|
elsif ($show_host_type eq "dr")
|
||
|
{
|
||
|
print "\n-=] DR Hosts\n";
|
||
|
}
|
||
|
foreach my $host_name (sort {$a cmp $b} keys %{$anvil->data->{sys}{hosts}{by_name}})
|
||
|
{
|
||
|
my $host_uuid = $anvil->data->{sys}{hosts}{by_name}{$host_name};
|
||
|
my $host_type = $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_type};
|
||
|
my $short_host_name = $anvil->data->{hosts}{host_uuid}{$host_uuid}{short_host_name};
|
||
|
my $host_ipmi = $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_ipmi};
|
||
|
my $access = "";
|
||
|
my $say_uptime = "";
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:host_name' => $host_name,
|
||
|
's2:short_host_name' => $short_host_name,
|
||
|
's3:host_uuid' => $host_uuid,
|
||
|
's4:host_type' => $host_type,
|
||
|
's5:host_ipmi' => $anvil->Log->is_secure($host_ipmi),
|
||
|
}});
|
||
|
next if $host_type ne $show_host_type;
|
||
|
next if $host_uuid eq $anvil->Get->host_uuid;
|
||
|
my $matches = $anvil->Network->find_access({
|
||
|
debug => 2,
|
||
|
target => $host_name,
|
||
|
});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { matches => $matches }});
|
||
|
foreach my $network_name (sort {$a cmp $b} keys %{$anvil->data->{network_access}})
|
||
|
{
|
||
|
my $target_ip = $anvil->data->{network_access}{$network_name}{target_ip_address};
|
||
|
my $test_access = $anvil->Remote->test_access({target => $target_ip});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:network_name' => $network_name,
|
||
|
's2:target_ip' => $target_ip,
|
||
|
's3:test_access' => $test_access,
|
||
|
}});
|
||
|
|
||
|
if ($test_access)
|
||
|
{
|
||
|
# We're good.
|
||
|
$access = 1;
|
||
|
my $uptime = $anvil->Get->uptime({debug => 2, target => $target_ip});
|
||
|
$say_uptime = $anvil->Convert->time({
|
||
|
debug => 2,
|
||
|
'time' => $uptime ? $uptime : 0,
|
||
|
translate => 1,
|
||
|
long => 1,
|
||
|
});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:access' => $access,
|
||
|
's2:uptime' => $uptime,
|
||
|
's3:say_uptime' => $say_uptime,
|
||
|
}});
|
||
|
last;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($access)
|
||
|
{
|
||
|
print $short_host_name." is up and has been running for: [".$say_uptime."]\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Can we check the power using IPMI?
|
||
|
if ($host_ipmi)
|
||
|
{
|
||
|
my $shell_call = $host_ipmi." -o status";
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, secure => 1, list => { shell_call => $shell_call }});
|
||
|
|
||
|
my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call, secure => 1});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
output => $output,
|
||
|
return_code => $return_code,
|
||
|
}});
|
||
|
|
||
|
if ($return_code eq "0")
|
||
|
{
|
||
|
# The machine is already on
|
||
|
print "The machine: [".$short_host_name."] appears to be powered ON, but we can't reach it. Is it booting?\n";
|
||
|
}
|
||
|
elsif ($return_code eq "1")
|
||
|
{
|
||
|
# Unable to connect to the fence device.
|
||
|
print "The machine: [".$short_host_name."] can not be reached, and we can't check it's power status either. Has it been completely powered off?\n";
|
||
|
}
|
||
|
elsif ($return_code eq "2")
|
||
|
{
|
||
|
# The machine is off, try to start it.
|
||
|
print "The machine: [".$short_host_name."] is confirmed to be powered OFF.\n";
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print "The machine: [".$short_host_name."] appears to be offline, and doesn't appear to have out-of-band management to check the power status.\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
print "\n Done!\n";
|
||
|
|
||
|
$anvil->nice_exit({exit_code => 0});
|