summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2014-09-08 20:12:53 +0700
committerDaniil Baturin <daniil@baturin.org>2014-09-08 20:12:53 +0700
commitd186a399184811b75786b820103aec43722c8a74 (patch)
treea393dc1005aade6aa3aa3eac25ea981b4d5aabd6
parent78d4ce4504f87f8135b3ca9b524f6ccf3b570634 (diff)
parent1a2d4456587604730cb29bf635253941a50669ab (diff)
downloadvyatta-cfg-system-d186a399184811b75786b820103aec43722c8a74.tar.gz
vyatta-cfg-system-d186a399184811b75786b820103aec43722c8a74.zip
Merge pull request #21 from cyclops8456/helium
vyatta-cfg-system: Bug #182 and #305
-rwxr-xr-xscripts/system/vyatta_update_resolv.pl233
-rwxr-xr-xscripts/vyatta-address76
2 files changed, 155 insertions, 154 deletions
diff --git a/scripts/system/vyatta_update_resolv.pl b/scripts/system/vyatta_update_resolv.pl
index b311bff5..d20eb848 100755
--- a/scripts/system/vyatta_update_resolv.pl
+++ b/scripts/system/vyatta_update_resolv.pl
@@ -26,7 +26,6 @@
use strict;
use lib "/opt/vyatta/share/perl5/";
-
use Getopt::Long;
my $dhclient_script = 0;
GetOptions("dhclient-script=i" => \$dhclient_script);
@@ -39,20 +38,20 @@ my @domains;
my $domain_name = undef;
if ($dhclient_script == 1) {
- @domains = $vc->returnOrigValues('domain-search domain');
- $domain_name = $vc->returnOrigValue('domain-name');
+ @domains = $vc->returnOrigValues('domain-search domain');
+ $domain_name = $vc->returnOrigValue('domain-name');
} else {
- @domains = $vc->returnValues('domain-search domain');
- $domain_name = $vc->returnValue('domain-name');
+ @domains = $vc->returnValues('domain-search domain');
+ $domain_name = $vc->returnValue('domain-name');
}
if ($dhclient_script == 0 && @domains > 0 && $domain_name && length($domain_name) > 0) {
my @loc;
if ($vc->returnOrigValues('domain-search domain') > 0) {
- @loc = ["system","domain-name"];
+ @loc = ["system","domain-name"];
}
else {
- @loc = ["system","domain-search","domain"];
+ @loc = ["system","domain-search","domain"];
}
Vyatta::Config::outputError(@loc,"System configuration error. Both \'domain-name\' and \'domain-search\' are specified, but only one of these mutually exclusive parameters is allowed.");
exit(1);
@@ -60,126 +59,125 @@ if ($dhclient_script == 0 && @domains > 0 && $domain_name && length($domain_name
my $doms = '';
foreach my $domain (@domains) {
- if (length($doms) > 0) {
- $doms .= ' ';
- }
- $doms .= $domain;
+ if (length($doms) > 0) {
+ $doms .= ' ';
+ }
+ $doms .= $domain;
}
# add domain names received from dhcp client to domain search in /etc/resolv.conf if domain-name not set in CLI
if (!defined($domain_name)) {
- my @dhcp_interfaces_resolv_files = `ls /etc/ | grep resolv.conf.dhclient-new`;
- if ($#dhcp_interfaces_resolv_files >= 0) {
- for my $each_file (@dhcp_interfaces_resolv_files) {
- chomp $each_file;
- my $find_search = `grep "^search" /etc/$each_file 2> /dev/null | wc -l`;
- if ($find_search == 1) {
- my $search_string = `grep "^search" /etc/$each_file`;
- my @dhcp_domains = split(/\s+/, $search_string, 2);
- my $dhcp_domain = $dhcp_domains[1];
- chomp $dhcp_domain;
- $doms .= ' ' . $dhcp_domain;
- }
+ my @dhcp_interfaces_resolv_files = `ls /etc/ | grep resolv.conf.dhclient-new`;
+ if ($#dhcp_interfaces_resolv_files >= 0) {
+ for my $each_file (@dhcp_interfaces_resolv_files) {
+ chomp $each_file;
+ my $find_search = `grep "^search" /etc/$each_file 2> /dev/null | wc -l`;
+ if ($find_search == 1) {
+ my $search_string = `grep "^search" /etc/$each_file`;
+ my @dhcp_domains = split(/\s+/, $search_string, 2);
+ my $dhcp_domain = $dhcp_domains[1];
+ chomp $dhcp_domain;
+ $doms .= ' ' . $dhcp_domain;
+ }
+ }
}
- }
}
my $search = '';
if (length($doms) > 0) {
- $search = "search\t\t$doms\t\t#line generated by $0\n";
+ $search = "search\t\t$doms\t\t#line generated by $0\n";
}
my $domain = '';
if ($domain_name && length($domain_name) > 0) {
- $domain = "domain\t\t$domain_name\t\t#line generated by $0\n";
+ $domain = "domain\t\t$domain_name\t\t#line generated by $0\n";
}
# update /etc/resolv.conf for name-servers received from dhcp client, only done when dhclient-script calls this script
-if ($dhclient_script == 1) {
- my @current_dhcp_nameservers;
- my $restart_ntp = 0;
-
- # code below to add new name-servers received from dhcp client
-
- my @dhcp_interfaces_resolv_files = `ls /etc/ | grep resolv.conf.dhclient-new`;
- if ($#dhcp_interfaces_resolv_files >= 0) {
- my $ns_count = 0;
- for my $each_file (@dhcp_interfaces_resolv_files) {
- chomp $each_file;
- my $find_nameserver = `grep nameserver /etc/$each_file 2> /dev/null | wc -l`;
- if ($find_nameserver > 0) {
- my @nameservers = `grep nameserver /etc/$each_file`;
- for my $each_nameserver (@nameservers) {
- my @nameserver = split(/ /, $each_nameserver, 2);
- my $ns = $nameserver[1];
- chomp $ns;
- $current_dhcp_nameservers[$ns_count] = $ns;
- $ns_count++;
- my @search_ns_in_resolvconf = `grep $ns /etc/resolv.conf`;
- my $ns_in_resolvconf = 0;
- if (@search_ns_in_resolvconf > 0) {
- foreach my $ns_resolvconf (@search_ns_in_resolvconf) {
- my @resolv_ns = split(/\s+/, $ns_resolvconf);
- my $final_ns = $resolv_ns[1];
- chomp $final_ns;
- if ($final_ns eq $ns) {
- $ns_in_resolvconf = 1;
- }
- }
- }
- if ($ns_in_resolvconf == 0) {
- open (my $rf, '>>', '/etc/resolv.conf')
- or die "$! error trying to overwrite";
- print $rf "#nameserver\t$ns\t\t#nameserver written by $0\n";
- print $rf "nameserver\t$ns\n";
- close $rf;
- $restart_ntp = 1;
- }
+# and there aren't statically configured DNS settings, via 'set system name-server', in place.
+if (($dhclient_script == 1) && !($vc->existsOrig('name-server'))) {
+ my @current_dhcp_nameservers;
+ my $restart_ntp = 0;
+
+ # code below to add new name-servers received from dhcp client
+
+ my @dhcp_interfaces_resolv_files = `ls /etc/ | grep resolv.conf.dhclient-new`;
+ if ($#dhcp_interfaces_resolv_files >= 0) {
+ my $ns_count = 0;
+ for my $each_file (@dhcp_interfaces_resolv_files) {
+ chomp $each_file;
+ my $find_nameserver = `grep nameserver /etc/$each_file 2> /dev/null | wc -l`;
+ if ($find_nameserver > 0) {
+ my @nameservers = `grep nameserver /etc/$each_file`;
+ for my $each_nameserver (@nameservers) {
+ my @nameserver = split(/ /, $each_nameserver, 2);
+ my $ns = $nameserver[1];
+ chomp $ns;
+ $current_dhcp_nameservers[$ns_count] = $ns;
+ $ns_count++;
+ my @search_ns_in_resolvconf = `grep $ns /etc/resolv.conf`;
+ my $ns_in_resolvconf = 0;
+ if (@search_ns_in_resolvconf > 0) {
+ foreach my $ns_resolvconf (@search_ns_in_resolvconf) {
+ my @resolv_ns = split(/\s+/, $ns_resolvconf);
+ my $final_ns = $resolv_ns[1];
+ chomp $final_ns;
+ if ($final_ns eq $ns) {
+ $ns_in_resolvconf = 1;
+ }
+ }
+ }
+ if ($ns_in_resolvconf == 0) {
+ open (my $rf, '>>', '/etc/resolv.conf')
+ or die "$! error trying to overwrite";
+ print $rf "#nameserver\t$ns\t\t#nameserver written by $0\n";
+ print $rf "nameserver\t$ns\n";
+ close $rf;
+ $restart_ntp = 1;
+ }
+ }
}
- }
+ }
}
- }
-
- # code below to remove old name-servers from /etc/resolv.conf that were not received in this response from dhcp-server
-
- my @nameservers_dhcp_in_resolvconf = `grep 'nameserver written' /etc/resolv.conf`;
- my @dhcp_nameservers_in_resolvconf;
- my $count_nameservers_in_resolvconf = 0;
- for my $count_dhcp_nameserver (@nameservers_dhcp_in_resolvconf) {
- my @dhcp_nameserver = split(/\t/, $count_dhcp_nameserver, 3);
- $dhcp_nameservers_in_resolvconf[$count_nameservers_in_resolvconf] = $dhcp_nameserver[1];
- $count_nameservers_in_resolvconf++;
- }
- if ($#current_dhcp_nameservers < 0) {
- for my $dhcpnameserver (@dhcp_nameservers_in_resolvconf) {
- my $cmd = "sed -i '/$dhcpnameserver\t/d' /etc/resolv.conf";
- system($cmd);
- $restart_ntp = 1;
+
+ # code below to remove old name-servers from /etc/resolv.conf that were not received in this response from dhcp-server
+
+ my @nameservers_dhcp_in_resolvconf = `grep 'nameserver written' /etc/resolv.conf`;
+ my @dhcp_nameservers_in_resolvconf;
+ my $count_nameservers_in_resolvconf = 0;
+ for my $count_dhcp_nameserver (@nameservers_dhcp_in_resolvconf) {
+ my @dhcp_nameserver = split(/\t/, $count_dhcp_nameserver, 3);
+ $dhcp_nameservers_in_resolvconf[$count_nameservers_in_resolvconf] = $dhcp_nameserver[1];
+ $count_nameservers_in_resolvconf++;
}
- } else {
- for my $dhcpnameserver (@dhcp_nameservers_in_resolvconf) {
+ if ($#current_dhcp_nameservers < 0) {
+ for my $dhcpnameserver (@dhcp_nameservers_in_resolvconf) {
+ my $cmd = "sed -i '/$dhcpnameserver\t/d' /etc/resolv.conf";
+ system($cmd);
+ $restart_ntp = 1;
+ }
+ } else {
+ for my $dhcpnameserver (@dhcp_nameservers_in_resolvconf) {
my $found = 0;
for my $currentnameserver (@current_dhcp_nameservers) {
- if ($dhcpnameserver eq $currentnameserver){
- $found = 1;
- }
+ if ($dhcpnameserver eq $currentnameserver){
+ $found = 1;
+ }
}
if ($found == 0) {
- my $cmd = "sed -i '/$dhcpnameserver\t/d' /etc/resolv.conf";
- system($cmd);
- $restart_ntp = 1;
+ my $cmd = "sed -i '/$dhcpnameserver\t/d' /etc/resolv.conf";
+ system($cmd);
+ $restart_ntp = 1;
}
-
}
- }
- if ($restart_ntp == 1) {
- # this corresponds to what is done in name-server/node.def as a fix for bug 1300
- my $cmd_ntp_restart = "if [ -f /etc/ntp.conf ] && grep -q '^server' /etc/ntp.conf; then /usr/sbin/invoke-rc.d ntp restart >&/dev/null; fi &";
- system($cmd_ntp_restart);
- }
+ }
+ if ($restart_ntp == 1) {
+ # this corresponds to what is done in name-server/node.def as a fix for bug 1300
+ my $cmd_ntp_restart = "if [ -f /etc/ntp.conf ] && grep -q '^server' /etc/ntp.conf; then /usr/sbin/invoke-rc.d ntp restart >&/dev/null; fi &";
+ system($cmd_ntp_restart);
+ }
}
-
# The following will re-write '/etc/resolv.conf' line by line,
# replacing the 'search' specifier with the latest values,
# or replacing the 'domain' specifier with the latest value.
@@ -187,12 +185,11 @@ if ($dhclient_script == 1) {
my @resolv;
if (-e '/etc/resolv.conf') {
open (my $f, '<', '/etc/resolv.conf')
- or die("$0: Error! Unable to open '/etc/resolv.conf' for input: $!\n");
+ or die("$0: Error! Unable to open '/etc/resolv.conf' for input: $!\n");
@resolv = <$f>;
close ($f);
}
-
my $foundSearch = 0;
my $foundDomain = 0;
@@ -200,26 +197,26 @@ open (my $r, '>', '/etc/resolv.conf')
or die("$0: Error! Unable to open '/etc/resolv.conf' for output: $!\n");
foreach my $line (@resolv) {
- if ($line =~ /^search\s/) {
- $foundSearch = 1;
- if (length($search) > 0) {
- print $r $search;
- }
- } elsif ($line =~ /^domain\s/) {
- $foundDomain = 1;
- if (length($domain) > 0) {
- print $r $domain;
- }
- } else {
- print $r $line;
- }
+ if ($line =~ /^search\s/) {
+ $foundSearch = 1;
+ if (length($search) > 0) {
+ print $r $search;
+ }
+ } elsif ($line =~ /^domain\s/) {
+ $foundDomain = 1;
+ if (length($domain) > 0) {
+ print $r $domain;
+ }
+ } else {
+ print $r $line;
+ }
}
+
if ($foundSearch == 0 && length($search) > 0) {
- print $r $search;
+ print $r $search;
}
if ($foundDomain == 0 && length($domain) > 0) {
- print $r $domain;
+ print $r $domain;
}
close ($r);
-
diff --git a/scripts/vyatta-address b/scripts/vyatta-address
index 08e14196..3cc1755b 100755
--- a/scripts/vyatta-address
+++ b/scripts/vyatta-address
@@ -9,45 +9,49 @@ if [ $# -ne 3 ]; then
fi
case $1 in
- add)
- if [[ "$3" = "dhcp" ]]
- then
- exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=start
- elif [[ "$3" = "dhcpv6" ]]
- then
+ add)
+ if [[ "$3" = "dhcp" ]]; then
+ exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=start
+ elif [[ "$3" = "dhcpv6" ]]; then
exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --start -ifname "$2"
- elif [[ "$3" =~ ":" ]]
- then # Ipv6 address
- if ! ip -6 addr list dev $2 | grep -q $3; then
- exec ip -6 addr add "$3" dev "$2"
- fi
- else
- if ! ip addr list dev $2 | grep -q $3; then
- exec ip addr add "$3" broadcast + dev "$2"
- fi
- fi ;;
+ elif [[ "$3" =~ ":" ]]; then
+ # Ipv6 address
+ if ! ip -6 addr list dev $2 | grep -q $3; then
+ exec ip -6 addr add "$3" dev "$2"
+ fi
+ else
+ if ! ip addr list dev $2 | grep -q $3; then
+ exec ip addr add "$3" broadcast + dev "$2"
+ fi
+ fi ;;
- delete)
- if ! /sbin/ip address show dev $2 2>/dev/null | grep -q "$3"; then
+ delete)
+ # Get current address from interface when using DHCP
+ if [[ "$3" = "dhcp" ]]; then
+ file=/var/lib/dhcp3/dhclient_"$2"_lease;
+ ip_address=$(sed -n "/new_ip_address='/ s/.*\='*//p" $file | sed -n "s/'//p");
+ else
+ ip_address=$3;
+ fi
+
+ if ! /sbin/ip address show dev $2 2>/dev/null | grep -q "$ip_address"; then
# Address doesn't exist there, nothing to delete
exit 0
fi
- if [ ! -d "/sys/class/net/$2" ]
- then # device is already gone
- exit 0
- elif [[ "$3" = "dhcp" ]]
- then
- exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=stop
- elif [[ "$3" = "dhcpv6" ]]
- then
- exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --stop --ifname "$2"
- elif [[ "$3" =~ ":" ]]
- then
- exec ip -6 addr del "$3" dev "$2"
- else
- exec ip addr del "$3" dev "$2"
- fi ;;
- *)
- echo "Unknown option $1"
- exit 1 ;;
+
+ if [ ! -d "/sys/class/net/$2" ]; then
+ # device is already gone
+ exit 0
+ elif [[ "$3" = "dhcp" ]]; then
+ exec /opt/vyatta/sbin/vyatta-interfaces.pl --dev="$2" --dhcp=stop
+ elif [[ "$3" = "dhcpv6" ]]; then
+ exec /opt/vyatta/sbin/vyatta-dhcpv6-client.pl --stop --ifname "$2"
+ elif [[ "$3" =~ ":" ]]; then
+ exec ip -6 addr del "$3" dev "$2"
+ else
+ exec ip addr del "$3" dev "$2"
+ fi ;;
+ *)
+ echo "Unknown option $1"
+ exit 1 ;;
esac