summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStig Thormodsrud <stig@vyatta.com>2009-11-01 10:02:49 -0800
committerStig Thormodsrud <stig@vyatta.com>2009-11-01 10:02:49 -0800
commitf197d4eebd25f3bcbd0f6b5589ce9370a2f501da (patch)
tree6fd6fe628f95d4b9f67f54f6b0ac91a7be339e28
parent37dbea348afb8d0770767441c30e5ab1e2cea874 (diff)
downloadvyatta-cfg-quagga-f197d4eebd25f3bcbd0f6b5589ce9370a2f501da.tar.gz
vyatta-cfg-quagga-f197d4eebd25f3bcbd0f6b5589ce9370a2f501da.zip
Convert keepalived to use Interface infrastructure.
-rw-r--r--scripts/keepalived/vyatta-clear-vrrp.pl65
-rwxr-xr-xscripts/keepalived/vyatta-keepalived.pl176
-rwxr-xr-xscripts/keepalived/vyatta-show-vrrp.pl24
-rwxr-xr-xscripts/keepalived/vyatta-vrrp-state.pl6
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");
}