diff --git a/Anvil/Tools/System.pm b/Anvil/Tools/System.pm index 07ec0fb0..fe8d6aec 100644 --- a/Anvil/Tools/System.pm +++ b/Anvil/Tools/System.pm @@ -5407,16 +5407,18 @@ sub _check_anvil_conf admin_uid => $admin_uid, admin_gid => $admin_gid, }}); - if (not $admin_gid) + if ((not $admin_uid) && (not $admin_gid)) { - # Create the admin group - my ($output, $return_code) = $anvil->System->call({debug => $debug, shell_call => $anvil->data->{path}{exe}{groupadd}." --system admin"}); + # Create the admin user and group + my ($output, $return_code) = $anvil->System->call({debug => $debug, shell_call => $anvil->data->{path}{exe}{useradd}." --create-home --comment \"Anvil! user account\" admin"}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { output => $output, return_code => $return_code, }}); + $admin_uid = getpwnam('admin'); $admin_gid = getgrnam('admin'); + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "alert", key => "warning_0119", variables => { uid => $admin_uid }}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "alert", key => "warning_0118", variables => { gid => $admin_gid }}); } if (not $admin_uid) @@ -5428,8 +5430,20 @@ sub _check_anvil_conf return_code => $return_code, }}); - my $admin_uid = getpwnam('admin'); - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "alert", key => "warning_0119", variables => { uid => $admin_gid }}); + $admin_uid = getpwnam('admin'); + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "alert", key => "warning_0119", variables => { uid => $admin_uid }}); + } + if (not $admin_gid) + { + # Create the admin group + my ($output, $return_code) = $anvil->System->call({debug => $debug, shell_call => $anvil->data->{path}{exe}{groupadd}." admin"}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { + output => $output, + return_code => $return_code, + }}); + + $admin_gid = getgrnam('admin'); + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "alert", key => "warning_0118", variables => { gid => $admin_gid }}); } # Does the file exist? diff --git a/share/words.xml b/share/words.xml index 884c4007..586d4a6b 100644 --- a/share/words.xml +++ b/share/words.xml @@ -849,6 +849,22 @@ resource #!variable!server!# { public history Server + CPU + RAM + Disk + Size + Storage Group + Bridge + Model + Last Known IP + Description + RAM Used + RAM Free + Bridges + Storage Group + Used + Free + Anvil! Node Pair Configure Network @@ -2513,6 +2529,10 @@ Available options; I was asked to resync. Calling the resync now. Aging out data to thin down the database(s). Prior to resync, we will check to see if any scan agent schemas need to be loaded. + #!variable!total_cores!#c (#!variable!sockets!#s) + #!variable!total_cores!#c (#!variable!sockets!#s, #!variable!cores!#c, #!variable!threads!#t), #!variable!model!#, #!variable!mode!# + #!variable!cores!#c (#!variable!threads!#t) + -=] Server Usage and Anvil! Node Resource Availability Saved the mail server information successfully! diff --git a/tools/anvil-report-usage b/tools/anvil-report-usage index 207fca72..8db8f287 100755 --- a/tools/anvil-report-usage +++ b/tools/anvil-report-usage @@ -17,10 +17,10 @@ if (($running_directory =~ /^\./) && ($ENV{PWD})) my $anvil = Anvil::Tools->new(); -$anvil->data->{switches}{brief} = 0; +$anvil->data->{switches}{detailed} = 0; $anvil->Get->switches(); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "switches::brief" => $anvil->data->{switches}{brief}, + "switches::detailed" => $anvil->data->{switches}{detailed}, }}); $anvil->Database->connect(); @@ -32,8 +32,17 @@ if (not $anvil->data->{sys}{database}{connections}) $anvil->nice_exit({exit_code => 1}); } -gather_data($anvil); +$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}); @@ -42,58 +51,480 @@ $anvil->nice_exit({exit_code => 0}); # Functions # ############################################################################################################# -sub gather_data +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}{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->data->{anvil_data}{$anvil_name}{dr1_host_uuid} = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_dr1_host_uuid}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "s1:anvil_data::${anvil_name}::anvil_description" => $anvil->data->{anvil_data}{$anvil_name}{description}, + "s2:anvil_data::${anvil_name}::node1_host_uuid" => $anvil->data->{anvil_data}{$anvil_name}{node1_host_uuid}, + "s3:anvil_data::${anvil_name}::node2_host_uuid" => $anvil->data->{anvil_data}{$anvil_name}{node2_host_uuid}, + "s4:anvil_data::${anvil_name}::dr1_host_uuid" => $anvil->data->{anvil_data}{$anvil_name}{dr1_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}; + my $dr1_host_uuid = $anvil->data->{anvil_data}{$anvil_name}{dr1_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->data->{anvil_data}{$anvil_name}{dr1_host_name} = ""; + if ($dr1_host_uuid) + { + $anvil->data->{anvil_data}{$anvil_name}{dr1_host_name} = $anvil->data->{hosts}{host_uuid}{$dr1_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}, + "s3:anvil_data::${anvil_name}::dr1_host_name" => $anvil->data->{anvil_data}{$anvil_name}{dr1_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}; + if ($dr1_host_uuid) + { + $anvil->data->{anvil_data}{$anvil_name}{dr1_host_name} = $anvil->data->{hosts}{host_uuid}{$dr1_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}, + "s3:anvil_data::${anvil_name}::dr1_host_name" => $anvil->data->{anvil_data}{$anvil_name}{dr1_host_name}, + }}); + } + + $anvil->Get->available_resources({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_string} = $say_cpu; + $anvil->data->{anvil_data}{$anvil_name}{ram_used_string} = $say_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_string" => $anvil->data->{anvil_data}{$anvil_name}{cpu_string}, + "s2:anvil_data::${anvil_name}::ram_used_string" => $anvil->data->{anvil_data}{$anvil_name}{ram_used_string}, + "s3:anvil_data::${anvil_name}::ram_free_string" => $anvil->data->{anvil_data}{$anvil_name}{ram_free_string}, + "s4: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; + my $vg_size_on_dr = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr}; + my $free_size_on_dr = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr}; + my $sg_used_on_dr = $vg_size_on_dr - $free_size_on_dr; + $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}).")", + 's6:vg_size_on_dr' => $anvil->Convert->add_commas({number => $vg_size_on_dr})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size_on_dr}).")", + 's7:free_size_on_dr' => $anvil->Convert->add_commas({number => $free_size_on_dr})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $free_size_on_dr}).")", + 's8:sg_used_on_dr' => $anvil->Convert->add_commas({number => $sg_used_on_dr})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $sg_used_on_dr}).")", + }}); + + $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}::say_used_size" => $anvil->data->{anvil_data}{$anvil_name}{storage_group}{$storage_group_name}{say_used_size}, + "s2: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) = @_; - collect_server_data($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_0078"}); + 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", $anvil_header)." "; + 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", $description_header)." "; + + } + # 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", $cpu_header)." "; + + 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_used_header)." "; + } + + # 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", $ram_free_header)." "; + + # 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", $bridge_header)." "; - 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}; + # 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_used_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)." |"; + + 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) = @_; + + 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 $lines = []; my $break_line = "+-".sprintf("%0${longest_server_name}d", 0); - $break_line .= "-+-".sprintf("%0${longest_server_name}d", 0); - $break_line .= "--------+-----+-----+------+------+--------+-----+---------+" + $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)." | Anvil! | CPU | RAM | Disk | Size | Bridge | MAC | Last IP |"; - my $blank_lead = "| ".sprintf("%-${longest_server_name}s", " ")." Anvil! CPU RAM | Disk | Size | Bridge | MAC | Last IP |"; - push @{$lines}, $break_line; - push @{$lines}, $header_line; - push @{$lines}, $break_line; - push @{$lines}, $blank_lead; + 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 $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 $cpu_total_cores = $anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{total_cores}; - 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}; - my $cpu_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}; - my $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}; - my $say_cpu = $cpu_total_cores." (".$cpu_sockets."s/".$cpu_cores."c/".$cpu_threads."t)"; - my $first_line = "| ".$server_name." | ".$anvil_name." | ".$say_cpu." | ".$say_ram_used." | "; + 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 $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}, $resource."/".$volume." | ".$say_size." | "; + 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}; @@ -103,6 +534,21 @@ sub gather_data 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 }}); + } } } @@ -119,28 +565,42 @@ sub gather_data { $ip = "--"; } - push @{$net_lines}, $bridge." | ".$mac." | ".$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 }}); + } } } } -# print "--------------------------------\n"; -# print Dumper $drbd_lines; -# print "--------------------------------\n"; -# print Dumper $net_lines; -# print "--------------------------------\n"; - 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:line_count' => $line_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] : "-- | -- | "; + 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, @@ -149,21 +609,16 @@ sub gather_data }}); if ($i == 0) { - push @{$lines}, $first_line.$drbd_line.$net_line; + push @{$anvil->data->{display}{lines}}, $first_line.$drbd_line.$net_line; } else { - push @{$lines}, "| -- | -- | -- | -- | ".$drbd_line.$net_line; + push @{$anvil->data->{display}{lines}}, $blank_lead.$drbd_line.$net_line; } } } } - - foreach my $line (@{$lines}) - { - print $line."\n"; - } - print $break_line."\n"; + push @{$anvil->data->{display}{lines}}, $break_line; return(0); } @@ -176,16 +631,17 @@ sub collect_server_data $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}{cpu_model} = 0; - $anvil->data->{longest}{ram_length} = 0; - $anvil->data->{longest}{resource_name} = 0; - $anvil->data->{longest}{resource_size} = 0; - $anvil->data->{longest}{disk_length} = 0; - $anvil->data->{longest}{bridge_name} = 0; - $anvil->data->{longest}{ip_address} = 0; + $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}; @@ -228,6 +684,22 @@ sub collect_server_data $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}, @@ -241,6 +713,7 @@ sub collect_server_data "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}) @@ -253,15 +726,15 @@ sub collect_server_data $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}{say_ram_used}) > $anvil->data->{longest}{ram_length}) + if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{say_cpu}) > $anvil->data->{longest}{cpu_string}) { - $anvil->data->{longest}{ram_length} = 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_length' => $anvil->data->{longest}{ram_length} }}); + $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}{cpu}{model_name}) > $anvil->data->{longest}{cpu_model}) + if (length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{say_ram_used}) > $anvil->data->{longest}{ram_string}) { - $anvil->data->{longest}{cpu_model} = length($anvil->data->{server_data}{$server_name}{server_uuid}{$server_uuid}{cpu}{model_name}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'longest::cpu_model' => $anvil->data->{longest}{cpu_model} }}); + $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 @@ -275,7 +748,7 @@ sub collect_server_data 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}; - my $dr1_host_name = ""; + my $dr1_host_name = ""; my $dr1_short_host_name = ""; if (($dr1_host_uuid) && (exists $anvil->data->{hosts}{host_uuid}{$dr1_host_uuid})) { @@ -312,18 +785,21 @@ sub collect_server_data # 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, + 's1:resource' => $resource, + 's2:volume' => $volume, + 's3:say_resource' => $say_resource, }}); - if (length($resource) > $anvil->data->{longest}{resource_name}) + if (length($say_resource) > $anvil->data->{longest}{resource_name}) { - $anvil->data->{longest}{resource_name} = length($resource); + $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 $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 }}); @@ -367,19 +843,53 @@ sub collect_server_data # 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 scan_lvm_lv_size FROM scan_lvm_lvs WHERE scan_lvm_lv_path = ".$anvil->Database->quote($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) { - # Find the size of the LV - $query .= " AND scan_lvm_lv_host_uuid = ".$anvil->Database->quote($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}, }}); } - $query .= ";"; $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}; @@ -390,9 +900,11 @@ sub collect_server_data if ($count) { - my $size = $results->[0]->[0]; + 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}).")", + 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) { @@ -401,21 +913,35 @@ sub collect_server_data 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}{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}.")", , + "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_length}) + 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}{disk_length} = 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_length' => $anvil->data->{longest}{disk_length} }}); + $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} }}); } } @@ -448,6 +974,30 @@ sub collect_server_data "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} }}); + } } }