From 824d961ba24251866e28a53aa71adff377c56192 Mon Sep 17 00:00:00 2001 From: John Southworth Date: Fri, 1 Jul 2011 17:31:40 -0700 Subject: bugfix 6801: check to see if the same address is configured on another interface in the working config before allowing an address to be set on an interface, allows for swapping addresses in the same commit --- scripts/vyatta-interfaces.pl | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl index 26f2791a..f139dcf6 100755 --- a/scripts/vyatta-interfaces.pl +++ b/scripts/vyatta-interfaces.pl @@ -103,6 +103,31 @@ sub is_ip_configured { return ($found > 0); } +sub is_uniq_address { + my $ip = pop(@_); + my @cfgifs = Vyatta::Interface::get_all_cfg_interfaces(); + my $config = new Vyatta::Config; + my %addr_hash = (); + foreach my $intf ( @cfgifs ) { + my $addrs = [ ]; + my $path = "$intf->{'path'}"; + if ($path =~ /openvpn/) { + $addrs = [$config->listNodes("$path local-address")]; + } else { + $addrs = [$config->returnValues("$path address")]; + } + foreach my $addr ( @{$addrs} ){ + if (not exists $addr_hash{$addr}){ + $addr_hash{$addr} = { _intf => [ $intf->{name} ] }; + } else { + $addr_hash{$addr}->{_intf} = + [ @{$addr_hash{$addr}->{_intf}}, $intf->{name} ]; + } + } + } + return ((scalar @{$addr_hash{$ip}->{_intf}}) <= 1); +} + sub is_ipv4 { return index($_[0],':') < 0; } @@ -290,12 +315,12 @@ sub is_valid_addr_commit { my ($dhcp, $static_v4); foreach my $addr (@addrs) { next if ($addr eq 'dhcpv6'); - if ($addr eq 'dhcp') { $dhcp = 1; - } elsif ($ipaddr_hash{$addr} && !is_ip_configured($ifname, $addr)) { - my $h = Vyatta::Misc::get_ipnet_intf_hash(); - print "Warning: possible duplicate address $addr on $h->{$addr}\n"; + } elsif (!is_uniq_address($addr)) { + my $h = Vyatta::Misc::get_ipnet_intf_hash(); + print "Error: duplicate address $addr on $h->{$addr}\n"; + exit 1; } elsif ( is_ipv4($addr) ) { $static_v4 = 1; } -- cgit v1.2.3