=== modified file 'debian/changelog' --- debian/changelog 2011-09-23 15:26:33 +0000 +++ debian/changelog 2011-09-23 16:08:18 +0000 @@ -1,3 +1,9 @@ +isc-dhcp (4.1.1-P1-17ubuntu11) UNRELEASED; urgency=low + + * debian/dhclient-script.linux: fix for read-only /etc (LP: #857524) + + -- Scott Moser Fri, 23 Sep 2011 12:07:24 -0400 + isc-dhcp (4.1.1-P1-17ubuntu10) oneiric; urgency=low * make sure writing of /etc/resolv.conf actually waits until the file is === modified file 'debian/dhclient-script.linux' --- debian/dhclient-script.linux 2011-09-23 15:26:18 +0000 +++ debian/dhclient-script.linux 2011-09-23 16:07:04 +0000 @@ -12,8 +12,9 @@ # The alias handling in here probably still sucks. -mdz -# wait for /etc/resolv.conf to become writable +# wait for given file to be writable wait_for_rw() { + local file=$1 # Find out whether we are going to mount / rw exec 9>&0 &9 9>&- - # Wait for /etc/resolv.conf to become writable + # Wait for $file to become writable if [ "$rootmode" = "rw" ]; then - while ! { : >> /etc/resolv.conf; } 2>/dev/null; do + while ! { : >> "$file"; } 2>/dev/null; do sleep 0.1 done fi @@ -37,17 +38,19 @@ # update /etc/resolv.conf based on received values make_resolv_conf() { - local new_resolv_conf + local old_ns="" + [ -e /etc/resolv.conf ] && + old_ns=$(sed -n \ + /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf) # DHCPv4 if [ -n "$new_domain_search" ] || [ -n "$new_domain_name" ] || [ -n "$new_domain_name_servers" ]; then - wait_for_rw - new_resolv_conf=/etc/resolv.conf.dhclient-new - rm -f $new_resolv_conf + wait_for_rw /etc/resolv.conf + { if [ -n "$new_domain_name" ]; then - echo domain ${new_domain_name%% *} >>$new_resolv_conf + echo domain ${new_domain_name%% *} fi if [ -n "$new_domain_search" ]; then @@ -63,43 +66,36 @@ new_domain_search="$new_domain_name $new_domain_search" fi fi - echo "search ${new_domain_search}" >> $new_resolv_conf + echo "search ${new_domain_search}" elif [ -n "$new_domain_name" ]; then - echo "search ${new_domain_name}" >> $new_resolv_conf + echo "search ${new_domain_name}" fi if [ -n "$new_domain_name_servers" ]; then for nameserver in $new_domain_name_servers; do - echo nameserver $nameserver >>$new_resolv_conf + echo nameserver $nameserver done - else # keep 'old' nameservers - sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf >>$new_resolv_conf + elif [ -n "$old_ns" ]; then # keep 'old' nameservers + echo "$old_ns" fi - - chown --reference=/etc/resolv.conf $new_resolv_conf - chmod --reference=/etc/resolv.conf $new_resolv_conf - mv -f $new_resolv_conf /etc/resolv.conf + } > /etc/resolv.conf # DHCPv6 elif [ -n "$new_dhcp6_domain_search" ] || [ -n "$new_dhcp6_name_servers" ]; then - wait_for_rw - new_resolv_conf=/etc/resolv.conf.dhclient-new - rm -f $new_resolv_conf + wait_for_rw /etc/resolv.conf + { if [ -n "$new_dhcp6_domain_search" ]; then - echo "search ${new_dhcp6_domain_search}" >> $new_resolv_conf + echo "search ${new_dhcp6_domain_search}" fi if [ -n "$new_dhcp6_name_servers" ]; then for nameserver in $new_dhcp6_name_servers; do - echo nameserver $nameserver >>$new_resolv_conf + echo nameserver $nameserver done - else # keep 'old' nameservers - sed -n /^\w*[Nn][Aa][Mm][Ee][Ss][Ee][Rr][Vv][Ee][Rr]/p /etc/resolv.conf >>$new_resolv_conf + elif [ -n "$old_ns" ]; then # keep 'old' nameservers + echo "$old_ns" fi - - chown --reference=/etc/resolv.conf $new_resolv_conf - chmod --reference=/etc/resolv.conf $new_resolv_conf - mv -f $new_resolv_conf /etc/resolv.conf + } > /etc/resolv.conf fi }