From bc8b9274cb3616f386e3576f29526fcb0c2ac0e8 Mon Sep 17 00:00:00 2001 From: Digimer Date: Thu, 22 Jul 2021 16:42:55 -0400 Subject: [PATCH] WIP; Reworked anvil-manage-server to have a more interactive menu system (for the sections done so far). Signed-off-by: Digimer --- share/words.xml | 4 + tools/anvil-manage-server | 589 +++++++++++++++++++++++--------------- 2 files changed, 365 insertions(+), 228 deletions(-) diff --git a/share/words.xml b/share/words.xml index 936fbbe3..25fafecc 100644 --- a/share/words.xml +++ b/share/words.xml @@ -2219,6 +2219,9 @@ Are you sure that you want to delete the server: [#!variable!server_name!#]? [Ty The fence delay to prefer the node: [#!variable!node!#] has been removed. The fence delay now prefers the node: [#!variable!node!#]. This is the TCP port that the VNC server is listening on to provide graphical access to the associated server. + [ #!variable!number!# ]- #!variable!server_name!# - (Current state: [#!variable!server_state!#]) + -=] Please select the Anvil! hosting the server you want to manage [=- + [ #!variable!number!# ]- #!variable!anvil_name!# - #!variable!anvil_description!# Saved the mail server information successfully! @@ -2544,6 +2547,7 @@ If you are comfortable that the target has changed for a known reason, you can s Control when the database is locked for use by any system except the lock holder. This is the number of bytes received (rx) by a network interface since it was last started. This is the number of bytes transmitted (tx) by a network interface since it was last started. + Stay Off #!variable!number!#/sec diff --git a/tools/anvil-manage-server b/tools/anvil-manage-server index 1865f477..c253c340 100755 --- a/tools/anvil-manage-server +++ b/tools/anvil-manage-server @@ -100,112 +100,6 @@ else $anvil->nice_exit({exit_code => 0}); - - - - - - - - - - - - - - - - - - - - - - - - - - - - -=cut -# Make sure we're in an Anvil! -$anvil->data->{sys}{anvil_uuid} = $anvil->Cluster->get_anvil_uuid(); -$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - 'sys::anvil_uuid' => $anvil->data->{sys}{anvil_uuid}, -}}); -if (not $anvil->data->{sys}{anvil_uuid}) -{ - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 0, priority => "err", key => "error_0260"}); - $anvil->Job->update_progress({progress => 100, message => "error_0260"}); - $anvil->nice_exit({exit_code => 1}); -} - -# Load servers and resources. -$anvil->Database->get_servers(); -$anvil->DRBD->gather_data({debug => 2}); -$anvil->Get->available_resources({ - debug => 2, - anvil_uuid => $anvil->data->{sys}{anvil_uuid}, -}); - -# Do we have a server (name or UUID)? -if ($anvil->Validate->uuid({uuid => $anvil->data->{switches}{server}})) -{ - $anvil->data->{sys}{server_uuid} = $anvil->data->{switches}{server}; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sys::server_uuid" => $anvil->data->{sys}{server_uuid}, - }}); - - # Find the server name - my $server_uuid = $anvil->data->{sys}{server_uuid}; - if (exists $anvil->data->{servers}{server_uuid}{$server_uuid}) - { - $anvil->data->{sys}{server_name} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_name}; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sys::server_name" => $anvil->data->{sys}{server_name}, - }}); - } -} -elsif ($anvil->data->{switches}{server}) -{ - $anvil->data->{sys}{server_name} = $anvil->data->{switches}{server}; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sys::server_name" => $anvil->data->{sys}{server_name}, - }}); - - # Get the server UUID. - my $anvil_uuid = $anvil->data->{sys}{anvil_uuid}; - my $server_name = $anvil->data->{sys}{server_name}; - if (exists $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$server_name}) - { - $anvil->data->{sys}{server_uuid} = $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$server_name}{server_uuid}; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "sys::server_uuid" => $anvil->data->{sys}{server_uuid}, - }}); - } -} - -# Do we have a valid server? -if ((not $anvil->data->{sys}{server_name}) or (not $anvil->data->{sys}{server_uuid})) -{ - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 0, key => "message_0247"}); - - my $anvil_uuid = $anvil->data->{sys}{anvil_uuid}; - foreach my $server_name (sort {$a cmp $b} keys %{$anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}}) - { - my $server_uuid = $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$server_name}{server_uuid}; - print "- ".$server_name." (".$server_uuid.")\n"; - } -} - -# Show the server's existing stats. -show_stats($anvil); -=cut - -$anvil->nice_exit({exit_code => 0}); - - ############################################################################################################# # Functions # ############################################################################################################# @@ -261,12 +155,21 @@ sub interactive_question } # Do we know or can we find the Anvil! UUID? - $anvil->data->{target_server}{anvil_uuid} = $anvil->data->{switches}{'anvil-uuid'} ? $anvil->data->{switches}{'anvil-uuid'} : ""; - $anvil->data->{target_server}{anvil_name} = $anvil->data->{switches}{'anvil-name'} ? $anvil->data->{switches}{'anvil-name'} : ""; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "target_server::anvil_name" => $anvil->data->{target_server}{anvil_name}, - "target_server::anvil_uuid" => $anvil->data->{target_server}{anvil_uuid}, - }}); + if ((not $anvil->data->{target_server}{anvil_name}) && ($anvil->data->{switches}{'anvil-name'})) + { + $anvil->data->{target_server}{anvil_name} = $anvil->data->{switches}{'anvil-name'}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "target_server::anvil_name" => $anvil->data->{target_server}{anvil_name}, + }}); + } + if ((not $anvil->data->{target_server}{anvil_uuid}) && ($anvil->data->{switches}{'anvil-uuid'})) + { + $anvil->data->{target_server}{anvil_uuid} = $anvil->data->{switches}{'anvil-uuid'}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "target_server::anvil_uuid" => $anvil->data->{target_server}{anvil_uuid}, + }}); + } + if ((not $anvil->data->{target_server}{anvil_uuid}) && (not $anvil->data->{target_server}{anvil_name})) { # Nothing given. Is this host a node, perhaps? @@ -462,41 +365,61 @@ sub interactive_question ### Pull out details of the server. # How much RAM are we using and how much is configured? - $anvil->data->{target_server}{server_ram_in_use} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_ram_in_use}; - $anvil->data->{target_server}{server_host_uuid} = $server_host_uuid; - $anvil->data->{target_server}{server_host_name} = $anvil->data->{hosts}{host_uuid}{$server_host_uuid}{host_name}; + $anvil->data->{target_server}{ram_in_use} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_ram_in_use}; + $anvil->data->{target_server}{configured_ram} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_configured_ram}; + $anvil->data->{target_server}{server_host_uuid} = $server_host_uuid; + $anvil->data->{target_server}{server_host_name} = $anvil->data->{hosts}{host_uuid}{$server_host_uuid}{host_name}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "target_server::server_ram_in_use" => $anvil->Convert->add_commas({number => $anvil->data->{target_server}{server_ram_in_use}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{target_server}{server_ram_in_use}}).")", + "target_server::ram_in_use" => $anvil->Convert->add_commas({number => $anvil->data->{target_server}{ram_in_use}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{target_server}{ram_in_use}}).")", + "target_server::configured_ram" => $anvil->Convert->add_commas({number => $anvil->data->{target_server}{configured_ram}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{target_server}{configured_ram}}).")", "target_server::server_host_uuid" => $anvil->data->{target_server}{server_host_uuid}, "target_server::server_host_name" => $anvil->data->{target_server}{server_host_name}, }}); if ($anvil->data->{target_server}{server_state} eq "shut off") { - $anvil->data->{target_server}{server_ram_in_use} = 0; - $anvil->data->{target_server}{server_host_uuid} = ""; - $anvil->data->{target_server}{server_host_name} = ""; + $anvil->data->{target_server}{ram_in_use} = 0; + $anvil->data->{target_server}{server_host_uuid} = ""; + $anvil->data->{target_server}{server_host_name} = ""; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "target_server::server_ram_in_use" => $anvil->Convert->add_commas({number => $anvil->data->{target_server}{server_ram_in_use}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{target_server}{server_ram_in_use}}).")", - "target_server::server_host_uuid" => $anvil->data->{target_server}{server_host_uuid}, - "target_server::server_host_name" => $anvil->data->{target_server}{server_host_name}, + "target_server::ram_in_use" => $anvil->Convert->add_commas({number => $anvil->data->{target_server}{ram_in_use}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{target_server}{ram_in_use}}).")", + "target_server::server_host_uuid" => $anvil->data->{target_server}{server_host_uuid}, + "target_server::server_host_name" => $anvil->data->{target_server}{server_host_name}, }}); } - $anvil->data->{target_server}{server_configured_ram} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_configured_ram}; - $anvil->data->{target_server}{server_start_after_server_uuid} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_after_server_uuid}; - $anvil->data->{target_server}{server_start_after_server_name} = ""; - $anvil->data->{target_server}{server_start_delay} = 0; + + # Does this server boot after others, or stay off? + $anvil->data->{target_server}{boot}{after_server_name} = ""; + $anvil->data->{target_server}{boot}{after_server_uuid} = ""; + $anvil->data->{target_server}{boot}{start_delay} = ""; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "target_server::server_configured_ram" => $anvil->Convert->add_commas({number => $anvil->data->{target_server}{server_configured_ram}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{target_server}{server_configured_ram}}).")", - "target_server::server_start_after_server_uuid" => $anvil->data->{target_server}{server_start_after_server_uuid}, + "servers::server_uuid::${server_uuid}::server_start_after_server_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_after_server_uuid}, }}); - if ($anvil->data->{target_server}{server_start_after_server_uuid}) + if (($anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_after_server_uuid}) && ($anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_after_server_uuid} ne "NULL")) { - my $server_start_after_server_uuid = $anvil->data->{target_server}{server_start_after_server_uuid}; - $anvil->data->{target_server}{server_start_after_server_name} = $anvil->data->{servers}{server_uuid}{$server_start_after_server_uuid}{server_name}; - $anvil->data->{target_server}{server_start_delay} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_delay}; + my $start_after_server_uuid = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_after_server_uuid}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { start_after_server_uuid => $start_after_server_uuid }}); + + if ($start_after_server_uuid eq "00000000-0000-0000-0000-000000000000") + { + # Stay off + $anvil->data->{target_server}{boot}{after_server_name} = $anvil->Words->string({key => "striker_0292"}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "target_server::boot::after_server_name" => $anvil->data->{target_server}{boot}{after_server_name}, + }}); + } + else + { + # Server proper + $anvil->data->{target_server}{boot}{after_server_name} = $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$start_after_server_uuid}{server_uuid}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "target_server::boot::after_server_name" => $anvil->data->{target_server}{boot}{after_server_name}, + }}); + } + $anvil->data->{target_server}{boot}{after_server_uuid} = "00000000-0000-0000-0000-000000000000"; + $anvil->data->{target_server}{boot}{start_delay} = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_delay}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "target_server::server_start_after_server_name" => $anvil->data->{target_server}{server_start_after_server_name}, - "target_server::server_start_delay" => $anvil->data->{target_server}{server_start_delay}, + "target_server::boot::after_server_uuid" => $anvil->data->{target_server}{boot}{after_server_uuid}, + "target_server::boot::start_delay" => $anvil->data->{target_server}{boot}{start_delay}, }}); } @@ -546,24 +469,11 @@ sub interactive_question host => $short_host_name, }); - my $cpu_sockets = $anvil->data->{server}{$short_host_name}{$server_name}{from_db}{cpu}{sockets}; - my $cpu_threads = $anvil->data->{server}{$short_host_name}{$server_name}{from_db}{cpu}{threads}; - my $ram_bytes = $anvil->data->{server}{$short_host_name}{$server_name}{from_db}{memory}; - my $say_ram = $anvil->Convert->bytes_to_human_readable({'bytes' => $ram_bytes}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - 's1:cpu_sockets' => $cpu_sockets, - 's2:cpu_threads' => $cpu_threads, - 's3:ram_bytes' => $ram_bytes, - 's4:say_ram' => $say_ram, - }}); - - $anvil->data->{target_server}{server_cpu_sockets} = $cpu_sockets if not defined $anvil->data->{target_server}{server_cpu_sockets}; - $anvil->data->{target_server}{server_cpu_cores} = $cpu_threads if not defined $anvil->data->{target_server}{server_cpu_cores}; - $anvil->data->{target_server}{server_ram} = $say_ram if not defined $anvil->data->{target_server}{server_ram}; + $anvil->data->{target_server}{server_cpu_sockets} = $anvil->data->{server}{$short_host_name}{$server_name}{from_db}{cpu}{sockets} if not defined $anvil->data->{target_server}{server_cpu_sockets}; + $anvil->data->{target_server}{server_cpu_cores} = $anvil->data->{server}{$short_host_name}{$server_name}{from_db}{cpu}{threads} if not defined $anvil->data->{target_server}{server_cpu_cores}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 's1:target_server::server_cpu_sockets' => $anvil->data->{target_server}{server_cpu_sockets}, 's2:target_server::server_cpu_cores' => $anvil->data->{target_server}{server_cpu_cores}, - 's3:target_server::server_ram' => $anvil->data->{target_server}{server_ram}, }}); # server::an-a02n01::srv02-c8s-fujitsu:: from_db::device::disk::target::vda @@ -616,68 +526,58 @@ sub interactive_question }}); } } -=cut -2021/07/20 22:08:12:Server.pm:1664; Variables: -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::address::bus: [0] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::address::type: [drive] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::alias: ....... [sata0-0-0] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::boot_order: .. [2] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::device_bus: .. [sata] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::driver::name: [qemu] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::driver::type: [raw] -\- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::type: ........ [file] -2021/07/20 22:08:12:Server.pm:1751; Variables: -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::address::controller: [0] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::address::target: ... [0] -|- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::address::unit: ..... [0] -\- server::an-a02n01::srv02-c8s-fujitsu::from_db::device::cdrom::target::sda::path: .............. [/mnt/shared/files/CentOS-Stream-8-x86_64-20201211-dvd1.iso] -=cut - -# "servers::server_uuid::${server_uuid}::server_pre_migration_file_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_pre_migration_file_uuid}, -# "servers::server_uuid::${server_uuid}::server_pre_migration_arguments" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_pre_migration_arguments}, -# "servers::server_uuid::${server_uuid}::server_post_migration_file_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_post_migration_file_uuid}, -# "servers::server_uuid::${server_uuid}::server_post_migration_arguments" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_post_migration_arguments}, -# -# -# $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { -# "hosts::host_uuid::${host_uuid}::host_name" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_name}, -# "hosts::host_uuid::${host_uuid}::short_host_name" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{short_host_name}, -# "hosts::host_uuid::${host_uuid}::host_type" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_type}, -# "hosts::host_uuid::${host_uuid}::host_key" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_key}, -# "hosts::host_uuid::${host_uuid}::host_ipmi" => $host_ipmi =~ /passw/ ? $anvil->Log->is_secure($anvil->data->{hosts}{host_uuid}{$host_uuid}{host_ipmi}) : $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_ipmi}, -# "hosts::host_uuid::${host_uuid}::host_status" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_status}, -# "hosts::host_uuid::${host_uuid}::anvil_name" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{anvil_name}, -# "hosts::host_uuid::${host_uuid}::anvil_uuid" => $anvil->data->{hosts}{host_uuid}{$host_uuid}{anvil_uuid}, -# }}); -# $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { -# "anvils::anvil_uuid::${anvil_uuid}::anvil_name" => $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_name}, -# "anvils::anvil_uuid::${anvil_uuid}::anvil_description" => $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_description}, -# "anvils::anvil_uuid::${anvil_uuid}::anvil_password" => $anvil->Log->is_secure($anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_password}), -# "anvils::anvil_uuid::${anvil_uuid}::anvil_node1_host_uuid" => $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid}, -# "anvils::anvil_uuid::${anvil_uuid}::anvil_node2_host_uuid" => $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid}, -# "anvils::anvil_uuid::${anvil_uuid}::anvil_dr1_host_uuid" => $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_dr1_host_uuid}, -# }}); -# $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { -# "servers::server_uuid::${server_uuid}::server_anvil_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_anvil_uuid}, -# "servers::server_uuid::${server_uuid}::server_user_stop" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_user_stop}, -# "servers::server_uuid::${server_uuid}::server_start_after_server_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_after_server_uuid}, -# "servers::server_uuid::${server_uuid}::server_start_delay" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_start_delay}, -# "servers::server_uuid::${server_uuid}::server_host_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_host_uuid}, -# "servers::server_uuid::${server_uuid}::server_state" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_state}, -# "servers::server_uuid::${server_uuid}::server_live_migration" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_live_migration}, -# "servers::server_uuid::${server_uuid}::server_pre_migration_file_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_pre_migration_file_uuid}, -# "servers::server_uuid::${server_uuid}::server_pre_migration_arguments" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_pre_migration_arguments}, -# "servers::server_uuid::${server_uuid}::server_post_migration_file_uuid" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_post_migration_file_uuid}, -# "servers::server_uuid::${server_uuid}::server_post_migration_arguments" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_post_migration_arguments}, -# "servers::server_uuid::${server_uuid}::server_ram_in_use" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_ram_in_use}, -# "servers::server_uuid::${server_uuid}::server_configured_ram" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_configured_ram}, -# "servers::server_uuid::${server_uuid}::server_updated_by_user" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_updated_by_user}, -# "servers::server_uuid::${server_uuid}::server_boot_time" => $anvil->data->{servers}{server_uuid}{$server_uuid}{server_boot_time}, -# }}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - "target_server::server_name" => $anvil->data->{target_server}{server_name}, - }}); + foreach my $script ("pre_migration", "post_migration") + { + my $file_uuid_key = "server_".$script."_file_uuid"; + my $argument_key = "server_".$script."_arguments"; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + script => $script, + file_uuid_key => $file_uuid_key, + }}); + + $anvil->data->{target_server}{scripts}{$script}{file_uuid} = ""; + $anvil->data->{target_server}{scripts}{$script}{file_name} = ""; + $anvil->data->{target_server}{scripts}{$script}{arguments} = ""; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "servers::server_uuid::${server_uuid}::${file_uuid_key}" => $anvil->data->{servers}{server_uuid}{$server_uuid}{$file_uuid_key}, + }}); + if (($anvil->data->{servers}{server_uuid}{$server_uuid}{$file_uuid_key}) && ($anvil->data->{servers}{server_uuid}{$server_uuid}{$file_uuid_key} ne "NULL")) + { + my $file_uuid = $anvil->data->{servers}{server_uuid}{$server_uuid}{$file_uuid_key}; + my $file_name = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{file_uuid}{$file_uuid}{file_name}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + file_uuid => $file_uuid, + file_name => $file_name, + }}); + + $anvil->data->{target_server}{scripts}{$script}{file_uuid} = $file_uuid; + $anvil->data->{target_server}{scripts}{$script}{file_name} = $file_name; + $anvil->data->{target_server}{scripts}{$script}{arguments} = $anvil->data->{servers}{server_uuid}{$server_uuid}{$argument_key}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "target_server::scripts::${script}::file_uuid" => $anvil->data->{target_server}{scripts}{$script}{file_uuid}, + "target_server::scripts::${script}::file_name" => $anvil->data->{target_server}{scripts}{$script}{file_name}, + "target_server::scripts::${script}::arguments" => $anvil->data->{target_server}{scripts}{$script}{arguments}, + }}); + } + } + + # Get the available resources. + $anvil->Get->available_resources(); +=cut + anvil_resources::::cpu::cores + anvil_resources::::cpu::threads + anvil_resources::::ram::available + anvil_resources::::ram::allocated + anvil_resources::::ram::hardware + anvil_resources::::bridges::::on_nodes + anvil_resources::::bridges::::on_dr + anvil_resources::::storage_group::::group_name + anvil_resources::::storage_group::::vg_size + anvil_resources::::storage_group::::free_size + anvil_resources::::storage_group::::vg_size_on_dr + anvil_resources::::storage_group::::available_on_dr +=cut } else { @@ -716,6 +616,121 @@ sub interactive_question interactive_ask_server_name($anvil, $terminal); } + # Made it here? Show the menu. + interactive_configure_main($anvil, $terminal); + + return(0); +} + +sub interactive_configure_main +{ + my ($anvil, $terminal) = @_; + + my $selection = 0; + my $retry = 0; + while(1) + { + my $default = ""; + + print $terminal->Tputs('cl'); + print $anvil->Words->string({key => "job_0352"})."\n"; + print $anvil->Words->string({key => "job_0151", variables => { anvil_name => $anvil->data->{target_server}{anvil_name} }})."\n"; + print $anvil->Words->string({key => "job_0157", variables => { server_name => $anvil->data->{target_server}{server_name} }})."\n"; + print "\n"; + print "[ 1 ] - CPU\n"; + print "[ 2 ] - RAM\n"; + print "[ 3 ] - Storage\n"; + print "[ 4 ] - Network\n"; + print "[ 5 ] - Boot Order\n"; + print "\n"; + print "[ B ] - Back\n"; + print "[ Q ] - Quit\n"; + print "\n"; + print $terminal->Tgoto('cm', 0, 13)."? "; + my $answer = ; + chomp $answer; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }}); + + if ($answer eq "1") + { + print "Going to CPU menu\n"; + sleep 1; + } + elsif ($answer eq "2") + { + print "Going to RAM menu\n"; + sleep 1; + } + elsif ($answer eq "3") + { + print "Going to Storage menu\n"; + sleep 1; + } + elsif ($answer eq "4") + { + print "Going to Network menu\n"; + sleep 1; + } + elsif ($answer eq "5") + { + print "Going to Boot order menu\n"; + sleep 1; + } + elsif (lc($answer) eq "b") + { + $anvil->data->{target_server}{server_name} = ""; + $anvil->data->{target_server}{server_uuid} = ""; + $anvil->data->{switches}{server} = ""; + print "Going back\n"; + interactive_ask_server_name($anvil, $terminal); + } + elsif (lc($answer) eq "q") + { + print "Good bye.\n"; + $anvil->nice_exit({exit_code => 0}); + } + else + { + print "Invalid selection, please enter the digit for the menu you want.\n"; + sleep 1; + } +=cut +1. CPU + * Max (sockets * cores): X + 1. Sockets: + 2. Cores: +2. RAM + * Available: X + * In use: y + * Configured: z + 1. Size: +3. Storage + 1. Optical media + + 1. Insert / change + + 2. Eject + 2. Disks + 1. New + + + 1. Grow + 2. Delete + 3. Move + 3. Boot order + +4. Network + + 1. MAC Address + 2. emulation type + 3. Plug in / Unplug + 4. Bridge + 5. Delete + 1. Add +5. Boot Order +=cut + } + return(0); } @@ -732,21 +747,62 @@ sub interactive_ask_anvil_name $default = $anvil->data->{target_server}{anvil_name}; } print $terminal->Tputs('cl'); - print $anvil->Words->string({key => "job_0352"})."\n"; - print $anvil->Words->string({key => "job_0151", variables => { anvil_name => $anvil->data->{target_server}{anvil_name} }})."\n\n\n"; + print $anvil->Words->string({key => "message_0257"})."\n"; - # Show all the current server names. - if ($retry) + my $anvil_selection = []; + push @{$anvil_selection}, "NULL"; + + my $anvil_count = 0; + my $longest_anvil_name = 0; + foreach my $anvil_name (sort {$a cmp $b} keys %{$anvil->data->{anvils}{anvil_name}}) { - print $anvil->Words->string({key => "job_0152"})."\n\n"; + my $anvil_uuid = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_uuid}; + my $anvil_description = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_description}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + anvil_name => $anvil_name, + anvil_uuid => $anvil_uuid, + anvil_description => $anvil_description, + }}); + next if $anvil_description eq "DELETED"; + + $anvil_count++; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { anvil_count => $anvil_count }}); + push @{$anvil_selection}, $anvil_name; + + if (length($anvil_name) > $longest_anvil_name) + { + $longest_anvil_name = length($anvil_name); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { longest_anvil_name => $longest_anvil_name }}); + } } - print $anvil->Words->string({key => "job_0153"})."\n"; - foreach my $anvil_name (sort {$a cmp $b} keys %{$anvil->data->{anvils}{anvil_name}}) + + my $number_length = length($anvil_count + 1); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { number_length => $number_length }}); + for (my $i = 1; $i < @{$anvil_selection}; $i++) { - print "- ".$anvil_name.": - ".$anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_description}."\n"; + my $anvil_name = $anvil_selection->[$i]; + next if $anvil_name eq "NULL"; + my $anvil_uuid = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_uuid}; + my $anvil_description = $anvil->data->{anvils}{anvil_name}{$anvil_name}{anvil_description}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + i => $i, + anvil_name => $anvil_name, + anvil_uuid => $anvil_uuid, + anvil_description => $anvil_description, + }}); + + print $anvil->Words->string({key => "message_0258", variables => { + number => sprintf("%-${number_length}s", $i), + anvil_name => sprintf("%-${longest_anvil_name}s", $anvil_name), + anvil_description => $anvil_description, + }})."\n"; } + print "\n"; + print "[ Q ] - Quit\n"; + print "\n"; - print $terminal->Tgoto('cm', 0, 2)."? "; + my $column = 3 + $anvil_count; + print $terminal->Tgoto('cm', 0, $column)."? "; my $answer = ; chomp $answer; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }}); @@ -759,7 +815,20 @@ sub interactive_ask_anvil_name # Reload in case a new anvil! was saved while we waited. $anvil->Database->get_anvils(); - if (exists $anvil->data->{anvils}{anvil_name}{$answer}) + if (($answer =~ /^\d+$/) && (exists $anvil_selection->[$answer]) && (not exists $anvil->data->{anvils}{anvil_name}{$answer})) + { + $answer = $anvil_selection->[$answer]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }}); + + $anvil->data->{target_server}{anvil_name} = $answer; + $anvil->data->{target_server}{anvil_uuid} = $anvil->Cluster->get_anvil_uuid({anvil_name => $answer}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + "target_server::anvil_name" => $anvil->data->{target_server}{anvil_name}, + "target_server::anvil_uuid" => $anvil->data->{target_server}{anvil_uuid}, + }}); + last; + } + elsif ((exists $anvil->data->{anvils}{anvil_name}{$answer}) && (ref($anvil->data->{anvils}{anvil_name}{$answer}) eq "HASH")) { # Valid. $anvil->data->{target_server}{anvil_name} = $answer; @@ -770,11 +839,17 @@ sub interactive_ask_anvil_name }}); last; } + elsif (lc($answer) eq "q") + { + print "Good bye.\n"; + $anvil->nice_exit({exit_code => 0}); + } else { $retry = 1; } } + interactive_question($anvil); return(0); @@ -787,6 +862,8 @@ sub interactive_ask_server_name $anvil->Database->get_servers({debug => 2}); ### TODO: Figure out how many rows we have and break the server list into columns if too long. + ### tput cols + ### tput rows my $retry = 0; my $not_found = ""; while(1) @@ -797,9 +874,6 @@ sub interactive_ask_server_name $default = $anvil->data->{target_server}{server_name}; } print $terminal->Tputs('cl'); - print $anvil->Words->string({key => "job_0352"})."\n"; - print $anvil->Words->string({key => "job_0151", variables => { anvil_name => $anvil->data->{target_server}{anvil_name} }})."\n"; - print $anvil->Words->string({key => "job_0157", variables => { server_name => $anvil->data->{target_server}{server_name} }})."\n\n\n"; # Show all the current server names. if ($retry) @@ -808,23 +882,63 @@ sub interactive_ask_server_name } my $anvil_uuid = $anvil->data->{target_server}{anvil_uuid}; print $anvil->Words->string({key => "job_0354", variables => { anvil_name => $anvil->data->{target_server}{anvil_name} }})."\n"; + + # Push the server names into an array, with '0' being null so the list we show the user + # starts at '1'. + my $server_selection = []; + push @{$server_selection}, "NULL"; + + my $server_count = 0; + my $longest_server_name = 0; foreach my $server_name (sort {$a cmp $b} keys %{$anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}}) { my $server_uuid = $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$server_name}{server_uuid}; my $server_state = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_state}; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + server_name => $server_name, server_uuid => $server_uuid, server_state => $server_state, }}); next if $server_state eq "DELETED"; - print $anvil->Words->string({key => "message_0219", variables => { - server_name => $server_name, + $server_count++; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { server_count => $server_count }}); + push @{$server_selection}, $server_name; + + if (length($server_name) > $longest_server_name) + { + $longest_server_name = length($server_name); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { longest_server_name => $longest_server_name }}); + } + } + + my $number_length = length($server_count + 1); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { number_length => $number_length }}); + for (my $i = 1; $i < @{$server_selection}; $i++) + { + my $server_name = $server_selection->[$i]; + next if $server_name eq "NULL"; + my $server_uuid = $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$server_name}{server_uuid}; + my $server_state = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_state}; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + server_name => $server_name, + server_uuid => $server_uuid, + server_state => $server_state, + }}); + + print $anvil->Words->string({key => "message_0256", variables => { + number => sprintf("%-${number_length}s", $i), + server_name => sprintf("%-${longest_server_name}s", $server_name), server_state => $server_state, }})."\n"; } + print "\n"; + print "[ B ] - Back\n"; + print "[ Q ] - Quit\n"; + print "\n"; - print $terminal->Tgoto('cm', 0, 3)."? "; + my $column = 4 + $server_count; + print $terminal->Tgoto('cm', 0, $column)."? "; my $answer = ; chomp $answer; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }}); @@ -840,8 +954,12 @@ sub interactive_ask_server_name if ($answer) { # Found? - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }}); - if (exists $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$answer}) + if (($answer =~ /^\d+$/) && (exists $server_selection->[$answer]) && (not exists $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$answer})) + { + $answer = $server_selection->[$answer]; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }}); + } + if ((exists $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$answer}) && (ref($anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}{$answer}) eq "HASH")) { # Valid $anvil->data->{target_server}{server_name} = $answer; @@ -852,6 +970,21 @@ sub interactive_ask_server_name }}); last; } + elsif (lc($answer) eq "b") + { + $anvil->data->{target_server}{anvil_name} = ""; + $anvil->data->{target_server}{anvil_uuid} = ""; + $anvil->data->{switches}{anvil} = ""; + $anvil->data->{switches}{'anvil-name'} = ""; + $anvil->data->{switches}{'anvil-uuid'} = ""; + print "Going back\n"; + interactive_ask_anvil_name($anvil, $terminal); + } + elsif (lc($answer) eq "q") + { + print "Good bye.\n"; + $anvil->nice_exit({exit_code => 0}); + } else { # Inalid.