summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/PVE/Network/SDN.pm18
-rw-r--r--src/PVE/Network/SDN/Fabrics.pm15
-rw-r--r--src/PVE/Network/SDN/Frr.pm64
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.