diff options
author | Stig Thormodsrud <stig@vyatta.com> | 2009-11-01 10:02:49 -0800 |
---|---|---|
committer | Stig Thormodsrud <stig@vyatta.com> | 2009-11-01 10:02:49 -0800 |
commit | f197d4eebd25f3bcbd0f6b5589ce9370a2f501da (patch) | |
tree | 6fd6fe628f95d4b9f67f54f6b0ac91a7be339e28 | |
parent | 37dbea348afb8d0770767441c30e5ab1e2cea874 (diff) | |
download | vyatta-cfg-quagga-f197d4eebd25f3bcbd0f6b5589ce9370a2f501da.tar.gz vyatta-cfg-quagga-f197d4eebd25f3bcbd0f6b5589ce9370a2f501da.zip |
Convert keepalived to use Interface infrastructure.
-rw-r--r-- | scripts/keepalived/vyatta-clear-vrrp.pl | 65 | ||||
-rwxr-xr-x | scripts/keepalived/vyatta-keepalived.pl | 176 | ||||
-rwxr-xr-x | scripts/keepalived/vyatta-show-vrrp.pl | 24 | ||||
-rwxr-xr-x | scripts/keepalived/vyatta-vrrp-state.pl | 6 |
4 files changed, 84 insertions, 187 deletions
diff --git a/scripts/keepalived/vyatta-clear-vrrp.pl b/scripts/keepalived/vyatta-clear-vrrp.pl index ba5d569b..3a9733ed 100644 --- a/scripts/keepalived/vyatta-clear-vrrp.pl +++ b/scripts/keepalived/vyatta-clear-vrrp.pl @@ -25,6 +25,9 @@ use lib '/opt/vyatta/share/perl5/'; use Vyatta::Keepalived; +use Vyatta::Interface; +use Vyatta::Misc; + use Getopt::Long; use Sys::Syslog qw(:standard :macros); @@ -108,51 +111,23 @@ sub get_vrrp_intf_group { # # return an array of hashes that contains all the intf/group pairs # - - foreach my $type (("ethernet", "bonding")) { - - my $config = new Vyatta::Config; - $config->setLevel("interfaces $type"); - my @eths = $config->listOrigNodes(); - foreach my $eth (@eths) { - my $path = "interfaces $type $eth"; - $config->setLevel($path); - if ($config->existsOrig("vrrp")) { - $path = "$path vrrp vrrp-group"; - $config->setLevel($path); - my @groups = $config->listOrigNodes(); - foreach my $group (@groups) { - my %hash; - $hash{'intf'} = $eth; - $hash{'group'} = $group; - $hash{'path'} = "$path $group"; - push @array, {%hash}; - } - } - - $path = "interfaces $type $eth"; + my $config = new Vyatta::Config; + + foreach my $name ( getInterfaces() ) { + my $intf = new Vyatta::Interface($name); + next unless $intf; + my $path = $intf->path(); + $config->setLevel($path); + if ($config->existsOrig('vrrp')) { + $path = "$path vrrp vrrp-group"; $config->setLevel($path); - if ($config->existsOrig('vif')) { - my $path = "$path vif"; - $config->setLevel($path); - my @vifs = $config->listOrigNodes(); - foreach my $vif (@vifs) { - my $vif_intf = $eth . '.' . $vif; - my $vif_path = "$path $vif"; - $config->setLevel($vif_path); - if ($config->existsOrig('vrrp')) { - $vif_path = "$vif_path vrrp vrrp-group"; - $config->setLevel($vif_path); - my @groups = $config->listOrigNodes(); - foreach my $group (@groups) { - my %hash; - $hash{'intf'} = $vif_intf; - $hash{'group'} = $group; - $hash{'path'} = "$path $group"; - push @array, {%hash}; - } - } - } + my @groups = $config->listOrigNodes(); + foreach my $group (@groups) { + my %hash; + $hash{'intf'} = $name; + $hash{'group'} = $group; + $hash{'path'} = "$path $group"; + push @array, {%hash}; } } } @@ -207,7 +182,7 @@ my $login = getlogin(); # # clear_process # -if ($action eq "clear_process") { +if ($action eq 'clear_process') { syslog('warning', "clear vrrp process requested by $login"); if (Vyatta::Keepalived::is_running()) { print "Restarting VRRP...\n"; diff --git a/scripts/keepalived/vyatta-keepalived.pl b/scripts/keepalived/vyatta-keepalived.pl index 842f8bc3..e87c9f64 100755 --- a/scripts/keepalived/vyatta-keepalived.pl +++ b/scripts/keepalived/vyatta-keepalived.pl @@ -235,65 +235,30 @@ sub vrrp_find_changes { my $config = new Vyatta::Config; my $vrrp_instances = 0; - foreach my $type (("ethernet", "bonding")) { - - $config->setLevel("interfaces $type"); - my @eths = $config->listNodes(); - foreach my $eth (@eths) { - my $path = "interfaces $type $eth"; - $config->setLevel($path); - if ($config->exists("vrrp")) { - my %vrrp_status_hash = $config->listNodeStatus("vrrp"); - my ($vrrp, $vrrp_status) = each(%vrrp_status_hash); - if ($vrrp_status ne "static") { - push @list, $eth; - vrrp_log("$vrrp_status found $eth"); - } - } - if ($config->exists("vif")) { - my $path = "interfaces $type $eth vif"; - $config->setLevel($path); - my @vifs = $config->listNodes(); - foreach my $vif (@vifs) { - my $vif_intf = $eth . "." . $vif; - my $vif_path = "$path $vif"; - $config->setLevel($vif_path); - if ($config->exists("vrrp")) { - my %vrrp_status_hash = $config->listNodeStatus("vrrp"); - my ($vrrp, $vrrp_status) = each(%vrrp_status_hash); - if ($vrrp_status ne "static") { - push @list, "$eth.$vif"; - vrrp_log("$vrrp_status found $eth.$vif"); - } - } - } + foreach my $name ( getInterfaces() ) { + my $intf = new Vyatta::Interface($name); + next unless $intf; + my $path = $intf->path(); + $config->setLevel($path); + if ($config->exists("vrrp")) { + my %vrrp_status_hash = $config->listNodeStatus("vrrp"); + my ($vrrp, $vrrp_status) = each(%vrrp_status_hash); + if ($vrrp_status ne "static") { + push @list, $name; + vrrp_log("$vrrp_status found $name"); } } # # Now look for deleted from the origin tree # - $config->setLevel("interfaces $type"); - @eths = $config->listOrigNodes(); - foreach my $eth (@eths) { - my $path = "interfaces $type $eth"; - $config->setLevel($path); - if ($config->isDeleted("vrrp")) { - push @list, $eth; - vrrp_log("Delete found $eth"); - } - $config->setLevel("$path vif"); - my @vifs = $config->listOrigNodes(); - foreach my $vif (@vifs) { - my $vif_intf = $eth . "." . $vif; - my $vif_path = "$path vif $vif"; - $config->setLevel($vif_path); - if ($config->isDeleted("vrrp")) { - push @list, "$eth.$vif"; - vrrp_log("Delete found $eth.$vif"); - } - } + $config->setLevel($path); + if ($config->isDeleted("vrrp")) { + push @list, $name; + vrrp_log("Delete found $name"); } + + } my $num = scalar(@list); @@ -344,51 +309,28 @@ sub vrrp_update_config { my $config = new Vyatta::Config; my $vrrp_instances = 0; - for my $type (("ethernet", "bonding")) { - - $config->setLevel("interfaces $type"); - my @eths = $config->listNodes(); - foreach my $eth (@eths) { - my $path = "interfaces $type $eth"; - $config->setLevel($path); - if ($config->exists("vrrp")) { - my ($inst_output, @inst_errs) = - keepalived_get_values($eth, $path); - if (scalar(@inst_errs)) { - push @errs, @inst_errs; - } else { - $output .= $inst_output; - $vrrp_instances++; - } + foreach my $name ( getInterfaces() ) { + my $intf = new Vyatta::Interface($name); + next unless $intf; + my $path = $intf->path(); + $config->setLevel($path); + if ($config->exists("vrrp")) { + # + # keepalived gets real grumpy with interfaces that + # don't exist, so skip vlans that haven't been + # instantiated yet (typically occurs at boot up). + # + if (!(-d "/sys/class/net/$name")) { + push @errs, "$name doesn't exist"; + next; } - if ($config->exists("vif")) { - my $path = "interfaces $type $eth vif"; - $config->setLevel($path); - my @vifs = $config->listNodes(); - foreach my $vif (@vifs) { - my $vif_path = "$path $vif"; - $config->setLevel($vif_path); - if ($config->exists("vrrp")) { - # - # keepalived gets real grumpy with interfaces that - # don't exist, so skip vlans that haven't been - # instantiated yet (typically occurs at boot up). - # - my $vif_intf = $eth . "." . $vif; - if (!(-d "/sys/class/net/$vif_intf")) { - push @errs, "vlan doesn't exist $vif_intf"; - next; - } - my ($inst_output, @inst_errs) = - keepalived_get_values($vif_intf, $vif_path); - if (scalar(@inst_errs)) { - push @errs, @inst_errs; - } else { - $output .= $inst_output; - $vrrp_instances++; - } - } - } + my ($inst_output, @inst_errs) = + keepalived_get_values($name, $path); + if (scalar(@inst_errs)) { + push @errs, @inst_errs; + } else { + $output .= $inst_output; + $vrrp_instances++; } } } @@ -415,27 +357,14 @@ sub list_vrrp_intf { my $config = new Vyatta::Config; my @intfs = (); - foreach my $type (("ethernet", "bonding")) { - - $config->setLevel("interfaces $type"); - my @eths = $config->listOrigNodes(); - foreach my $eth (@eths) { - my $path = "interfaces $type $eth"; - $config->setLevel($path); - push @intfs, $eth if $config->existsOrig("vrrp"); - if ($config->existsOrig("vif")) { - my $path = "interfaces $type $eth vif"; - $config->setLevel($path); - my @vifs = $config->listOrigNodes(); - foreach my $vif (@vifs) { - my $vif_intf = $eth . "." . $vif; - my $vif_path = "$path $vif"; - $config->setLevel($vif_path); - push @intfs, $vif_intf if $config->existsOrig("vrrp"); - } - } - } + foreach my $name ( getInterfaces() ) { + my $intf = new Vyatta::Interface($name); + next unless $intf; + my $path = $intf->path(); + $config->setLevel($path); + push @intfs, $name if $config->existsOrig("vrrp"); } + return @intfs; } @@ -443,17 +372,10 @@ sub list_vrrp_group { my ($name) = @_; my $config = new Vyatta::Config; my $path; - if ($name =~ /bond/) { - $path = "interfaces bonding $name"; - if ($name =~ /(bond\d+)\.(\d+)/) { - $path = "interfaces bonding $1 vif $2"; - } - } else { - $path = "interfaces ethernet $name"; - if ($name =~ /(eth\d+)\.(\d+)/) { - $path = "interfaces ethernet $1 vif $2"; - } - } + + my $intf = new Vyatta::Interface($name); + next unless $intf; + $path = $intf->path(); $path .= " vrrp vrrp-group"; $config->setLevel($path); my @groups = $config->listOrigNodes(); diff --git a/scripts/keepalived/vyatta-show-vrrp.pl b/scripts/keepalived/vyatta-show-vrrp.pl index 5ec2e8ad..521abc7f 100755 --- a/scripts/keepalived/vyatta-show-vrrp.pl +++ b/scripts/keepalived/vyatta-show-vrrp.pl @@ -24,6 +24,7 @@ # use lib "/opt/vyatta/share/perl5/"; use Vyatta::Keepalived; +use Vyatta::Interface; use strict; use warnings; @@ -65,23 +66,22 @@ sub elapse_time { } sub get_state_link { - my $intf = shift; + my $intf_name = shift; - my $IFF_UP = 0x1; + my $intf = new Vyatta::Interface($intf_name); + die "Unknown interface [$intf_name]" unless $intf; + my ($state, $link); - my $flags = `cat /sys/class/net/$intf/flags 2> /dev/null`; - my $carrier = `cat /sys/class/net/$intf/carrier 2> /dev/null`; - chomp $flags; chomp $carrier; - my $hex_flags = hex($flags); - if ($hex_flags & $IFF_UP) { - $state = "up"; + if ($intf->up()) { + $state = 'up'; } else { - $state = "admin down"; + $state = 'admin down'; } - if ($carrier eq "1") { - $link = "up"; + + if ($intf->carrier()) { + $link = 'up'; } else { - $link = "down"; + $link = 'down'; } return ($state, $link); } diff --git a/scripts/keepalived/vyatta-vrrp-state.pl b/scripts/keepalived/vyatta-vrrp-state.pl index 930c7cd0..9bb54a0c 100755 --- a/scripts/keepalived/vyatta-vrrp-state.pl +++ b/scripts/keepalived/vyatta-vrrp-state.pl @@ -66,10 +66,10 @@ if (defined $old_state and $vrrp_state eq $old_state) { Vyatta::Keepalived::vrrp_log("$vrrp_intf $vrrp_group transition to $vrrp_state"); vrrp_state_log($vrrp_state, $vrrp_intf, $vrrp_group); -if ($vrrp_state eq "backup") { +if ($vrrp_state eq 'backup') { Vyatta::Keepalived::snoop_for_master($vrrp_intf, $vrrp_group, $vrrp_vips[0], 60); -} elsif ($vrrp_state eq "master") { +} elsif ($vrrp_state eq 'master') { # # keepalived will send gratuitous arp requests on master transition # but some hosts do not update their arp cache for gratuitous arp @@ -87,7 +87,7 @@ if ($vrrp_state eq "backup") { system("rm -f $mfile"); } -if (!($vrrp_transitionscript eq "null")){ +if (!($vrrp_transitionscript eq 'null')){ exec("$vrrp_transitionscript"); } |