diff options
author | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2009-04-28 23:01:47 -0700 |
---|---|---|
committer | Stephen Hemminger <stephen.hemminger@vyatta.com> | 2009-04-28 23:01:47 -0700 |
commit | 4bb05740120a92338d081bd3f2a2993b87ce3909 (patch) | |
tree | 06c45a5b925457354545796a884ca8101dd21716 | |
parent | 5e7cbd98a5f76adf37f15020b1a9375e388ba37a (diff) | |
parent | cb8a0c4dd7f3ebb47bbda57edb528c1cda278578 (diff) | |
download | vyatta-cfg-4bb05740120a92338d081bd3f2a2993b87ce3909.tar.gz vyatta-cfg-4bb05740120a92338d081bd3f2a2993b87ce3909.zip |
Merge branch 'jenner' of 192.168.100.1:git/vyatta-cfg into jenner
-rwxr-xr-x | lib/Vyatta/Misc.pm | 10 | ||||
-rwxr-xr-x | scripts/vyatta-interfaces.pl | 25 |
2 files changed, 17 insertions, 18 deletions
diff --git a/lib/Vyatta/Misc.pm b/lib/Vyatta/Misc.pm index e5d0738..01f1537 100755 --- a/lib/Vyatta/Misc.pm +++ b/lib/Vyatta/Misc.pm @@ -102,12 +102,18 @@ sub getInterfaces { return @interfaces; } +# get list of IPv4 and IPv6 addresses +# if name is defined then get the addresses on that interface +# if type is defined then restrict to that type (inet, inet6) sub getIP { my ( $name, $type ) = @_; + my @args = qw(ip addr show); my @addresses; - open my $ipcmd, '-|' - or exec qw(ip addr show dev), $name + push @args, ('dev', $name) if $name; + + open my $ipcmd, '-|' + or exec @args or die "ip addr command failed: $!"; <$ipcmd>; diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl index 25fefc9..d0d8fa1 100755 --- a/scripts/vyatta-interfaces.pl +++ b/scripts/vyatta-interfaces.pl @@ -90,25 +90,19 @@ exit 0; sub is_ip_configured { my ($intf, $ip) = @_; - my @found = grep $ip, Vyatta::Misc::getIP($intf); - return ($#found > 0); + my $found = grep { $_ eq $ip } Vyatta::Misc::getIP($intf); + return ($found > 0); } sub is_ip_duplicate { my ($intf, $ip) = @_; - # - # get a list of all ipv4 and ipv6 addresses - # - my @ipaddrs = `ip addr show | grep inet | cut -d" " -f6`; - chomp @ipaddrs; - my %ipaddrs_hash = map { $_ => 1 } @ipaddrs; + # get a map of all ipv4 and ipv6 addresses + my %ipaddrs_hash = map { $_ => 1 } getIP(); return unless($ipaddrs_hash{$ip}); - # - # allow dup if it's the same interface - # + # if ip exists but on another interface, that is okay return is_ip_configured($intf, $ip); } @@ -233,9 +227,8 @@ sub update_eth_addrs { return; } my $version = is_ip_v4_or_v6($addr); - if (!defined $version) { - exit 1; - } + die "Unknown address not IPV4 or IPV6" unless $version; + if (is_ip_configured($intf, $addr)) { # # treat this as informational, don't fail @@ -250,8 +243,7 @@ sub update_eth_addrs { if ($version == 6) { return system("ip -6 addr add $addr dev $intf"); } - print "Error: Invalid address/prefix [$addr] for interface $intf\n"; - exit 1; + die "Error: Invalid address/prefix [$addr] for interface $intf\n"; } sub delete_eth_addrs { @@ -380,6 +372,7 @@ sub is_valid_addr { print "Error: remove dhcp before adding static addresses for $intf\n"; exit 1; } + if (is_ip_duplicate($intf, $addr_net)) { print "Error: duplicate address/prefix [$addr_net]\n"; exit 1; |