summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrbalocca <rbalocca@vyatta.com>2008-04-02 15:04:19 -0700
committerrbalocca <rbalocca@vyatta.com>2008-04-02 15:04:19 -0700
commitbfd1fedf32528a5fe714ba9491c5bc5dd2052e91 (patch)
tree84305f6415af8171a57dec453ee8d2a26f61e6e8
parent053d42ea27a5b89f0a19a09dd347bc37c6f07948 (diff)
parent35642e2e10aff32335690a5af2710bbb9ec3ea13 (diff)
downloadvyatta-cfg-bfd1fedf32528a5fe714ba9491c5bc5dd2052e91.tar.gz
vyatta-cfg-bfd1fedf32528a5fe714ba9491c5bc5dd2052e91.zip
Merge branch 'glendale' into hollywood
-rw-r--r--Makefile.am1
-rwxr-xr-xscripts/vyatta-interfaces.pl40
-rwxr-xr-xscripts/vyatta-watchlink-exclude.pl168
-rw-r--r--src/commit.c15
4 files changed, 209 insertions, 15 deletions
diff --git a/Makefile.am b/Makefile.am
index a309d34..4496be6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -43,6 +43,7 @@ sbin_SCRIPTS += scripts/vyatta-cfg-notify
sbin_SCRIPTS += scripts/vyatta-interfaces.pl
sbin_SCRIPTS += scripts/vyatta-irqaffin
sbin_SCRIPTS += scripts/vyatta-check-typeless-node.pl
+sbin_SCRIPTS += scripts/vyatta-watchlink-exclude.pl
share_perl5_SCRIPTS = scripts/VyattaConfig.pm
share_perl5_SCRIPTS += scripts/VyattaConfigDOMTree.pm
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
diff --git a/src/commit.c b/src/commit.c
index 980a98b..8fbc1d6 100644
--- a/src/commit.c
+++ b/src/commit.c
@@ -747,17 +747,16 @@ static boolean commit_delete_child(vtw_def *pdefp, char *child,
mark_paths(&mark);
if (!deleting) {
int status;
- /* are we marked with opaque */
push_path(&m_path, child);
- push_path(&m_path, opaque_name);
+ switch_path(APATH); /* switch to active */
status = lstat(m_path.path, &statbuf);
+ switch_path(CPATH); /* back to changes */
pop_path(&m_path);
- pop_path(&m_path);
- if (status >= 0) {
- /* brand new directory, nothing is
- deleted there;
- update will handle txn (both begin and end)
- */
+ if (status < 0) {
+ /* node doesn't exist in active config. it's newly created
+ * so we don't need to handle delete. update will handle the
+ * transaction (if any).
+ */
return TRUE;
}
}