diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/PVE/Network/SDN.pm | 18 | ||||
| -rw-r--r-- | src/PVE/Network/SDN/Fabrics.pm | 15 | ||||
| -rw-r--r-- | src/PVE/Network/SDN/Frr.pm | 64 |
3 files changed, 96 insertions, 1 deletions
diff --git a/src/PVE/Network/SDN.pm b/src/PVE/Network/SDN.pm index b321013..bd6f7a2 100644 --- a/src/PVE/Network/SDN.pm +++ b/src/PVE/Network/SDN.pm @@ -293,16 +293,32 @@ sub generate_frr_raw_config { return $raw_config; } +=head3 get_frr_daemon_status(\%fabric_config) + +Returns a hash that indicates which FRR daemons, that are managed by SDN, should +be enabled / disabled. + +=cut + +sub get_frr_daemon_status { + my ($fabric_config) = @_; + + return PVE::Network::SDN::Fabrics::get_frr_daemon_status($fabric_config); +} + sub generate_frr_config { my ($apply) = @_; my $running_config = PVE::Network::SDN::running_config(); my $fabric_config = PVE::Network::SDN::Fabrics::config(1); + my $daemon_status = PVE::Network::SDN::get_frr_daemon_status($fabric_config); + my $needs_restart = PVE::Network::SDN::Frr::set_daemon_status($daemon_status, 1); + my $raw_config = PVE::Network::SDN::generate_frr_raw_config($running_config, $fabric_config); PVE::Network::SDN::Frr::write_raw_config($raw_config); - PVE::Network::SDN::Frr::apply() if $apply; + PVE::Network::SDN::Frr::apply($needs_restart) if $apply; } sub generate_dhcp_config { diff --git a/src/PVE/Network/SDN/Fabrics.pm b/src/PVE/Network/SDN/Fabrics.pm index e5e3428..94f4e97 100644 --- a/src/PVE/Network/SDN/Fabrics.pm +++ b/src/PVE/Network/SDN/Fabrics.pm @@ -44,6 +44,21 @@ sub write_config { cfs_write_file("sdn/fabrics.cfg", $config->to_raw(), 1); } +sub get_frr_daemon_status { + my ($fabric_config) = @_; + + my $daemon_status = {}; + my $nodename = PVE::INotify::nodename(); + + my $enabled_daemons = $fabric_config->enabled_daemons($nodename); + + for my $daemon (@$enabled_daemons) { + $daemon_status->{$daemon} = 1; + } + + return $daemon_status; +} + sub generate_frr_raw_config { my ($fabric_config) = @_; diff --git a/src/PVE/Network/SDN/Frr.pm b/src/PVE/Network/SDN/Frr.pm index 2698928..62a71e5 100644 --- a/src/PVE/Network/SDN/Frr.pm +++ b/src/PVE/Network/SDN/Frr.pm @@ -109,6 +109,70 @@ sub restart { run_command(['systemctl', 'restart', 'frr'], errfunc => $err); } +my $SDN_DAEMONS_DEFAULT = { + ospfd => 0, + fabricd => 0, +}; + +=head3 set_daemon_status(\%daemons, $set_default) + +Sets the status of all daemons supplied in C<\%daemons>. This only works for +daemons managed by SDN, as indicated in the C<$SDN_DAEMONS_DEFAULT> constant. If +a daemon is supplied that isn't managed by SDN then this command will fail. If +C<$set_default> is set, then additionally all sdn-managed daemons that are +missing in C<\%daemons> are reset to their default value. It returns whether the +status of any daemons has changed, which indicates that a restart of the daemon +is required, rather than only a reload. + +=cut + +sub set_daemon_status { + my ($daemon_status, $set_default) = @_; + + my $daemons_file = "/etc/frr/daemons"; + die "daemons file does not exist" if !-e $daemons_file; + + for my $daemon (keys %$daemon_status) { + die "$daemon is not SDN managed" if !defined $SDN_DAEMONS_DEFAULT->{$daemon}; + } + + if ($set_default) { + for my $daemon (keys %$SDN_DAEMONS_DEFAULT) { + $daemon_status->{$daemon} = $SDN_DAEMONS_DEFAULT->{$daemon} + if !defined($daemon_status->{$daemon}); + } + } + + my $old_config = PVE::Tools::file_get_contents($daemons_file); + my $new_config = ""; + + my $changed = 0; + + my @lines = split(/\n/, $old_config); + + for my $line (@lines) { + if ($line =~ m/^([a-z_]+)=/) { + my $key = $1; + my $status = $daemon_status->{$key}; + + if (defined $status) { + my $value = $status ? "yes" : "no"; + my $new_line = "$key=$value"; + + $changed = 1 if $new_line ne $line; + + $line = $new_line; + } + } + + $new_config .= "$line\n"; + } + + PVE::Tools::file_set_contents($daemons_file, $new_config); + + return $changed; +} + =head3 to_raw_config(\%frr_config) Converts a given C<\%frr_config> to the raw config format. |
