* Added Database->insert_or_update_bridges() and finished Database->insert_or_update_bonds (both need testing still).

Signed-off-by: Digimer <digimer@alteeve.ca>
main
Digimer 7 years ago
parent d6c94e9d28
commit 66f280c9a7
  1. 264
      Anvil/Tools/Database.pm

@ -22,6 +22,7 @@ my $THIS_FILE = "Database.pm";
# get_hosts
# get_local_uuid
# initialize
# insert_or_update_bridges
# insert_or_update_bonds
# insert_or_update_hosts
# insert_or_update_ip_addresses
@ -1387,6 +1388,225 @@ sub initialize
return($success);
};
=head2 insert_or_update_bridges
This updates (or inserts) a record in the 'bridges' table. The C<< bridge_uuid >> referencing the database row will be returned.
If there is an error, an empty string is returned.
Parameters;
=head3 uuid (optional)
If set, only the corresponding database will be written to.
=head3 file (optional)
If set, this is the file name logged as the source of any INSERTs or UPDATEs.
=head3 line (optional)
If set, this is the file line number logged as the source of any INSERTs or UPDATEs.
=head2 bridge_uuid (optional)
If not passed, a check will be made to see if an existing entry is found for C<< bridge_name >>. If found, that entry will be updated. If not found, a new record will be inserted.
=head2 bridge_host_uuid (optional)
This is the host that the IP address is on. If not passed, the local C<< sys::host_uuid >> will be used (indicating it is a local IP address).
=head2 bridge_name (required)
This is the bridge's device name.
=head2 bridge_id (optional)
This is the unique identifier for the bridge.
=head2 bridge_stp_enabled (optional)
This is set to C<< yes >> or C<< no >> to indicate if spanning tree protocol is enabled on the switch.
=cut
sub insert_or_update_bridges
{
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 => "Database->insert_or_update_bridges()" }});
my $uuid = defined $parameter->{uuid} ? $parameter->{uuid} : "";
my $file = defined $parameter->{file} ? $parameter->{file} : "";
my $line = defined $parameter->{line} ? $parameter->{line} : "";
my $bridge_uuid = defined $parameter->{bridge_uuid} ? $parameter->{bridge_uuid} : "";
my $bridge_host_uuid = defined $parameter->{bridge_host_uuid} ? $parameter->{bridge_host_uuid} : $anvil->data->{sys}{host_uuid};
my $bridge_name = defined $parameter->{bridge_name} ? $parameter->{bridge_name} : "";
my $bridge_id = $parameter->{bridge_id} ? $parameter->{bridge_id} : "NULL";
my $bridge_stp_enabled = $parameter->{bridge_stp_enabled} ? $parameter->{bridge_stp_enabled} : "NULL";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
uuid => $uuid,
file => $file,
line => $line,
bridge_uuid => $bridge_uuid,
bridge_host_uuid => $bridge_host_uuid,
bridge_name => $bridge_name,
bridge_id => $bridge_id,
bridge_down_delay => $bridge_down_delay,
}});
if (not $bridge_name)
{
# Throw an error and exit.
$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, priority => "err", key => "log_0020", variables => { method => "Database->insert_or_update_bridges()", parameter => "bridge_name" }});
return("");
}
# If we don't have a UUID, see if we can find one for the given bridge server name.
if (not $bridge_uuid)
{
my $query = "
SELECT
bridge_uuid
FROM
bridges
WHERE
bridge_name = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_name)."
AND
bridge_host_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_host_uuid)."
;";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { query => $query }});
my $results = $anvil->Database->query({query => $query, source => $file ? $file : $THIS_FILE, line => $line ? $line : __LINE__});
my $count = @{$results};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
results => $results,
count => $count,
}});
if ($count)
{
$bridge_uuid = $results->[0]->[0];
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { bridge_uuid => $bridge_uuid }});
}
}
# If I still don't have an bridge_uuid, we're INSERT'ing .
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { bridge_uuid => $bridge_uuid }});
if (not $bridge_uuid)
{
# It's possible that this is called before the host is recorded in the database. So to be
# safe, we'll return without doing anything if there is no host_uuid in the database.
my $hosts = $anvil->Database->get_hosts();
my $found = 0;
foreach my $hash_ref (@{$hosts})
{
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
"hash_ref->{host_uuid}" => $hash_ref->{host_uuid},
"sys::host_uuid" => $anvil->data->{sys}{host_uuid},
}});
if ($hash_ref->{host_uuid} eq $anvil->data->{sys}{host_uuid})
{
$found = 1;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { found => $found }});
}
}
if (not $found)
{
# We're out.
return("");
}
# INSERT
$bridge_uuid = $anvil->Get->uuid();
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { bridge_uuid => $bridge_uuid }});
my $query = "
INSERT INTO
bridges
(
bridge_uuid,
bridge_host_uuid,
bridge_name,
bridge_id,
bridge_stp_enabled,
modified_date
) VALUES (
".$anvil->data->{sys}{use_db_fh}->quote($bridge_uuid).",
".$anvil->data->{sys}{use_db_fh}->quote($bridge_host_uuid).",
".$anvil->data->{sys}{use_db_fh}->quote($bridge_name).",
".$anvil->data->{sys}{use_db_fh}->quote($bridge_id).",
".$anvil->data->{sys}{use_db_fh}->quote($bridge_stp_enabled).",
".$anvil->data->{sys}{use_db_fh}->quote($anvil->data->{sys}{db_timestamp})."
);
";
$query =~ s/'NULL'/NULL/g;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { query => $query }});
$anvil->Database->write({query => $query, source => $file ? $file : $THIS_FILE, line => $line ? $line : __LINE__});
}
else
{
# Query the rest of the values and see if anything changed.
my $query = "
SELECT
bridge_host_uuid,
bridge_name,
bridge_id,
bridge_stp_enabled
FROM
bridges
WHERE
bridge_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_uuid)."
;";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { query => $query }});
my $results = $anvil->Database->query({query => $query, source => $file ? $file : $THIS_FILE, line => $line ? $line : __LINE__});
my $count = @{$results};
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
results => $results,
count => $count,
}});
foreach my $row (@{$results})
{
my $old_bridge_host_uuid = $row->[0];
my $old_bridge_name = $row->[1];
my $old_bridge_id = defined $row->[2] ? $row->[2] : "NULL";
my $old_bridge_stp_enabled = defined $row->[3] ? $row->[3] : "NULL";
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => {
old_bridge_host_uuid => $old_bridge_host_uuid,
old_bridge_name => $old_bridge_name,
old_bridge_id => $old_bridge_id,
old_bridge_stp_enabled => $old_bridge_stp_enabled,
}});
# Anything change?
if (($old_bridge_host_uuid ne $bridge_host_uuid) or
($old_bridge_name ne $bridge_name) or
($old_bridge_id ne $bridge_id) or
($old_bridge_stp_enabled ne $bridge_stp_enabled))
{
# Something changed, save.
my $query = "
UPDATE
bridges
SET
bridge_host_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_host_uuid).",
bridge_name = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_name).",
bridge_id = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_id).",
bridge_stp_enabled = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_stp_enabled).",
modified_date = ".$anvil->data->{sys}{use_db_fh}->quote($anvil->data->{sys}{db_timestamp})."
WHERE
bridge_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bridge_uuid)."
";
$query =~ s/'NULL'/NULL/g;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { query => $query }});
$anvil->Database->write({query => $query, source => $file ? $file : $THIS_FILE, line => $line ? $line : __LINE__});
}
}
}
return($bridge_uuid);
}
=head2 insert_or_update_bonds
@ -1660,39 +1880,43 @@ WHERE
old_bond_down_delay => $old_bond_down_delay,
}});
=cut
# Anything change?
if (($old_bond_host_uuid ne $bond_host_uuid) or
($old_bond_on_type ne $bond_on_type) or
($old_bond_on_uuid ne $bond_on_uuid) or
($old_bond_name ne $bond_name) or
($old_bond_subnet_mask ne $bond_subnet_mask) or
($old_bond_gateway ne $bond_gateway) or
($say_old_bond_default_gateway ne $say_bond_default_gateway) or
($old_bond_dns ne $bond_dns))
if (($old_bond_host_uuid ne $bond_host_uuid) or
($old_bond_name ne $bond_name) or
($old_bond_mode ne $bond_mode) or
($old_bond_mtu ne $bond_mtu) or
($old_bond_primary_slave ne $bond_primary_slave) or
($old_bond_primary_reselect ne $bond_primary_reselect) or
($old_bond_active_slave ne $bond_active_slave) or
($old_bond_mii_status ne $bond_mii_status) or
($old_bond_mii_polling_interval ne $bond_mii_polling_interval) or
($old_bond_up_delay ne $bond_up_delay) or
($old_bond_down_delay ne $bond_down_delay))
{
# Something changed, save.
my $query = "
UPDATE
bonds
SET
bond_host_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bond_host_uuid).",
bond_on_type = ".$anvil->data->{sys}{use_db_fh}->quote($bond_on_type).",
bond_on_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bond_on_uuid).",
bond_name = ".$anvil->data->{sys}{use_db_fh}->quote($bond_name).",
bond_subnet_mask = ".$anvil->data->{sys}{use_db_fh}->quote($bond_subnet_mask).",
bond_gateway = ".$anvil->data->{sys}{use_db_fh}->quote($bond_gateway).",
bond_default_gateway = $say_bond_default_gateway,
bond_dns = ".$anvil->data->{sys}{use_db_fh}->quote($bond_dns).",
modified_date = ".$anvil->data->{sys}{use_db_fh}->quote($anvil->data->{sys}{db_timestamp})."
bond_host_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bond_host_uuid).",
bond_name = ".$anvil->data->{sys}{use_db_fh}->quote($bond_name).",
bond_mode = ".$anvil->data->{sys}{use_db_fh}->quote($bond_mode).",
bond_mtu = ".$anvil->data->{sys}{use_db_fh}->quote($bond_mtu).",
bond_primary_slave = ".$anvil->data->{sys}{use_db_fh}->quote($bond_primary_slave).",
bond_primary_reselect = ".$anvil->data->{sys}{use_db_fh}->quote($bond_primary_reselect).",
bond_active_slave = ".$anvil->data->{sys}{use_db_fh}->quote($bond_active_slave).",
bond_mii_status = ".$anvil->data->{sys}{use_db_fh}->quote($bond_mii_status).",
bond_mii_polling_interval = ".$anvil->data->{sys}{use_db_fh}->quote($bond_mii_polling_interval).",
bond_up_delay = ".$anvil->data->{sys}{use_db_fh}->quote($bond_up_delay).",
bond_down_delay = ".$anvil->data->{sys}{use_db_fh}->quote($bond_down_delay).",
modified_date = ".$anvil->data->{sys}{use_db_fh}->quote($anvil->data->{sys}{db_timestamp})."
WHERE
bond_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bond_uuid)."
bond_uuid = ".$anvil->data->{sys}{use_db_fh}->quote($bond_uuid)."
";
$query =~ s/'NULL'/NULL/g;
$anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => $debug, list => { query => $query }});
$anvil->Database->write({query => $query, source => $file ? $file : $THIS_FILE, line => $line ? $line : __LINE__});
}
=cut
}
}

Loading…
Cancel
Save