#!/bin/sh set -e MYNAME="${0##*/}" report() { echo "${MYNAME}: $*" ; } report_warn() { report "Warning: $*" >&2 ; } report_err() { report "Error: $*" >&2 ; } # Create /etc/network/run if [ "$1" = configure -a ! -d /etc/network/run ]; then if [ -e /etc/network/run -o -L /etc/network/run ]; then echo "Renaming non-directory /etc/network/run to run.dpkg-old..." mv /etc/network/run /etc/network/run.dpkg-old fi # The best choice is to use /run/network # That must be supported everywhere [ -d /run/network ] || mkdir /run/network ln -s /run/network /etc/network/run fi # Move /etc/network/ifstate to /etc/network/run/ifstate if [ "$1" = configure -a "$2" != "" -a -e /etc/network/ifstate ] && dpkg --compare-versions "$2" lt "0.6.5" then if [ ! -e /etc/network/run/ifstate ] || ! diff /etc/network/ifstate /etc/network/run/ifstate >/dev/null then echo "Moving /etc/network/ifstate to /etc/network/run/ifstate" if [ ! -L /etc/network/ifstate ]; then mv /etc/network/ifstate /etc/network/run/ifstate else cat /etc/network/ifstate >/etc/network/run/ifstate mv /etc/network/ifstate /etc/network/ifstate.dpkg-old fi fi fi l=$(readlink /etc/network/run || echo /etc/network/run) # Migrate /etc/network/run to /run/network if [ "$1" = configure -a "$2" != "" -a -e /etc/network/run -a "$l" != "/run/network" ] then echo "Migrating network state directory from $l to /run/network..." [ -d /run/network ] || mkdir /run/network if [ -e /etc/network/run/ifstate ] then echo "Moving /etc/network/run/ifstate to /run/network/ifstate" if [ ! -L /etc/network/run/ifstate ]; then mv -f /etc/network/run/ifstate /run/network/ifstate else # we do this thing with .dpkg-new just so we don't truncate the # state file in the case of crazy symlinked or mount-bound setup cat /etc/network/run/ifstate >/run/network/ifstate.dpkg-new mv -f /etc/network/run/ifstate /run/network/ifstate.dpkg-old mv -f /run/network/ifstate.dpkg-new /run/network/ifstate fi fi mv -f /etc/network/run /etc/network/run.dpkg-old ln -s /run/network /etc/network/run rmdir /etc/network/run.dpkg-old 2>/dev/null || report_warn "Not removing the old contents of /etc/network/run: directory not empty; renamed into /etc/network/run.dpkg-old." fi if [ "$1" = "configure" -a "$2" != "" ] && dpkg --compare-versions "$2" le "0.6.4-4.1" && [ -f /etc/network/run/ifstate -a -x /sbin/dhclient ] then # for every active ifupdown-controlled dhclient interface, copy # /var/run/dhclient.pid, so that the new ifdown is able to kill # dhclient. # # the old version had a bug with more than one DHCP iface anyway, # so we don't know which one the PID file actually belongs to. sed -e 's/^.*=//' /etc/network/run/ifstate | while read iface; do # handle \-continued lines if sed -e '/^[[:space:]]*#/b;:g /\\$/{N;s/\\\n//;bg;}' /etc/network/interfaces | grep -qe "^[[:space:]]*iface[[:space:]]*\\b${iface}\\b[[:space:]]*.*\\bdhcp\\b.*" && [ -f "/var/run/dhclient.pid" ] && [ ! -f "/var/run/dhclient.${iface}.pid" ] then # copy original file. If dhclient was started # manually, one can still use dhclient.pid, if started # by ifupdown, the new ifupdown can take it down with # dhclient.${iface}.pid. Obsolete files are removed during # next boot (bootmisc.sh). cp /var/run/dhclient.pid "/var/run/dhclient.${iface}.pid" fi done fi # Remove the ifupdown and ifupdown-clean init script symlinks if [ "$1" = "configure" -a "$2" != "" ] && dpkg --compare-versions "$2" lt "0.6.7ubuntu4" then rm -f /etc/init.d/ifupdown /etc/init.d/ifupdown-clean rm -f /etc/default/ifupdown update-rc.d -f ifupdown remove update-rc.d -f ifupdown-clean remove fi # Generic stuff done on all configurations if [ "$1" = "configure" ] ; then if [ -f /etc/network/interfaces ] ; then # TODO: This should be handled with debconf and the script # could introduce the line there directly if ! grep -q "^[[:space:]]*iface[[:space:]]\+lo[[:space:]]\+inet[[:space:]]\+loopback\>" /etc/network/interfaces ; then report_warn "No 'iface lo' definition found in /etc/network/interfaces" report_warn " adding it for you" if ! grep -q "^[[:space:]]*auto[[:space:]].*\" /etc/network/interfaces ; then # both are missing? add the whole block report_warn "No 'auto lo' statement found in /etc/network/interfaces" report_warn " adding it for you" cat >> /etc/network/interfaces </a\ iface lo inet loopback' /etc/network/interfaces fi fi if ! grep -q "^[[:space:]]*auto[[:space:]].*\" /etc/network/interfaces ; then report_warn "No 'auto lo' statement found in /etc/network/interfaces" report_warn " adding it for you" sed -i -e'/^[[:space:]]*iface[[:space:]]\+lo[[:space:]]\+inet[[:space:]]\+loopback\>/i\ auto lo' /etc/network/interfaces fi else # ! -f /etc/network/interfaces echo "Creating /etc/network/interfaces." echo "# interfaces(5) file used by ifup(8) and ifdown(8)" > /etc/network/interfaces echo "auto lo" >> /etc/network/interfaces echo "iface lo inet loopback" >> /etc/network/interfaces fi fi