You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
399 lines
18 KiB
399 lines
18 KiB
2 years ago
|
#!/usr/bin/perl
|
||
|
#
|
||
|
# This program will manage servers; Changing RAM, CPU cores, Growing virtual disks, adding virtual disks,
|
||
|
# inserting and ejecting ISO images into virtual optical media.
|
||
|
#
|
||
|
# Exit codes;
|
||
|
# 0 = Normal exit.
|
||
|
# 1 = No database connection.
|
||
|
#
|
||
|
# TODO:
|
||
|
#
|
||
|
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
use Anvil::Tools;
|
||
|
require POSIX;
|
||
|
use Term::Cap;
|
||
|
use Data::Dumper;
|
||
|
|
||
|
my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0];
|
||
|
my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0];
|
||
|
if (($running_directory =~ /^\./) && ($ENV{PWD}))
|
||
|
{
|
||
|
$running_directory =~ s/^\./$ENV{PWD}/;
|
||
|
}
|
||
|
|
||
|
# Turn off buffering so that the pinwheel will display while waiting for the SSH call(s) to complete.
|
||
|
$| = 1;
|
||
|
|
||
|
my $anvil = Anvil::Tools->new();
|
||
|
|
||
|
### TODO: Remove this before final release
|
||
|
$anvil->Log->level({set => 2});
|
||
|
$anvil->Log->secure({set => 1});
|
||
|
##########################################
|
||
|
|
||
|
# Read switches (target ([user@]host[:port]) and the file with the target's password.
|
||
|
$anvil->Get->switches({list => [
|
||
|
"add",
|
||
|
"anvil",
|
||
|
"grow",
|
||
|
"server",
|
||
|
], 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 }});
|
||
|
|
||
|
# Connect to the database(s). If we have no connections, we'll proceed anyway as one of the 'run_once' tasks
|
||
|
# is to setup the database server.
|
||
|
$anvil->Database->connect();
|
||
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 3, secure => 0, key => "log_0132"});
|
||
|
if (not $anvil->data->{sys}{database}{connections})
|
||
|
{
|
||
|
# No databases, update the job, sleep for a bit and then exit. The daemon will pick it up and try
|
||
|
# again after we exit.
|
||
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 0, priority => "err", key => "error_0305"});
|
||
|
sleep 10;
|
||
|
$anvil->nice_exit({exit_code => 1});
|
||
|
}
|
||
|
|
||
|
# If we don't have a job UUID, try to find one.
|
||
|
if (not $anvil->data->{switches}{'job-uuid'})
|
||
|
{
|
||
|
# Load the job data.
|
||
|
$anvil->data->{switches}{'job-uuid'} = $anvil->Job->get_job_uuid({program => $THIS_FILE});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { "switches::job-uuid" => $anvil->data->{switches}{'job-uuid'} }});
|
||
|
}
|
||
|
|
||
|
$anvil->Database->get_hosts();
|
||
|
$anvil->Database->get_anvils();
|
||
|
$anvil->Database->get_servers();
|
||
|
|
||
|
if ($anvil->data->{switches}{anvil})
|
||
|
{
|
||
|
# Make sure they asked for a real anvil.
|
||
|
$anvil->Get->anvil_from_switch({string => $anvil->data->{switches}{anvil}});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
"switches::anvil_name" => $anvil->data->{switches}{anvil_name},
|
||
|
"switches::anvil_uuid" => $anvil->data->{switches}{anvil_uuid},
|
||
|
}});
|
||
|
}
|
||
|
|
||
|
if (not $anvil->data->{switches}{server})
|
||
|
{
|
||
|
# Show the list of servers.
|
||
|
show_server_list($anvil);
|
||
|
print "\nPlease specify which server you want to modify using '--server <name or uuid>'.\n\n";
|
||
|
$anvil->nice_exit({exit_code => 0});
|
||
|
}
|
||
|
manage_server($anvil);
|
||
|
|
||
|
$anvil->nice_exit({exit_code => 0});
|
||
|
|
||
|
|
||
|
#############################################################################################################
|
||
|
# Functions #
|
||
|
#############################################################################################################
|
||
|
|
||
|
sub manage_server
|
||
|
{
|
||
|
my ($anvil) = @_;
|
||
|
|
||
|
$anvil->Get->server_from_switch({
|
||
|
debug => 2,
|
||
|
string => $anvil->data->{switches}{server},
|
||
|
anvil_uuid => $anvil->data->{switches}{anvil_uuid},
|
||
|
});
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
"switches::server_name" => $anvil->data->{switches}{server_name},
|
||
|
"switches::server_uuid" => $anvil->data->{switches}{server_uuid},
|
||
|
}});
|
||
|
|
||
|
if (not $anvil->data->{switches}{server_uuid})
|
||
|
{
|
||
|
show_server_list($anvil);
|
||
|
if ($anvil->data->{switches}{anvil_uuid})
|
||
|
{
|
||
|
# Not found on the requested Anvil! node.
|
||
|
print "\nThe server: [".$anvil->data->{switches}{server}."] was not found on the Anvil! node: [".$anvil->data->{switches}{anvil_name}."]. Valid servers are above.\n\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
# Not found at all.
|
||
|
print "\nThe server: [".$anvil->data->{switches}{server}."] was not found. Valid servers are above.\n\n";
|
||
|
}
|
||
|
$anvil->nice_exit({exit_code => 1});
|
||
|
}
|
||
|
|
||
|
print "Working with the server: [".$anvil->data->{switches}{server_name}."], UUID: [".$anvil->data->{switches}{server_uuid}."]\n";
|
||
|
my $short_host_name = $anvil->Get->short_host_name;
|
||
|
my $server_name = $anvil->data->{switches}{server_name};
|
||
|
my $server_uuid = $anvil->data->{switches}{server_uuid};
|
||
|
my $server_definition = $anvil->data->{servers}{server_uuid}{$server_uuid}{server_definition_xml};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:short_host_name' => $short_host_name,
|
||
|
's2:server_name' => $server_name,
|
||
|
's3:server_uuid' => $server_uuid,
|
||
|
's4:server_definition' => $server_definition,
|
||
|
}});
|
||
|
|
||
|
# Parse the definition.
|
||
|
$anvil->Server->parse_definition({
|
||
|
debug => 3,
|
||
|
host => $short_host_name,
|
||
|
server => $server_name,
|
||
|
source => "from_virsh",
|
||
|
definition => $server_definition,
|
||
|
});
|
||
|
|
||
|
#$anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{boot_order}
|
||
|
foreach my $device ("disk", "cdrom")
|
||
|
{
|
||
|
if ($device eq "disk")
|
||
|
{
|
||
|
print "\nDisk Drives:\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
print "\nOptical Drives:\n";
|
||
|
}
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { device => $device }});
|
||
|
next if $device ne "cdrom" && $device ne "disk";
|
||
|
foreach my $device_target (sort {$a cmp $b} keys %{$anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}})
|
||
|
{
|
||
|
my $alias = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{alias};
|
||
|
my $boot_order = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{boot_order};
|
||
|
my $say_boot = $boot_order eq "99" ? "--" : sprintf("%02d", $boot_order);
|
||
|
my $type = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{type};
|
||
|
my $address_type = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{type};
|
||
|
my $address_bus = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{bus};
|
||
|
my $driver_name = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{driver}{name};
|
||
|
my $device_bus = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{device_bus};
|
||
|
my $driver_type = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{driver}{type};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's01:device_target' => $device_target,
|
||
|
's02:alias' => $alias,
|
||
|
's03:boot_order' => $boot_order,
|
||
|
's04:say_boot' => $say_boot,
|
||
|
's05:type' => $type,
|
||
|
's06:address_type' => $address_type,
|
||
|
's07:address_bus' => $address_bus,
|
||
|
's08:driver_name' => $driver_name,
|
||
|
's09:device_bus' => $device_bus,
|
||
|
's10:driver_type' => $driver_type,
|
||
|
}});
|
||
|
if ($device eq "disk")
|
||
|
{
|
||
|
my $address_domain = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{domain};
|
||
|
my $address_slot = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{slot};
|
||
|
my $address_function = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{function};
|
||
|
my $device_path = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{path};
|
||
|
my $driver_io = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{driver}{io};
|
||
|
my $driver_cache = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{driver}{cache};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:address_domain' => $address_domain,
|
||
|
's2:address_slot' => $address_slot,
|
||
|
's3:address_function' => $address_function,
|
||
|
's4:device_path' => $device_path,
|
||
|
's5:driver_io' => $driver_io,
|
||
|
's6:driver_cache' => $driver_cache,
|
||
|
}});
|
||
|
print "- Target: [".$device_target."], boot: [".$say_boot."], path: [".$device_path."], cache: [".$driver_cache."], driver type: [".$driver_type."]\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
my $address_controller = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{controller};
|
||
|
my $address_unit = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{unit};
|
||
|
my $address_target = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{address}{target};
|
||
|
my $device_path = $anvil->data->{server}{$short_host_name}{$server_name}{from_virsh}{device}{$device}{target}{$device_target}{path};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:address_controller' => $address_controller,
|
||
|
's2:address_unit' => $address_unit,
|
||
|
's3:address_target' => $address_target,
|
||
|
's4:device_path' => $device_path,
|
||
|
}});
|
||
|
print "- Target: [".$device_target."], boot: [".$say_boot."], ISO: [".$device_path."]\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
print "\n";
|
||
|
|
||
|
my $drbd_resource = "";
|
||
|
foreach my $device_path (sort {$a cmp $b} keys %{$anvil->data->{server}{$short_host_name}{$server_name}{device}})
|
||
|
{
|
||
|
my $on_lv = $anvil->data->{server}{$short_host_name}{$server_name}{device}{$device_path}{on_lv};
|
||
|
$drbd_resource = $anvil->data->{server}{$short_host_name}{$server_name}{device}{$device_path}{resource};
|
||
|
my $device_target = $anvil->data->{server}{$short_host_name}{$server_name}{device}{$device_path}{target};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:device_path' => $device_path,
|
||
|
's2:on_lv' => $on_lv,
|
||
|
's3:drbd_resource' => $drbd_resource,
|
||
|
's4:device_target' => $device_target,
|
||
|
}});
|
||
|
}
|
||
|
foreach my $drbd_resource (sort {$a cmp $b} keys %{$anvil->data->{server}{$short_host_name}{$server_name}{drbd}{resource}})
|
||
|
{
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { drbd_resource => $drbd_resource }});
|
||
|
}
|
||
|
|
||
|
# Get the DRBD volume data
|
||
|
# Get the DRBD volume data
|
||
|
my $query = "
|
||
|
SELECT
|
||
|
a.host_uuid,
|
||
|
b.scan_drbd_resource_xml,
|
||
|
c.scan_drbd_volume_number,
|
||
|
c.scan_drbd_volume_device_path,
|
||
|
c.scan_drbd_volume_device_minor,
|
||
|
c.scan_drbd_volume_size
|
||
|
FROM
|
||
|
hosts a,
|
||
|
scan_drbd_resources b,
|
||
|
scan_drbd_volumes c
|
||
|
WHERE
|
||
|
a.host_uuid = b.scan_drbd_resource_host_uuid
|
||
|
AND
|
||
|
b.scan_drbd_resource_uuid = c.scan_drbd_volume_scan_drbd_resource_uuid
|
||
|
AND
|
||
|
b.scan_drbd_resource_name = ".$anvil->Database->quote($drbd_resource)."
|
||
|
;";
|
||
|
$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,
|
||
|
}});
|
||
|
foreach my $row (@{$results})
|
||
|
{
|
||
|
my $host_uuid = $row->[0];
|
||
|
my $short_host_name = $anvil->data->{hosts}{host_uuid}{$host_uuid}{short_host_name};
|
||
|
my $host_type = $anvil->data->{hosts}{host_uuid}{$host_uuid}{host_type};
|
||
|
my $scan_drbd_volume_number = $row->[2];
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:host_uuid' => $host_uuid,
|
||
|
's2:host_type' => $host_type,
|
||
|
's3:short_host_name' => $short_host_name,
|
||
|
's4:scan_drbd_volume_number' => $scan_drbd_volume_number,
|
||
|
}});
|
||
|
|
||
|
$anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$scan_drbd_volume_number}{device_path} = $row->[3];
|
||
|
$anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$scan_drbd_volume_number}{device_minor} = $row->[4];
|
||
|
$anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$scan_drbd_volume_number}{volume_size} = $row->[5];
|
||
|
$anvil->data->{drbd_resource}{$drbd_resource}{host_type}{$host_type}{short_host_name}{$short_host_name}{host_uuid} = $host_uuid;
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
"s1:drbd_resource::${drbd_resource}::host_uuid::${host_uuid}::volume_number::${scan_drbd_volume_number}::device_path" => $anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$scan_drbd_volume_number}{device_path},
|
||
|
"s2:drbd_resource::${drbd_resource}::host_uuid::${host_uuid}::volume_number::${scan_drbd_volume_number}::device_minor" => $anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$scan_drbd_volume_number}{device_minor},
|
||
|
"s3:drbd_resource::${drbd_resource}::host_uuid::${host_uuid}::volume_number::${scan_drbd_volume_number}::volume_size" => $anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$scan_drbd_volume_number}{volume_size},
|
||
|
"s4:drbd_resource::${drbd_resource}::host_type::${host_type}::short_host_name::${short_host_name}::host_uuid" => $anvil->data->{drbd_resource}{$drbd_resource}{host_type}{$host_type}{short_host_name}{$short_host_name}{host_uuid},
|
||
|
}});
|
||
|
|
||
|
if (not exists $anvil->data->{drbd_resource}{$drbd_resource}{xml})
|
||
|
{
|
||
|
$anvil->data->{drbd_resource}{$drbd_resource}{xml} = $row->[1];
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
"drbd_resource::${drbd_resource}::xml" => $anvil->data->{drbd_resource}{$drbd_resource}{xml},
|
||
|
}});
|
||
|
$anvil->DRBD->parse_resource({
|
||
|
debug => 2,
|
||
|
xml => $anvil->data->{drbd_resource}{$drbd_resource}{xml},
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
print "Sub-Nodes:\n";
|
||
|
show_volume($anvil, $drbd_resource, "node");
|
||
|
|
||
|
my $dr_count = keys %{$anvil->data->{drbd_resource}{$drbd_resource}{host_type}{dr}{short_host_name}};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { dr_count => $dr_count }});
|
||
|
if ($dr_count)
|
||
|
{
|
||
|
print "DR Hosts:\n";
|
||
|
show_volume($anvil, $drbd_resource, "dr");
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
sub show_volume
|
||
|
{
|
||
|
my ($anvil, $drbd_resource, $host_type) = @_;
|
||
|
|
||
|
foreach my $short_host_name (sort {$a cmp $b} keys %{$anvil->data->{drbd_resource}{$drbd_resource}{host_type}{$host_type}{short_host_name}})
|
||
|
{
|
||
|
my $host_uuid = $anvil->data->{drbd_resource}{$drbd_resource}{host_type}{$host_type}{short_host_name}{$short_host_name}{host_uuid};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:short_host_name' => $short_host_name,
|
||
|
's2:host_uuid' => $host_uuid,
|
||
|
}});
|
||
|
print " |- Name: [".$short_host_name."], UUID: [".$host_uuid."]\n";
|
||
|
foreach my $volume_number (sort {$a cmp $b} keys %{$anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}})
|
||
|
{
|
||
|
my $device_path = $anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$volume_number}{device_path};
|
||
|
my $device_minor = $anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$volume_number}{device_minor};
|
||
|
my $volume_size = $anvil->data->{drbd_resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$volume_number}{volume_size};
|
||
|
my $backing_disk = $anvil->data->{new}{resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$volume_number}{backing_disk};
|
||
|
my $meta_disk = $anvil->data->{new}{resource}{$drbd_resource}{host_uuid}{$host_uuid}{volume_number}{$volume_number}{meta_disk};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
's1:volume_number' => $volume_number,
|
||
|
's2:device_path' => $device_path,
|
||
|
's3:device_minor' => $device_minor,
|
||
|
's4:volume_size' => $volume_size,
|
||
|
's5:backing_disk' => $backing_disk,
|
||
|
's6:meta_disk' => $meta_disk,
|
||
|
}});
|
||
|
print " ^- Volume: [".$volume_number."], backing device: [".$backing_disk."], DRBD minor: [".$device_minor."], size: [".$anvil->Convert->bytes_to_human_readable({'bytes' => $volume_size})."]\n";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
sub show_server_list
|
||
|
{
|
||
|
my ($anvil) = @_;
|
||
|
|
||
|
# Loop through all Anvil! nodes, then all server in that Anvil!
|
||
|
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};
|
||
|
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,
|
||
|
}});
|
||
|
if (($anvil->data->{switches}{anvil_uuid}) && ($anvil->data->{switches}{anvil_uuid} ne $anvil_uuid))
|
||
|
{
|
||
|
next;
|
||
|
}
|
||
|
print "\nAnvil! Node: [".$anvil_name."], UUID: [".$anvil_uuid."] - Description: [".$anvil_description."]\n";
|
||
|
|
||
|
my $server_count = 0;
|
||
|
if (exists $anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name})
|
||
|
{
|
||
|
$server_count = keys %{$anvil->data->{servers}{anvil_uuid}{$anvil_uuid}{server_name}};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { server_count => $server_count }});
|
||
|
}
|
||
|
if (not $server_count)
|
||
|
{
|
||
|
print "- No servers on this node yet\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
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};
|
||
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
||
|
server_name => $server_name,
|
||
|
server_uuid => $server_uuid,
|
||
|
}});
|
||
|
print "^- Server: [".$server_name."], UUID: [".$server_uuid."]\n";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
}
|