diff options
author | rbalocca <rbalocca@vyatta.com> | 2008-04-02 15:04:19 -0700 |
---|---|---|
committer | rbalocca <rbalocca@vyatta.com> | 2008-04-02 15:04:19 -0700 |
commit | bfd1fedf32528a5fe714ba9491c5bc5dd2052e91 (patch) | |
tree | 84305f6415af8171a57dec453ee8d2a26f61e6e8 /scripts | |
parent | 053d42ea27a5b89f0a19a09dd347bc37c6f07948 (diff) | |
parent | 35642e2e10aff32335690a5af2710bbb9ec3ea13 (diff) | |
download | vyatta-cfg-bfd1fedf32528a5fe714ba9491c5bc5dd2052e91.tar.gz vyatta-cfg-bfd1fedf32528a5fe714ba9491c5bc5dd2052e91.zip |
Merge branch 'glendale' into hollywood
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/vyatta-interfaces.pl | 40 | ||||
-rwxr-xr-x | scripts/vyatta-watchlink-exclude.pl | 168 |
2 files changed, 201 insertions, 7 deletions
diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl index e3afe68..c60288a 100755 --- a/scripts/vyatta-interfaces.pl +++ b/scripts/vyatta-interfaces.pl @@ -332,18 +332,44 @@ sub delete_eth_addrs { dhcp_release_addr($intf); update_dhcp_client(); system("rm -f /var/lib/dhcp3/dhclient_$intf\_lease"); - return; + exit 0; } my $version = is_ip_v4_or_v6($addr); - if (!defined $version) { - exit 1; + + # If interface has address than delete it + if (is_ip_configured($intf, $addr)) { + if ($version == 4) { + exec 'ip', 'addr', 'del', $addr, 'dev', $intf; + } elsif ($version == 6) { + exec 'ip', '-6', 'addr', 'del', $addr, 'dev', $intf; + } else { + die "Bad ip version"; + } + die "Can't exec ip"; } - if ($version == 4) { - return system("ip addr del $addr dev $intf"); + + # Interface address might have been removed by quagga link going down + # so tell quagga no to restore it on link-detect + my $vtysh; + if ( -x '/usr/bin/vyatta-vtysh' ) { + $vtysh = '/usr/bin/vyatta-vtysh'; + } else { + $vtysh = '/usr/bin/vtysh'; } - if ($version == 6) { - return system("ip -6 addr del $addr dev $intf"); + + my @cmd = (); + if ($version == 4) { + @cmd = ('vtysh', '-c', + "configure terminal; interface $intf; no ip address $intf" ); + } elsif ($version == 6) { + @cmd = ('vtysh', '-c', + "configure terminal; interface $intf; no ip6 address $intf" ); + } else { + die "Bad ip version"; } + exec $vtysh, @cmd; + + die "Can't exec vtysh"; } sub update_mac { diff --git a/scripts/vyatta-watchlink-exclude.pl b/scripts/vyatta-watchlink-exclude.pl new file mode 100755 index 0000000..048946c --- /dev/null +++ b/scripts/vyatta-watchlink-exclude.pl @@ -0,0 +1,168 @@ +#!/usr/bin/perl +# +# Module: vyatta-watchlink-exclude.pl +# +# **** 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. +# +# A copy of the GNU General Public License is available as +# `/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution +# or on the World Wide Web at `http://www.gnu.org/copyleft/gpl.html'. +# You can also obtain it by writing to the Free Software Foundation, +# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, +# MA 02110-1301, USA. +# +# 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: March 2008 +# Description: Script to update watchlink exclude file +# +# **** End License **** +# + +# +# parameters: +# --id="" : owner of exclude line (e.g. vrrp, ha) [required] +# --action="" : add or remove [required] +# --intf="" : interface [required for add] +# --ipaddr="" : ip address or network to execlude [optional] +# --signal : should watchlink get signaled [optional] +# +# Expected format of exclude file: +# +# <interface> [ <ipv4addr> | <ipv4net> ] # id +# + +use Getopt::Long; +use POSIX; + +use strict; +use warnings; + +my $exclude_file = '/var/linkstatus/exclude'; +my $watchlink_pid = '/var/run/vyatta/quagga/watchlink.pid'; + +sub read_exclude_file { + my $FILE; + my @lines = (); + if (! -e $exclude_file) { + return @lines; + } + open($FILE, "<", $exclude_file) or die "Error: read() $!"; + @lines = <$FILE>; + close($FILE); + chomp @lines; + return @lines; +} + +sub write_exclude_file { + my @lines = @_; + + my $FILE; + open($FILE, ">", $exclude_file) or die "Error: write() $!"; + if (scalar(@lines) > 0) { + print $FILE join("\n", @lines), "\n"; + } + close($FILE); +} + +sub remove_exclude_id { + my ($id, @lines) = @_; + + my @new_lines; + my $match = 0; + foreach my $line (@lines) { + if ($line =~ /# $id$/) { + $match++; + } else { + push @new_lines, $line; + } + } + if ($match < 1) { + die "Error: no match found for $id"; + } + return @new_lines; +} + +sub remove_exclude_line { + my ($remove_line, @lines) = @_; + + my @new_lines; + my $match = 0; + foreach my $line (@lines) { + if ($line eq $remove_line) { + $match++; + } else { + push @new_lines, $line; + } + } + if ($match < 1) { + die "Error: no match found for $remove_line"; + } + return @new_lines; +} + + +# +# main +# + +my ($opt_id, $opt_action, $opt_intf, $opt_ipaddr, $opt_ipnet, $opt_signal); + +GetOptions("id=s" => \$opt_id, + "action=s" => \$opt_action, + "intf=s" => \$opt_intf, + "ipaddr=s" => \$opt_ipaddr, + "signal!" => \$opt_signal, + ); + +if (!(defined $opt_id and defined $opt_action)) { + die "Error: parameters --id --action must be set"; +} + +if ($opt_action ne "add" and $opt_action ne "remove") { + die "Error: --action must be \"add\" or \"remove\" "; +} + +if ($opt_action eq "add" and !defined($opt_intf)) { + die "Error: --intf must be set for \"add\""; +} + +my @lines = read_exclude_file(); +my $new_line = "$opt_intf "; +if (defined $opt_ipaddr) { + $new_line .= "$opt_ipaddr "; +} +if (defined $opt_id) { + $new_line .= "# $opt_id"; +} + +if ($opt_action eq "add") { + push @lines, $new_line; +} elsif (defined $opt_intf) { + @lines = remove_exclude_line($new_line, @lines); +} else { + @lines = remove_exclude_id($opt_id, @lines); +} +write_exclude_file(@lines); + +if (defined $opt_signal) { + if (! -e $watchlink_pid) { + die "Error: missing pid file [$watchlink_pid]\n"; + } + my $pid = `cat $watchlink_pid`; + chomp $pid; + system("kill -10 $pid"); +} + +# end of file |