Local modifications to ClusterLabs/Anvil by Alteeve
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

#!/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});