summaryrefslogtreecommitdiff
path: root/scripts/vyatta-interfaces.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/vyatta-interfaces.pl')
-rwxr-xr-xscripts/vyatta-interfaces.pl33
1 files 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;
}