|
|
|
#!/usr/bin/perl
|
|
|
|
#
|
|
|
|
# This is called when the local network needs to be reconfigured.
|
|
|
|
#
|
|
|
|
# Exit codes;
|
|
|
|
# 0 = Normal exit.
|
|
|
|
#
|
|
|
|
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use Data::Dumper;
|
|
|
|
use Anvil::Tools;
|
|
|
|
|
|
|
|
my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0];
|
|
|
|
my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0];
|
|
|
|
if (($running_directory =~ /^\./) && ($ENV{PWD}))
|
|
|
|
{
|
|
|
|
$running_directory =~ s/^\./$ENV{PWD}/;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Turn off buffering so that the pinwheel will display while waiting for the SSH call(s) to complete.
|
|
|
|
$| = 1;
|
|
|
|
|
|
|
|
my $anvil = Anvil::Tools->new();
|
|
|
|
$anvil->Log->level({set => 2});
|
|
|
|
$anvil->Log->secure({set => 0});
|
|
|
|
|
|
|
|
# Read switches
|
|
|
|
$anvil->Get->switches;
|
|
|
|
|
|
|
|
# Paths
|
|
|
|
$anvil->Storage->read_config({file => $anvil->data->{path}{config}{'anvil.conf'}});
|
|
|
|
|
|
|
|
# Connect
|
|
|
|
my $connections = $anvil->Database->connect({
|
|
|
|
sql_file => $anvil->data->{sys}{database}{schema},
|
|
|
|
test_table => "network_interfaces",
|
|
|
|
});
|
|
|
|
|
|
|
|
print $THIS_FILE." ".__LINE__."; connections: [".$connections."]\n";
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 3, key => "log_0132", variables => { connections => $connections }});
|
|
|
|
if (not $connections)
|
|
|
|
{
|
|
|
|
# No databases, exit.
|
|
|
|
print $anvil->Words->string({key => "striker_error_0003"});
|
|
|
|
$anvil->nice_exit({exit_code => 2});
|
|
|
|
}
|
|
|
|
|
|
|
|
pickup_job_details($anvil);
|
|
|
|
|
|
|
|
reconfigure_network($anvil);
|
|
|
|
|
|
|
|
$anvil->nice_exit({code => 0});
|
|
|
|
|
|
|
|
#############################################################################################################
|
|
|
|
# Functions #
|
|
|
|
#############################################################################################################
|
|
|
|
|
|
|
|
# This does the work of reconfiguring the network
|
|
|
|
sub reconfigure_network
|
|
|
|
{
|
|
|
|
my ($anvil) = @_;
|
|
|
|
|
|
|
|
my $prefix = $anvil->data->{variables}{form}{config_step1}{prefix}{value};
|
|
|
|
my $sequence = $anvil->data->{variables}{form}{config_step1}{sequence}{value};
|
|
|
|
my $domain = $anvil->data->{variables}{form}{config_step1}{domain}{value};
|
|
|
|
my $organization = $anvil->data->{variables}{form}{config_step1}{organization}{value};
|
|
|
|
my $bcn_count = 1; # TODO: This should be coming from the form, even though it's only '1' for now.
|
|
|
|
my $ifn_count = $anvil->data->{variables}{form}{config_step1}{ifn_count}{value};
|
|
|
|
my $new_hostname = $prefix."-striker".sprintf("%02d", $sequence).".".$domain;
|
|
|
|
my $pretty_hostname = $organization." - Striker ".sprintf("%02d", $sequence);
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
|
|
prefix => $prefix,
|
|
|
|
sequence => $sequence,
|
|
|
|
domain => $domain,
|
|
|
|
organization => $organization,
|
|
|
|
bcn_count => $bcn_count,
|
|
|
|
ifn_count => $ifn_count,
|
|
|
|
new_hostname => $new_hostname,
|
|
|
|
pretty_hostname => $pretty_hostname,
|
|
|
|
}});
|
|
|
|
|
|
|
|
# Set the hostname
|
|
|
|
my $hostnam = $anvil->System->hostname({set => $new_hostname, pretty => $pretty_hostname, debug => 2});
|
|
|
|
if ($hostname eq $new_hostname)
|
|
|
|
{
|
|
|
|
# Success
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
# Failed
|
|
|
|
}
|
|
|
|
=cut
|
|
|
|
print Dumper $anvil->data->{variables};
|
|
|
|
|
|
|
|
$VAR1 = {
|
|
|
|
'form' => {
|
|
|
|
'config_step2' => {
|
|
|
|
'bcn1_subnet' => {
|
|
|
|
'value' => '255.255.0.0'
|
|
|
|
},
|
|
|
|
'ifn1_iface1_mac' => {
|
|
|
|
'value' => '52:54:00:dd:ad:8a'
|
|
|
|
},
|
|
|
|
'dns' => {
|
|
|
|
'value' => '8.8.8.8, 8.8.4.4'
|
|
|
|
},
|
|
|
|
'gateway' => {
|
|
|
|
'value' => '192.168.122.1'
|
|
|
|
},
|
|
|
|
'bcn1_iface1_mac' => {
|
|
|
|
'value' => '52:54:00:6b:35:bc'
|
|
|
|
},
|
|
|
|
'striker_password' => {
|
|
|
|
'value' => 'super secret password'
|
|
|
|
},
|
|
|
|
'hostname' => {
|
|
|
|
'value' => 'an-striker01.alteeve.com'
|
|
|
|
},
|
|
|
|
'gateway_interface' => {
|
|
|
|
'value' => 'ifn1'
|
|
|
|
},
|
|
|
|
'ifn1_subnet' => {
|
|
|
|
'value' => '255.255.0.0'
|
|
|
|
},
|
|
|
|
'ifn1_ip' => {
|
|
|
|
'value' => '192.168.122.201'
|
|
|
|
},
|
|
|
|
'bcn1_ip' => {
|
|
|
|
'value' => '10.1.4.1'
|
|
|
|
},
|
|
|
|
'bcn1_iface2_mac' => {
|
|
|
|
'value' => '52:54:00:5d:5d:3d'
|
|
|
|
},
|
|
|
|
'ifn1_iface2_mac' => {
|
|
|
|
'value' => '52:54:00:1e:36:03'
|
|
|
|
},
|
|
|
|
'striker_user' => {
|
|
|
|
'value' => 'striker'
|
|
|
|
}
|
|
|
|
},
|
|
|
|
};
|
|
|
|
=cut
|
|
|
|
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
# This will pick up the job, or exit.
|
|
|
|
sub pickup_job_details
|
|
|
|
{
|
|
|
|
my ($anvil) = @_;
|
|
|
|
|
|
|
|
# If any job said it was picked up, and the "job_picked_up_by" PID doesn't exist, take it and update
|
|
|
|
# it.
|
|
|
|
|
|
|
|
my $query = "
|
|
|
|
SELECT
|
|
|
|
job_uuid,
|
|
|
|
job_command,
|
|
|
|
job_data,
|
|
|
|
job_picked_up_by,
|
|
|
|
job_picked_up_at,
|
|
|
|
job_updated,
|
|
|
|
job_progress
|
|
|
|
FROM
|
|
|
|
jobs
|
|
|
|
WHERE
|
|
|
|
job_name = 'configure::network'
|
|
|
|
AND
|
|
|
|
job_progress != 100
|
|
|
|
AND
|
|
|
|
job_host_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($anvil->Get->host_uuid)."
|
|
|
|
LIMIT 1;";
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
|
|
|
|
|
|
|
my $results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
|
|
|
|
my $count = @{$results};
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
|
|
results => $results,
|
|
|
|
count => $count,
|
|
|
|
}});
|
|
|
|
my $job_uuid = $results->[0]->[0];
|
|
|
|
my $job_command = $results->[0]->[1];
|
|
|
|
my $job_data = defined $results->[0]->[2] ? $results->[0]->[2] : "";
|
|
|
|
my $job_picked_up_by = $results->[0]->[3];
|
|
|
|
my $job_picked_up_at = $results->[0]->[4];
|
|
|
|
my $job_updated = $results->[0]->[5];
|
|
|
|
my $job_progress = $results->[0]->[6];
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => {
|
|
|
|
job_uuid => $job_uuid,
|
|
|
|
job_command => $job_command,
|
|
|
|
job_data => $job_data,
|
|
|
|
job_picked_up_by => $job_picked_up_by,
|
|
|
|
job_picked_up_at => $job_picked_up_at,
|
|
|
|
job_updated => $job_updated,
|
|
|
|
job_progress => $job_progress,
|
|
|
|
}});
|
|
|
|
|
|
|
|
# See if the job was picked up by another running instance.
|
|
|
|
if ($job_picked_up_by)
|
|
|
|
{
|
|
|
|
# Check if the PID is still active.
|
|
|
|
$anvil->System->pids({ignore_me => 1});
|
|
|
|
|
|
|
|
# Is the PID that picked up the job still alive?
|
|
|
|
if (exists $anvil->{pids}{$job_picked_up_by})
|
|
|
|
{
|
|
|
|
print Dumper $anvil->{pids}{$job_picked_up_by};
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0146", variables => { pid => $job_picked_up_by }});
|
|
|
|
$anvil->nice_exit({code => 1});
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
# The previous job is gone, we'll take this over.
|
|
|
|
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0147", variables => {
|
|
|
|
pid => $job_picked_up_by,
|
|
|
|
percent => $job_progress,
|
|
|
|
}});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# This will store the variables from the database
|
|
|
|
$anvil->data->{variables} = {};
|
|
|
|
|
|
|
|
# If we're still alive, pick up the details.
|
|
|
|
$results = "";
|
|
|
|
$count = "";
|
|
|
|
$query = "
|
|
|
|
SELECT
|
|
|
|
variable_name,
|
|
|
|
variable_value
|
|
|
|
FROM
|
|
|
|
variables
|
|
|
|
WHERE
|
|
|
|
variable_name
|
|
|
|
LIKE
|
|
|
|
'form::config_step%'
|
|
|
|
AND
|
|
|
|
variable_source_table = 'hosts'
|
|
|
|
AND
|
|
|
|
variable_source_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($anvil->Get->host_uuid)."
|
|
|
|
;";
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
|
|
|
|
|
|
|
$results = $anvil->Database->query({query => $query, source => $THIS_FILE, line => __LINE__});
|
|
|
|
$count = @{$results};
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => {
|
|
|
|
results => $results,
|
|
|
|
count => $count,
|
|
|
|
}});
|
|
|
|
foreach my $row (@{$results})
|
|
|
|
{
|
|
|
|
my $this_variable = $row->[0];
|
|
|
|
my $this_value = defined $row->[1] ? $row->[1] : "";
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 3, list => {
|
|
|
|
this_variable => $this_variable,
|
|
|
|
this_value => $this_value,
|
|
|
|
}});
|
|
|
|
|
|
|
|
$anvil->_make_hash_reference($anvil->data->{variables}, $this_variable, $this_value);
|
|
|
|
}
|
|
|
|
|
|
|
|
# Record that we've picked up this job.
|
|
|
|
$query = "UPDATE jobs SET job_picked_up_by = ".$$.", job_progress = 1, job_picked_up_at = ".time." WHERE job_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($job_uuid).";";
|
|
|
|
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { query => $query }});
|
|
|
|
|
|
|
|
$anvil->Database->write({query => $query, source => $THIS_FILE, line => __LINE__});
|
|
|
|
|
|
|
|
return(0);
|
|
|
|
}
|