#!/bin/bash
### BEGIN INIT INFO
# Provides:          networking ifupdown
# Required-Start:    mountkernfs $local_fs urandom
# Required-Stop:     $local_fs
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Raise network interfaces.
# Description:       Prepare /run/network directory, ifstate file and raise network interfaces, or take them down.
### END INIT INFO

PATH="/sbin:/bin"
RUN_DIR="/run/network"
IFSTATE_LOCKFILE="${RUN_DIR}/ifstatelock"

STATE_DIR="/var/tmp/network"
IFSTATE_FILE="${STATE_DIR}/ifstatenew"

NAME=networking
SCRIPTNAME=/etc/init.d/$NAME

[ -x /sbin/ifup ] || exit 0
[ -x /sbin/ifdown ] || exit 0

. /lib/lsb/init-functions

CONFIGURE_INTERFACES=yes

EXTRA_ARGS=

[ -f /etc/default/networking ] && . /etc/default/networking

[ "$VERBOSE" = yes ] && EXTRA_ARGS=-v
[ "$DEBUG" = yes ] && EXTRA_ARGS="$EXTRA_ARGS -d"
[ "$SYSLOG" = yes ] && EXTRA_ARGS="$EXTRA_ARGS --syslog"

gen_examples() {
    # Generate sample interfaces file. The interfaces files are
    # generated under /usr/share/doc/python-ifupdown2/examples/
    #

    # generate files only at boot
    [ -f ${IFSTATE_LOCKFILE} ] && return

    python_ifupdown2_docdir="/usr/share/doc/python-ifupdown2"
    swpfile=${python_ifupdown2_docdir}"/examples/swp_defaults"
    bridgedefaultfile=${python_ifupdown2_docdir}"/examples/bridge_untagged_default"
    interfaces_gen_script=${python_ifupdown2_docdir}"/examples/generate_interfaces.py"

    [ ! -e $interfaces_gen_script ] && return
    ret=$($interfaces_gen_script -s 2>&1 >$swpfile)
    ret=$($interfaces_gen_script -b 2>&1 >$bridgedefaultfile)
    return
}

perf_options() {
    # At bootup lets set perfmode
    [ -f ${IFSTATE_LOCKFILE} ] && echo -n "" && return

    echo -n "--perfmode"
}

process_exclusions() {
    set -- $EXCLUDE_INTERFACES
    exclusions=""
    for d
    do
	exclusions="-X $d $exclusions"
    done
    echo $exclusions
}

check_network_file_systems() {
    [ -e /proc/mounts ] || return 0

    if [ -e /etc/iscsi/iscsi.initramfs ]; then
	log_warning_msg "not deconfiguring network interfaces: iSCSI root is mounted."
	exit 0
    fi

    while read DEV MTPT FSTYPE REST; do
	case $DEV in
	/dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*)
	    log_warning_msg "not deconfiguring network interfaces: network devices still mounted."
	    exit 0
	    ;;
	esac
	case $FSTYPE in
	nfs|nfs4|smbfs|ncp|ncpfs|cifs|coda|ocfs2|gfs|pvfs|pvfs2|fuse.httpfs|fuse.curlftpfs)
	    log_warning_msg "not deconfiguring network interfaces: network file systems still mounted."
	    exit 0
	    ;;
	esac
    done < /proc/mounts
}

check_network_swap() {
    [ -e /proc/swaps ] || return 0

    while read DEV MTPT FSTYPE REST; do
	case $DEV in
	/dev/nbd*|/dev/nd[a-z]*|/dev/etherd/e*)
	    log_warning_msg "not deconfiguring network interfaces: network swap still mounted."
	    exit 0
	    ;;
	esac
    done < /proc/swaps
}

ifup_hotplug () {
    if [ -d /sys/class/net ]
    then
	    ifaces=$(for iface in $(ifquery --list --allow=hotplug 2>/dev/null)
			    do
				    link=${iface##:*}
				    link=${link##.*}
				    if [ -e "/sys/class/net/$link" ] && [ "$(cat /sys/class/net/$link/operstate)" = up ]
				    then
					    echo "$iface"
				    fi
			    done)
	    if [ -n "$ifaces" ]
	    then
		ifup $ifaces "$@" || true
	    fi
    fi
}

ifupdown_init() {
    	# remove state file at boot
	[ ! -e ${IFSTATE_LOCKFILE} ] && rm -f ${IFSTATE_FILE}
	[ ! -e /run/network ] && mkdir -p /run/network &>/dev/null
	[ ! -e /etc/network/run ] && \
		ln -sf /run/network /etc/network/run &>/dev/null
}

case "$1" in
start)
    	gen_examples
	ifupdown_init
	if [ "$CONFIGURE_INTERFACES" = no ]
	then
	    log_action_msg "Not configuring network interfaces, see /etc/default/networking"
	    exit 0
	fi
	set -f
	exclusions=$(process_exclusions)
	perfoptions=$(perf_options)
	log_action_begin_msg "Configuring network interfaces"
	ifup -a $EXTRA_ARGS $exclusions $perfoptions 
	log_action_end_msg $?
	;;

stop)
	if [ "$SKIP_DOWN_AT_SYSRESET" = "yes" ]; then
		shutdown_or_reboot=$(runlevel 2>/dev/null | \
				     /usr/bin/tr -s " " | \
				     /usr/bin/cut -d " " \
				     -f1- --output-delimiter=$'\n' | \
				     /bin/grep -e "0" -e "6")
		if [ -n "$shutdown_or_reboot" ]; then
			log_action_begin_msg "Deconfiguring network interfaces..skip"
			log_action_end_msg 0
			exit 0
		fi
	fi
	ifupdown_init
	check_network_file_systems
	check_network_swap
	exclusions=$(process_exclusions)

	log_action_begin_msg "Deconfiguring network interfaces"
	ifdown -a $EXTRA_ARGS $exclusions
	log_action_end_msg $?
	;;

reload)

	ifupdown_init
	log_action_begin_msg "Reloading network interfaces configuration"

	ifreload -a $EXTRA_ARGS
	log_action_end_msg $?
	;;

reload-currently-up)

	ifupdown_init
	log_action_begin_msg "Reloading currently up network interfaces configuration"

	ifreload --currently-up $EXTRA_ARGS
	log_action_end_msg $?
	;;

force-reload)

	ifupdown_init

	log_action_begin_msg "Reloading network interfaces configuration"
	ifreload -f -a $EXTRA_ARGS
	log_action_end_msg $?
	;;

restart)
	ifupdown_init

	set -f
	exclusions=$(process_exclusions)
	log_action_begin_msg "Reconfiguring network interfaces"
	ifdown -a $EXTRA_ARGS $exclusions || true
	ifup -a $EXTRA_ARGS $exclusions
	log_action_end_msg $?
	;;

*)
	echo "Usage: /etc/init.d/networking {start|stop|reload|restart|force-reload}"
	exit 1
	;;
esac

exit 0

# vim: noet ts=8
