diff options
author | Daniil Baturin <daniil@baturin.org> | 2014-09-08 20:12:53 +0700 |
---|---|---|
committer | Daniil Baturin <daniil@baturin.org> | 2014-09-08 20:12:53 +0700 |
commit | d186a399184811b75786b820103aec43722c8a74 (patch) | |
tree | a393dc1005aade6aa3aa3eac25ea981b4d5aabd6 | |
parent | 78d4ce4504f87f8135b3ca9b524f6ccf3b570634 (diff) | |
parent | 1a2d4456587604730cb29bf635253941a50669ab (diff) | |
download | vyatta-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-x | scripts/system/vyatta_update_resolv.pl | 233 | ||||
-rwxr-xr-x | scripts/vyatta-address | 76 |
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 |