diff options
Diffstat (limited to 'scripts/keepalived')
-rwxr-xr-x | scripts/keepalived/VyattaKeepalived.pm | 261 | ||||
-rwxr-xr-x | scripts/keepalived/vyatta-keepalived.pl | 42 |
2 files changed, 21 insertions, 282 deletions
diff --git a/scripts/keepalived/VyattaKeepalived.pm b/scripts/keepalived/VyattaKeepalived.pm deleted file mode 100755 index 6507d8f7..00000000 --- a/scripts/keepalived/VyattaKeepalived.pm +++ /dev/null @@ -1,261 +0,0 @@ -# -# Module: VyattaKeepalived.pm -# -# **** License **** -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# This code was originally developed by Vyatta, Inc. -# Portions created by Vyatta are Copyright (C) 2007 Vyatta, Inc. -# All Rights Reserved. -# -# Author: Stig Thormodsrud -# Date: October 2007 -# Description: Common keepalived definitions/funcitions -# -# **** End License **** -# -package VyattaKeepalived; - -use VyattaConfig; -use POSIX; - -use strict; -use warnings; - -my $daemon = '/usr/sbin/keepalived'; -my $keepalived_conf = '/etc/keepalived/keepalived.conf'; -my $sbin_dir = '/opt/vyatta/sbin'; -my $state_transition = "$sbin_dir/vyatta-vrrp-state.pl"; -my $keepalived_pid = '/var/run/keepalived_vrrp.pid'; -my $state_dir = '/var/log/vrrpd'; -my $vrrp_log = "$state_dir/vrrp.log"; - - -sub vrrp_log { - my $timestamp = strftime("%Y%m%d-%H:%M.%S", localtime); - open my $fh, ">>", $vrrp_log; - print $fh "$timestamp: ", @_ , "\n"; - close $fh; -} - -sub is_running { - if (-f $keepalived_pid) { - my $pid = `cat $keepalived_pid`; - $pid =~ s/\s+$//; # chomp doesn't remove nl - my $ps = `ps -p $pid -o comm=`; - - if (defined($ps) && $ps ne "") { - return 1; - } - } - return 0; -} - -sub start_daemon { - my ($conf) = @_; - - my $cmd = "$daemon --vrrp --log-facility 7 --log-detail --dump-conf"; - $cmd .= " --use-file $conf --vyatta-workaround"; - system($cmd); - vrrp_log("start_daemon"); -} - -sub stop_daemon { - if (is_running()) { - my $pid = `cat $keepalived_pid`; - $pid =~ s/\s+$//; # chomp doesn't remove nl - system("kill $pid"); - vrrp_log("stop_daemon"); - } else { - vrrp_log("stop daemon called while not running"); - } -} - -sub restart_daemon { - my ($conf) = @_; - - if (VyattaKeepalived::is_running()) { - my $pid = `cat $keepalived_pid`; - $pid =~ s/\s+$//; # chomp doesn't remove nl - system("kill -1 $pid"); - vrrp_log("restart_deamon"); - } else { - start_daemon($conf); - } -} - -sub get_conf_file { - return $keepalived_conf; -} - -sub get_state_script { - return $state_transition; -} - -sub get_state_file { - my ($vrrp_intf, $vrrp_group) = @_; - - my $file = "$state_dir/vrrpd_" . "$vrrp_intf" . "_" . "$vrrp_group.state"; - return $file; -} - -sub get_master_file { - my ($vrrp_intf, $vrrp_group) = @_; - - my $file = "$state_dir/vrrpd_" . "$vrrp_intf" . "_" . "$vrrp_group.master"; - return $file; -} - -sub get_state_files { - my ($intf, $group) = @_; - - # todo: fix sorting for ethX > 9 - my @state_files; - my $LS; - if ($group eq "all") { - open($LS,"ls $state_dir |grep '^vrrpd_$intf.*\.state\$' | sort |"); - } else { - my $intf_group = $intf . "_" . $group . ".state"; - open($LS, - "ls $state_dir |grep '^vrrpd_$intf_group\$' | sort |"); - } - @state_files = <$LS>; - close($LS); - foreach my $i (0 .. $#state_files) { - $state_files[$i] = "$state_dir/$state_files[$i]"; - } - chomp @state_files; - return @state_files; -} - -sub vrrp_get_config { - my ($intf, $group) = @_; - - my $path; - my $config = new VyattaConfig; - - if ($intf =~ m/(eth\d+)\.(\d+)/) { - $path = "interfaces ethernet $1 vif $2"; - } else { - $path = "interfaces ethernet $intf"; - } - - $config->setLevel($path); - my $primary_addr = $config->returnOrigValue("address"); - if (!defined $primary_addr) { - $primary_addr = "0.0.0.0"; - } - - if ($primary_addr =~ m/(\d+\.\d+\.\d+\.\d+)\/\d+/) { - $primary_addr = $1; - } - - $config->setLevel("$path vrrp vrrp-group $group"); - my @vips = $config->returnOrigValues("virtual-address"); - my $priority = $config->returnOrigValue("priority"); - if (!defined $priority) { - $priority = 1; - } - my $preempt = $config->returnOrigValue("preempt"); - if (!defined $preempt) { - $preempt = "true"; - } - my $advert_int = $config->returnOrigValue("advertise-interval"); - if (!defined $advert_int) { - $advert_int = 1; - } - $config->setLevel("$path vrrp vrrp-group $group authentication"); - my $auth_type = $config->returnOrigValue("type"); - if (!defined $auth_type) { - $auth_type = "none"; - } - - return ($primary_addr, $priority, $preempt, $advert_int, $auth_type, @vips); -} - -sub snoop_for_master { - my ($intf, $group, $vip, $timeout) = @_; - - my ($cap_filt, $dis_filt, $options, $cmd); - - my $file = get_master_file($intf, $group); - - # - # set up common tshark parameters - # - $cap_filt = "-f \"host 224.0.0.18"; - $dis_filt = "-R \"vrrp.virt_rtr_id == $group and vrrp.ip_addr == $vip\""; - $options = "-a duration:$timeout -p -i$intf -c1 -T pdml"; - - my $auth_type = (vrrp_get_config($intf, $group))[4]; - if (lc($auth_type) ne "ah") { - # - # the vrrp group is the 2nd byte in the vrrp header - # - $cap_filt .= " and proto VRRP and vrrp[1:1] = $group\""; - $cmd = "tshark $options $cap_filt $dis_filt"; - system("$cmd > $file 2> /dev/null"); - } else { - # - # if the vrrp group is using AH authentication, then the proto will be - # AH (0x33) instead of VRRP (0x70). So try snooping for AH and - # look for the vrrp group at byte 45 (ip_header=20, ah=24) - # - $cap_filt .= " and proto 0x33 and ip[45:1] = $group\""; - $cmd = "tshark $options $cap_filt $dis_filt"; - system("$cmd > $file 2> /dev/null"); - } -} - -sub vrrp_state_parse { - my ($file) = @_; - - $file =~ s/\s+$//; # chomp doesn't remove nl - if ( -f $file) { - my $line = `cat $file`; - chomp $line; - my ($start_time, $intf, $group, $state, $ltime) = split(' ', $line); - return ($start_time, $intf, $group, $state, $ltime); - } else { - return undef; - } -} - -sub vrrp_get_init_state { - my ($intf, $group, $vips, $preempt) = @_; - - my $init_state; - if (VyattaKeepalived::is_running()) { - my @state_files = VyattaKeepalived::get_state_files($intf, $group); - chomp @state_files; - if (scalar(@state_files) > 0) { - my ($start_time, $f_intf, $f_group, $state, $ltime) = - VyattaKeepalived::vrrp_state_parse($state_files[0]); - if ($state eq "master") { - $init_state = 'MASTER'; - } else { - $init_state = 'BACKUP'; - } - return $init_state; - } - # fall through to logic below - } - - if ($preempt eq "false") { - $init_state = 'BACKUP'; - } else { - $init_state = 'MASTER'; - } - - return $init_state; -} - -1; -#end of file diff --git a/scripts/keepalived/vyatta-keepalived.pl b/scripts/keepalived/vyatta-keepalived.pl index c41fa7e2..a59f6832 100755 --- a/scripts/keepalived/vyatta-keepalived.pl +++ b/scripts/keepalived/vyatta-keepalived.pl @@ -25,14 +25,14 @@ use lib "/opt/vyatta/share/perl5/"; use VyattaConfig; -use VyattaKeepalived; +use Vyatta::Keepalived; use Getopt::Long; use strict; use warnings; my $changes_file = '/var/log/vrrpd/changes'; -my $conf_file = VyattaKeepalived::get_conf_file(); +my $conf_file = get_conf_file(); my %HoA_sync_groups; @@ -43,7 +43,7 @@ sub keepalived_get_values { my $output = ''; my $config = new VyattaConfig; - my $state_transition_script = VyattaKeepalived::get_state_script(); + my $state_transition_script = get_state_script(); $config->setLevel("$path vrrp vrrp-group"); my @groups = $config->listNodes(); @@ -51,8 +51,8 @@ sub keepalived_get_values { my $vrrp_instance = "vyatta-$intf-$group"; $config->setLevel("$path vrrp vrrp-group $group"); if ($config->exists("disable")) { - VyattaKeepalived::vrrp_log("$vrrp_instance disabled - skipping"); - my $state_file = VyattaKeepalived::get_state_file($intf, $group); + vrrp_log("$vrrp_instance disabled - skipping"); + my $state_file = get_state_file($intf, $group); system("rm -f $state_file"); next; } @@ -116,7 +116,7 @@ sub keepalived_get_values { $output .= "vrrp_instance $vrrp_instance \{\n"; my $init_state; - $init_state = VyattaKeepalived::vrrp_get_init_state($intf, $group, + $init_state = vrrp_get_init_state($intf, $group, $vips[0], $preempt); $output .= "\tstate $init_state\n"; $output .= "\tinterface $intf\n"; @@ -179,7 +179,7 @@ sub vrrp_save_changes { my @list = @_; my $num_changes = scalar(@list); - VyattaKeepalived::vrrp_log("saving changes file $num_changes"); + vrrp_log("saving changes file $num_changes"); open(my $FILE, ">", $changes_file) or die "Error: write $!"; print $FILE join("\n", @list), "\n"; close($FILE); @@ -201,7 +201,7 @@ sub vrrp_find_changes { my ($vrrp, $vrrp_status) = each(%vrrp_status_hash); if ($vrrp_status ne "static") { push @list, $eth; - VyattaKeepalived::vrrp_log("$vrrp_status found $eth"); + vrrp_log("$vrrp_status found $eth"); } } if ($config->exists("vif")) { @@ -217,7 +217,7 @@ sub vrrp_find_changes { my ($vrrp, $vrrp_status) = each(%vrrp_status_hash); if ($vrrp_status ne "static") { push @list, "$eth.$vif"; - VyattaKeepalived::vrrp_log("$vrrp_status found $eth.$vif"); + vrrp_log("$vrrp_status found $eth.$vif"); } } } @@ -234,7 +234,7 @@ sub vrrp_find_changes { $config->setLevel($path); if ($config->isDeleted("vrrp")) { push @list, $eth; - VyattaKeepalived::vrrp_log("Delete found $eth"); + vrrp_log("Delete found $eth"); } $config->setLevel("$path vif"); my @vifs = $config->listOrigNodes(); @@ -244,13 +244,13 @@ sub vrrp_find_changes { $config->setLevel($vif_path); if ($config->isDeleted("vrrp")) { push @list, "$eth.$vif"; - VyattaKeepalived::vrrp_log("Delete found $eth.$vif"); + vrrp_log("Delete found $eth.$vif"); } } } my $num = scalar(@list); - VyattaKeepalived::vrrp_log("Start transation: $num changes"); + vrrp_log("Start transation: $num changes"); if ($num) { vrrp_save_changes(@list); } @@ -271,7 +271,7 @@ sub remove_from_changes { my @new_lines = (); foreach my $line (@lines) { if ($line =~ /$intf$/) { - VyattaKeepalived::vrrp_log("remove_from_changes [$line]"); + vrrp_log("remove_from_changes [$line]"); } else { push @new_lines, $line; } @@ -316,7 +316,7 @@ sub vrrp_update_config { # my $vif_intf = $eth . "." . $vif; if (!(-d "/sys/class/net/$vif_intf")) { - VyattaKeepalived::vrrp_log("skipping $vif_intf"); + vrrp_log("skipping $vif_intf"); next; } my $vif_path = "$path $vif"; @@ -363,24 +363,24 @@ if (! defined $action) { } if ($action eq "update") { - VyattaKeepalived::vrrp_log("vrrp update $vrrp_intf"); + vrrp_log("vrrp update $vrrp_intf"); if ( ! -e $changes_file) { my $num_changes = vrrp_find_changes(); if ($num_changes == 0) { # # Shouldn't happen, but ... # - VyattaKeepalived::vrrp_log("unexpected 0 changes"); + vrrp_log("unexpected 0 changes"); } } my $vrrp_instances = vrrp_update_config($vrrp_intf); my $more_changes = remove_from_changes($vrrp_intf); - VyattaKeepalived::vrrp_log(" instances $vrrp_instances, $more_changes"); + vrrp_log(" instances $vrrp_instances, $more_changes"); if ($vrrp_instances > 0 and $more_changes == 0) { - VyattaKeepalived::restart_daemon($conf_file); + restart_daemon($conf_file); } if ($vrrp_instances == 0) { - VyattaKeepalived::stop_daemon(); + stop_daemon(); system("rm -f $conf_file"); } } @@ -390,8 +390,8 @@ if ($action eq "delete") { print "must include interface & group"; exit 1; } - VyattaKeepalived::vrrp_log("vrrp delete $vrrp_intf $vrrp_group"); - my $state_file = VyattaKeepalived::get_state_file($vrrp_intf, $vrrp_group); + vrrp_log("vrrp delete $vrrp_intf $vrrp_group"); + my $state_file = get_state_file($vrrp_intf, $vrrp_group); system("rm -f $state_file"); exit 0; } |