summaryrefslogtreecommitdiff
path: root/scripts/keepalived
diff options
context:
space:
mode:
authorDavid S. Madole <david@omd3.com>2009-09-27 15:29:17 -0400
committerStig Thormodsrud <stig@vyatta.com>2009-10-31 12:52:35 -0700
commit1b8212fe55cc9d83601acc52b43d3e7116542eda (patch)
tree44308d0726619ddc3f9575080b31f776cb471c30 /scripts/keepalived
parent5d2999ffb3a93966091c095cc85446ec62834c0f (diff)
downloadvyatta-cfg-system-1b8212fe55cc9d83601acc52b43d3e7116542eda.tar.gz
vyatta-cfg-system-1b8212fe55cc9d83601acc52b43d3e7116542eda.zip
Add VRRP capability to bonding interfaces and vifs of bonding interfaces.
Diffstat (limited to 'scripts/keepalived')
-rw-r--r--scripts/keepalived/vyatta-clear-vrrp.pl75
-rwxr-xr-xscripts/keepalived/vyatta-keepalived.pl225
-rwxr-xr-xscripts/keepalived/vyatta-show-vrrp.pl14
3 files changed, 168 insertions, 146 deletions
diff --git a/scripts/keepalived/vyatta-clear-vrrp.pl b/scripts/keepalived/vyatta-clear-vrrp.pl
index 17dedc59..ba5d569b 100644
--- a/scripts/keepalived/vyatta-clear-vrrp.pl
+++ b/scripts/keepalived/vyatta-clear-vrrp.pl
@@ -109,47 +109,50 @@ sub get_vrrp_intf_group {
# return an array of hashes that contains all the intf/group pairs
#
- my $config = new Vyatta::Config;
- $config->setLevel('interfaces ethernet');
- my @eths = $config->listOrigNodes();
- foreach my $eth (@eths) {
- my $path = "interfaces ethernet $eth";
- $config->setLevel($path);
- if ($config->existsOrig("vrrp")) {
- $path = "$path vrrp vrrp-group";
+ 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);
- my @groups = $config->listOrigNodes();
- foreach my $group (@groups) {
- my %hash;
- $hash{'intf'} = $eth;
- $hash{'group'} = $group;
- $hash{'path'} = "$path $group";
- push @array, {%hash};
+ 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 ethernet $eth";
- $config->setLevel($path);
- if ($config->existsOrig('vif')) {
- my $path = "$path vif";
+ $path = "interfaces $type $eth";
$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";
+ 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);
- my @groups = $config->listOrigNodes();
- foreach my $group (@groups) {
- my %hash;
- $hash{'intf'} = $vif_intf;
- $hash{'group'} = $group;
- $hash{'path'} = "$path $group";
- push @array, {%hash};
- }
- }
+ 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};
+ }
+ }
+ }
}
}
}
diff --git a/scripts/keepalived/vyatta-keepalived.pl b/scripts/keepalived/vyatta-keepalived.pl
index f7d3a652..842f8bc3 100755
--- a/scripts/keepalived/vyatta-keepalived.pl
+++ b/scripts/keepalived/vyatta-keepalived.pl
@@ -235,61 +235,64 @@ sub vrrp_find_changes {
my $config = new Vyatta::Config;
my $vrrp_instances = 0;
- $config->setLevel("interfaces ethernet");
- my @eths = $config->listNodes();
- foreach my $eth (@eths) {
- my $path = "interfaces ethernet $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 ethernet $eth vif";
+ 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);
- 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");
+ 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");
+ }
}
}
}
}
- }
- #
- # Now look for deleted from the origin tree
- #
- $config->setLevel("interfaces ethernet");
- @eths = $config->listOrigNodes();
- foreach my $eth (@eths) {
- my $path = "interfaces ethernet $eth";
- $config->setLevel($path);
- if ($config->isDeleted("vrrp")) {
+ #
+ # 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 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");
+ }
+ }
}
}
@@ -339,47 +342,51 @@ sub vrrp_update_config {
my $output = "#\n# autogenerated by $0 on $date\n#\n\n";
my $config = new Vyatta::Config;
-
- $config->setLevel("interfaces ethernet");
- my @eths = $config->listNodes();
my $vrrp_instances = 0;
- foreach my $eth (@eths) {
- my $path = "interfaces ethernet $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++;
- }
- }
- if ($config->exists("vif")) {
- my $path = "interfaces ethernet $eth vif";
+
+ 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);
- 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++;
+ 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++;
+ }
+ }
+ 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++;
+ }
}
}
}
@@ -408,21 +415,24 @@ sub list_vrrp_intf {
my $config = new Vyatta::Config;
my @intfs = ();
- $config->setLevel("interfaces ethernet");
- my @eths = $config->listOrigNodes();
- foreach my $eth (@eths) {
- my $path = "interfaces ethernet $eth";
- $config->setLevel($path);
- push @intfs, $eth if $config->existsOrig("vrrp");
- if ($config->existsOrig("vif")) {
- my $path = "interfaces ethernet $eth vif";
+ 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);
- 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");
+ 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");
+ }
}
}
}
@@ -431,11 +441,18 @@ sub list_vrrp_intf {
sub list_vrrp_group {
my ($name) = @_;
-
my $config = new Vyatta::Config;
- my $path = "interfaces ethernet $name";
- if ($name =~ /(eth\d+)\.(\d+)/) {
- $path = "interfaces ethernet $1 vif $2";
+ 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";
+ }
}
$path .= " vrrp vrrp-group";
$config->setLevel($path);
diff --git a/scripts/keepalived/vyatta-show-vrrp.pl b/scripts/keepalived/vyatta-show-vrrp.pl
index 3015bc92..5ec2e8ad 100755
--- a/scripts/keepalived/vyatta-show-vrrp.pl
+++ b/scripts/keepalived/vyatta-show-vrrp.pl
@@ -129,7 +129,7 @@ sub get_master_info {
my $source_ip = (vrrp_get_config($intf, $group))[0];
# arping doesn't seem to work for vlans
- if ($intf =~ /(eth\d+).\d+/) {
+ if ($intf =~ /(eth\d+|bond\d+).\d+/) {
$intf = $1;
}
system("/usr/bin/arping -c1 -f -I $intf -s $source_ip $vip > $arp_file");
@@ -251,7 +251,7 @@ sub vrrp_show {
#
# main
#
-my $intf = "eth";
+my @intfs = ("eth", "bond");
my $group = "all";
my $showsummary = 0;
@@ -259,7 +259,7 @@ if ($#ARGV >= 0) {
if ($ARGV[0] eq "summary") {
$showsummary = 1;
} else {
- $intf = $ARGV[0];
+ @intfs = ($ARGV[0]);
}
}
@@ -284,9 +284,11 @@ if ($showsummary == 1) {
$display_func = \&vrrp_show;
}
-my @state_files = Vyatta::Keepalived::get_state_files($intf, $group);
-foreach my $state_file (@state_files) {
- &$display_func($state_file);
+foreach my $intf (@intfs) {
+ my @state_files = Vyatta::Keepalived::get_state_files($intf, $group);
+ foreach my $state_file (@state_files) {
+ &$display_func($state_file);
+ }
}
exit 0;