b24b81c17c
Signed-off-by: digimer <mkelly@alteeve.ca>
1169 lines
70 KiB
Perl
Executable File
1169 lines
70 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
use Anvil::Tools;
|
|
use Data::Dumper;
|
|
use Text::Diff;
|
|
|
|
$| = 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();
|
|
|
|
# Read switches
|
|
$anvil->Get->switches({list => [
|
|
"detailed",
|
|
"machine"], 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 => 1, key => "log_0132"});
|
|
if (not $anvil->data->{sys}{database}{connections})
|
|
{
|
|
# No databases, exit.
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0359"});
|
|
$anvil->nice_exit({exit_code => 1});
|
|
}
|
|
|
|
$anvil->data->{display}{lines} = [];
|
|
collect_server_data($anvil);
|
|
collect_anvil_data($anvil);
|
|
show_servers($anvil);
|
|
show_anvils($anvil);
|
|
|
|
# Show the results
|
|
foreach my $line (@{$anvil->data->{display}{lines}})
|
|
{
|
|
print $line."\n";
|
|
}
|
|
|
|
$anvil->nice_exit({exit_code => 0});
|
|
|
|
|
|
#############################################################################################################
|
|
# Functions #
|
|
#############################################################################################################
|
|
|
|
sub collect_anvil_data
|
|
{
|
|
$anvil->data->{longest}{anvil_name} = 0;
|
|
$anvil->data->{longest}{description} = 0;
|
|
$anvil->data->{longest}{host_cpu_string} = 0;
|
|
$anvil->data->{longest}{ram_used} = 0;
|
|
$anvil->data->{longest}{ram_free} = 0;
|
|
$anvil->data->{longest}{bridge_string} = 0;
|
|
$anvil->data->{longest}{storage_group} = 0;
|
|
$anvil->data->{longest}{sg_used} = 0;
|
|
$anvil->data->{longest}{sg_free} = 0;
|
|
foreach my $anvil_name (sort {$a cmp $b} keys %{$anvil->data->{anvils}{anvil_name}})
|
|
{
|
|
my $anvil_uuid = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_uuid};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:anvil_name" => $anvil_name,
|
|
"s2:anvil_uuid" => $anvil_uuid,
|
|
}});
|
|
|
|
$anvil->data->{anvil_data}{$anvil_name}{anvil_uuid} = $anvil_uuid;
|
|
$anvil->data->{anvil_data}{$anvil_name}{description} = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_description};
|
|
$anvil->data->{anvil_data}{$anvil_name}{node1_host_uuid} = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_node1_host_uuid};
|
|
$anvil->data->{anvil_data}{$anvil_name}{node2_host_uuid} = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_node2_host_uuid};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:anvil_data::${anvil_name}::anvil_uuid" => $anvil->data->{anvil_data}{$anvil_name}{anvil_uuid},
|
|
"s2:anvil_data::${anvil_name}::anvil_description" => $anvil->data->{anvil_data}{$anvil_name}{description},
|
|
"s3:anvil_data::${anvil_name}::node1_host_uuid" => $anvil->data->{anvil_data}{$anvil_name}{node1_host_uuid},
|
|
"s4:anvil_data::${anvil_name}::node2_host_uuid" => $anvil->data->{anvil_data}{$anvil_name}{node2_host_uuid},
|
|
}});
|
|
|
|
if (length($anvil_name) > $anvil->data->{longest}{anvil_name})
|
|
{
|
|
$anvil->data->{longest}{anvil_name} = length($anvil_name);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::anvil_name' => $anvil->data->{longest}{anvil_name},
|
|
}});
|
|
}
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{description}) > $anvil->data->{longest}{description})
|
|
{
|
|
$anvil->data->{longest}{description} = length($anvil->data->{anvil_data}{$anvil_name}{description});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::description' => $anvil->data->{longest}{description},
|
|
}});
|
|
}
|
|
|
|
my $node1_host_uuid = $anvil->data->{anvil_data}{$anvil_name}{node1_host_uuid};
|
|
my $node2_host_uuid = $anvil->data->{anvil_data}{$anvil_name}{node2_host_uuid};
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$anvil->data->{anvil_data}{$anvil_name}{node1_host_name} = $anvil->data->{hosts}{host_uuid}{$node1_host_uuid}{host_name};
|
|
$anvil->data->{anvil_data}{$anvil_name}{node2_host_name} = $anvil->data->{hosts}{host_uuid}{$node2_host_uuid}{host_name};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:anvil_data::${anvil_name}::node1_host_name" => $anvil->data->{anvil_data}{$anvil_name}{node1_host_name},
|
|
"s2:anvil_data::${anvil_name}::node2_host_name" => $anvil->data->{anvil_data}{$anvil_name}{node2_host_name},
|
|
}});
|
|
}
|
|
else
|
|
{
|
|
$anvil->data->{anvil_data}{$anvil_name}{node1_host_name} = $anvil->data->{hosts}{host_uuid}{$node1_host_uuid}{short_host_name};
|
|
$anvil->data->{anvil_data}{$anvil_name}{node2_host_name} = $anvil->data->{hosts}{host_uuid}{$node2_host_uuid}{short_host_name};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:anvil_data::${anvil_name}::node1_host_name" => $anvil->data->{anvil_data}{$anvil_name}{node1_host_name},
|
|
"s2:anvil_data::${anvil_name}::node2_host_name" => $anvil->data->{anvil_data}{$anvil_name}{node2_host_name},
|
|
}});
|
|
}
|
|
|
|
$anvil->Get->available_resources({
|
|
debug => 2,
|
|
anvil_uuid => $anvil_uuid,
|
|
});
|
|
my $cpu_cores = $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores};
|
|
my $cpu_threads = $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads};
|
|
my $say_cpu = $anvil->Words->string({key => "message_0289", variables => {
|
|
cores => $cpu_cores,
|
|
threads => $cpu_threads,
|
|
}});
|
|
my $ram_available = $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available};
|
|
my $say_ram_available = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_available});
|
|
my $ram_used = $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{allocated};
|
|
my $say_ram_used = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_used});
|
|
my $ram_hardware = $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{hardware};
|
|
my $say_ram_hardware = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_hardware});
|
|
|
|
my $bridges = "";
|
|
foreach my $bridge_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}})
|
|
{
|
|
$bridges .= $bridge_name.", ";
|
|
}
|
|
$bridges =~ s/, $//;
|
|
|
|
# Store
|
|
$anvil->data->{anvil_data}{$anvil_name}{cpu_cores} = $cpu_cores;
|
|
$anvil->data->{anvil_data}{$anvil_name}{cpu_threads} = $cpu_threads;
|
|
$anvil->data->{anvil_data}{$anvil_name}{cpu_string} = $say_cpu;
|
|
$anvil->data->{anvil_data}{$anvil_name}{ram_used_string} = $say_ram_hardware;
|
|
$anvil->data->{anvil_data}{$anvil_name}{ram_available} = $ram_available;
|
|
$anvil->data->{anvil_data}{$anvil_name}{ram_used} = $ram_used;
|
|
$anvil->data->{anvil_data}{$anvil_name}{ram_hardware} = $ram_hardware;
|
|
$anvil->data->{anvil_data}{$anvil_name}{ram_free_string} = $say_ram_available;
|
|
$anvil->data->{anvil_data}{$anvil_name}{bridge_string} = $bridges;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:anvil_data::${anvil_name}::cpu_cores" => $anvil->data->{anvil_data}{$anvil_name}{cpu_cores},
|
|
"s2:anvil_data::${anvil_name}::cpu_threads" => $anvil->data->{anvil_data}{$anvil_name}{cpu_threads},
|
|
"s3:anvil_data::${anvil_name}::cpu_string" => $anvil->data->{anvil_data}{$anvil_name}{cpu_string},
|
|
"s4:anvil_data::${anvil_name}::ram_used_string" => $anvil->data->{anvil_data}{$anvil_name}{ram_used_string},
|
|
"s5:anvil_data::${anvil_name}::ram_available" => $anvil->data->{anvil_data}{$anvil_name}{ram_available},
|
|
"s6:anvil_data::${anvil_name}::ram_used" => $anvil->data->{anvil_data}{$anvil_name}{ram_used},
|
|
"s7:anvil_data::${anvil_name}::ram_hardware" => $anvil->data->{anvil_data}{$anvil_name}{ram_hardware},
|
|
"s8:anvil_data::${anvil_name}::ram_free_string" => $anvil->data->{anvil_data}{$anvil_name}{ram_free_string},
|
|
"s9:anvil_data::${anvil_name}::bridge_string" => $anvil->data->{anvil_data}{$anvil_name}{bridge_string},
|
|
}});
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{cpu_string}) > $anvil->data->{longest}{host_cpu_string})
|
|
{
|
|
$anvil->data->{longest}{host_cpu_string} = length($anvil->data->{anvil_data}{$anvil_name}{cpu_string});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::host_cpu_string' => $anvil->data->{longest}{host_cpu_string},
|
|
}});
|
|
}
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{ram_used_string}) > $anvil->data->{longest}{ram_used})
|
|
{
|
|
$anvil->data->{longest}{ram_used} = length($anvil->data->{anvil_data}{$anvil_name}{ram_used_string});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::ram_used' => $anvil->data->{longest}{ram_used},
|
|
}});
|
|
}
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{ram_free_string}) > $anvil->data->{longest}{ram_free})
|
|
{
|
|
$anvil->data->{longest}{ram_free} = length($anvil->data->{anvil_data}{$anvil_name}{ram_free_string});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::ram_free' => $anvil->data->{longest}{ram_free},
|
|
}});
|
|
}
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{bridge_string}) > $anvil->data->{longest}{bridge_string})
|
|
{
|
|
$anvil->data->{longest}{bridge_string} = length($anvil->data->{anvil_data}{$anvil_name}{bridge_string});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::bridge_string' => $anvil->data->{longest}{bridge_string},
|
|
}});
|
|
}
|
|
|
|
my $storage_groups = [];
|
|
foreach my $storage_group_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_resources}{$anvil_uuid}{storage_group_name}})
|
|
{
|
|
my $storage_group_uuid = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group_name}{$storage_group_name}{storage_group_uuid};
|
|
my $vg_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size};
|
|
my $free_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size};
|
|
my $sg_used = $vg_size - $free_size;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:storage_group_name' => $storage_group_name,
|
|
's2:storage_group_uuid' => $storage_group_uuid,
|
|
's3:vg_size' => $anvil->Convert->add_commas({number => $vg_size})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")",
|
|
's4:free_size' => $anvil->Convert->add_commas({number => $free_size})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $free_size}).")",
|
|
's5:sg_used' => $anvil->Convert->add_commas({number => $sg_used})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $sg_used}).")",
|
|
}});
|
|
|
|
$anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{storage_group_uuid} = $storage_group_uuid;
|
|
$anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{used_size} = $sg_used;
|
|
$anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{free_size} = $free_size;
|
|
$anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size} = $anvil->Convert->bytes_to_human_readable({'bytes' => $sg_used});
|
|
$anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_free_size} = $anvil->Convert->bytes_to_human_readable({'bytes' => $free_size});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:anvil_data::${anvil_name}::storage_group::${storage_group_name}::storage_group_uuid" => $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{storage_group_uuid},
|
|
"s2:anvil_data::${anvil_name}::storage_group::${storage_group_name}::used_size" => $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{used_size},
|
|
"s3:anvil_data::${anvil_name}::storage_group::${storage_group_name}::free_size" => $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{free_size},
|
|
"s4:anvil_data::${anvil_name}::storage_group::${storage_group_name}::say_used_size" => $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size},
|
|
"s5:anvil_data::${anvil_name}::storage_group::${storage_group_name}::say_free_size" => $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_free_size},
|
|
}});
|
|
|
|
if (length($storage_group_name) > $anvil->data->{longest}{storage_group})
|
|
{
|
|
$anvil->data->{longest}{storage_group} = length($storage_group_name);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::storage_group' => $anvil->data->{longest}{storage_group},
|
|
}});
|
|
}
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size}) > $anvil->data->{longest}{sg_used})
|
|
{
|
|
$anvil->data->{longest}{sg_used} = length($anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::sg_used' => $anvil->data->{longest}{sg_used},
|
|
}});
|
|
}
|
|
|
|
if (length($anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_free_size}) > $anvil->data->{longest}{sg_free})
|
|
{
|
|
$anvil->data->{longest}{sg_free} = length($anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_free_size});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
'longest::sg_used' => $anvil->data->{longest}{sg_used},
|
|
}});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
sub show_anvils
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
if ($anvil->data->{switches}{machine})
|
|
{
|
|
show_anvils_machine($anvil);
|
|
}
|
|
else
|
|
{
|
|
show_anvils_human($anvil);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
sub show_anvils_machine
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
$anvil->data->{show}{xml} .= " <nodes>\n";
|
|
foreach my $anvil_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_data}})
|
|
{
|
|
my $anvil_uuid = $anvil->data->{anvil_data}{$anvil_name}{anvil_uuid};
|
|
my $anvil_description = $anvil->data->{anvil_data}{$anvil_name}{description};
|
|
$anvil_description =~ s/^"//;
|
|
$anvil_description =~ s/"$//;
|
|
$anvil_description =~ s/"/\"/g;
|
|
my $cpu_cores = $anvil->data->{anvil_data}{$anvil_name}{cpu_cores};
|
|
my $cpu_threads = $anvil->data->{anvil_data}{$anvil_name}{cpu_threads};
|
|
my $ram_available = $anvil->data->{anvil_data}{$anvil_name}{ram_available};
|
|
my $ram_available_hr = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_available});
|
|
my $ram_used = $anvil->data->{anvil_data}{$anvil_name}{ram_used};
|
|
my $ram_used_hr = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_used});
|
|
my $ram_hardware = $anvil->data->{anvil_data}{$anvil_name}{ram_hardware};
|
|
my $ram_hardware_hr = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_hardware});
|
|
my $bridge_string = $anvil->data->{anvil_data}{$anvil_name}{bridge_string};
|
|
|
|
$anvil->data->{show}{xml} .= " <node name=\"".$anvil_name."\" uuid=\"".$anvil_uuid."\" description=\"".$anvil_description."\">
|
|
<cpu cores=\"".$cpu_cores."\" threads=\"".$cpu_threads."\" />
|
|
<ram hardware=\"".$ram_hardware."\" hardware-hr=\"".$ram_available_hr."\" used=\"".$ram_used."\" used-hr=\"".$ram_used_hr."\" available=\"".$ram_available."\" available-hr=\"".$ram_available_hr."\" />
|
|
<bridges available=\"".$bridge_string."\" />
|
|
";
|
|
foreach my $storage_group_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_data}{$anvil_name}{storage_group}})
|
|
{
|
|
my $storage_group_uuid = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{storage_group_uuid};
|
|
my $used_bytes = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{used_size};
|
|
my $free_bytes = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{free_size};
|
|
my $say_used_size = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size};
|
|
my $say_free_size = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_free_size};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:storage_group_name' => $storage_group_name,
|
|
's2:storage_group_uuid' => $storage_group_uuid,
|
|
's3:used_bytes' => $used_bytes,
|
|
's4:free_bytes' => $free_bytes,
|
|
's5:say_used_size' => $say_used_size,
|
|
's6:say_free_size' => $say_free_size,
|
|
}});
|
|
|
|
$anvil->data->{show}{xml} .= " <storage-group name=\"".$storage_group_name."\" uuid=\"".$storage_group_uuid."\" used-bytes=\"".$used_bytes."\" used-hr=\"".$say_used_size."\" free-bytes=\"".$free_bytes."\" free-hr=\"".$say_free_size."\" />\n";
|
|
}
|
|
$anvil->data->{show}{xml} .= " </node>\n";
|
|
}
|
|
$anvil->data->{show}{xml} .= " </nodes>
|
|
</resources>
|
|
";
|
|
print $anvil->data->{show}{xml};
|
|
|
|
return(0);
|
|
}
|
|
|
|
sub show_anvils_human
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
my $anvil_header = $anvil->Words->string({key => "header_0081"});
|
|
my $longest_anvil_name = length($anvil_header) > $anvil->data->{longest}{anvil_name} ? length($anvil_header) : $anvil->data->{longest}{anvil_name};
|
|
my $description_header = $anvil->Words->string({key => "header_0074"});
|
|
my $longest_description = length($description_header) > $anvil->data->{longest}{description} ? length($description_header) : $anvil->data->{longest}{description};
|
|
my $cpu_header = $anvil->Words->string({key => "header_0066"});
|
|
my $longest_cpu_string = length($cpu_header) > $anvil->data->{longest}{host_cpu_string} ? length($cpu_header) : $anvil->data->{longest}{host_cpu_string};
|
|
my $ram_used_header = $anvil->Words->string({key => "header_0075"});
|
|
my $longest_ram_used = length($ram_used_header) > $anvil->data->{longest}{ram_used} ? length($ram_used_header) : $anvil->data->{longest}{ram_used};
|
|
my $ram_free_header = $anvil->Words->string({key => "header_0076"});
|
|
my $longest_ram_free = length($ram_free_header) > $anvil->data->{longest}{ram_free} ? length($ram_free_header) : $anvil->data->{longest}{ram_free};
|
|
my $bridge_header = $anvil->Words->string({key => "header_0077"});
|
|
my $longest_bridge_string = length($bridge_header) > $anvil->data->{longest}{bridge_string} ? length($bridge_header) : $anvil->data->{longest}{bridge_string};
|
|
my $storage_group_header = $anvil->Words->string({key => "header_0070"});
|
|
my $longest_storage_group = length($storage_group_header) > $anvil->data->{longest}{storage_group} ? length($storage_group_header) : $anvil->data->{longest}{storage_group};
|
|
my $sg_used_header = $anvil->Words->string({key => "header_0079"});
|
|
my $longest_sg_used = length($sg_used_header) > $anvil->data->{longest}{sg_used} ? length($sg_used_header) : $anvil->data->{longest}{sg_used};
|
|
my $sg_free_header = $anvil->Words->string({key => "header_0080"});
|
|
my $longest_sg_free = length($sg_free_header) > $anvil->data->{longest}{sg_free} ? length($sg_free_header) : $anvil->data->{longest}{sg_free};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:longest_anvil_name' => $longest_anvil_name,
|
|
's2:longest_description' => $longest_description,
|
|
's3:longest_cpu_string' => $longest_cpu_string,
|
|
's4:longest_ram_used' => $longest_ram_used,
|
|
's5:longest_ram_free' => $longest_ram_free,
|
|
's6:longest_bridge_string' => $longest_bridge_string,
|
|
's7:longest_storage_group' => $longest_storage_group,
|
|
's8:longest_sg_used' => $longest_sg_used,
|
|
's9:longest_sg_free' => $longest_sg_free,
|
|
}});
|
|
|
|
# Anvil!
|
|
my $break_line = "+-".sprintf("%0${longest_anvil_name}d", 0);
|
|
my $header_line = "| ".sprintf("%-${longest_anvil_name}s", $anvil_header)." ";
|
|
my $blank_lead = "| ".sprintf("%-${longest_anvil_name}s", "")." ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
# Description
|
|
$break_line .= "-+-".sprintf("%0${longest_description}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_description}s", $description_header)." ";
|
|
$blank_lead .= "| ".sprintf("%-${longest_description}s", "")." ";
|
|
}
|
|
|
|
# CPU String
|
|
$break_line .= "-+-".sprintf("%0${longest_cpu_string}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_cpu_string}s", $cpu_header)." ";
|
|
$blank_lead .= "| ".sprintf("%-${longest_cpu_string}s", "")." ";
|
|
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
# RAM used
|
|
$break_line .= "-+-".sprintf("%0${longest_ram_used}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_ram_used}s", $ram_used_header)." ";
|
|
$blank_lead .= "| ".sprintf("%-${longest_ram_used}s", "")." ";
|
|
}
|
|
|
|
# RAM Free
|
|
$break_line .= "-+-".sprintf("%0${longest_ram_free}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_ram_free}s", $ram_free_header)." ";
|
|
$blank_lead .= "| ".sprintf("%-${longest_ram_free}s", "")." ";
|
|
|
|
# Bridges
|
|
$break_line .= "-+-".sprintf("%0${longest_bridge_string}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_bridge_string}s", $bridge_header)." ";
|
|
$blank_lead .= "| ".sprintf("%-${longest_bridge_string}s", "");
|
|
|
|
# Storage Group
|
|
$break_line .= "-+-".sprintf("%0${longest_storage_group}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_storage_group}s", $storage_group_header)." ";
|
|
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
# Storage Group Used
|
|
$break_line .= "-+-".sprintf("%0${longest_sg_used}d", 0);
|
|
$header_line .= "| ".sprintf("%-${longest_sg_used}s", $sg_used_header)." ";
|
|
}
|
|
|
|
# Storage Group Free Space
|
|
$break_line .= "-+-".sprintf("%0${longest_sg_free}d", 0)."-+";
|
|
$header_line .= "| ".sprintf("%-${longest_sg_free}s", $sg_free_header)." |";
|
|
|
|
$break_line =~ s/0/-/g;
|
|
|
|
push @{$anvil->data->{display}{lines}}, "";
|
|
push @{$anvil->data->{display}{lines}}, $break_line;
|
|
push @{$anvil->data->{display}{lines}}, $header_line;
|
|
push @{$anvil->data->{display}{lines}}, $break_line;
|
|
foreach my $anvil_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_data}})
|
|
{
|
|
my $anvil_description = $anvil->data->{anvil_data}{$anvil_name}{description};
|
|
my $cpu_string = $anvil->data->{anvil_data}{$anvil_name}{cpu_string};
|
|
my $ram_used_string = $anvil->data->{anvil_data}{$anvil_name}{ram_used_string};
|
|
my $ram_free_string = $anvil->data->{anvil_data}{$anvil_name}{ram_free_string};
|
|
my $bridge_string = $anvil->data->{anvil_data}{$anvil_name}{bridge_string};
|
|
|
|
my $first_line = "| ".sprintf("%-${longest_anvil_name}s", $anvil_name);
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$first_line .= " | ".sprintf("%-${longest_description}s", $anvil_description);
|
|
}
|
|
$first_line .= " | ".sprintf("%-${longest_cpu_string}s", $cpu_string);
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$first_line .= " | ".sprintf("%-${longest_ram_used}s", $ram_used_string);
|
|
}
|
|
$first_line .= " | ".sprintf("%-${longest_ram_free}s", $ram_free_string);
|
|
$first_line .= " | ".sprintf("%-${longest_bridge_string}s", $bridge_string);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { first_line => $first_line }});
|
|
|
|
my $storage_groups = [];
|
|
foreach my $storage_group_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_data}{$anvil_name}{storage_group}})
|
|
{
|
|
my $say_used_size = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size};
|
|
my $say_free_size = $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_free_size};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:storage_group_name' => $storage_group_name,
|
|
's2:say_used_size' => $say_used_size,
|
|
's3:say_free_size' => $say_free_size,
|
|
}});
|
|
|
|
my $storage_line = " | ".sprintf("%-${longest_storage_group}s", $storage_group_name);
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$storage_line .= " | ".sprintf("%-${longest_sg_used}s", $say_used_size);
|
|
}
|
|
$storage_line .= " | ".sprintf("%-${longest_sg_free}s", $say_free_size)." |";
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { storage_line => $storage_line }});
|
|
|
|
push @{$storage_groups}, $storage_line;
|
|
}
|
|
|
|
my $line_count = @{$storage_groups};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line_count => $line_count }});
|
|
foreach (my $i = 0; $i < $line_count; $i++)
|
|
{
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { i => $i }});
|
|
if ($i == 0)
|
|
{
|
|
push @{$anvil->data->{display}{lines}}, $first_line.$storage_groups->[$i];
|
|
}
|
|
else
|
|
{
|
|
push @{$anvil->data->{display}{lines}}, $blank_lead.$storage_groups->[$i];
|
|
}
|
|
}
|
|
}
|
|
push @{$anvil->data->{display}{lines}}, $break_line;
|
|
|
|
return(0);
|
|
}
|
|
|
|
sub show_servers
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
if ($anvil->data->{switches}{machine})
|
|
{
|
|
show_servers_machine($anvil);
|
|
}
|
|
else
|
|
{
|
|
show_servers_human($anvil);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
sub show_servers_machine
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
$anvil->data->{show}{xml} = "<?xml version=\"1.0\" ?>
|
|
<resources>
|
|
<servers>\n";
|
|
foreach my $server_name (sort {$a cmp $b} keys %{$anvil->data->{server_data}})
|
|
{
|
|
foreach my $server_uuid (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}})
|
|
{
|
|
my $anvil_name = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_name};
|
|
my $anvil_uuid = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_uuid};
|
|
my $cpu_sockets = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{sockets};
|
|
my $cpu_cores = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{cores};
|
|
my $cpu_threads = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{threads};
|
|
my $cpu_model = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_name} ? $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_name} : "";
|
|
my $cpu_fallback = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_fallback} ? $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_fallback} : "";
|
|
my $cpu_match = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{match} ? $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{match} : "";
|
|
my $cpu_vendor = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{vendor} ? $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{vendor} : "";
|
|
my $cpu_mode = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{mode} ? $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{mode} : "";
|
|
my $ram_used = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{ram_used};
|
|
my $ram_used_hr = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used};
|
|
$anvil->data->{show}{xml} .= " <server name=\"".$server_name."\" uuid=\"".$server_uuid."\">
|
|
<anvil name=\"".$anvil_name."\" uuid=\"".$anvil_uuid."\" />
|
|
<cpu cores=\"".$cpu_cores."\" threads=\"".$cpu_threads."\" sockets=\"".$cpu_sockets."\" model=\"".$cpu_model."\" fallback=\"".$cpu_fallback."\" match=\"".$cpu_match."\" vendor=\"".$cpu_vendor."\" mode=\"".$cpu_mode."\" />
|
|
<ram used_bytes=\"".$ram_used."\" used_hr=\"".$ram_used_hr."\" />
|
|
";
|
|
foreach my $resource (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}})
|
|
{
|
|
$anvil->data->{show}{xml} .= " <storage resource=\"".$resource."\">\n";
|
|
foreach my $volume (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}})
|
|
{
|
|
my $size = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{size};
|
|
my $say_size = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{say_size};
|
|
my $storage_group = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{storage_group};
|
|
$anvil->data->{show}{xml} .= " <volume number=\"".$volume."\" size-bytes=\"".$size."\" size-hr=\"".$say_size."\" storage-group=\"".$storage_group."\">\n";
|
|
foreach my $drbd_node (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}})
|
|
{
|
|
my $drbd_path = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path};
|
|
my $drbd_path_by_res = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path_by_res};
|
|
my $drbd_minor = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_minor};
|
|
my $meta_disk = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{'meta-disk'};
|
|
my $backing_lv = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{backing_lv};
|
|
my $node_host_uuid = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{host_uuid};
|
|
$anvil->data->{show}{xml} .= " <subnode name=\"".$drbd_node."\" host-uuid=\"".$node_host_uuid."\" path=\"".$drbd_path."\" res-path=\"".$drbd_path_by_res."\" minor=\"".$drbd_minor."\" meta-data=\"".$meta_disk."\" lv=\"".$backing_lv."\" />\n";
|
|
}
|
|
$anvil->data->{show}{xml} .= " </volume>\n";
|
|
}
|
|
$anvil->data->{show}{xml} .= " </storage>\n";
|
|
}
|
|
|
|
foreach my $bridge (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}})
|
|
{
|
|
$anvil->data->{show}{xml} .= " <network bridge=\"".$bridge."\">\n";
|
|
foreach my $alias (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}})
|
|
{
|
|
foreach my $mac (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}})
|
|
{
|
|
my $model = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{model};
|
|
my $ip = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{ip};
|
|
$anvil->data->{show}{xml} .= " <mac alias=\"".$alias."\" address=\"".$mac."\" model=\"".$model."\" ip=\"".$ip."\" />\n";
|
|
}
|
|
}
|
|
$anvil->data->{show}{xml} .= " </network>\n";
|
|
}
|
|
$anvil->data->{show}{xml} .= " </server>\n";
|
|
}
|
|
}
|
|
$anvil->data->{show}{xml} .= " </servers>\n";
|
|
|
|
return(0);
|
|
}
|
|
|
|
sub show_servers_human
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
my $server_header = $anvil->Words->string({key => "header_0065"});
|
|
my $longest_server_name = length($server_header) > $anvil->data->{longest}{server_name} ? length($server_header) : $anvil->data->{longest}{server_name};
|
|
my $anvil_header = $anvil->Words->string({key => "brand_0002"});
|
|
my $longest_anvil_name = length($anvil_header) > $anvil->data->{longest}{anvil_name} ? length($anvil_header) : $anvil->data->{longest}{anvil_name};
|
|
my $cpu_header = $anvil->Words->string({key => "header_0066"});
|
|
my $longest_cpu_string = length($cpu_header) > $anvil->data->{longest}{cpu_string} ? length($cpu_header) : $anvil->data->{longest}{cpu_string};
|
|
my $ram_header = $anvil->Words->string({key => "header_0067"});
|
|
my $longest_ram_string = length($ram_header) > $anvil->data->{longest}{ram_string} ? length($ram_header) : $anvil->data->{longest}{ram_string};
|
|
my $resource_header = $anvil->Words->string({key => "header_0068"});
|
|
my $longest_resource_name = length($resource_header) > $anvil->data->{longest}{resource_name} ? length($resource_header) : $anvil->data->{longest}{resource_name};
|
|
my $disk_header = $anvil->Words->string({key => "header_0069"});
|
|
my $longest_disk_size = length($disk_header) > $anvil->data->{longest}{disk_size} ? length($disk_header) : $anvil->data->{longest}{disk_size};
|
|
my $storage_group_header = $anvil->Words->string({key => "header_0070"});
|
|
my $longest_storage_group = length($storage_group_header) > $anvil->data->{longest}{storage_group} ? length($storage_group_header) : $anvil->data->{longest}{storage_group};
|
|
my $bridge_header = $anvil->Words->string({key => "header_0071"});
|
|
my $longest_bridge_name = length($bridge_header) > $anvil->data->{longest}{bridge_name} ? length($bridge_header) : $anvil->data->{longest}{bridge_name};
|
|
my $net_model_header = $anvil->Words->string({key => "header_0072"});
|
|
my $longest_net_model_name = length($net_model_header) > $anvil->data->{longest}{net_model_name} ? length($net_model_header) : $anvil->data->{longest}{net_model_name};
|
|
my $mac_address_header = $anvil->Words->string({key => "header_0002"});
|
|
my $longest_mac_address = length($mac_address_header) > $anvil->data->{longest}{mac_address} ? length($mac_address_header) : $anvil->data->{longest}{mac_address};
|
|
my $ip_address_header = $anvil->Words->string({key => "header_0073"});
|
|
my $longest_ip_address = length($ip_address_header) > $anvil->data->{longest}{ip_address} ? length($ip_address_header) : $anvil->data->{longest}{ip_address};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's01:longest_server_name' => $longest_server_name,
|
|
's02:longest_anvil_name' => $longest_anvil_name,
|
|
's03:longest_cpu_string' => $longest_cpu_string,
|
|
's04:longest_ram_string' => $longest_ram_string,
|
|
's05:longest_resource_name' => $longest_resource_name,
|
|
's06:longest_disk_size' => $longest_disk_size,
|
|
's07:longest_storage_group' => $longest_storage_group,
|
|
's08:longest_bridge_name' => $longest_bridge_name,
|
|
's09:longest_net_model_name' => $longest_net_model_name,
|
|
's10:longest_mac_address' => $longest_mac_address,
|
|
's11:longest_ip_address' => $longest_ip_address,
|
|
}});
|
|
|
|
my $break_line = "+-".sprintf("%0${longest_server_name}d", 0);
|
|
$break_line .= "-+-".sprintf("%0${longest_anvil_name}d", 0);
|
|
$break_line .= "-+-".sprintf("%0${longest_cpu_string}d", 0);
|
|
$break_line .= "-+-".sprintf("%0${longest_ram_string}d", 0);
|
|
$break_line .= "-+-".sprintf("%0${longest_resource_name}d", 0);
|
|
$break_line .= "-+-".sprintf("%0${longest_disk_size}d", 0);
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$break_line .= "-+-".sprintf("%0${longest_storage_group}d", 0);
|
|
}
|
|
$break_line .= "-+-".sprintf("%0${longest_bridge_name}d", 0);
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$break_line .= "-+-".sprintf("%0${longest_net_model_name}d", 0);
|
|
$break_line .= "-+-".sprintf("%0${longest_mac_address}d", 0);
|
|
}
|
|
$break_line .= "-+-".sprintf("%0${longest_ip_address}d", 0)."-+";
|
|
$break_line =~ s/0/-/g;
|
|
|
|
my $header_line = "| ".sprintf("%-${longest_server_name}s", $server_header)." ";
|
|
$header_line .= "| ".sprintf("%-${longest_anvil_name}s", $anvil_header)." ";
|
|
$header_line .= "| ".sprintf("%-${longest_cpu_string}s", $cpu_header)." ";
|
|
$header_line .= "| ".sprintf("%-${longest_ram_string}s", $ram_header)." ";
|
|
$header_line .= "| ".sprintf("%-${longest_resource_name}s", $resource_header)." ";
|
|
$header_line .= "| ".sprintf("%-${longest_disk_size}s", $disk_header)." ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$header_line .= "| ".sprintf("%-${longest_storage_group}s", $storage_group_header)." ";
|
|
}
|
|
$header_line .= "| ".sprintf("%-${longest_bridge_name}s", $bridge_header)." ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$header_line .= "| ".sprintf("%-${longest_net_model_name}s", $net_model_header)." ";
|
|
$header_line .= "| ".sprintf("%-${longest_mac_address}s", $mac_address_header)." ";
|
|
}
|
|
$header_line .= "| ".sprintf("%-${longest_ip_address}s", $ip_address_header)." |";
|
|
|
|
my $blank_lead = "| ".sprintf("%-${longest_server_name}s", " ")." ";
|
|
$blank_lead .= " ".sprintf("%-${longest_anvil_name}s", " ")." ";
|
|
$blank_lead .= " ".sprintf("%-${longest_cpu_string}s", " ")." ";
|
|
$blank_lead .= " ".sprintf("%-${longest_ram_string}s", " ")." ";
|
|
my $blank_drbd = "";
|
|
my $blank_net = "";
|
|
|
|
push @{$anvil->data->{display}{lines}}, $anvil->Words->string({key => "message_0290"});
|
|
push @{$anvil->data->{display}{lines}}, $break_line;
|
|
push @{$anvil->data->{display}{lines}}, $header_line;
|
|
push @{$anvil->data->{display}{lines}}, $break_line;
|
|
#push @{$anvil->data->{display}{lines}}, $blank_lead;
|
|
foreach my $server_name (sort {$a cmp $b} keys %{$anvil->data->{server_data}})
|
|
{
|
|
# There should only ever be one UUID for a given name, but it's not impossible for there to be two.
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { server_name => $server_name }});
|
|
foreach my $server_uuid (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}})
|
|
{
|
|
my $anvil_name = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_name};
|
|
my $anvil_uuid = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_uuid};
|
|
my $say_cpu = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu};
|
|
my $ram_used = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{ram_used};
|
|
my $say_ram_used = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used};
|
|
my $first_line = "| ".sprintf("%-${longest_server_name}s", $server_name);
|
|
$first_line .= " | ".sprintf("%-${longest_anvil_name}s", $anvil_name);
|
|
$first_line .= " | ".sprintf("%-${longest_cpu_string}s", $say_cpu);
|
|
$first_line .= " | ".sprintf("%-${longest_ram_string}s", $say_ram_used)." | ";
|
|
|
|
my $drbd_lines = [];
|
|
foreach my $resource (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}})
|
|
{
|
|
foreach my $volume (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}})
|
|
{
|
|
my $say_size = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{say_size};
|
|
my $storage_group = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{storage_group};
|
|
my $say_resource = $resource."/".$volume;
|
|
my $storage_line = sprintf("%-${longest_resource_name}s", $say_resource)." | ";
|
|
$storage_line .= sprintf("%-${longest_disk_size}s", $say_size)." | ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$storage_line .= sprintf("%-${longest_storage_group}s", $storage_group)." | ";
|
|
}
|
|
|
|
push @{$drbd_lines}, $storage_line;
|
|
foreach my $drbd_node (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}})
|
|
{
|
|
my $drbd_path = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path};
|
|
my $drbd_path_by_res = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path_by_res};
|
|
my $drbd_minor = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_minor};
|
|
my $meta_disk = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{'meta-disk'};
|
|
my $backing_lv = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{backing_lv};
|
|
my $node_host_uuid = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{host_uuid};
|
|
}
|
|
|
|
if (not length($blank_drbd))
|
|
{
|
|
$blank_drbd = sprintf("%-${longest_resource_name}s", " ")." ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$blank_drbd .= sprintf("%-${longest_disk_size}s", " ")." ";
|
|
$blank_drbd .= sprintf("%-${longest_storage_group}s", " ")." | ";
|
|
}
|
|
else
|
|
{
|
|
$blank_drbd .= sprintf("%-${longest_disk_size}s", " ")." |";
|
|
}
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { blank_drbd => $blank_drbd }});
|
|
}
|
|
}
|
|
}
|
|
|
|
my $net_lines = [];
|
|
foreach my $bridge (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}})
|
|
{
|
|
foreach my $alias (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}})
|
|
{
|
|
foreach my $mac (sort {$a cmp $b} keys %{$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}})
|
|
{
|
|
my $model = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{model};
|
|
my $ip = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{ip};
|
|
if (not $ip)
|
|
{
|
|
$ip = "--";
|
|
}
|
|
my $net_line = sprintf("%-${longest_bridge_name}s", $bridge)." | ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$net_line .= sprintf("%-${longest_net_model_name}s", $model)." | ";
|
|
$net_line .= sprintf("%-${longest_mac_address}s", $mac)." | ";
|
|
}
|
|
$net_line .= sprintf("%-${longest_ip_address}s", $ip)." |";
|
|
|
|
push @{$net_lines}, $net_line;
|
|
|
|
if (not length($blank_net))
|
|
{
|
|
$blank_net = sprintf("%-${longest_bridge_name}s", " ")." ";
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$blank_net .= sprintf("%-${longest_net_model_name}s", " ")." ";
|
|
$blank_net .= sprintf("%-${longest_mac_address}s", " ")." ";
|
|
}
|
|
$blank_net .= sprintf("%-${longest_ip_address}s", " ")." |";
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { blank_net => $blank_net }});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
my $drbd_count = @{$drbd_lines};
|
|
my $net_count = @{$net_lines};
|
|
my $line_count = $drbd_count > $net_count ? $drbd_count : $net_count;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:drbd_count' => $drbd_count,
|
|
's2:net_count' => $net_count,
|
|
's3:line_count' => $line_count,
|
|
}});
|
|
foreach (my $i = 0; $i < $line_count; $i++)
|
|
{
|
|
my $drbd_line = $drbd_lines->[$i] ? $drbd_lines->[$i] : $blank_drbd;
|
|
my $net_line = $net_lines->[$i] ? $net_lines->[$i] : "-- | -- | -- ";
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:i' => $i,
|
|
's2:drbd_line' => $drbd_line,
|
|
's3:drbd_line' => $net_line,
|
|
}});
|
|
if ($i == 0)
|
|
{
|
|
push @{$anvil->data->{display}{lines}}, $first_line.$drbd_line.$net_line;
|
|
}
|
|
else
|
|
{
|
|
push @{$anvil->data->{display}{lines}}, $blank_lead.$drbd_line.$net_line;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
push @{$anvil->data->{display}{lines}}, $break_line;
|
|
|
|
return(0);
|
|
}
|
|
|
|
sub collect_server_data
|
|
{
|
|
my ($anvil) = @_;
|
|
|
|
$anvil->Database->get_anvils();
|
|
$anvil->Database->get_servers();
|
|
$anvil->Database->get_server_definitions();
|
|
|
|
$anvil->data->{longest}{server_name} = 0;
|
|
$anvil->data->{longest}{anvil_name} = 0;
|
|
$anvil->data->{longest}{cpu_string} = 0;
|
|
$anvil->data->{longest}{ram_string} = 0;
|
|
$anvil->data->{longest}{resource_name} = 0;
|
|
$anvil->data->{longest}{disk_size} = 0;
|
|
$anvil->data->{longest}{storage_group} = 0;
|
|
$anvil->data->{longest}{bridge_name} = 0;
|
|
$anvil->data->{longest}{net_model_name} = 0;
|
|
$anvil->data->{longest}{mac_address} = 0;
|
|
$anvil->data->{longest}{ip_address} = 0;
|
|
foreach my $server_uuid (sort {$a cmp $b} keys %{$anvil->data->{servers}{server_uuid}})
|
|
{
|
|
my $server_name = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_name};
|
|
my $anvil_uuid = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_anvil_uuid};
|
|
my $anvil_name = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_name};
|
|
my $server_ram = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_ram_in_use};
|
|
my $server_state = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_state};
|
|
if ($anvil->data->{servers}{server_uuid}{$server_uuid}{server_configured_ram} > $server_ram)
|
|
{
|
|
$server_ram = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_configured_ram};
|
|
}
|
|
my $say_server_ram = $anvil->Convert->bytes_to_human_readable({'bytes' => $server_ram});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:server_uuid' => $server_uuid,
|
|
's2:server_name' => $server_name,
|
|
's3:anvil_uuid' => $anvil_uuid,
|
|
's4:anvil_name' => $anvil_name,
|
|
's5:server_state' => $server_state,
|
|
's6:server_ram' => $anvil->Convert->add_commas({number => $server_ram})." (".$say_server_ram.")",
|
|
}});
|
|
|
|
next if $server_state eq "DELETED";
|
|
|
|
my $server_definition = $anvil->data->{server_definitions}{server_definition_server_uuid}{$server_uuid}{server_definition_xml};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { server_definition => $server_definition }});
|
|
|
|
my $target = $anvil->Get->short_host_name;
|
|
my $source = "from_db";
|
|
$anvil->Server->parse_definition({
|
|
debug => 2,
|
|
source => $source,
|
|
server => $server_name,
|
|
definition => $server_definition,
|
|
anvil_uuid => $anvil_uuid,
|
|
});
|
|
|
|
# CPU info
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_name} = $anvil_name;
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_uuid} = $anvil_uuid;
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{ram_used} = $server_ram;
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used} = $say_server_ram;
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{total_cores} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{total_cores};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{sockets} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{sockets};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{cores} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{cores};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{threads} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{threads};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_name} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{model_name};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_fallback} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{model_fallback};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{match} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{match};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{vendor} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{vendor};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{mode} = $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{mode};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu} = $anvil->Words->string({key => "message_0287", variables => {
|
|
total_cores => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{total_cores},
|
|
sockets => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{sockets},
|
|
}});
|
|
if ($anvil->data->{switches}{detailed})
|
|
{
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu} = $anvil->Words->string({key => "message_0288", variables => {
|
|
total_cores => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{total_cores},
|
|
sockets => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{sockets},
|
|
cores => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{cores},
|
|
threads => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{threads},
|
|
model => $anvil->data->{server}{$target}{$server_name}{$source}{cpu}{model_name},
|
|
mode => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{mode},
|
|
}});
|
|
}
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:server_data::${server_name}::server_uuid::${server_uuid}::anvil_name" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_name},
|
|
"s2:server_data::${server_name}::server_uuid::${server_uuid}::anvil_uuid" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{anvil_uuid},
|
|
"s3:server_data::${server_name}::server_uuid::${server_uuid}::ram_used" => $anvil->Convert->add_commas({number => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{ram_used}})." (".$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used}.")", ,
|
|
"s4:server_data::${server_name}::server_uuid::${server_uuid}::cpu::total_cores" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{total_cores},
|
|
"s5:server_data::${server_name}::server_uuid::${server_uuid}::cpu::sockets" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{sockets},
|
|
"s5:server_data::${server_name}::server_uuid::${server_uuid}::cpu::cores" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{cores},
|
|
"s6:server_data::${server_name}::server_uuid::${server_uuid}::cpu::threads" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{threads},
|
|
"s7:server_data::${server_name}::server_uuid::${server_uuid}::cpu::model_name" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_name},
|
|
"s8:server_data::${server_name}::server_uuid::${server_uuid}::cpu::model_fallback" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_fallback},
|
|
"s9:server_data::${server_name}::server_uuid::${server_uuid}::cpu::match" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{match},
|
|
"s10:server_data::${server_name}::server_uuid::${server_uuid}::cpu::vendor" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{vendor},
|
|
"s11:server_data::${server_name}::server_uuid::${server_uuid}::cpu::mode" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{mode},
|
|
"s12:server_data::${server_name}::server_uuid::${server_uuid}::cpu::say_cpu" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu},
|
|
}});
|
|
|
|
if (length($server_name) > $anvil->data->{longest}{server_name})
|
|
{
|
|
$anvil->data->{longest}{server_name} = length($server_name);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::server_name' => $anvil->data->{longest}{server_name} }});
|
|
}
|
|
if (length($anvil_name) > $anvil->data->{longest}{anvil_name})
|
|
{
|
|
$anvil->data->{longest}{anvil_name} = length($anvil_name);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::anvil_name' => $anvil->data->{longest}{anvil_name} }});
|
|
}
|
|
if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu}) > $anvil->data->{longest}{cpu_string})
|
|
{
|
|
$anvil->data->{longest}{cpu_string} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::cpu_string' => $anvil->data->{longest}{cpu_string} }});
|
|
}
|
|
if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used}) > $anvil->data->{longest}{ram_string})
|
|
{
|
|
$anvil->data->{longest}{ram_string} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::ram_string' => $anvil->data->{longest}{ram_string} }});
|
|
}
|
|
|
|
# I need to know what nodes are in this cluster, so I don't look at another node that may
|
|
# have a matching node name.
|
|
my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid};
|
|
my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:node1_host_uuid' => $node1_host_uuid,
|
|
's2:node2_host_uuid' => $node2_host_uuid,
|
|
}});
|
|
|
|
if (not exists $anvil->data->{hosts}{host_uuid}{$node1_host_uuid})
|
|
{
|
|
$anvil->Database->get_hosts({debug => 2});
|
|
}
|
|
|
|
# Get names.
|
|
my $node1_host_name = $anvil->data->{hosts}{host_uuid}{$node1_host_uuid}{host_name};
|
|
my $node1_short_host_name = $anvil->data->{hosts}{host_uuid}{$node1_host_uuid}{short_host_name};
|
|
my $node2_host_name = $anvil->data->{hosts}{host_uuid}{$node2_host_uuid}{host_name};
|
|
my $node2_short_host_name = $anvil->data->{hosts}{host_uuid}{$node2_host_uuid}{short_host_name};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:node1_host_name' => $node1_host_name,
|
|
's2:node1_short_host_name' => $node1_short_host_name,
|
|
's3:node2_host_name' => $node2_host_name,
|
|
's4:node2_short_host_name' => $node2_short_host_name,
|
|
}});
|
|
|
|
# Storage info.
|
|
foreach my $device_target (sort {$a cmp $b} keys %{$anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}})
|
|
{
|
|
my $address_domain = $anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}{$device_target}{address}{domain};
|
|
my $address_slot = $anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}{$device_target}{address}{slot};
|
|
my $address_function = $anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}{$device_target}{address}{function};
|
|
my $device_path = $anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}{$device_target}{path};
|
|
my $driver_io = $anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}{$device_target}{driver}{io};
|
|
my $driver_cache = $anvil->data->{server}{$target}{$server_name}{$source}{device}{disk}{target}{$device_target}{driver}{cache};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:device_target' => $device_target,
|
|
's2:address_domain' => $address_domain,
|
|
's3:address_slot' => $address_slot,
|
|
's4:address_function' => $address_function,
|
|
's5:device_path' => $device_path,
|
|
's6:driver_io' => $driver_io,
|
|
's7:driver_cache' => $driver_cache,
|
|
}});
|
|
|
|
# What is the DRBD resource name?
|
|
my ($resource, $volume) = ($device_path =~ /\/dev\/drbd\/by-res\/(.*?)\/(\d+)$/);
|
|
my $say_resource = $resource."/".$volume;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
's1:resource' => $resource,
|
|
's2:volume' => $volume,
|
|
's3:say_resource' => $say_resource,
|
|
}});
|
|
if (length($say_resource) > $anvil->data->{longest}{resource_name})
|
|
{
|
|
$anvil->data->{longest}{resource_name} = length($say_resource);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::resource_name' => $anvil->data->{longest}{resource_name} }});
|
|
}
|
|
|
|
# This will store the largest size LV becking the volume
|
|
my $disk_size = 0;
|
|
my $storage_group_name = "";
|
|
foreach my $drbd_node (sort {$a cmp $b} keys %{$anvil->data->{drbd}{drbd_node}})
|
|
{
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { drbd_node => $drbd_node }});
|
|
if (($drbd_node eq $node1_host_name) or
|
|
($drbd_node eq $node1_short_host_name) or
|
|
($drbd_node eq $node2_host_name) or
|
|
($drbd_node eq $node2_short_host_name))
|
|
{
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path} = $anvil->data->{drbd}{drbd_node}{$drbd_node}{config}{resource}{$resource}{volume}{$volume}{drbd_path};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path_by_res} = $anvil->data->{drbd}{drbd_node}{$drbd_node}{config}{resource}{$resource}{volume}{$volume}{drbd_path_by_res};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_minor} = $anvil->data->{drbd}{drbd_node}{$drbd_node}{config}{resource}{$resource}{volume}{$volume}{drbd_minor};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{'meta-disk'} = $anvil->data->{drbd}{drbd_node}{$drbd_node}{config}{resource}{$resource}{volume}{$volume}{'meta-disk'};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{backing_lv} = $anvil->data->{drbd}{drbd_node}{$drbd_node}{config}{resource}{$resource}{volume}{$volume}{backing_lv};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::node::${drbd_node}::drbd_path" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path},
|
|
"s2:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::node::${drbd_node}::drbd_path_by_res" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_path_by_res},
|
|
"s3:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::node::${drbd_node}::drbd_minor" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{drbd_minor},
|
|
"s4:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::node::${drbd_node}::meta_disk" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{'meta-disk'},
|
|
"s5:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::node::${drbd_node}::backing_lv" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{backing_lv},
|
|
}});
|
|
|
|
# What this node's host uuid?
|
|
my $node_host_uuid = "";
|
|
if (($drbd_node eq $node1_host_name) or ($drbd_node eq $node1_short_host_name))
|
|
{
|
|
$node_host_uuid = $node1_host_uuid;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { node_host_uuid => $node_host_uuid }});
|
|
}
|
|
elsif (($drbd_node eq $node2_host_name) or ($drbd_node eq $node2_short_host_name))
|
|
{
|
|
$node_host_uuid = $node2_host_uuid;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { node_host_uuid => $node_host_uuid }});
|
|
}
|
|
|
|
# How big is this LV?
|
|
my $backing_lv = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{backing_lv};
|
|
my $query = "
|
|
SELECT
|
|
a.scan_lvm_lv_size,
|
|
d.storage_group_name
|
|
FROM
|
|
scan_lvm_lvs a,
|
|
scan_lvm_vgs b,
|
|
storage_group_members c,
|
|
storage_groups d
|
|
WHERE
|
|
a.scan_lvm_lv_path = ".$anvil->Database->quote($backing_lv);
|
|
if ($node_host_uuid)
|
|
{
|
|
$query .= "
|
|
AND
|
|
a.scan_lvm_lv_host_uuid = ".$anvil->Database->quote($node_host_uuid);
|
|
}
|
|
$query .= "
|
|
AND
|
|
a.scan_lvm_lv_on_vg = b.scan_lvm_vg_name";
|
|
if ($node_host_uuid)
|
|
{
|
|
$query .= "
|
|
AND
|
|
b.scan_lvm_vg_host_uuid = ".$anvil->Database->quote($node_host_uuid);
|
|
}
|
|
$query .= "
|
|
AND
|
|
b.scan_lvm_vg_internal_uuid = c.storage_group_member_vg_uuid";
|
|
if ($node_host_uuid)
|
|
{
|
|
$query .= "
|
|
AND
|
|
c.storage_group_member_host_uuid = ".$anvil->Database->quote($node_host_uuid);
|
|
}
|
|
$query .= "
|
|
AND
|
|
c.storage_group_member_storage_group_uuid = d.storage_group_uuid
|
|
;";
|
|
if ($node_host_uuid)
|
|
{
|
|
# Store the host_uuid as well.
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{host_uuid} = $node_host_uuid;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::node::${drbd_node}::host_uuid" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{node}{$drbd_node}{host_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 => 2, list => {
|
|
results => $results,
|
|
count => $count,
|
|
}});
|
|
|
|
if ($count)
|
|
{
|
|
my $size = $results->[0]->[0];
|
|
my $in_storage_group = $results->[0]->[1];
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
size => $anvil->Convert->add_commas({number => $size})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $size}).")",
|
|
in_storage_group => $in_storage_group,
|
|
}});
|
|
if ($size > $disk_size)
|
|
{
|
|
$disk_size = $size;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
disk_size => $anvil->Convert->add_commas({number => $disk_size})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $disk_size}).")",
|
|
}});
|
|
}
|
|
|
|
if ((not $storage_group_name) && ($in_storage_group))
|
|
{
|
|
$storage_group_name = $in_storage_group;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { storage_group_name => $storage_group_name }});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# Store the disk size.
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{size} = $disk_size;
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{say_size} = $anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{size}});
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{storage_group} = $storage_group_name;
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::size" => $anvil->Convert->add_commas({number => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{size}})." (".$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{say_size}.")",
|
|
"s2:server_data::${server_name}::server_uuid::${server_uuid}::disk::${resource}::${volume}::storage_group" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{storage_group},
|
|
}});
|
|
|
|
if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{say_size}) > $anvil->data->{longest}{disk_size})
|
|
{
|
|
$anvil->data->{longest}{disk_size} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{say_size});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::disk_size' => $anvil->data->{longest}{disk_size} }});
|
|
}
|
|
|
|
if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{storage_group}) > $anvil->data->{longest}{storage_group})
|
|
{
|
|
$anvil->data->{longest}{storage_group} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{disk}{$resource}{$volume}{storage_group});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::storage_group' => $anvil->data->{longest}{storage_group} }});
|
|
}
|
|
}
|
|
|
|
# Find networks
|
|
foreach my $mac (sort {$a cmp $b} keys %{$anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}})
|
|
{
|
|
my $bridge = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{bridge};
|
|
my $alias = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{alias};
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:mac" => $mac,
|
|
"s2:bridge" => $bridge,
|
|
"s3:alias" => $alias,
|
|
}});
|
|
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{target} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{target};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{model} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{model};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{bus} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{address}{bus};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{domain} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{address}{domain};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{type} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{address}{type};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{slot} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{address}{slot};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{function} = $anvil->data->{server}{$target}{$server_name}{$source}{device}{interface}{$mac}{address}{function};
|
|
$anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{ip} = $anvil->Network->get_ip_from_mac({debug => 2, mac => $mac});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
"s1:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::target" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{target},
|
|
"s2:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::model" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{model},
|
|
"s3:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::bus" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{bus},
|
|
"s4:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::domain" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{domain},
|
|
"s5:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::type" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{type},
|
|
"s6:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::slot" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{slot},
|
|
"s7:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::function" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{function},
|
|
"s8:server_data::${server_name}::server_uuid::${server_uuid}::net::${bridge}::${alias}::${mac}::ip" => $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{ip},
|
|
}});
|
|
|
|
if (length($bridge) > $anvil->data->{longest}{bridge_name})
|
|
{
|
|
$anvil->data->{longest}{bridge_name} = length($bridge);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::bridge_name' => $anvil->data->{longest}{bridge_name} }});
|
|
}
|
|
|
|
if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{model}) > $anvil->data->{longest}{net_model_name})
|
|
{
|
|
$anvil->data->{longest}{net_model_name} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{model});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::net_model_name' => $anvil->data->{longest}{net_model_name} }});
|
|
}
|
|
|
|
if (length($mac) > $anvil->data->{longest}{mac_address})
|
|
{
|
|
$anvil->data->{longest}{mac_address} = length($mac);
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::mac_address' => $anvil->data->{longest}{mac_address} }});
|
|
}
|
|
|
|
if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{ip}) > $anvil->data->{longest}{ip_address})
|
|
{
|
|
$anvil->data->{longest}{ip_address} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{net}{$bridge}{$alias}{$mac}{ip});
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::ip_address' => $anvil->data->{longest}{ip_address} }});
|
|
}
|
|
}
|
|
}
|
|
|
|
return(0);
|
|
}
|