From 91be36bece8c9ebc1ed89e36a7b2f52fe9a9fb67 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen.hemminger@vyatta.com>
Date: Tue, 28 Apr 2009 22:38:48 -0700
Subject: Extend getIP() to be able to get all addresses

Only have one interface for getting addresses.
---
 lib/Vyatta/Misc.pm | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 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>;
-- 
cgit v1.2.3


From 7d181bfaafd262f95bcf13e1c358a043ee6c685c Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen.hemminger@vyatta.com>
Date: Tue, 28 Apr 2009 22:47:27 -0700
Subject: Fix bug in is_ip_configured

Bug 4311
Doing grep ($ip, @list) will return whole list since it evaluted
$ip as a expression and the result was defined.
---
 scripts/vyatta-interfaces.pl | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl
index 25fefc9..c4e5c4e 100755
--- a/scripts/vyatta-interfaces.pl
+++ b/scripts/vyatta-interfaces.pl
@@ -90,8 +90,8 @@ 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 {
-- 
cgit v1.2.3


From e4e05713a76c31ba4edbb252e6f5fa0f59b13837 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen.hemminger@vyatta.com>
Date: Tue, 28 Apr 2009 22:50:27 -0700
Subject: Catch incorrect address format

Don't just silently exit on incorrect address format.
At least print an error
---
 scripts/vyatta-interfaces.pl | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl
index c4e5c4e..5574462 100755
--- a/scripts/vyatta-interfaces.pl
+++ b/scripts/vyatta-interfaces.pl
@@ -233,9 +233,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 +249,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 {
-- 
cgit v1.2.3


From cb8a0c4dd7f3ebb47bbda57edb528c1cda278578 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen.hemminger@vyatta.com>
Date: Tue, 28 Apr 2009 23:00:59 -0700
Subject: Use getIP() to check for duplicates

Simpler to use new getIP() for all address fetching
---
 scripts/vyatta-interfaces.pl | 13 ++++---------
 1 file changed, 4 insertions(+), 9 deletions(-)

diff --git a/scripts/vyatta-interfaces.pl b/scripts/vyatta-interfaces.pl
index 5574462..d0d8fa1 100755
--- a/scripts/vyatta-interfaces.pl
+++ b/scripts/vyatta-interfaces.pl
@@ -97,18 +97,12 @@ sub is_ip_configured {
 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);
 }
 
@@ -378,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;
-- 
cgit v1.2.3