* Updated the short OS list.

* Created Get->virsh_list_net() and Get->virsh_list_os() that call and parse osinfo-query directly to create lists of supported network interfaces and OS optimization options used when provisioning VMs. The later of which is used to replace the old language list of OSes, which was clunky and prone to missing valid options.
* Updated Get->available_resources() to remove the old anvil_dr1_host_uuid mechanism of finding and referencing DR resources.
* Started adding --network support to anvil-provision-server to allow users to specify a specific network bridge, MAC address and model to use for a new VM.

Signed-off-by: Digimer <digimer@alteeve.ca>
main
Digimer 2 years ago
parent 9194eb3d09
commit 6d59399c73
  1. 2
      Anvil/Tools.pm
  2. 300
      Anvil/Tools/Get.pm
  3. 4
      anvil.conf
  4. 791
      share/words.xml
  5. 2
      tools/anvil-daemon
  6. 239
      tools/anvil-provision-server

@ -925,7 +925,7 @@ sub _set_defaults
# This is the list of OSes short in the user's short list of OS types to # This is the list of OSes short in the user's short list of OS types to
# optimize for. The full the list is available by running: # optimize for. The full the list is available by running:
# /usr/bin/osinfo-query os # /usr/bin/osinfo-query os
os_short_list => "rhel5.11, rhel6.10, rhel7.9, rhel8.3, win10, win2k16, win2k19", os_short_list => "rhel8.7,rhel9.1,win10,win2k19,win2k22",
}, },
terminal => { terminal => {
columns => 80, columns => 80,

@ -42,6 +42,8 @@ my $THIS_FILE = "Get.pm";
# uptime # uptime
# users_home # users_home
# uuid # uuid
# virsh_list_net
# virsh_list_os
# _salt # _salt
# _wrap_to # _wrap_to
@ -466,12 +468,9 @@ Data is store in the following hashes;
anvil_resources::<anvil_uuid>::ram::allocated anvil_resources::<anvil_uuid>::ram::allocated
anvil_resources::<anvil_uuid>::ram::hardware anvil_resources::<anvil_uuid>::ram::hardware
anvil_resources::<anvil_uuid>::bridges::<bridge_name>::on_nodes anvil_resources::<anvil_uuid>::bridges::<bridge_name>::on_nodes
anvil_resources::<anvil_uuid>::bridges::<bridge_name>::on_dr
anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::group_name anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::group_name
anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::vg_size anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::vg_size
anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::free_size anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::free_size
anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::vg_size_on_dr
anvil_resources::<anvil_uuid>::storage_group::<storage_group_uuid>::available_on_dr
All sizes are stored in bytes. All sizes are stored in bytes.
@ -517,8 +516,7 @@ sub available_resources
SELECT SELECT
anvil_name, anvil_name,
anvil_node1_host_uuid, anvil_node1_host_uuid,
anvil_node2_host_uuid, anvil_node2_host_uuid
anvil_dr1_host_uuid
FROM FROM
anvils anvils
WHERE WHERE
@ -539,20 +537,13 @@ WHERE
} }
# Get the details. # Get the details.
my $anvil_name = $results->[0]->[0]; my $anvil_name = $results->[0]->[0];
my $node1_host_uuid = $results->[0]->[1]; my $node1_host_uuid = $results->[0]->[1];
my $node2_host_uuid = $results->[0]->[2]; my $node2_host_uuid = $results->[0]->[2];
my $dr1_host_uuid = defined $results->[0]->[3] ? $results->[0]->[3] : "";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
anvil_name => $anvil_name, anvil_name => $anvil_name,
node1_host_uuid => $node1_host_uuid, node1_host_uuid => $node1_host_uuid,
node2_host_uuid => $node2_host_uuid, node2_host_uuid => $node2_host_uuid,
dr1_host_uuid => $dr1_host_uuid,
}});
$anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} = $dr1_host_uuid ? 1 : 0;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"anvil_resources::${anvil_uuid}::has_dr" => $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr},
}}); }});
# Load hosts and network bridges # Load hosts and network bridges
@ -570,13 +561,13 @@ WHERE
$anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads} = 0; $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads} = 0;
$anvil->data->{anvil_resources}{$anvil_uuid}{ram}{hardware} = 0; $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{hardware} = 0;
foreach my $host_uuid ($node1_host_uuid, $node2_host_uuid, $dr1_host_uuid) foreach my $host_uuid ($node1_host_uuid, $node2_host_uuid)
{ {
# If DR isn't defined, it'll be blank.
next if not $host_uuid;
my $this_is = "node1"; my $this_is = "node1";
if ($host_uuid eq $node2_host_uuid) { $this_is = "node2"; } if ($host_uuid eq $node2_host_uuid)
elsif ($host_uuid eq $dr1_host_uuid) { $this_is = "dr1"; } {
$this_is = "node2";
}
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { this_is => $this_is }}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { this_is => $this_is }});
# Start collecting data. # Start collecting data.
@ -650,34 +641,30 @@ WHERE
"anvil_resources::${anvil_uuid}::host_uuid::${host_uuid}::ram::hardware" => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$host_uuid}{ram}{hardware}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$host_uuid}{ram}{hardware}}).")", "anvil_resources::${anvil_uuid}::host_uuid::${host_uuid}::ram::hardware" => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$host_uuid}{ram}{hardware}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$host_uuid}{ram}{hardware}}).")",
}}); }});
# For available resources, we only care about nodes. # How many cores?
if ($this_is !~ /^dr/) if ((not $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores}) or
($scan_hardware_cpu_cores < $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores}))
{ {
# How many cores? $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores} = $scan_hardware_cpu_cores;
if ((not $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores}) or $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
($scan_hardware_cpu_cores < $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores})) "anvil_resources::${anvil_uuid}::cpu::cores" => $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores},
{ }});
$anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores} = $scan_hardware_cpu_cores; }
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { if ((not $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads}) or
"anvil_resources::${anvil_uuid}::cpu::cores" => $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{cores}, ($scan_hardware_cpu_threads < $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads}))
}}); {
} $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads} = $scan_hardware_cpu_threads;
if ((not $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads}) or $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
($scan_hardware_cpu_threads < $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads})) "anvil_resources::${anvil_uuid}::cpu::threads" => $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads},
{ }});
$anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads} = $scan_hardware_cpu_threads; }
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { if ((not $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available}) or
"anvil_resources::${anvil_uuid}::cpu::threads" => $anvil->data->{anvil_resources}{$anvil_uuid}{cpu}{threads}, ($scan_hardware_ram_total < $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{hardware}))
}}); {
} $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available} = $scan_hardware_ram_total;
if ((not $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available}) or $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
($scan_hardware_ram_total < $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{hardware})) "anvil_resources::${anvil_uuid}::ram::available" => $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available}}).")",
{ }});
$anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available} = $scan_hardware_ram_total;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"anvil_resources::${anvil_uuid}::ram::available" => $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{ram}{available}}).")",
}});
}
} }
} }
@ -731,7 +718,6 @@ ORDER BY
foreach my $bridge_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}}) foreach my $bridge_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}})
{ {
$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_nodes} = 0; $anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_nodes} = 0;
$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_dr} = 0;
if (($anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on}{$node1_host_uuid}) && if (($anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on}{$node1_host_uuid}) &&
($anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on}{$node2_host_uuid})) ($anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on}{$node2_host_uuid}))
{ {
@ -740,13 +726,6 @@ ORDER BY
"anvil_resources::${anvil_uuid}::bridges::${bridge_name}::on_nodes" => $anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_nodes}, "anvil_resources::${anvil_uuid}::bridges::${bridge_name}::on_nodes" => $anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_nodes},
}}); }});
} }
if ($anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on}{$dr1_host_uuid})
{
$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_dr} = 1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"anvil_resources::${anvil_uuid}::bridges::${bridge_name}::on_dr" => $anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_dr},
}});
}
} }
foreach my $storage_group_uuid (keys %{$anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}}) foreach my $storage_group_uuid (keys %{$anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}})
@ -760,8 +739,6 @@ ORDER BY
my $node1_vg_free = 0; my $node1_vg_free = 0;
my $node2_vg_size = 0; my $node2_vg_size = 0;
my $node2_vg_free = 0; my $node2_vg_free = 0;
my $dr1_vg_size = 0;
my $dr1_vg_free = 0;
if (exists $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$node1_host_uuid}) if (exists $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$node1_host_uuid})
{ {
$node1_vg_size = $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$node1_host_uuid}{vg_size}; $node1_vg_size = $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$node1_host_uuid}{vg_size};
@ -780,25 +757,12 @@ ORDER BY
node2_vg_free => $node2_vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $node2_vg_free}).")", node2_vg_free => $node2_vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $node2_vg_free}).")",
}}); }});
} }
if (exists $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$dr1_host_uuid})
{
$dr1_vg_size = $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$dr1_host_uuid}{vg_size};
$dr1_vg_free = $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{host_uuid}{$dr1_host_uuid}{vg_free};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
dr1_vg_size => $dr1_vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr1_vg_size}).")",
dr1_vg_free => $dr1_vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr1_vg_free}).")",
}});
}
$anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size} = $node2_vg_size < $node1_vg_size ? $node2_vg_size : $node1_vg_size; $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size} = $node2_vg_size < $node1_vg_size ? $node2_vg_size : $node1_vg_size;
$anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size} = $node2_vg_free < $node1_vg_free ? $node2_vg_free : $node1_vg_free; $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size} = $node2_vg_free < $node1_vg_free ? $node2_vg_free : $node1_vg_free;
$anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr} = $dr1_vg_size;
$anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr} = $dr1_vg_free;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"anvil_resources::${anvil_uuid}::storage_group::${storage_group_uuid}::vg_size" => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size}}).")", "anvil_resources::${anvil_uuid}::storage_group::${storage_group_uuid}::vg_size" => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size}}).")",
"anvil_resources::${anvil_uuid}::storage_group::${storage_group_uuid}::free_size" => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}}).")", "anvil_resources::${anvil_uuid}::storage_group::${storage_group_uuid}::free_size" => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}}).")",
"anvil_resources::${anvil_uuid}::storage_group::${storage_group_uuid}::vg_size_on_dr" => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr}}).")",
"anvil_resources::${anvil_uuid}::storage_group::${storage_group_uuid}::available_on_dr" => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr}." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr}}).")",
}}); }});
# Make it easy to sort by group name # Make it easy to sort by group name
@ -2672,6 +2636,194 @@ sub uuid
return($uuid); return($uuid);
} }
=head2 virsh_list_net
This parses the output from C<< osinfo-query device class=net >> and populated the hash;
osinfo::net::<name>::vendor = Company name
osinfo::net::<name>::vendor_id = Vendor ID hex value
osinfo::net::<name>::product = Device friendly name
osinfo::net::<name>::product_id = Product ID hex value
This method takes no parameters.
=cut
sub virsh_list_net
{
my $self = shift;
my $parameter = shift;
my $anvil = $self->parent;
my $debug = defined $parameter->{debug} ? $parameter->{debug} : 3;
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0125", variables => { method => "Get->virsh_list_net()" }});
my $shell_call = $anvil->data->{path}{exe}{'osinfo-query'}." device class=net";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { shell_call => $shell_call }});
my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
output => $output,
return_code => $return_code,
}});
if (exists $anvil->data->{osinfo}{net})
{
delete $anvil->data->{osinfo}{net};
}
my $last_vendor = "";
foreach my $line (split/\n/, $output)
{
$line = $anvil->Words->clean_spaces({string => $line});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { line => $line }});
next if $line =~ /Vendor \| Vendor ID/;
next if $line =~ /----+----/;
if ($line =~ /(.*?) \| (.*?) \| (.*?) \| (.*?) \| (.*?) \| (.*?) \| (.*?) \| (.*)$/)
{
my $vendor = $1;
my $vendor_id = $2;
my $product = $3;
my $product_id = $4;
my $name = $5;
my $class = $6;
my $bus = $7;
my $id = $8;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
's1:vendor' => $vendor,
's2:vendor_id' => $vendor_id,
's3:product' => $product,
's4:product_id' => $product_id,
's5:name' => $name,
's6:class' => $class,
's7:bus' => $bus,
's8:id' => $id,
}});
if ($vendor)
{
$last_vendor = $vendor;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { last_vendor => $last_vendor }});
}
else
{
$vendor = $last_vendor;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { vendor => $vendor }});
}
next if $bus eq "xen";
$anvil->data->{osinfo}{net}{$name}{vendor} = $vendor;
$anvil->data->{osinfo}{net}{$name}{vendor_id} = $vendor_id;
$anvil->data->{osinfo}{net}{$name}{product} = $product;
$anvil->data->{osinfo}{net}{$name}{product_id} = $product_id;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"s1:osinfo::net::${name}::vendor" => $anvil->data->{osinfo}{net}{$name}{vendor},
"s2:osinfo::net::${name}::vendor_id" => $anvil->data->{osinfo}{net}{$name}{vendor_id},
"s3:osinfo::net::${name}::product" => $anvil->data->{osinfo}{net}{$name}{product},
"s4:osinfo::net::${name}::product_id" => $anvil->data->{osinfo}{net}{$name}{product_id},
}});
}
}
# If there's only a 'virtio-net', create a 'virtio' alias.
if ((not exists $anvil->data->{osinfo}{net}{virtio}) && (exists $anvil->data->{osinfo}{net}{'virtio-net'}))
{
$anvil->data->{osinfo}{net}{virtio}{vendor} = $anvil->data->{osinfo}{net}{'virtio-net'}{vendor};
$anvil->data->{osinfo}{net}{virtio}{vendor_id} = $anvil->data->{osinfo}{net}{'virtio-net'}{vendor_id};
$anvil->data->{osinfo}{net}{virtio}{product} = $anvil->data->{osinfo}{net}{'virtio-net'}{product};
$anvil->data->{osinfo}{net}{virtio}{product_id} = $anvil->data->{osinfo}{net}{'virtio-net'}{product_id};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"s1:osinfo::net::virtio::vendor" => $anvil->data->{osinfo}{net}{virtio}{vendor},
"s2:osinfo::net::virtio::vendor_id" => $anvil->data->{osinfo}{net}{virtio}{vendor_id},
"s3:osinfo::net::virtio::product" => $anvil->data->{osinfo}{net}{virtio}{product},
"s4:osinfo::net::virtio::product_id" => $anvil->data->{osinfo}{net}{virtio}{product_id},
}});
}
return(0);
}
=head2 virsh_list_os
This parses the output from C<< osinfo-query os >> and populates the hash;
osinfo::os-list::<name>::name = Operating System name
osinfo::os-list::<name>::version = OS Version
osinfo::os-list::<name>::id = ID URL
It also loads the OSes into the strings as 'os_list_<short_name>' = OS
This method takes no parameters.
=cut
sub virsh_list_os
{
my $self = shift;
my $parameter = shift;
my $anvil = $self->parent;
my $debug = defined $parameter->{debug} ? $parameter->{debug} : 3;
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => $debug, key => "log_0125", variables => { method => "Get->virsh_list_os()" }});
my $shell_call = $anvil->data->{path}{exe}{'osinfo-query'}." os";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { shell_call => $shell_call }});
my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
output => $output,
return_code => $return_code,
}});
if (exists $anvil->data->{osinfo}{'os-list'})
{
delete $anvil->data->{osinfo}{'os-list'};
}
my $last_vendor = "";
foreach my $line (split/\n/, $output)
{
$line = $anvil->Words->clean_spaces({string => $line});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { line => $line }});
next if $line =~ /Short ID \| Name/;
next if $line =~ /----+----/;
if ($line =~ /(.*?) \| (.*?) \| (.*?) \| (.*)$/)
{
my $short_id = $1;
my $name = $2;
my $version = $3;
my $id = $4;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
's1:short_id' => $short_id,
's2:name' => $name,
's3:version' => $version,
's4:id' => $id,
}});
$version = "unknown" if $version eq "";
$anvil->data->{osinfo}{'os-list'}{$short_id}{name} = $name;
$anvil->data->{osinfo}{'os-list'}{$short_id}{version} = $version;
$anvil->data->{osinfo}{'os-list'}{$short_id}{id} = $id;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"s1:osinfo::os-list::${short_id}::name" => $anvil->data->{osinfo}{'os-list'}{$short_id}{name},
"s2:osinfo::os-list::${short_id}::version" => $anvil->data->{osinfo}{'os-list'}{$short_id}{version},
"s3:osinfo::os-list::${short_id}::id" => $anvil->data->{osinfo}{'os-list'}{$short_id}{id},
}});
my $key = "os_list_".$short_id;
foreach my $file (sort {$a cmp $b} keys %{$anvil->data->{words}})
{
foreach my $language (sort {$a cmp $b} keys %{$anvil->data->{words}{$file}{language}})
{
$anvil->data->{words}{$file}{language}{$language}{key}{$key}{content} = $name;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"words::${file}::language::${language}::key::${key}::content" => $anvil->data->{words}{$file}{language}{$language}{key}{$key}{content},
}});
}
}
}
}
return(0);
}
# =head3 # =head3
# #
# Private Functions; # Private Functions;

@ -196,8 +196,8 @@ sys::manage::firewall = 1
### Server related options ### Server related options
# This is the "short list" of servers shown when provisioning a new server. To see the full list of options, # This is the "short list" of servers shown when provisioning a new server. To see the full list of options,
# run '/usr/bin/osinfo-query os' on any machine in the Anvil!. # run '/usr/bin/osinfo-query os' and use here the 'Short ID' entries on any machine in the Anvil!.
#sys::servers::os_short_list = debian10,fedora32,freebsd12.1,gentoo,macosx10.7,msdos6.22,openbsd6.7,opensuse15.2,rhel5.11,rhel6.10,rhel7.9,rhel8.3,sles12sp5,solaris11,ubuntu20.04,win10,win2k16,win2k19 #sys::servers::os_short_list = rhel8.7,rhel9.1,win10,win2k19,win2k22
### Scan agent options ### Scan agent options

@ -570,6 +570,7 @@ The definition data passed in was:
<key name="error_0395">[ Error ] - The host UUID: [#!variable!uuid!#], with the host name: [#!variable!name!#] is of host type: [#!variable!type!#]. This must be a type 'dr'.</key> <key name="error_0395">[ Error ] - The host UUID: [#!variable!uuid!#], with the host name: [#!variable!name!#] is of host type: [#!variable!type!#]. This must be a type 'dr'.</key>
<key name="error_0396">[ Error ] - The Anvil! UUID: [#!variable!uuid!#] was not found.</key> <key name="error_0396">[ Error ] - The Anvil! UUID: [#!variable!uuid!#] was not found.</key>
<key name="error_0397">[ Error ] - The DR link UUID: [#!variable!uuid!#] was not found.</key> <key name="error_0397">[ Error ] - The DR link UUID: [#!variable!uuid!#] was not found.</key>
<key name="error_0398">[ Error ] - There was a problem processing the requested network: [#!variable!network!#]. Details should be logged.</key>
<!-- Files templates --> <!-- Files templates -->
<!-- NOTE: Translating these files requires an understanding of which lines are translatable --> <!-- NOTE: Translating these files requires an understanding of which lines are translatable -->
@ -1157,7 +1158,7 @@ Failure! The return code: [#!variable!return_code!#] was received ('0' was expec
<key name="job_0161">* Please enter a number between 1 and #!variable!max_cores!#.</key> <key name="job_0161">* Please enter a number between 1 and #!variable!max_cores!#.</key>
<key name="job_0162">-=] Available cores / threads: [#!variable!cores!# / #!variable!threads!#]</key> <key name="job_0162">-=] Available cores / threads: [#!variable!cores!# / #!variable!threads!#]</key>
<key name="job_0163"> - Node #!variable!core!# CPU Model: [#!variable!model!#]</key> <key name="job_0163"> - Node #!variable!core!# CPU Model: [#!variable!model!#]</key>
<key name="job_0164"> - DR Host CPU: .... [#!variable!model!#], [#!variable!cores!#c]/[#!variable!threads!#t]</key> <key name="job_0164">#!free!#</key>
<key name="job_0165">RAM: ........... [#!variable!ram!#]</key> <key name="job_0165">RAM: ........... [#!variable!ram!#]</key>
<key name="job_0166">* Please enter a valid amount up to: [#!variable!ram_total!# / #!variable!ram_available!#].</key> <key name="job_0166">* Please enter a valid amount up to: [#!variable!ram_total!# / #!variable!ram_available!#].</key>
<key name="job_0167">-=] Available RAM: [#!variable!ram_available!#] <key name="job_0167">-=] Available RAM: [#!variable!ram_available!#]
@ -1165,9 +1166,8 @@ Failure! The return code: [#!variable!return_code!#] was received ('0' was expec
- Allocated to servers: [#!variable!ram_allocated!#] - Allocated to servers: [#!variable!ram_allocated!#]
- Node 1 RAM (total): . [#!variable!ram_node1!#] - Node 1 RAM (total): . [#!variable!ram_node1!#]
- Node 2 RAM (total): . [#!variable!ram_node2!#]</key> - Node 2 RAM (total): . [#!variable!ram_node2!#]</key>
<key name="job_0168"> - DR Host RAM (total): [#!variable!ram_available!#]</key> <key name="job_0168">#!free!#</key>
<key name="job_0169"> Available on Anvil!: [#!variable!vg_free!#], Total: [#!variable!vg_size!#] <key name="job_0169"> Available on Anvil!: [#!variable!vg_free!#], Total: [#!variable!vg_size!#]</key>
Available on DR: ... [#!variable!dr_free!#], Total: [#!variable!dr_size!#]</key>
<key name="job_0170">Storage Group: . [#!variable!storage_group!#]</key> <key name="job_0170">Storage Group: . [#!variable!storage_group!#]</key>
<key name="job_0171">* Please enter a number beside the storage group you want to use.</key> <key name="job_0171">* Please enter a number beside the storage group you want to use.</key>
<key name="job_0172">-=] Storage groups</key> <key name="job_0172">-=] Storage groups</key>
@ -1201,7 +1201,9 @@ It should be provisioned in the next minute or two.</key>
<key name="job_0194">The LV(s) behind the resource: [#!variable!resource!#] already existed, and the DRBD resource is not in the disk state 'UpToDate'. As such, we'll keep waiting before provisioning the server.</key> <key name="job_0194">The LV(s) behind the resource: [#!variable!resource!#] already existed, and the DRBD resource is not in the disk state 'UpToDate'. As such, we'll keep waiting before provisioning the server.</key>
<key name="job_0195">The resource needs to be forced to UpToDate as it is brand now, doing that now.</key> <key name="job_0195">The resource needs to be forced to UpToDate as it is brand now, doing that now.</key>
<key name="job_0196">-=] OS Short List</key> <key name="job_0196">-=] OS Short List</key>
<key name="job_0197">* Please enter an OS key that is closest to your target OS. Run 'osinfo-query os' for a full list.</key> <key name="job_0197">* Please enter an OS key that is closest to your target OS.
From any machine in the Anvil!, run 'osinfo-query os'.
Use the 'Short ID' that best matches your OS.</key>
<key name="job_0198">Optimize for: .. [#!variable!os!#]</key> <key name="job_0198">Optimize for: .. [#!variable!os!#]</key>
<key name="job_0199">Ready to provision the server! Please be patient, this could take a moment. The call to create the server will be: <key name="job_0199">Ready to provision the server! Please be patient, this could take a moment. The call to create the server will be:
==== ====
@ -3503,785 +3505,6 @@ The error was:
</key> </key>
<key name="warning_0147">[ Warning ] - The interface: [#!variable!interface!#] is in a bond, but it is down. The system uptime is: [#!variable!uptime!#], so it might be a problem where the interface didn't start on boot as it should have. So we're going to bring the interface up.</key> <key name="warning_0147">[ Warning ] - The interface: [#!variable!interface!#] is in a bond, but it is down. The system uptime is: [#!variable!uptime!#], so it might be a problem where the interface didn't start on boot as it should have. So we're going to bring the interface up.</key>
<key name="warning_0148">[ Warning ] - The IPMI stonith resource: [#!variable!resource!#] is in the role: [#!variable!role!#] (should be 'Started'). Will check the IPMI config now.</key> <key name="warning_0148">[ Warning ] - The IPMI stonith resource: [#!variable!resource!#] is in the role: [#!variable!role!#] (should be 'Started'). Will check the IPMI config now.</key>
<!-- The entries below here are not sequential, but use a key to find the entry. -->
<!-- Run 'striker-parse-os-list to find new entries. -->
<key name="os_list_almalinux8"><![CDATA[AlmaLinux 8]]></key>
<key name="os_list_almalinux9"><![CDATA[AlmaLinux 9]]></key>
<key name="os_list_alpinelinux3.10"><![CDATA[Alpine Linux 3.10]]></key>
<key name="os_list_alpinelinux3.11"><![CDATA[Alpine Linux 3.11]]></key>
<key name="os_list_alpinelinux3.12"><![CDATA[Alpine Linux 3.12]]></key>
<key name="os_list_alpinelinux3.13"><![CDATA[Alpine Linux 3.13]]></key>
<key name="os_list_alpinelinux3.14"><![CDATA[Alpine Linux 3.14]]></key>
<key name="os_list_alpinelinux3.15"><![CDATA[Alpine Linux 3.15]]></key>
<key name="os_list_alpinelinux3.16"><![CDATA[Alpine Linux 3.16]]></key>
<key name="os_list_alpinelinux3.5"><![CDATA[Alpine Linux 3.5]]></key>
<key name="os_list_alpinelinux3.6"><![CDATA[Alpine Linux 3.6]]></key>
<key name="os_list_alpinelinux3.7"><![CDATA[Alpine Linux 3.7]]></key>
<key name="os_list_alpinelinux3.8"><![CDATA[Alpine Linux 3.8]]></key>
<key name="os_list_alpinelinux3.9"><![CDATA[Alpine Linux 3.9]]></key>
<key name="os_list_alt.p10"><![CDATA[ALT p10 StarterKits]]></key>
<key name="os_list_alt.p8"><![CDATA[ALT p8 StarterKits]]></key>
<key name="os_list_alt.p9"><![CDATA[ALT p9 StarterKits]]></key>
<key name="os_list_alt.sisyphus"><![CDATA[ALT regular]]></key>
<key name="os_list_alt10.0"><![CDATA[ALT 10.0]]></key>
<key name="os_list_alt8.0"><![CDATA[ALT 8 Education]]></key>
<key name="os_list_alt8.1"><![CDATA[ALT 8.1]]></key>
<key name="os_list_alt8.2"><![CDATA[ALT 8.2]]></key>
<key name="os_list_alt9.0"><![CDATA[ALT 9.0]]></key>
<key name="os_list_alt9.1"><![CDATA[ALT 9.1]]></key>
<key name="os_list_alt9.2"><![CDATA[ALT 9.2]]></key>
<key name="os_list_altlinux1.0"><![CDATA[Mandrake RE Spring 2001]]></key>
<key name="os_list_altlinux2.0"><![CDATA[ALT Linux 2.0]]></key>
<key name="os_list_altlinux2.2"><![CDATA[ALT Linux 2.2]]></key>
<key name="os_list_altlinux2.4"><![CDATA[ALT Linux 2.4]]></key>
<key name="os_list_altlinux3.0"><![CDATA[ALT Linux 3.0]]></key>
<key name="os_list_altlinux4.0"><![CDATA[ALT Linux 4.0]]></key>
<key name="os_list_altlinux4.1"><![CDATA[ALT Linux 4.1]]></key>
<key name="os_list_altlinux5.0"><![CDATA[ALT Linux 5.0]]></key>
<key name="os_list_altlinux6.0"><![CDATA[ALT Linux 6.0]]></key>
<key name="os_list_altlinux7.0"><![CDATA[ALT Linux 7.0]]></key>
<key name="os_list_android-x86-8.1"><![CDATA[Android-x86 8.1]]></key>
<key name="os_list_android-x86-9.0"><![CDATA[Android-x86 9.0]]></key>
<key name="os_list_archlinux"><![CDATA[Arch Linux]]></key>
<key name="os_list_asianux-unknown"><![CDATA[Asianux unknown]]></key>
<key name="os_list_asianux4.6"><![CDATA[Asianux Server 4 SP6]]></key>
<key name="os_list_asianux4.7"><![CDATA[Asianux Server 4 SP7]]></key>
<key name="os_list_asianux7.0"><![CDATA[Asianux Server 7]]></key>
<key name="os_list_asianux7.1"><![CDATA[Asianux Server 7 SP1]]></key>
<key name="os_list_asianux7.2"><![CDATA[Asianux Server 7 SP2]]></key>
<key name="os_list_asianux7.3"><![CDATA[Asianux Server 7 SP3]]></key>
<key name="os_list_asianux8.0"><![CDATA[Asianux Server 8]]></key>
<key name="os_list_caasp-unknown"><![CDATA[SUSE CaaS Platform Unknown]]></key>
<key name="os_list_caasp1.0"><![CDATA[SUSE CaaS Platform 1.0]]></key>
<key name="os_list_caasp2.0"><![CDATA[SUSE CaaS Platform 2.0]]></key>
<key name="os_list_caasp3.0"><![CDATA[SUSE CaaS Platform 3.0]]></key>
<key name="os_list_centos-stream8"><![CDATA[CentOS Stream 8]]></key>
<key name="os_list_centos-stream9"><![CDATA[CentOS Stream 9]]></key>
<key name="os_list_centos5.0"><![CDATA[CentOS 5.0]]></key>
<key name="os_list_centos5.1"><![CDATA[CentOS 5.1]]></key>
<key name="os_list_centos5.10"><![CDATA[CentOS 5.10]]></key>
<key name="os_list_centos5.11"><![CDATA[CentOS 5.11]]></key>
<key name="os_list_centos5.2"><![CDATA[CentOS 5.2]]></key>
<key name="os_list_centos5.3"><![CDATA[CentOS 5.3]]></key>
<key name="os_list_centos5.4"><![CDATA[CentOS 5.4]]></key>
<key name="os_list_centos5.5"><![CDATA[CentOS 5.5]]></key>
<key name="os_list_centos5.6"><![CDATA[CentOS 5.6]]></key>
<key name="os_list_centos5.7"><![CDATA[CentOS 5.7]]></key>
<key name="os_list_centos5.8"><![CDATA[CentOS 5.8]]></key>
<key name="os_list_centos5.9"><![CDATA[CentOS 5.9]]></key>
<key name="os_list_centos6.0"><![CDATA[CentOS 6.0]]></key>
<key name="os_list_centos6.1"><![CDATA[CentOS 6.1]]></key>
<key name="os_list_centos6.10"><![CDATA[CentOS 6.10]]></key>
<key name="os_list_centos6.2"><![CDATA[CentOS 6.2]]></key>
<key name="os_list_centos6.3"><![CDATA[CentOS 6.3]]></key>
<key name="os_list_centos6.4"><![CDATA[CentOS 6.4]]></key>
<key name="os_list_centos6.5"><![CDATA[CentOS 6.5]]></key>
<key name="os_list_centos6.6"><![CDATA[CentOS 6.6]]></key>
<key name="os_list_centos6.7"><![CDATA[CentOS 6.7]]></key>
<key name="os_list_centos6.8"><![CDATA[CentOS 6.8]]></key>
<key name="os_list_centos6.9"><![CDATA[CentOS 6.9]]></key>
<key name="os_list_centos7.0"><![CDATA[CentOS 7]]></key>
<key name="os_list_centos8"><![CDATA[CentOS 8]]></key>
<key name="os_list_circle-unknown"><![CDATA[Circle Linux Unknown]]></key>
<key name="os_list_circle8-unknown"><![CDATA[Circle Linux 8 Unknown]]></key>
<key name="os_list_circle8.4"><![CDATA[Circle Linux 8.4]]></key>
<key name="os_list_circle8.5"><![CDATA[Circle Linux 8.5]]></key>
<key name="os_list_circle9-unknown"><![CDATA[Circle Linux 9 Unknown]]></key>
<key name="os_list_circle9.0"><![CDATA[Circle Linux 9.0]]></key>
<key name="os_list_cirros0.3.0"><![CDATA[CirrOS 0.3.0]]></key>
<key name="os_list_cirros0.3.1"><![CDATA[CirrOS 0.3.1]]></key>
<key name="os_list_cirros0.3.2"><![CDATA[CirrOS 0.3.2]]></key>
<key name="os_list_cirros0.3.3"><![CDATA[CirrOS 0.3.3]]></key>
<key name="os_list_cirros0.3.4"><![CDATA[CirrOS 0.3.4]]></key>
<key name="os_list_cirros0.3.5"><![CDATA[CirrOS 0.3.5]]></key>
<key name="os_list_cirros0.4.0"><![CDATA[CirrOS 0.4.0]]></key>
<key name="os_list_cirros0.5.0"><![CDATA[CirrOS 0.5.0]]></key>
<key name="os_list_cirros0.5.1"><![CDATA[CirrOS 0.5.1]]></key>
<key name="os_list_cirros0.5.2"><![CDATA[CirrOS 0.5.2]]></key>
<key name="os_list_clearlinux"><![CDATA[Clear Linux OS]]></key>
<key name="os_list_debian1.1"><![CDATA[Debian GNU/Linux 1.1]]></key>
<key name="os_list_debian1.2"><![CDATA[Debian GNU/Linux 1.2]]></key>
<key name="os_list_debian1.3"><![CDATA[Debian GNU/Linux 1.3]]></key>
<key name="os_list_debian10"><![CDATA[Debian 10]]></key>
<key name="os_list_debian11"><![CDATA[Debian 11]]></key>
<key name="os_list_debian2.0"><![CDATA[Debian GNU/Linux 2.0]]></key>
<key name="os_list_debian2.1"><![CDATA[Debian GNU/Linux 2.1]]></key>
<key name="os_list_debian2.2"><![CDATA[Debian GNU/Linux 2.2]]></key>
<key name="os_list_debian3"><![CDATA[Debian GNU/Linux 3.0]]></key>
<key name="os_list_debian3.1"><![CDATA[Debian GNU/Linux 3.1]]></key>
<key name="os_list_debian4"><![CDATA[Debian GNU/Linux 4.0]]></key>
<key name="os_list_debian5"><![CDATA[Debian GNU/Linux 5.0]]></key>
<key name="os_list_debian6"><![CDATA[Debian 6.0]]></key>
<key name="os_list_debian7"><![CDATA[Debian 7]]></key>
<key name="os_list_debian8"><![CDATA[Debian 8]]></key>
<key name="os_list_debian9"><![CDATA[Debian 9]]></key>
<key name="os_list_debiantesting"><![CDATA[Debian testing]]></key>
<key name="os_list_dragonflybsd1.0"><![CDATA[DragonFlyBSD 1.0]]></key>
<key name="os_list_dragonflybsd1.0A"><![CDATA[DragonFlyBSD 1.0A]]></key>
<key name="os_list_dragonflybsd1.10.0"><![CDATA[DragonFlyBSD 1.10.0]]></key>
<key name="os_list_dragonflybsd1.10.1"><![CDATA[DragonFlyBSD 1.10.1]]></key>
<key name="os_list_dragonflybsd1.12.0"><![CDATA[DragonFlyBSD 1.12.0]]></key>
<key name="os_list_dragonflybsd1.12.1"><![CDATA[DragonFlyBSD 1.12.1]]></key>
<key name="os_list_dragonflybsd1.12.2"><![CDATA[DragonFlyBSD 1.12.2]]></key>
<key name="os_list_dragonflybsd1.2.0"><![CDATA[DragonFlyBSD 1.2.0]]></key>
<key name="os_list_dragonflybsd1.2.1"><![CDATA[DragonFlyBSD 1.2.1]]></key>
<key name="os_list_dragonflybsd1.2.2"><![CDATA[DragonFlyBSD 1.2.2]]></key>
<key name="os_list_dragonflybsd1.2.3"><![CDATA[DragonFlyBSD 1.2.3]]></key>
<key name="os_list_dragonflybsd1.2.4"><![CDATA[DragonFlyBSD 1.2.4]]></key>
<key name="os_list_dragonflybsd1.2.5"><![CDATA[DragonFlyBSD 1.2.5]]></key>
<key name="os_list_dragonflybsd1.2.6"><![CDATA[DragonFlyBSD 1.2.6]]></key>
<key name="os_list_dragonflybsd1.4.0"><![CDATA[DragonFlyBSD 1.4.0]]></key>
<key name="os_list_dragonflybsd1.4.4"><![CDATA[DragonFlyBSD 1.4.4]]></key>
<key name="os_list_dragonflybsd1.6.0"><![CDATA[DragonFlyBSD 1.6.0]]></key>
<key name="os_list_dragonflybsd1.8.0"><![CDATA[DragonFlyBSD 1.8.0]]></key>
<key name="os_list_dragonflybsd1.8.1"><![CDATA[DragonFlyBSD 1.8.1]]></key>
<key name="os_list_dragonflybsd2.0.0"><![CDATA[DragonFlyBSD 2.0.0]]></key>
<key name="os_list_dragonflybsd2.0.1"><![CDATA[DragonFlyBSD 2.0.1]]></key>
<key name="os_list_dragonflybsd2.10.1"><![CDATA[DragonFlyBSD 2.10.1]]></key>
<key name="os_list_dragonflybsd2.2.0"><![CDATA[DragonFlyBSD 2.2.0]]></key>
<key name="os_list_dragonflybsd2.2.1"><![CDATA[DragonFlyBSD 2.2.1]]></key>
<key name="os_list_dragonflybsd2.4.0"><![CDATA[DragonFlyBSD 2.4.0]]></key>
<key name="os_list_dragonflybsd2.4.1"><![CDATA[DragonFlyBSD 2.4.1]]></key>
<key name="os_list_dragonflybsd2.6.1"><![CDATA[DragonFlyBSD 2.6.1]]></key>
<key name="os_list_dragonflybsd2.6.2"><![CDATA[DragonFlyBSD 2.6.2]]></key>
<key name="os_list_dragonflybsd2.6.3"><![CDATA[DragonFlyBSD 2.6.3]]></key>
<key name="os_list_dragonflybsd2.8.2"><![CDATA[DragonFlyBSD 2.8.2]]></key>
<key name="os_list_dragonflybsd3.0.1"><![CDATA[DragonFlyBSD 3.0.1]]></key>
<key name="os_list_dragonflybsd3.2.1"><![CDATA[DragonFlyBSD 3.2.1]]></key>
<key name="os_list_dragonflybsd3.4.1"><![CDATA[DragonFlyBSD 3.4.1]]></key>
<key name="os_list_dragonflybsd3.4.2"><![CDATA[DragonFlyBSD 3.4.2]]></key>
<key name="os_list_dragonflybsd3.4.3"><![CDATA[DragonFlyBSD 3.4.3]]></key>
<key name="os_list_dragonflybsd3.6.0"><![CDATA[DragonFlyBSD 3.6.0]]></key>
<key name="os_list_dragonflybsd3.6.1"><![CDATA[DragonFlyBSD 3.6.1]]></key>
<key name="os_list_dragonflybsd3.6.2"><![CDATA[DragonFlyBSD 3.6.2]]></key>
<key name="os_list_dragonflybsd3.8.0"><![CDATA[DragonFlyBSD 3.8.0]]></key>
<key name="os_list_dragonflybsd3.8.1"><![CDATA[DragonFlyBSD 3.8.1]]></key>
<key name="os_list_dragonflybsd3.8.2"><![CDATA[DragonFlyBSD 3.8.2]]></key>
<key name="os_list_dragonflybsd4.0.0"><![CDATA[DragonFlyBSD 4.0.0]]></key>
<key name="os_list_dragonflybsd4.0.1"><![CDATA[DragonFlyBSD 4.0.1]]></key>
<key name="os_list_dragonflybsd4.2.0"><![CDATA[DragonFlyBSD 4.2.0]]></key>
<key name="os_list_dragonflybsd4.2.1"><![CDATA[DragonFlyBSD 4.2.1]]></key>
<key name="os_list_dragonflybsd4.2.3"><![CDATA[DragonFlyBSD 4.2.3]]></key>
<key name="os_list_dragonflybsd4.2.4"><![CDATA[DragonFlyBSD 4.2.4]]></key>
<key name="os_list_dragonflybsd4.4.1"><![CDATA[DragonFlyBSD 4.4.1]]></key>
<key name="os_list_dragonflybsd4.4.2"><![CDATA[DragonFlyBSD 4.4.2]]></key>
<key name="os_list_dragonflybsd4.4.3"><![CDATA[DragonFlyBSD 4.4.3]]></key>
<key name="os_list_dragonflybsd4.6.0"><![CDATA[DragonFlyBSD 4.6.0]]></key>
<key name="os_list_dragonflybsd4.6.1"><![CDATA[DragonFlyBSD 4.6.1]]></key>
<key name="os_list_dragonflybsd4.6.2"><![CDATA[DragonFlyBSD 4.6.2]]></key>
<key name="os_list_dragonflybsd4.8.0"><![CDATA[DragonFlyBSD 4.8.0]]></key>
<key name="os_list_dragonflybsd4.8.1"><![CDATA[DragonFlyBSD 4.8.1]]></key>
<key name="os_list_dragonflybsd5.0.0"><![CDATA[DragonFlyBSD 5.0.0]]></key>
<key name="os_list_dragonflybsd5.0.1"><![CDATA[DragonFlyBSD 5.0.1]]></key>
<key name="os_list_dragonflybsd5.0.2"><![CDATA[DragonFlyBSD 5.0.2]]></key>
<key name="os_list_dragonflybsd5.2.0"><![CDATA[DragonFlyBSD 5.2.0]]></key>
<key name="os_list_dragonflybsd5.2.1"><![CDATA[DragonFlyBSD 5.2.1]]></key>
<key name="os_list_dragonflybsd5.2.2"><![CDATA[DragonFlyBSD 5.2.2]]></key>
<key name="os_list_dragonflybsd5.4.0"><![CDATA[DragonFlyBSD 5.4.0]]></key>
<key name="os_list_dragonflybsd5.4.1"><![CDATA[DragonFlyBSD 5.4.1]]></key>
<key name="os_list_dragonflybsd5.4.2"><![CDATA[DragonFlyBSD 5.4.2]]></key>
<key name="os_list_dragonflybsd5.4.3"><![CDATA[DragonFlyBSD 5.4.3]]></key>
<key name="os_list_dragonflybsd5.6"><![CDATA[DragonFlyBSD 5.6]]></key>
<key name="os_list_elementary5.0"><![CDATA[Elementary OS 5.0 Juno]]></key>
<key name="os_list_eos3.1"><![CDATA[Endless OS 3.1]]></key>
<key name="os_list_eos3.10"><![CDATA[Endless OS 3.10]]></key>
<key name="os_list_eos3.2"><![CDATA[Endless OS 3.2]]></key>
<key name="os_list_eos3.3"><![CDATA[Endless OS 3.3]]></key>
<key name="os_list_eos3.4"><![CDATA[Endless OS 3.4]]></key>
<key name="os_list_eos3.5"><![CDATA[Endless OS 3.5]]></key>
<key name="os_list_eos3.6"><![CDATA[Endless OS 3.6]]></key>
<key name="os_list_eos3.7"><![CDATA[Endless OS 3.7]]></key>
<key name="os_list_eos3.8"><![CDATA[Endless OS 3.8]]></key>
<key name="os_list_eos3.9"><![CDATA[Endless OS 3.9]]></key>
<key name="os_list_eos4.0"><![CDATA[Endless OS 4.0]]></key>
<key name="os_list_fedora-coreos-next"><![CDATA[Fedora CoreOS]]></key>
<key name="os_list_fedora-coreos-stable"><![CDATA[Fedora CoreOS]]></key>
<key name="os_list_fedora-coreos-testing"><![CDATA[Fedora CoreOS]]></key>
<key name="os_list_fedora-eln"><![CDATA[Fedora ELN]]></key>
<key name="os_list_fedora-rawhide"><![CDATA[Fedora Rawhide]]></key>
<key name="os_list_fedora-unknown"><![CDATA[Fedora]]></key>
<key name="os_list_fedora1"><![CDATA[Fedora Core 1]]></key>
<key name="os_list_fedora10"><![CDATA[Fedora 10]]></key>
<key name="os_list_fedora11"><![CDATA[Fedora 11]]></key>
<key name="os_list_fedora12"><![CDATA[Fedora 12]]></key>
<key name="os_list_fedora13"><![CDATA[Fedora 13]]></key>
<key name="os_list_fedora14"><![CDATA[Fedora 14]]></key>
<key name="os_list_fedora15"><![CDATA[Fedora 15]]></key>
<key name="os_list_fedora16"><![CDATA[Fedora 16]]></key>
<key name="os_list_fedora17"><![CDATA[Fedora 17]]></key>
<key name="os_list_fedora18"><![CDATA[Fedora 18]]></key>
<key name="os_list_fedora19"><![CDATA[Fedora 19]]></key>
<key name="os_list_fedora2"><![CDATA[Fedora Core 2]]></key>
<key name="os_list_fedora20"><![CDATA[Fedora 20]]></key>
<key name="os_list_fedora21"><![CDATA[Fedora 21]]></key>
<key name="os_list_fedora22"><![CDATA[Fedora 22]]></key>
<key name="os_list_fedora23"><![CDATA[Fedora 23]]></key>
<key name="os_list_fedora24"><![CDATA[Fedora 24]]></key>
<key name="os_list_fedora25"><![CDATA[Fedora 25]]></key>
<key name="os_list_fedora26"><![CDATA[Fedora 26]]></key>
<key name="os_list_fedora27"><![CDATA[Fedora 27]]></key>
<key name="os_list_fedora28"><![CDATA[Fedora 28]]></key>
<key name="os_list_fedora29"><![CDATA[Fedora 29]]></key>
<key name="os_list_fedora3"><![CDATA[Fedora Core 3]]></key>
<key name="os_list_fedora30"><![CDATA[Fedora 30]]></key>
<key name="os_list_fedora31"><![CDATA[Fedora 31]]></key>
<key name="os_list_fedora32"><![CDATA[Fedora 32]]></key>
<key name="os_list_fedora33"><![CDATA[Fedora 33]]></key>
<key name="os_list_fedora34"><![CDATA[Fedora 34]]></key>
<key name="os_list_fedora35"><![CDATA[Fedora 35]]></key>
<key name="os_list_fedora36"><![CDATA[Fedora Linux 36]]></key>
<key name="os_list_fedora4"><![CDATA[Fedora Core 4]]></key>
<key name="os_list_fedora5"><![CDATA[Fedora Core 5]]></key>
<key name="os_list_fedora6"><![CDATA[Fedora Core 6]]></key>
<key name="os_list_fedora7"><![CDATA[Fedora 7]]></key>
<key name="os_list_fedora8"><![CDATA[Fedora 8]]></key>
<key name="os_list_fedora9"><![CDATA[Fedora 9]]></key>
<key name="os_list_freebsd1.0"><![CDATA[FreeBSD 1.0]]></key>
<key name="os_list_freebsd10.0"><![CDATA[FreeBSD 10.0]]></key>
<key name="os_list_freebsd10.1"><![CDATA[FreeBSD 10.1]]></key>
<key name="os_list_freebsd10.2"><![CDATA[FreeBSD 10.2]]></key>
<key name="os_list_freebsd10.3"><![CDATA[FreeBSD 10.3]]></key>
<key name="os_list_freebsd10.4"><![CDATA[FreeBSD 10.4]]></key>
<key name="os_list_freebsd11.0"><![CDATA[FreeBSD 11.0]]></key>
<key name="os_list_freebsd11.1"><![CDATA[FreeBSD 11.1]]></key>
<key name="os_list_freebsd11.2"><![CDATA[FreeBSD 11.2]]></key>
<key name="os_list_freebsd11.3"><![CDATA[FreeBSD 11.3]]></key>
<key name="os_list_freebsd11.4"><![CDATA[FreeBSD 11.4]]></key>
<key name="os_list_freebsd12.0"><![CDATA[FreeBSD 12.0]]></key>
<key name="os_list_freebsd12.1"><![CDATA[FreeBSD 12.1]]></key>
<key name="os_list_freebsd12.2"><![CDATA[FreeBSD 12.2]]></key>
<key name="os_list_freebsd12.3"><![CDATA[FreeBSD 12.3]]></key>
<key name="os_list_freebsd13.0"><![CDATA[FreeBSD 13.0]]></key>
<key name="os_list_freebsd13.1"><![CDATA[FreeBSD 13.1]]></key>
<key name="os_list_freebsd2.0"><![CDATA[FreeBSD 2.0]]></key>
<key name="os_list_freebsd2.0.5"><![CDATA[FreeBSD 2.0.5]]></key>
<key name="os_list_freebsd2.2.8"><![CDATA[FreeBSD 2.2.8]]></key>
<key name="os_list_freebsd2.2.9"><![CDATA[FreeBSD 2.2.9]]></key>
<key name="os_list_freebsd3.0"><![CDATA[FreeBSD 3.0]]></key>
<key name="os_list_freebsd3.2"><![CDATA[FreeBSD 3.2]]></key>
<key name="os_list_freebsd4.0"><![CDATA[FreeBSD 4.0]]></key>
<key name="os_list_freebsd4.1"><![CDATA[FreeBSD 4.1]]></key>
<key name="os_list_freebsd4.10"><![CDATA[FreeBSD 4.10]]></key>
<key name="os_list_freebsd4.11"><![CDATA[FreeBSD 4.11]]></key>
<key name="os_list_freebsd4.2"><![CDATA[FreeBSD 4.2]]></key>
<key name="os_list_freebsd4.3"><![CDATA[FreeBSD 4.3]]></key>
<key name="os_list_freebsd4.4"><![CDATA[FreeBSD 4.4]]></key>
<key name="os_list_freebsd4.5"><![CDATA[FreeBSD 4.5]]></key>
<key name="os_list_freebsd4.6"><![CDATA[FreeBSD 4.6]]></key>
<key name="os_list_freebsd4.7"><![CDATA[FreeBSD 4.7]]></key>
<key name="os_list_freebsd4.8"><![CDATA[FreeBSD 4.8]]></key>
<key name="os_list_freebsd4.9"><![CDATA[FreeBSD 4.9]]></key>
<key name="os_list_freebsd5.0"><![CDATA[FreeBSD 5.0]]></key>
<key name="os_list_freebsd5.1"><![CDATA[FreeBSD 5.1]]></key>
<key name="os_list_freebsd5.2"><![CDATA[FreeBSD 5.2]]></key>
<key name="os_list_freebsd5.2.1"><![CDATA[FreeBSD 5.2.1]]></key>
<key name="os_list_freebsd5.3"><![CDATA[FreeBSD 5.3]]></key>
<key name="os_list_freebsd5.4"><![CDATA[FreeBSD 5.4]]></key>
<key name="os_list_freebsd5.5"><![CDATA[FreeBSD 5.5]]></key>
<key name="os_list_freebsd6.0"><![CDATA[FreeBSD 6.0]]></key>
<key name="os_list_freebsd6.1"><![CDATA[FreeBSD 6.1]]></key>
<key name="os_list_freebsd6.2"><![CDATA[FreeBSD 6.2]]></key>
<key name="os_list_freebsd6.3"><![CDATA[FreeBSD 6.3]]></key>
<key name="os_list_freebsd6.4"><![CDATA[FreeBSD 6.4]]></key>
<key name="os_list_freebsd7.0"><![CDATA[FreeBSD 7.0]]></key>
<key name="os_list_freebsd7.1"><![CDATA[FreeBSD 7.1]]></key>
<key name="os_list_freebsd7.2"><![CDATA[FreeBSD 7.2]]></key>
<key name="os_list_freebsd7.3"><![CDATA[FreeBSD 7.3]]></key>
<key name="os_list_freebsd7.4"><![CDATA[FreeBSD 7.4]]></key>
<key name="os_list_freebsd8.0"><![CDATA[FreeBSD 8.0]]></key>
<key name="os_list_freebsd8.1"><![CDATA[FreeBSD 8.1]]></key>
<key name="os_list_freebsd8.2"><![CDATA[FreeBSD 8.2]]></key>
<key name="os_list_freebsd8.3"><![CDATA[FreeBSD 8.3]]></key>
<key name="os_list_freebsd8.4"><![CDATA[FreeBSD 8.4]]></key>
<key name="os_list_freebsd9.0"><![CDATA[FreeBSD 9.0]]></key>
<key name="os_list_freebsd9.1"><![CDATA[FreeBSD 9.1]]></key>
<key name="os_list_freebsd9.2"><![CDATA[FreeBSD 9.2]]></key>
<key name="os_list_freebsd9.3"><![CDATA[FreeBSD 9.3]]></key>
<key name="os_list_freedos1.2"><![CDATA[FreeDOS 1.2]]></key>
<key name="os_list_freenix14.2"><![CDATA[Freenix 14.2]]></key>
<key name="os_list_gentoo"><![CDATA[Gentoo Linux]]></key>
<key name="os_list_gnome-continuous-3.10"><![CDATA[GNOME 3.10]]></key>
<key name="os_list_gnome-continuous-3.12"><![CDATA[GNOME 3.12]]></key>
<key name="os_list_gnome-continuous-3.14"><![CDATA[GNOME 3.14]]></key>
<key name="os_list_gnome3.6"><![CDATA[GNOME 3.6]]></key>
<key name="os_list_gnome3.8"><![CDATA[GNOME 3.8]]></key>
<key name="os_list_guix-1.1"><![CDATA[Guix 1.1]]></key>
<key name="os_list_guix-1.3"><![CDATA[Guix 1.3]]></key>
<key name="os_list_guix-hurd-latest"><![CDATA[Guix Hurd Latest]]></key>
<key name="os_list_guix-latest"><![CDATA[Guix latest]]></key>
<key name="os_list_haikunightly"><![CDATA[Haiku Nightly]]></key>
<key name="os_list_haikur1alpha1"><![CDATA[Haiku R1/Alpha1]]></key>
<key name="os_list_haikur1alpha2"><![CDATA[Haiku R1/Alpha2]]></key>
<key name="os_list_haikur1alpha3"><![CDATA[Haiku R1/Alpha3]]></key>
<key name="os_list_haikur1alpha4.1"><![CDATA[Haiku R1/Alpha4.1]]></key>
<key name="os_list_haikur1beta1"><![CDATA[Haiku R1/Beta1]]></key>
<key name="os_list_haikur1beta2"><![CDATA[Haiku R1/Beta2]]></key>
<key name="os_list_haikur1beta3"><![CDATA[Haiku R1/Beta3]]></key>
<key name="os_list_hyperbola03"><![CDATA[Hyperbola]]></key>
<key name="os_list_linux2016"><![CDATA[Generic Linux 2016]]></key>
<key name="os_list_linux2018"><![CDATA[Generic Linux 2018]]></key>
<key name="os_list_linux2020"><![CDATA[Generic Linux 2020]]></key>
<key name="os_list_linux2022"><![CDATA[Generic Linux 2022]]></key>
<key name="os_list_macosx10.0"><![CDATA[MacOS X Cheetah]]></key>
<key name="os_list_macosx10.1"><![CDATA[MacOS X Puma]]></key>
<key name="os_list_macosx10.2"><![CDATA[MacOS X Jaguar]]></key>
<key name="os_list_macosx10.3"><![CDATA[MacOS X Panther]]></key>
<key name="os_list_macosx10.4"><![CDATA[MacOS X Tiger]]></key>
<key name="os_list_macosx10.5"><![CDATA[MacOS X Leopard]]></key>
<key name="os_list_macosx10.6"><![CDATA[MacOS X Snow Leopard]]></key>
<key name="os_list_macosx10.7"><![CDATA[MacOS X Lion]]></key>
<key name="os_list_mageia1"><![CDATA[Mageia 1]]></key>
<key name="os_list_mageia2"><![CDATA[Mageia 2]]></key>
<key name="os_list_mageia3"><![CDATA[Mageia 3]]></key>
<key name="os_list_mageia4"><![CDATA[Mageia 4]]></key>
<key name="os_list_mageia5"><![CDATA[Mageia 5]]></key>
<key name="os_list_mageia6"><![CDATA[Mageia 6]]></key>
<key name="os_list_mageia7"><![CDATA[Mageia 7]]></key>
<key name="os_list_mageia8"><![CDATA[Mageia 8]]></key>
<key name="os_list_mandrake10.0"><![CDATA[Mandrake Linux 10.0]]></key>
<key name="os_list_mandrake10.1"><![CDATA[Mandrake Linux 10.1]]></key>
<key name="os_list_mandrake10.2"><![CDATA[Mandrake Linux 10.2]]></key>
<key name="os_list_mandrake5.1"><![CDATA[Mandrake Linux 5.1]]></key>
<key name="os_list_mandrake5.2"><![CDATA[Mandrake Linux 5.2]]></key>
<key name="os_list_mandrake5.3"><![CDATA[Mandrake Linux 5.3]]></key>
<key name="os_list_mandrake6.0"><![CDATA[Mandrake Linux 6.0]]></key>
<key name="os_list_mandrake6.1"><![CDATA[Mandrake Linux 6.1]]></key>
<key name="os_list_mandrake7.0"><![CDATA[Mandrake Linux 7.0]]></key>
<key name="os_list_mandrake7.1"><![CDATA[Mandrake Linux 7.1]]></key>
<key name="os_list_mandrake7.2"><![CDATA[Mandrake Linux 7.2]]></key>
<key name="os_list_mandrake8.0"><![CDATA[Mandrake Linux 8.0]]></key>
<key name="os_list_mandrake8.1"><![CDATA[Mandrake Linux 8.1]]></key>
<key name="os_list_mandrake8.2"><![CDATA[Mandrake Linux 8.2]]></key>
<key name="os_list_mandrake9.0"><![CDATA[Mandrake Linux 9.0]]></key>
<key name="os_list_mandrake9.1"><![CDATA[Mandrake Linux 9.1]]></key>
<key name="os_list_mandrake9.2"><![CDATA[Mandrake Linux 9.2]]></key>
<key name="os_list_mandriva2006.0"><![CDATA[Mandriva Linux 2006.0]]></key>
<key name="os_list_mandriva2007"><![CDATA[Mandriva Linux 2007]]></key>
<key name="os_list_mandriva2007.1"><![CDATA[Mandriva Linux 2007 Spring]]></key>
<key name="os_list_mandriva2008.0"><![CDATA[Mandriva Linux 2008]]></key>
<key name="os_list_mandriva2008.1"><![CDATA[Mandriva Linux 2008 Spring]]></key>
<key name="os_list_mandriva2009.0"><![CDATA[Mandriva Linux 2009]]></key>
<key name="os_list_mandriva2009.1"><![CDATA[Mandriva Linux 2009 Spring]]></key>
<key name="os_list_mandriva2010.0"><![CDATA[Mandriva Linux 2010]]></key>
<key name="os_list_mandriva2010.1"><![CDATA[Mandriva Linux 2010 Spring]]></key>
<key name="os_list_mandriva2010.2"><![CDATA[Mandriva Linux 2010.2]]></key>
<key name="os_list_mandriva2011"><![CDATA[Mandriva Linux 2011]]></key>
<key name="os_list_manjaro"><![CDATA[Manjaro]]></key>
<key name="os_list_mbs1.0"><![CDATA[Mandriva Business Server 1.0]]></key>
<key name="os_list_mes5"><![CDATA[Mandriva Enterprise Server 5.0]]></key>
<key name="os_list_mes5.1"><![CDATA[Mandriva Enterprise Server 5.1]]></key>
<key name="os_list_miraclelinux8.4"><![CDATA[MIRACLE LINUX 8.4]]></key>
<key name="os_list_msdos6.22"><![CDATA[Microsoft MS-DOS 6.22]]></key>
<key name="os_list_netbsd0.8"><![CDATA[NetBSD 0.8]]></key>
<key name="os_list_netbsd0.9"><![CDATA[NetBSD 0.9]]></key>
<key name="os_list_netbsd1.0"><![CDATA[NetBSD 1.0]]></key>
<key name="os_list_netbsd1.1"><![CDATA[NetBSD 1.1]]></key>
<key name="os_list_netbsd1.2"><![CDATA[NetBSD 1.2]]></key>
<key name="os_list_netbsd1.3"><![CDATA[NetBSD 1.3]]></key>
<key name="os_list_netbsd1.4"><![CDATA[NetBSD 1.4]]></key>
<key name="os_list_netbsd1.5"><![CDATA[NetBSD 1.5]]></key>
<key name="os_list_netbsd1.6"><![CDATA[NetBSD 1.6]]></key>
<key name="os_list_netbsd2.0"><![CDATA[NetBSD 2.0]]></key>
<key name="os_list_netbsd3.0"><![CDATA[NetBSD 3.0]]></key>
<key name="os_list_netbsd4.0"><![CDATA[NetBSD 4.0]]></key>
<key name="os_list_netbsd5.0"><![CDATA[NetBSD 5.0]]></key>
<key name="os_list_netbsd5.1"><![CDATA[NetBSD 5.1]]></key>
<key name="os_list_netbsd6.0"><![CDATA[NetBSD 6.0]]></key>
<key name="os_list_netbsd6.1"><![CDATA[NetBSD 6.1]]></key>
<key name="os_list_netbsd7.0"><![CDATA[NetBSD 7.0]]></key>
<key name="os_list_netbsd7.1"><![CDATA[NetBSD 7.1]]></key>
<key name="os_list_netbsd7.1.1"><![CDATA[NetBSD 7.1.1]]></key>
<key name="os_list_netbsd7.1.2"><![CDATA[NetBSD 7.1.2]]></key>
<key name="os_list_netbsd7.2"><![CDATA[NetBSD 7.2]]></key>
<key name="os_list_netbsd8.0"><![CDATA[NetBSD 8.0]]></key>
<key name="os_list_netbsd8.1"><![CDATA[NetBSD 8.1]]></key>
<key name="os_list_netbsd8.2"><![CDATA[NetBSD 8.2]]></key>
<key name="os_list_netbsd9.0"><![CDATA[NetBSD 9.0]]></key>
<key name="os_list_netware4"><![CDATA[Novell Netware 4]]></key>
<key name="os_list_netware5"><![CDATA[Novell Netware 5]]></key>
<key name="os_list_netware6"><![CDATA[Novell Netware 6]]></key>
<key name="os_list_nixos-20.03"><![CDATA[NixOS 20.03]]></key>
<key name="os_list_nixos-20.09"><![CDATA[NixOS 20.09]]></key>
<key name="os_list_nixos-21.05"><![CDATA[NixOS 21.05]]></key>
<key name="os_list_nixos-21.11"><![CDATA[NixOS 21.11]]></key>
<key name="os_list_nixos-22.05"><![CDATA[NixOS 22.05]]></key>
<key name="os_list_nixos-unknown"><![CDATA[NixOS]]></key>
<key name="os_list_nixos-unstable"><![CDATA[NixOS Unstable]]></key>
<key name="os_list_oel4.4"><![CDATA[Oracle Enterprise Linux 4.4]]></key>
<key name="os_list_oel4.5"><![CDATA[Oracle Enterprise Linux 4.5]]></key>
<key name="os_list_oel4.6"><![CDATA[Oracle Enterprise Linux 4.6]]></key>
<key name="os_list_oel4.7"><![CDATA[Oracle Enterprise Linux 4.7]]></key>
<key name="os_list_oel4.8"><![CDATA[Oracle Enterprise Linux 4.8]]></key>
<key name="os_list_oel4.9"><![CDATA[Oracle Enterprise Linux 4.9]]></key>
<key name="os_list_oel5.0"><![CDATA[Oracle Enterprise Linux 5.0]]></key>
<key name="os_list_oel5.1"><![CDATA[Oracle Enterprise Linux 5.1]]></key>
<key name="os_list_oel5.2"><![CDATA[Oracle Enterprise Linux 5.2]]></key>
<key name="os_list_oel5.3"><![CDATA[Oracle Enterprise Linux 5.3]]></key>
<key name="os_list_oel5.4"><![CDATA[Oracle Enterprise Linux 5.4]]></key>
<key name="os_list_ol5.10"><![CDATA[Oracle Linux 5.10]]></key>
<key name="os_list_ol5.11"><![CDATA[Oracle Linux 5.11]]></key>
<key name="os_list_ol5.5"><![CDATA[Oracle Linux 5.5]]></key>
<key name="os_list_ol5.6"><![CDATA[Oracle Linux 5.6]]></key>
<key name="os_list_ol5.7"><![CDATA[Oracle Linux 5.7]]></key>
<key name="os_list_ol5.8"><![CDATA[Oracle Linux 5.8]]></key>
<key name="os_list_ol5.9"><![CDATA[Oracle Linux 5.9]]></key>
<key name="os_list_ol6.0"><![CDATA[Oracle Linux 6.0]]></key>
<key name="os_list_ol6.1"><![CDATA[Oracle Linux 6.1]]></key>
<key name="os_list_ol6.10"><![CDATA[Oracle Linux 6.10]]></key>
<key name="os_list_ol6.2"><![CDATA[Oracle Linux 6.2]]></key>
<key name="os_list_ol6.3"><![CDATA[Oracle Linux 6.3]]></key>
<key name="os_list_ol6.4"><![CDATA[Oracle Linux 6.4]]></key>
<key name="os_list_ol6.5"><![CDATA[Oracle Linux 6.5]]></key>
<key name="os_list_ol6.6"><![CDATA[Oracle Linux 6.6]]></key>
<key name="os_list_ol6.7"><![CDATA[Oracle Linux 6.7]]></key>
<key name="os_list_ol6.8"><![CDATA[Oracle Linux 6.8]]></key>
<key name="os_list_ol6.9"><![CDATA[Oracle Linux 6.9]]></key>
<key name="os_list_ol7.0"><![CDATA[Oracle Linux 7.0]]></key>
<key name="os_list_ol7.1"><![CDATA[Oracle Linux 7.1]]></key>
<key name="os_list_ol7.2"><![CDATA[Oracle Linux 7.2]]></key>
<key name="os_list_ol7.3"><![CDATA[Oracle Linux 7.3]]></key>
<key name="os_list_ol7.4"><![CDATA[Oracle Linux 7.4]]></key>
<key name="os_list_ol7.5"><![CDATA[Oracle Linux 7.5]]></key>
<key name="os_list_ol7.6"><![CDATA[Oracle Linux 7.6]]></key>
<key name="os_list_ol7.7"><![CDATA[Oracle Linux 7.7]]></key>
<key name="os_list_ol7.8"><![CDATA[Oracle Linux 7.8]]></key>
<key name="os_list_ol7.9"><![CDATA[Oracle Linux 7.9]]></key>
<key name="os_list_ol8.0"><![CDATA[Oracle Linux 8.0]]></key>
<key name="os_list_ol8.1"><![CDATA[Oracle Linux 8.1]]></key>
<key name="os_list_ol8.2"><![CDATA[Oracle Linux 8.2]]></key>
<key name="os_list_ol8.3"><![CDATA[Oracle Linux 8.3]]></key>
<key name="os_list_ol8.4"><![CDATA[Oracle Linux 8.4]]></key>
<key name="os_list_ol8.5"><![CDATA[Oracle Linux 8.5]]></key>
<key name="os_list_openbsd4.2"><![CDATA[OpenBSD 4.2]]></key>
<key name="os_list_openbsd4.3"><![CDATA[OpenBSD 4.3]]></key>
<key name="os_list_openbsd4.4"><![CDATA[OpenBSD 4.4]]></key>
<key name="os_list_openbsd4.5"><![CDATA[OpenBSD 4.5]]></key>
<key name="os_list_openbsd4.8"><![CDATA[OpenBSD 4.8]]></key>
<key name="os_list_openbsd4.9"><![CDATA[OpenBSD 4.9]]></key>
<key name="os_list_openbsd5.0"><![CDATA[OpenBSD 5.0]]></key>
<key name="os_list_openbsd5.1"><![CDATA[OpenBSD 5.1]]></key>
<key name="os_list_openbsd5.2"><![CDATA[OpenBSD 5.2]]></key>
<key name="os_list_openbsd5.3"><![CDATA[OpenBSD 5.3]]></key>
<key name="os_list_openbsd5.4"><![CDATA[OpenBSD 5.4]]></key>
<key name="os_list_openbsd5.5"><![CDATA[OpenBSD 5.5]]></key>
<key name="os_list_openbsd5.6"><![CDATA[OpenBSD 5.6]]></key>
<key name="os_list_openbsd5.7"><![CDATA[OpenBSD 5.7]]></key>
<key name="os_list_openbsd5.8"><![CDATA[OpenBSD 5.8]]></key>
<key name="os_list_openbsd5.9"><![CDATA[OpenBSD 5.9]]></key>
<key name="os_list_openbsd6.0"><![CDATA[OpenBSD 6.0]]></key>
<key name="os_list_openbsd6.1"><![CDATA[OpenBSD 6.1]]></key>
<key name="os_list_openbsd6.2"><![CDATA[OpenBSD 6.2]]></key>
<key name="os_list_openbsd6.3"><![CDATA[OpenBSD 6.3]]></key>
<key name="os_list_openbsd6.4"><![CDATA[OpenBSD 6.4]]></key>
<key name="os_list_openbsd6.5"><![CDATA[OpenBSD 6.5]]></key>
<key name="os_list_openbsd6.6"><![CDATA[OpenBSD 6.6]]></key>
<key name="os_list_openbsd6.7"><![CDATA[OpenBSD 6.7]]></key>
<key name="os_list_openbsd6.8"><![CDATA[OpenBSD 6.8]]></key>
<key name="os_list_openbsd6.9"><![CDATA[OpenBSD 6.9]]></key>
<key name="os_list_openbsd7.0"><![CDATA[OpenBSD 7.0]]></key>
<key name="os_list_opensolaris2009.06"><![CDATA[OpenSolaris 2009.06]]></key>
<key name="os_list_opensuse-factory"><![CDATA[openSUSE]]></key>
<key name="os_list_opensuse-unknown"><![CDATA[openSUSE]]></key>
<key name="os_list_opensuse10.2"><![CDATA[openSUSE 10.2]]></key>
<key name="os_list_opensuse10.3"><![CDATA[openSUSE 10.3]]></key>
<key name="os_list_opensuse11.0"><![CDATA[openSUSE 11.0]]></key>
<key name="os_list_opensuse11.1"><![CDATA[openSUSE 11.1]]></key>
<key name="os_list_opensuse11.2"><![CDATA[openSUSE 11.2]]></key>
<key name="os_list_opensuse11.3"><![CDATA[openSUSE 11.3]]></key>
<key name="os_list_opensuse11.4"><![CDATA[openSUSE 11.4]]></key>
<key name="os_list_opensuse12.1"><![CDATA[openSUSE 12.1]]></key>
<key name="os_list_opensuse12.2"><![CDATA[openSUSE 12.2]]></key>
<key name="os_list_opensuse12.3"><![CDATA[openSUSE 12.3]]></key>
<key name="os_list_opensuse13.1"><![CDATA[openSUSE 13.1]]></key>
<key name="os_list_opensuse13.2"><![CDATA[openSUSE 13.2]]></key>
<key name="os_list_opensuse15.0"><![CDATA[openSUSE Leap 15.0]]></key>
<key name="os_list_opensuse15.1"><![CDATA[openSUSE Leap 15.1]]></key>
<key name="os_list_opensuse15.2"><![CDATA[openSUSE Leap 15.2]]></key>
<key name="os_list_opensuse15.3"><![CDATA[openSUSE Leap 15.3]]></key>
<key name="os_list_opensuse15.4"><![CDATA[openSUSE Leap 15.4]]></key>
<key name="os_list_opensuse42.1"><![CDATA[openSUSE Leap 42.1]]></key>
<key name="os_list_opensuse42.2"><![CDATA[openSUSE Leap 42.2]]></key>
<key name="os_list_opensuse42.3"><![CDATA[openSUSE Leap 42.3]]></key>
<key name="os_list_opensusetumbleweed"><![CDATA[openSUSE Tumbleweed]]></key>
<key name="os_list_popos17.10"><![CDATA[Pop!_OS 17.10]]></key>
<key name="os_list_popos18.04"><![CDATA[Pop!_OS 18.04]]></key>
<key name="os_list_popos18.10"><![CDATA[Pop!_OS 18.10]]></key>
<key name="os_list_popos19.04"><![CDATA[Pop!_OS 19.04]]></key>
<key name="os_list_popos19.10"><![CDATA[Pop!_OS 19.10]]></key>
<key name="os_list_popos20.04"><![CDATA[Pop!_OS 20.04]]></key>
<key name="os_list_popos20.10"><![CDATA[Pop!_OS 20.10]]></key>
<key name="os_list_pureos10"><![CDATA[PureOS]]></key>
<key name="os_list_pureos8"><![CDATA[PureOS]]></key>
<key name="os_list_pureos9"><![CDATA[PureOS]]></key>
<key name="os_list_rhel-atomic-7.0"><![CDATA[Red Hat Enterprise Linux Atomic Host 7.0]]></key>
<key name="os_list_rhel-atomic-7.1"><![CDATA[Red Hat Enterprise Linux Atomic Host 7.1]]></key>
<key name="os_list_rhel-atomic-7.2"><![CDATA[Red Hat Enterprise Linux Atomic Host 7.2]]></key>
<key name="os_list_rhel-atomic-7.3"><![CDATA[Red Hat Enterprise Linux Atomic Host 7.3]]></key>
<key name="os_list_rhel-atomic-7.4"><![CDATA[Red Hat Enterprise Linux Atomic Host 7.4]]></key>
<key name="os_list_rhel-unknown"><![CDATA[Red Hat Enterprise Linux Unknown]]></key>
<key name="os_list_rhel2.1"><![CDATA[Red Hat Enterprise Linux 2.1]]></key>
<key name="os_list_rhel2.1.1"><![CDATA[Red Hat Enterprise Linux 2.1 Update 1]]></key>
<key name="os_list_rhel2.1.2"><![CDATA[Red Hat Enterprise Linux 2.1 Update 2]]></key>
<key name="os_list_rhel2.1.3"><![CDATA[Red Hat Enterprise Linux 2.1 Update 3]]></key>
<key name="os_list_rhel2.1.4"><![CDATA[Red Hat Enterprise Linux 2.1 Update 4]]></key>
<key name="os_list_rhel2.1.5"><![CDATA[Red Hat Enterprise Linux 2.1 Update 5]]></key>
<key name="os_list_rhel2.1.6"><![CDATA[Red Hat Enterprise Linux 2.1 Update 6]]></key>
<key name="os_list_rhel2.1.7"><![CDATA[Red Hat Enterprise Linux 2.1 Update 7]]></key>
<key name="os_list_rhel3"><![CDATA[Red Hat Enterprise Linux 3]]></key>
<key name="os_list_rhel3.1"><![CDATA[Red Hat Enterprise Linux 3 Update 1]]></key>
<key name="os_list_rhel3.2"><![CDATA[Red Hat Enterprise Linux 3 Update 2]]></key>
<key name="os_list_rhel3.3"><![CDATA[Red Hat Enterprise Linux 3 Update 3]]></key>
<key name="os_list_rhel3.4"><![CDATA[Red Hat Enterprise Linux 3 Update 4]]></key>
<key name="os_list_rhel3.5"><![CDATA[Red Hat Enterprise Linux 3 Update 5]]></key>
<key name="os_list_rhel3.6"><![CDATA[Red Hat Enterprise Linux 3 Update 6]]></key>
<key name="os_list_rhel3.7"><![CDATA[Red Hat Enterprise Linux 3 Update 7]]></key>
<key name="os_list_rhel3.8"><![CDATA[Red Hat Enterprise Linux 3 Update 8]]></key>
<key name="os_list_rhel3.9"><![CDATA[Red Hat Enterprise Linux 3 Update 9]]></key>
<key name="os_list_rhel4.0"><![CDATA[Red Hat Enterprise Linux 4.0]]></key>
<key name="os_list_rhel4.1"><![CDATA[Red Hat Enterprise Linux 4.1]]></key>
<key name="os_list_rhel4.2"><![CDATA[Red Hat Enterprise Linux 4.2]]></key>
<key name="os_list_rhel4.3"><![CDATA[Red Hat Enterprise Linux 4.3]]></key>
<key name="os_list_rhel4.4"><![CDATA[Red Hat Enterprise Linux 4.4]]></key>
<key name="os_list_rhel4.5"><![CDATA[Red Hat Enterprise Linux 4.5]]></key>
<key name="os_list_rhel4.6"><![CDATA[Red Hat Enterprise Linux 4.6]]></key>
<key name="os_list_rhel4.7"><![CDATA[Red Hat Enterprise Linux 4.7]]></key>
<key name="os_list_rhel4.8"><![CDATA[Red Hat Enterprise Linux 4.8]]></key>
<key name="os_list_rhel4.9"><![CDATA[Red Hat Enterprise Linux 4.9]]></key>
<key name="os_list_rhel5.0"><![CDATA[Red Hat Enterprise Linux 5.0]]></key>
<key name="os_list_rhel5.1"><![CDATA[Red Hat Enterprise Linux 5.1]]></key>
<key name="os_list_rhel5.10"><![CDATA[Red Hat Enterprise Linux 5.10]]></key>
<key name="os_list_rhel5.11"><![CDATA[Red Hat Enterprise Linux 5.11]]></key>
<key name="os_list_rhel5.2"><![CDATA[Red Hat Enterprise Linux 5.2]]></key>
<key name="os_list_rhel5.3"><![CDATA[Red Hat Enterprise Linux 5.3]]></key>
<key name="os_list_rhel5.4"><![CDATA[Red Hat Enterprise Linux 5.4]]></key>
<key name="os_list_rhel5.5"><![CDATA[Red Hat Enterprise Linux 5.5]]></key>
<key name="os_list_rhel5.6"><![CDATA[Red Hat Enterprise Linux 5.6]]></key>
<key name="os_list_rhel5.7"><![CDATA[Red Hat Enterprise Linux 5.7]]></key>
<key name="os_list_rhel5.8"><![CDATA[Red Hat Enterprise Linux 5.8]]></key>
<key name="os_list_rhel5.9"><![CDATA[Red Hat Enterprise Linux 5.9]]></key>
<key name="os_list_rhel6-unknown"><![CDATA[Red Hat Enterprise Linux 6 Unknown]]></key>
<key name="os_list_rhel6.0"><![CDATA[Red Hat Enterprise Linux 6.0]]></key>
<key name="os_list_rhel6.1"><![CDATA[Red Hat Enterprise Linux 6.1]]></key>
<key name="os_list_rhel6.10"><![CDATA[Red Hat Enterprise Linux 6.10]]></key>
<key name="os_list_rhel6.2"><![CDATA[Red Hat Enterprise Linux 6.2]]></key>
<key name="os_list_rhel6.3"><![CDATA[Red Hat Enterprise Linux 6.3]]></key>
<key name="os_list_rhel6.4"><![CDATA[Red Hat Enterprise Linux 6.4]]></key>
<key name="os_list_rhel6.5"><![CDATA[Red Hat Enterprise Linux 6.5]]></key>
<key name="os_list_rhel6.6"><![CDATA[Red Hat Enterprise Linux 6.6]]></key>
<key name="os_list_rhel6.7"><![CDATA[Red Hat Enterprise Linux 6.7]]></key>
<key name="os_list_rhel6.8"><![CDATA[Red Hat Enterprise Linux 6.8]]></key>
<key name="os_list_rhel6.9"><![CDATA[Red Hat Enterprise Linux 6.9]]></key>
<key name="os_list_rhel7-unknown"><![CDATA[Red Hat Enterprise Linux 7 Unknown]]></key>
<key name="os_list_rhel7.0"><![CDATA[Red Hat Enterprise Linux 7.0]]></key>
<key name="os_list_rhel7.1"><![CDATA[Red Hat Enterprise Linux 7.1]]></key>
<key name="os_list_rhel7.2"><![CDATA[Red Hat Enterprise Linux 7.2]]></key>
<key name="os_list_rhel7.3"><![CDATA[Red Hat Enterprise Linux 7.3]]></key>
<key name="os_list_rhel7.4"><![CDATA[Red Hat Enterprise Linux 7.4]]></key>
<key name="os_list_rhel7.5"><![CDATA[Red Hat Enterprise Linux 7.5]]></key>
<key name="os_list_rhel7.6"><![CDATA[Red Hat Enterprise Linux 7.6]]></key>
<key name="os_list_rhel7.7"><![CDATA[Red Hat Enterprise Linux 7.7]]></key>
<key name="os_list_rhel7.8"><![CDATA[Red Hat Enterprise Linux 7.8]]></key>
<key name="os_list_rhel7.9"><![CDATA[Red Hat Enterprise Linux 7.9]]></key>
<key name="os_list_rhel8-unknown"><![CDATA[Red Hat Enterprise Linux 8 Unknown]]></key>
<key name="os_list_rhel8.0"><![CDATA[Red Hat Enterprise Linux 8.0]]></key>
<key name="os_list_rhel8.1"><![CDATA[Red Hat Enterprise Linux 8.1]]></key>
<key name="os_list_rhel8.2"><![CDATA[Red Hat Enterprise Linux 8.2]]></key>
<key name="os_list_rhel8.3"><![CDATA[Red Hat Enterprise Linux 8.3]]></key>
<key name="os_list_rhel8.4"><![CDATA[Red Hat Enterprise Linux 8.4]]></key>
<key name="os_list_rhel8.5"><![CDATA[Red Hat Enterprise Linux 8.5]]></key>
<key name="os_list_rhel8.6"><![CDATA[Red Hat Enterprise Linux 8.6]]></key>
<key name="os_list_rhel8.7"><![CDATA[Red Hat Enterprise Linux 8.7]]></key>
<key name="os_list_rhel9-unknown"><![CDATA[Red Hat Enterprise Linux 9 Unknown]]></key>
<key name="os_list_rhel9.0"><![CDATA[Red Hat Enterprise Linux 9.0]]></key>
<key name="os_list_rhel9.1"><![CDATA[Red Hat Enterprise Linux 9.1]]></key>
<key name="os_list_rhl1.0"><![CDATA[Red Hat Linux 1.0]]></key>
<key name="os_list_rhl1.1"><![CDATA[Red Hat Linux 1.1]]></key>
<key name="os_list_rhl2.0"><![CDATA[Red Hat Linux 2.0]]></key>
<key name="os_list_rhl2.1"><![CDATA[Red Hat Linux 2.1]]></key>
<key name="os_list_rhl3.0.3"><![CDATA[Red Hat Linux 3.0.3]]></key>
<key name="os_list_rhl4.0"><![CDATA[Red Hat Linux 4.0]]></key>
<key name="os_list_rhl4.1"><![CDATA[Red Hat Linux 4.1]]></key>
<key name="os_list_rhl4.2"><![CDATA[Red Hat Linux 4.2]]></key>
<key name="os_list_rhl5.0"><![CDATA[Red Hat Linux 5.0]]></key>
<key name="os_list_rhl5.1"><![CDATA[Red Hat Linux 5.1]]></key>
<key name="os_list_rhl5.2"><![CDATA[Red Hat Linux 5.2]]></key>
<key name="os_list_rhl6.0"><![CDATA[Red Hat Linux 6.0]]></key>
<key name="os_list_rhl6.1"><![CDATA[Red Hat Linux 6.1]]></key>
<key name="os_list_rhl6.2"><![CDATA[Red Hat Linux 6.2]]></key>
<key name="os_list_rhl7"><![CDATA[Red Hat Linux 7]]></key>
<key name="os_list_rhl7.1"><![CDATA[Red Hat Linux 7.1]]></key>
<key name="os_list_rhl7.2"><![CDATA[Red Hat Linux 7.2]]></key>
<key name="os_list_rhl7.3"><![CDATA[Red Hat Linux 7.3]]></key>
<key name="os_list_rhl8.0"><![CDATA[Red Hat Linux 8.0]]></key>
<key name="os_list_rhl9"><![CDATA[Red Hat Linux 9]]></key>
<key name="os_list_rocky-unknown"><![CDATA[Rocky Linux Unknown]]></key>
<key name="os_list_rocky8-unknown"><![CDATA[Rocky Linux 8 Unknown]]></key>
<key name="os_list_rocky8.4"><![CDATA[Rocky Linux 8.4]]></key>
<key name="os_list_rocky8.5"><![CDATA[Rocky Linux 8.5]]></key>
<key name="os_list_rocky8.6"><![CDATA[Rocky Linux 8.6]]></key>
<key name="os_list_rocky9-unknown"><![CDATA[Rocky Linux 9 Unknown]]></key>
<key name="os_list_rocky9.0"><![CDATA[Rocky Linux 9.0]]></key>
<key name="os_list_scientificlinux5.0"><![CDATA[Scientific Linux 5.0]]></key>
<key name="os_list_scientificlinux5.1"><![CDATA[Scientific Linux 5.1]]></key>
<key name="os_list_scientificlinux5.10"><![CDATA[Scientific Linux 5.10]]></key>
<key name="os_list_scientificlinux5.11"><![CDATA[Scientific Linux 5.11]]></key>
<key name="os_list_scientificlinux5.2"><![CDATA[Scientific Linux 5.2]]></key>
<key name="os_list_scientificlinux5.3"><![CDATA[Scientific Linux 5.3]]></key>
<key name="os_list_scientificlinux5.4"><![CDATA[Scientific Linux 5.4]]></key>
<key name="os_list_scientificlinux5.5"><![CDATA[Scientific Linux 5.5]]></key>
<key name="os_list_scientificlinux5.6"><![CDATA[Scientific Linux 5.6]]></key>
<key name="os_list_scientificlinux5.7"><![CDATA[Scientific Linux 5.7]]></key>
<key name="os_list_scientificlinux5.8"><![CDATA[Scientific Linux 5.8]]></key>
<key name="os_list_scientificlinux5.9"><![CDATA[Scientific Linux 5.9]]></key>
<key name="os_list_scientificlinux6.0"><![CDATA[Scientific Linux 6.0]]></key>
<key name="os_list_scientificlinux6.1"><![CDATA[Scientific Linux 6.1]]></key>
<key name="os_list_scientificlinux6.10"><![CDATA[Scientific Linux 6.10]]></key>
<key name="os_list_scientificlinux6.2"><![CDATA[Scientific Linux 6.2]]></key>
<key name="os_list_scientificlinux6.3"><![CDATA[Scientific Linux 6.3]]></key>
<key name="os_list_scientificlinux6.4"><![CDATA[Scientific Linux 6.4]]></key>
<key name="os_list_scientificlinux6.5"><![CDATA[Scientific Linux 6.5]]></key>
<key name="os_list_scientificlinux6.6"><![CDATA[Scientific Linux 6.6]]></key>
<key name="os_list_scientificlinux6.7"><![CDATA[Scientific Linux 6.7]]></key>
<key name="os_list_scientificlinux6.8"><![CDATA[Scientific Linux 6.8]]></key>
<key name="os_list_scientificlinux6.9"><![CDATA[Scientific Linux 6.9]]></key>
<key name="os_list_scientificlinux7-unknown"><![CDATA[Scientific Linux 7 Unknown]]></key>
<key name="os_list_scientificlinux7.0"><![CDATA[Scientific Linux 7.0]]></key>
<key name="os_list_scientificlinux7.1"><![CDATA[Scientific Linux 7.1]]></key>
<key name="os_list_scientificlinux7.2"><![CDATA[Scientific Linux 7.2]]></key>
<key name="os_list_scientificlinux7.3"><![CDATA[Scientific Linux 7.3]]></key>
<key name="os_list_scientificlinux7.4"><![CDATA[Scientific Linux 7.4]]></key>
<key name="os_list_scientificlinux7.5"><![CDATA[Scientific Linux 7.5]]></key>
<key name="os_list_scientificlinux7.6"><![CDATA[Scientific Linux 7.6]]></key>
<key name="os_list_silverblue-rawhide"><![CDATA[Fedora Silverblue Rawhide]]></key>
<key name="os_list_silverblue-unknown"><![CDATA[Fedora Silverblue]]></key>
<key name="os_list_silverblue28"><![CDATA[Fedora Silverblue 28]]></key>
<key name="os_list_silverblue29"><![CDATA[Fedora Silverblue 29]]></key>
<key name="os_list_silverblue30"><![CDATA[Fedora Silverblue 30]]></key>
<key name="os_list_silverblue31"><![CDATA[Fedora Silverblue 31]]></key>
<key name="os_list_silverblue32"><![CDATA[Fedora Silverblue 32]]></key>
<key name="os_list_silverblue33"><![CDATA[Fedora Silverblue 33]]></key>
<key name="os_list_silverblue34"><![CDATA[Fedora Silverblue 34]]></key>
<key name="os_list_silverblue35"><![CDATA[Fedora Silverblue 35]]></key>
<key name="os_list_silverblue36"><![CDATA[Fedora Silverblue 36]]></key>
<key name="os_list_slackware-current"><![CDATA[Slackware -current]]></key>
<key name="os_list_slackware14.2"><![CDATA[Slackware 14.2]]></key>
<key name="os_list_sle-unknown"><![CDATA[SUSE Linux Enterprise Unknown]]></key>
<key name="os_list_sle15"><![CDATA[SUSE Linux Enterprise 15]]></key>
<key name="os_list_sle15-unknown"><![CDATA[SUSE Linux Enterprise 15 Unknown]]></key>
<key name="os_list_sle15sp1"><![CDATA[SUSE Linux Enterprise 15 SP1]]></key>
<key name="os_list_sle15sp2"><![CDATA[SUSE Linux Enterprise 15 SP2]]></key>
<key name="os_list_sle15sp3"><![CDATA[SUSE Linux Enterprise 15 SP3]]></key>
<key name="os_list_sle15sp4"><![CDATA[SUSE Linux Enterprise 15 SP4]]></key>
<key name="os_list_sled10"><![CDATA[SUSE Linux Enterprise Desktop 10]]></key>
<key name="os_list_sled10sp1"><![CDATA[SUSE Linux Enterprise Desktop 10 SP1]]></key>
<key name="os_list_sled10sp2"><![CDATA[SUSE Linux Enterprise Desktop 10 SP2]]></key>
<key name="os_list_sled10sp3"><![CDATA[SUSE Linux Enterprise Desktop 10 SP3]]></key>
<key name="os_list_sled10sp4"><![CDATA[SUSE Linux Enterprise Desktop 10 SP4]]></key>
<key name="os_list_sled11"><![CDATA[SUSE Linux Enterprise Desktop 11]]></key>
<key name="os_list_sled11sp1"><![CDATA[SUSE Linux Enterprise Desktop 11 SP1]]></key>
<key name="os_list_sled11sp2"><![CDATA[SUSE Linux Enterprise Desktop 11 SP2]]></key>
<key name="os_list_sled11sp3"><![CDATA[SUSE Linux Enterprise Desktop 11 SP3]]></key>
<key name="os_list_sled11sp4"><![CDATA[SUSE Linux Enterprise Desktop 11 SP4]]></key>
<key name="os_list_sled12"><![CDATA[SUSE Linux Enterprise Desktop 12]]></key>
<key name="os_list_sled12-unknown"><![CDATA[SUSE Linux Enterprise Desktop 12 Unknown]]></key>
<key name="os_list_sled12sp1"><![CDATA[SUSE Linux Enterprise Desktop 12 SP1]]></key>
<key name="os_list_sled12sp2"><![CDATA[SUSE Linux Enterprise Desktop 12 SP2]]></key>
<key name="os_list_sled12sp3"><![CDATA[SUSE Linux Enterprise Desktop 12 SP3]]></key>
<key name="os_list_sled12sp4"><![CDATA[SUSE Linux Enterprise Desktop 12 SP4]]></key>
<key name="os_list_sled12sp5"><![CDATA[SUSE Linux Enterprise Desktop 12 SP5]]></key>
<key name="os_list_sled9"><![CDATA[SUSE Linux Enterprise Desktop 9]]></key>
<key name="os_list_slem5.0"><![CDATA[SUSE Linux Enterprise Micro]]></key>
<key name="os_list_slem5.1"><![CDATA[SUSE Linux Enterprise Micro 5.1]]></key>
<key name="os_list_slem5.2"><![CDATA[SUSE Linux Enterprise Micro 5.2]]></key>
<key name="os_list_sles10"><![CDATA[SUSE Linux Enterprise Server 10]]></key>
<key name="os_list_sles10sp1"><![CDATA[SUSE Linux Enterprise Server 10 SP1]]></key>
<key name="os_list_sles10sp2"><![CDATA[SUSE Linux Enterprise Server 10 SP2]]></key>
<key name="os_list_sles10sp3"><![CDATA[SUSE Linux Enterprise Server 10 SP3]]></key>
<key name="os_list_sles10sp4"><![CDATA[SUSE Linux Enterprise Server 10 SP4]]></key>
<key name="os_list_sles11"><![CDATA[SUSE Linux Enterprise Server 11]]></key>
<key name="os_list_sles11sp1"><![CDATA[SUSE Linux Enterprise Server 11 SP1]]></key>
<key name="os_list_sles11sp2"><![CDATA[SUSE Linux Enterprise Server 11 SP2]]></key>
<key name="os_list_sles11sp3"><![CDATA[SUSE Linux Enterprise Server 11 SP3]]></key>
<key name="os_list_sles11sp4"><![CDATA[SUSE Linux Enterprise Server 11 SP4]]></key>
<key name="os_list_sles12"><![CDATA[SUSE Linux Enterprise Server 12]]></key>
<key name="os_list_sles12-unknown"><![CDATA[SUSE Linux Enterprise Server 12 Unknown]]></key>
<key name="os_list_sles12sp1"><![CDATA[SUSE Linux Enterprise Server 12 SP1]]></key>
<key name="os_list_sles12sp2"><![CDATA[SUSE Linux Enterprise Server 12 SP2]]></key>
<key name="os_list_sles12sp3"><![CDATA[SUSE Linux Enterprise Server 12 SP3]]></key>
<key name="os_list_sles12sp4"><![CDATA[SUSE Linux Enterprise Server 12 SP4]]></key>
<key name="os_list_sles12sp5"><![CDATA[SUSE Linux Enterprise Server 12 SP5]]></key>
<key name="os_list_sles9"><![CDATA[SUSE Linux Enterprise Server 9]]></key>
<key name="os_list_solaris10"><![CDATA[Solaris 10]]></key>
<key name="os_list_solaris11"><![CDATA[Oracle Solaris 11]]></key>
<key name="os_list_solaris9"><![CDATA[Solaris 9]]></key>
<key name="os_list_trisquel9"><![CDATA[Trisquel]]></key>
<key name="os_list_ubuntu10.04"><![CDATA[Ubuntu 10.04 LTS]]></key>
<key name="os_list_ubuntu10.10"><![CDATA[Ubuntu 10.10]]></key>
<key name="os_list_ubuntu11.04"><![CDATA[Ubuntu 11.04]]></key>
<key name="os_list_ubuntu11.10"><![CDATA[Ubuntu 11.10]]></key>
<key name="os_list_ubuntu12.04"><![CDATA[Ubuntu 12.04 LTS]]></key>
<key name="os_list_ubuntu12.10"><![CDATA[Ubuntu 12.10]]></key>
<key name="os_list_ubuntu13.04"><![CDATA[Ubuntu 13.04]]></key>
<key name="os_list_ubuntu13.10"><![CDATA[Ubuntu 13.10]]></key>
<key name="os_list_ubuntu14.04"><![CDATA[Ubuntu 14.04 LTS]]></key>
<key name="os_list_ubuntu14.10"><![CDATA[Ubuntu 14.10]]></key>
<key name="os_list_ubuntu15.04"><![CDATA[Ubuntu 15.04]]></key>
<key name="os_list_ubuntu15.10"><![CDATA[Ubuntu 15.10]]></key>
<key name="os_list_ubuntu16.04"><![CDATA[Ubuntu 16.04]]></key>
<key name="os_list_ubuntu16.10"><![CDATA[Ubuntu 16.10]]></key>
<key name="os_list_ubuntu17.04"><![CDATA[Ubuntu 17.04]]></key>
<key name="os_list_ubuntu17.10"><![CDATA[Ubuntu 17.10]]></key>
<key name="os_list_ubuntu18.04"><![CDATA[Ubuntu 18.04 LTS]]></key>
<key name="os_list_ubuntu18.10"><![CDATA[Ubuntu 18.10]]></key>
<key name="os_list_ubuntu19.04"><![CDATA[Ubuntu 19.04]]></key>
<key name="os_list_ubuntu19.10"><![CDATA[Ubuntu 19.10]]></key>
<key name="os_list_ubuntu20.04"><![CDATA[Ubuntu 20.04 LTS]]></key>
<key name="os_list_ubuntu20.10"><![CDATA[Ubuntu 20.10]]></key>
<key name="os_list_ubuntu21.04"><![CDATA[Ubuntu 21.04]]></key>
<key name="os_list_ubuntu21.10"><![CDATA[Ubuntu 21.10]]></key>
<key name="os_list_ubuntu22.04"><![CDATA[Ubuntu 22.04 LTS]]></key>
<key name="os_list_ubuntu4.10"><![CDATA[Ubuntu 4.10]]></key>
<key name="os_list_ubuntu5.04"><![CDATA[Ubuntu 5.04]]></key>
<key name="os_list_ubuntu5.10"><![CDATA[Ubuntu 5.10]]></key>
<key name="os_list_ubuntu6.06"><![CDATA[Ubuntu 6.06 LTS]]></key>
<key name="os_list_ubuntu6.10"><![CDATA[Ubuntu 6.10]]></key>
<key name="os_list_ubuntu7.04"><![CDATA[Ubuntu 7.04]]></key>
<key name="os_list_ubuntu7.10"><![CDATA[Ubuntu 7.10]]></key>
<key name="os_list_ubuntu8.04"><![CDATA[Ubuntu 8.04 LTS]]></key>
<key name="os_list_ubuntu8.10"><![CDATA[Ubuntu 8.10]]></key>
<key name="os_list_ubuntu9.04"><![CDATA[Ubuntu 9.04]]></key>
<key name="os_list_ubuntu9.10"><![CDATA[Ubuntu 9.10]]></key>
<key name="os_list_unknown"><![CDATA[Unknown]]></key>
<key name="os_list_voidlinux"><![CDATA[Void Linux]]></key>
<key name="os_list_win1.0"><![CDATA[Microsoft Windows 1.0]]></key>
<key name="os_list_win10"><![CDATA[Microsoft Windows 10]]></key>
<key name="os_list_win2.0"><![CDATA[Microsoft Windows 2.0]]></key>
<key name="os_list_win2.1"><![CDATA[Microsoft Windows 2.1]]></key>
<key name="os_list_win2k"><![CDATA[Microsoft Windows 2000]]></key>
<key name="os_list_win2k12"><![CDATA[Microsoft Windows Server 2012]]></key>
<key name="os_list_win2k12r2"><![CDATA[Microsoft Windows Server 2012 R2]]></key>
<key name="os_list_win2k16"><![CDATA[Microsoft Windows Server 2016]]></key>
<key name="os_list_win2k19"><![CDATA[Microsoft Windows Server 2019]]></key>
<key name="os_list_win2k22"><![CDATA[Microsoft Windows Server 2022]]></key>
<key name="os_list_win2k3"><![CDATA[Microsoft Windows Server 2003]]></key>
<key name="os_list_win2k3r2"><![CDATA[Microsoft Windows Server 2003 R2]]></key>
<key name="os_list_win2k8"><![CDATA[Microsoft Windows Server 2008]]></key>
<key name="os_list_win2k8r2"><![CDATA[Microsoft Windows Server 2008 R2]]></key>
<key name="os_list_win3.1"><![CDATA[Microsoft Windows 3.1]]></key>
<key name="os_list_win7"><![CDATA[Microsoft Windows 7]]></key>
<key name="os_list_win8"><![CDATA[Microsoft Windows 8]]></key>
<key name="os_list_win8.1"><![CDATA[Microsoft Windows 8.1]]></key>
<key name="os_list_win95"><![CDATA[Microsoft Windows 95]]></key>
<key name="os_list_win98"><![CDATA[Microsoft Windows 98]]></key>
<key name="os_list_winme"><![CDATA[Microsoft Windows Millennium Edition]]></key>
<key name="os_list_winnt3.1"><![CDATA[Microsoft Windows NT Server 3.1]]></key>
<key name="os_list_winnt3.5"><![CDATA[Microsoft Windows NT Server 3.5]]></key>
<key name="os_list_winnt3.51"><![CDATA[Microsoft Windows NT Server 3.51]]></key>
<key name="os_list_winnt4.0"><![CDATA[Microsoft Windows NT Server 4.0]]></key>
<key name="os_list_winvista"><![CDATA[Microsoft Windows Vista]]></key>
<key name="os_list_winxp"><![CDATA[Microsoft Windows XP]]></key>
</language> </language>
<!-- 日本語 --> <!-- 日本語 -->
<language name="jp" long_name="日本語" description="Anvil! language file."> <language name="jp" long_name="日本語" description="Anvil! language file.">

@ -20,8 +20,6 @@
# - # -
# - Increase DRBD's default timeout # - Increase DRBD's default timeout
# - Check for and enable persistent journald logging # - Check for and enable persistent journald logging
# -
# - Record that a machine is configured /etc/anvil/host.is_configred
# #
# NOTE: # NOTE:
# - For later; 'reboot --force --force' immediately kills the OS, like disabling ACPI on EL6 and hitting the # - For later; 'reboot --force --force' immediately kills the OS, like disabling ACPI on EL6 and hitting the

@ -34,7 +34,25 @@ my $anvil = Anvil::Tools->new();
# Read switches (target ([user@]host[:port]) and the file with the target's password. If the password is # Read switches (target ([user@]host[:port]) and the file with the target's password. If the password is
# passed directly, it will be used. Otherwise, the password will be read from the database. # passed directly, it will be used. Otherwise, the password will be read from the database.
$anvil->Get->switches({list => ["anvil", "anvil-name", "anvil-uuid", "ci-test", "driver-disc", "cpu", "install-media", "machine", "name", "options", "os", "pre-test", "uuid", "ram", "storage-group", "storage-size", "use-image"], man => $THIS_FILE}); $anvil->Get->switches({list => [
"anvil",
"anvil-name",
"anvil-uuid",
"ci-test",
"driver-disc",
"cpu",
"install-media",
"machine",
"name",
"network",
"options",
"os",
"pre-test",
"uuid",
"ram",
"storage-group",
"storage-size",
"use-image"], man => $THIS_FILE});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => $anvil->data->{switches}}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => $anvil->data->{switches}});
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0115", variables => { program => $THIS_FILE }}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0115", variables => { program => $THIS_FILE }});
@ -122,8 +140,8 @@ sub run_jobs
if (not $waiting_reported) if (not $waiting_reported)
{ {
$anvil->Job->update_progress({ $anvil->Job->update_progress({
progress => 5, progress => 5,
message => "job_0275", message => "job_0275",
}); });
$waiting_reported = 1; $waiting_reported = 1;
} }
@ -138,8 +156,8 @@ sub run_jobs
# We're ready! # We're ready!
$waiting = 0; $waiting = 0;
$anvil->Job->update_progress({ $anvil->Job->update_progress({
progress => 8, progress => 8,
message => "job_0276", message => "job_0276",
}); });
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "job_0276"}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "job_0276"});
} }
@ -147,8 +165,8 @@ sub run_jobs
{ {
# Cluster is coming up, but it's not up yet. # Cluster is coming up, but it's not up yet.
$anvil->Job->update_progress({ $anvil->Job->update_progress({
progress => 6, progress => 6,
message => "job_0278", message => "job_0278",
}); });
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "job_0278"}); $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 1, key => "job_0278"});
} }
@ -1345,6 +1363,27 @@ sub parse_job_data
$anvil->data->{job}{os} =~ s/\s+?//; $anvil->data->{job}{os} =~ s/\s+?//;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'job::os' => $anvil->data->{job}{os} }}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'job::os' => $anvil->data->{job}{os} }});
} }
if ($line =~ /network=(.*)$/)
{
$anvil->data->{job}{network}{raw} = $1;
$anvil->data->{job}{network}{raw} =~ s/^\s+//;
$anvil->data->{job}{network}{raw} =~ s/\s+?//;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'job::network::raw' => $anvil->data->{job}{network}{raw} }});
# Now break up the data, if needed.
my $problem = process_network($anvil, $anvil->data->{job}{network}{raw});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { problem => $problem }});
if ($problem)
{
$anvil->Job->update_progress({
progress => 100,
message => "error_0398,!!network!".$anvil->data->{job}{network}{raw}."!!",
job_status => "failed",
});
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, 'print' => 1, level => 0, priority => 'err', key => "error_0398", variables => { job_uuid => $anvil->data->{job}{network}{raw} }});
$anvil->nice_exit({exit_code => 1});
}
}
} }
# We need a server name and storage group UUID regardless of which mode we're in. # We need a server name and storage group UUID regardless of which mode we're in.
@ -1521,6 +1560,7 @@ sub parse_job_data
}}); }});
$anvil->nice_exit({exit_code => 1}); $anvil->nice_exit({exit_code => 1});
} }
# Driver disc is optional. # Driver disc is optional.
$anvil->data->{new_server}{driver_iso_path} = ""; $anvil->data->{new_server}{driver_iso_path} = "";
if (($anvil->data->{job}{driver_iso_uuid}) && ($anvil->data->{job}{driver_iso_uuid} ne "none")) if (($anvil->data->{job}{driver_iso_uuid}) && ($anvil->data->{job}{driver_iso_uuid} ne "none"))
@ -1567,6 +1607,90 @@ sub parse_job_data
return(0); return(0);
} }
sub process_network
{
my ($anvil, $string) = @_;
my $problem = 0;
my $anvil_uuid = $anvil->data->{new_server}{anvil_uuid};
my $anvil_name = $anvil->data->{new_server}{anvil_name};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
anvil_uuid => $anvil_uuid,
anvil_name => $anvil_name,
}});
$anvil->data->{job}{network}{bridge} = "";
$anvil->data->{job}{network}{mac} = "";
$anvil->data->{job}{network}{model} = "";
if (($string =~ /bridge=(.*?),/) or ($string =~ /bridge=(.*?)$/))
{
my $bridge_name = $1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { bridge_name => $bridge_name }});
# Make sure the bridge is valid.
if ((exists $anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}) && ($anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_nodes}))
{
$anvil->data->{job}{network}{bridge} = $bridge_name;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'job::network::bridge' => $anvil->data->{job}{network}{bridge} }});
}
else
{
print "The requested bridge: [".$bridge_name."] is not valid.\n";
print "Valid bridges on the Anvil! node: [".$anvil_name."] are:'\n";
foreach my $bridge_name (sort {$a cmp $b} keys %{$anvil->data->{anvil_resources}{$anvil_uuid}{bridges}})
{
next if $anvil->data->{anvil_resources}{$anvil_uuid}{bridges}{$bridge_name}{on_nodes};
print "- ".$bridge_name."\n";
}
$problem = 1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { problem => $problem }});
}
}
if (($string =~ /mac=(.*?),/) or ($string =~ /mac=(.*?)$/))
{
my $mac_address = $1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { mac_address => $mac_address }});
# Validate it
if (not $anvil->Validate->mac({mac => $mac_address}))
{
print "The requested MAC address: [".$mac_address."] does not appear to be valid.\n";
$problem = 1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { problem => $problem }});
}
else
{
$anvil->data->{job}{network}{mac} = $mac_address;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'job::network::mac' => $anvil->data->{job}{network}{mac} }});
}
}
if (($string =~ /model=(.*?),/) or ($string =~ /model=(.*?)$/))
{
my $model = $1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { model => $model }});
$anvil->Get->virsh_list_net({debug => 2});
if (exists $anvil->data->{osinfo}{net}{$model})
{
$anvil->data->{job}{network}{model} = $model;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { 'job::network::model' => $anvil->data->{job}{network}{model} }});
}
else
{
print "The requested network model: [".$model."] does not appear to be valid.\n";
print "Valid network models are:\n";
foreach my $model (sort {$a cmp $b} keys %{$anvil->data->{osinfo}{net}})
{
print "- ".$model." (".$anvil->data->{osinfo}{net}{$model}{vendor}." - ".$anvil->data->{osinfo}{net}{$model}{product}.")\n";
}
$problem = 1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { problem => $problem }});
}
}
return($problem);
}
sub check_anvil sub check_anvil
{ {
my ($anvil) = @_; my ($anvil) = @_;
@ -1926,20 +2050,10 @@ sub interactive_ask_server_cpu
}})."\n"; }})."\n";
my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid}; my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid};
my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid}; my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid};
my $dr1_host_uuid = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_dr1_host_uuid} : "";
print $anvil->Words->string({key => "job_0163", variables => { core => 1, model => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{cpu}{model} }})."\n"; print $anvil->Words->string({key => "job_0163", variables => { core => 1, model => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{cpu}{model} }})."\n";
print $anvil->Words->string({key => "job_0163", variables => { core => 2, model => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node2_host_uuid}{cpu}{model} }})."\n"; print $anvil->Words->string({key => "job_0163", variables => { core => 2, model => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node2_host_uuid}{cpu}{model} }})."\n";
if ($anvil->data->{anvil_resources}{$anvil_uuid}{has_dr})
{
print $anvil->Words->string({key => "job_0164", variables => {
model => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{cpu}{model},
cores => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$dr1_host_uuid}{cpu}{cores},
threads => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$dr1_host_uuid}{cpu}{threads},
}})."\n";
}
print $terminal->Tgoto('cm', 0, 4)."? "; print $terminal->Tgoto('cm', 0, 4)."? ";
my $answer = <STDIN>; my $answer = <STDIN>;
chomp $answer; chomp $answer;
@ -2021,12 +2135,6 @@ sub interactive_ask_server_ram
ram_node1 => $anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{ram}{hardware}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{ram}{hardware}, unit => "M"}).")", ram_node1 => $anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{ram}{hardware}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node1_host_uuid}{ram}{hardware}, unit => "M"}).")",
ram_node2 => $anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node2_host_uuid}{ram}{hardware}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node2_host_uuid}{ram}{hardware}, unit => "M"}).")", ram_node2 => $anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node2_host_uuid}{ram}{hardware}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$node2_host_uuid}{ram}{hardware}, unit => "M"}).")",
}})."\n"; }})."\n";
if ($anvil->data->{anvil_resources}{$anvil_uuid}{has_dr})
{
print $anvil->Words->string({key => "job_0168", variables => {
ram_available => $anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$dr1_host_uuid}{ram}{hardware}})." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $anvil->data->{anvil_resources}{$anvil_uuid}{host_uuid}{$dr1_host_uuid}{ram}{hardware}, unit => "M"}).")",
}})."\n";
}
print $terminal->Tgoto('cm', 0, 5)."? "; print $terminal->Tgoto('cm', 0, 5)."? ";
my $answer = <STDIN>; my $answer = <STDIN>;
@ -2095,15 +2203,11 @@ sub interactive_ask_server_storage_group
my $storage_group_uuid = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group_name}{$storage_group_name}{storage_group_uuid}; 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 $vg_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size};
my $vg_free = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}; my $vg_free = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size};
my $dr_size = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr} : 0;
my $dr_free = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr} : 0;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
's1:storage_group_name' => $storage_group_name, 's1:storage_group_name' => $storage_group_name,
's2:storage_group_uuid' => $storage_group_uuid, 's2:storage_group_uuid' => $storage_group_uuid,
's3:vg_size' => $vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")", 's3:vg_size' => $vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")",
's4:vg_free' => $vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}).")", 's4:vg_free' => $vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}).")",
's5:dr_size' => $dr_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr_size}).")",
's6:dr_free' => $dr_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr_free}).")",
}}); }});
if ($anvil->data->{switches}{'storage-group'}) if ($anvil->data->{switches}{'storage-group'})
@ -2119,8 +2223,6 @@ sub interactive_ask_server_storage_group
$show_list .= $anvil->Words->string({key => "job_0169", variables => { $show_list .= $anvil->Words->string({key => "job_0169", variables => {
vg_free => $anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}), vg_free => $anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}),
vg_size => $anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}), vg_size => $anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}),
dr_free => $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->Convert->bytes_to_human_readable({'bytes' => $dr_free}) : "--",
dr_size => $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->Convert->bytes_to_human_readable({'bytes' => $dr_size}) : "--",
}})."\n"; }})."\n";
} }
@ -2144,7 +2246,6 @@ sub interactive_ask_server_storage_group
} }
my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid}; my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid};
my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid}; my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid};
my $dr1_host_uuid = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_dr1_host_uuid} : "";
print $anvil->Words->string({key => "job_0171"})."\n"; print $anvil->Words->string({key => "job_0171"})."\n";
print $show_list."\n"; print $show_list."\n";
@ -2188,16 +2289,12 @@ sub interactive_ask_server_storage_size
my $storage_group_name = $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{group_name}; my $storage_group_name = $anvil->data->{storage_groups}{anvil_uuid}{$anvil_uuid}{storage_group_uuid}{$storage_group_uuid}{group_name};
my $vg_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size}; my $vg_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size};
my $vg_free = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}; my $vg_free = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size};
my $dr_size = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr} : 0;
my $dr_free = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr} : 0;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
's1:anvil_uuid' => $anvil_uuid, 's1:anvil_uuid' => $anvil_uuid,
's2:storage_group_name' => $storage_group_name, 's2:storage_group_name' => $storage_group_name,
's3:storage_group_uuid' => $storage_group_uuid, 's3:storage_group_uuid' => $storage_group_uuid,
's4:vg_size' => $vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")", 's4:vg_size' => $vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")",
's5:vg_free' => $vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}).")", 's5:vg_free' => $vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}).")",
's6:dr_size' => $dr_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr_size}).")",
's7:dr_free' => $dr_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr_free}).")",
}}); }});
$anvil->Database->get_anvils(); $anvil->Database->get_anvils();
@ -2206,13 +2303,9 @@ sub interactive_ask_server_storage_size
$vg_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size}; $vg_size = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size};
$vg_free = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size}; $vg_free = $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{free_size};
$dr_size = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{vg_size_on_dr} : 0;
$dr_free = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvil_resources}{$anvil_uuid}{storage_group}{$storage_group_uuid}{available_on_dr} : 0;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
's1:vg_size' => $vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")", 's1:vg_size' => $vg_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_size}).")",
's2:vg_free' => $vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}).")", 's2:vg_free' => $vg_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $vg_free}).")",
's3:dr_size' => $dr_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr_size}).")",
's4:dr_free' => $dr_free." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $dr_free}).")",
}}); }});
# I need a list of Storage groups, # I need a list of Storage groups,
@ -2255,7 +2348,6 @@ sub interactive_ask_server_storage_size
} }
my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid}; my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid};
my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid}; my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid};
my $dr1_host_uuid = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_dr1_host_uuid} : "";
print $anvil->Words->string({key => "job_0175", variables => { print $anvil->Words->string({key => "job_0175", variables => {
storage_group => $say_storage_group, storage_group => $say_storage_group,
@ -2265,10 +2357,12 @@ sub interactive_ask_server_storage_size
print $terminal->Tgoto('cm', 0, 7)."? "; print $terminal->Tgoto('cm', 0, 7)."? ";
my $answer = <STDIN>; my $answer = <STDIN>;
chomp $answer; chomp $answer;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }});
if ($answer eq "") if (($answer eq "") or ($answer eq "100%"))
{ {
$answer = $default_storage_size; $answer = $default_storage_size;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer => $answer }});
} }
if ($answer) if ($answer)
{ {
@ -2279,6 +2373,28 @@ sub interactive_ask_server_storage_size
}); });
# Make sure they've asked for at least 10 MiB # Make sure they've asked for at least 10 MiB
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer_bytes => $answer_bytes }}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { answer_bytes => $answer_bytes }});
# If the answer is within 1GiB set it to the available space.
if ($answer_bytes =~ /^\d+$/)
{
my $difference = $answer_bytes - $vg_free;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { difference => $difference }});
$difference =~ s/^-//;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
difference => $difference." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $difference}).")",
}});
if ($difference < (2**30))
{
# Close enough.
$answer_bytes = $vg_free;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
answer_bytes => $answer_bytes." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $answer_bytes}).")",
}});
}
}
if (($answer_bytes eq "!!error!!") or if (($answer_bytes eq "!!error!!") or
(not $answer_bytes) or (not $answer_bytes) or
($answer_bytes < (10*(2**20))) or ($answer_bytes < (10*(2**20))) or
@ -2372,7 +2488,6 @@ sub interactive_ask_server_install_media
} }
my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid}; my $node1_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node1_host_uuid};
my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid}; my $node2_host_uuid = $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_node2_host_uuid};
my $dr1_host_uuid = $anvil->data->{anvil_resources}{$anvil_uuid}{has_dr} ? $anvil->data->{anvils}{anvil_uuid}{$anvil_uuid}{anvil_dr1_host_uuid} : "";
print $anvil->Words->string({key => "job_0178"})."\n"; print $anvil->Words->string({key => "job_0178"})."\n";
print $iso_list."\n"; print $iso_list."\n";
@ -2508,23 +2623,33 @@ sub interactive_ask_server_os
my $language = $anvil->Words->language; my $language = $anvil->Words->language;
my $os_list = ""; my $os_list = "";
my $default_os = $anvil->data->{switches}{os} ? $anvil->data->{switches}{os} : ""; my $default_os = $anvil->data->{switches}{os} ? $anvil->data->{switches}{os} : "";
my $longest_os = 0;
foreach my $os_code (split/,/, $anvil->data->{sys}{servers}{os_short_list}) foreach my $os_code (split/,/, $anvil->data->{sys}{servers}{os_short_list})
{ {
$os_code =~ s/ //g; $os_code =~ s/ //g;
my $os_key = "os_list_".$os_code;
my $os_name = $anvil->Words->string({key => $os_key}); next if not exists $anvil->data->{osinfo}{'os-list'}{$os_code};
if ($os_name =~ /#!not_found/) if (length($os_code) > $longest_os)
{ {
# Skip it. $longest_os = length($os_code);
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { longest_os => $longest_os }});
} }
}
$anvil->Get->virsh_list_os({debug => 2});
foreach my $os_code (split/,/, $anvil->data->{sys}{servers}{os_short_list})
{
$os_code =~ s/ //g;
next if not exists $anvil->data->{osinfo}{'os-list'}{$os_code};
my $os_name = $anvil->data->{osinfo}{'os-list'}{$os_code}{name};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
's1:os_code' => $os_code, 's1:os_code' => $os_code,
's2:os_key' => $os_key,
's2:os_name' => $os_name, 's2:os_name' => $os_name,
}}); }});
# Still here? # Still here?
$os_list .= " - ".sprintf("%-10s", $os_code)." - ".$os_name."\n"; $os_list .= " - ".sprintf("%-${longest_os}s", $os_code)." - ".$os_name."\n";
} }
my $retry = 0; my $retry = 0;
@ -2573,11 +2698,14 @@ sub interactive_ask_server_os
if ($answer) if ($answer)
{ {
# Is this valid? # Is this valid?
my $os_key = "os_list_".$answer; if (exists $anvil->data->{osinfo}{'os-list'}{$answer})
$os_name = $anvil->Words->string({key => $os_key}); {
$os_name = $anvil->data->{osinfo}{'os-list'}{$answer}{name};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { os_name => $os_name }});
}
} }
if ((not $answer) or ($os_name =~ /#!not_found/)) if ((not $answer) or ($os_name eq ""))
{ {
# invalid. # invalid.
$retry = 1; $retry = 1;
@ -2921,6 +3049,15 @@ sub interactive_ask_server_confirm
} }
$anvil->nice_exit({exit_code => 0}); $anvil->nice_exit({exit_code => 0});
} }
### TODO: Better sanity check this
# If we were passed network info, validate it.
if ($anvil->data->{switches}{network})
{
$problem = process_network($anvil, $anvil->data->{switches}{network});
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { problem => $problem }});
}
if ($problem) if ($problem)
{ {
$anvil->nice_exit({exit_code => 1}); $anvil->nice_exit({exit_code => 1});

Loading…
Cancel
Save