#!/bin/sh
#
# NetworkManager:   NetworkManager daemon
#
# chkconfig: - 40 90
# description:  This is a daemon for automatically switching network \
#               connections to the best available connection.
#
# processname: NetworkManager
# pidfile: /var/run/NetworkManager/NetworkManager.pid
#
### BEGIN INIT INFO
# Provides: network_manager
# Required-Start: $local_fs messagebus haldaemon
# Required-Stop: $local_fs messagebus haldaemon
# Default-Start:  3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop NetworkManager
# Description: NetworkManager is a tool for easily managing network connections
### END INIT INFO

# Do not load RH compatibility interface.
WITHOUT_RC_COMPAT=1

# Source function library.
. /etc/init.d/functions

PIDFILE=/var/run/NetworkManager/NetworkManager.pid
LOCKFILE=/var/lock/subsys/NetworkManager
DBUS_SEND=/usr/bin/dbus-send
RETVAL=0

stop_daemon_private()
{
	local ANNOUNCE BASENAME CMDNAME DEFAULT DISPNAME EXPECT FLAGS HUPSIG LOCKFILE MESSAGE NAME PIDFILE RETRY SIGNAL STATUS WHICH

# Process options.
	ANNOUNCE=1
	CMDNAME=
	DEFAULT=true
	DISPNAME=
	EXPECT=
	LOCKFILE=
	NAME=
	PIDFILE=
	RETRY=
# start-stop-daemon wants a signal number.
	SIGNAL="$(kill -l TERM)" || SIGNAL=15
	HUPSIG="$(kill -l HUP)" || HUPSIG=1
	while [ $# -ge 1 ]; do
		case "$1" in
		--)
			shift
			[ -z "$NAME" ] || return 1
			NAME="$1"
			break
			;;
		--announce)
			shift
			ANNOUNCE=1
			;;
		--no-announce)
			shift
			ANNOUNCE=
			;;
		--displayname)
			shift
			DISPNAME="$1"
			shift
			;;
		--expect-user)
			shift
			EXPECT="$1"
			shift
			;;
		--lockfile)
			shift
			LOCKFILE="$1"
			shift
			;;
		--name)
			shift
			CMDNAME="$1"
			shift
			;;
		--pidfile)
			shift
			PIDFILE="$1"
			shift
			;;
		--retry)
			shift
			RETRY="$1"
			shift
			;;
		-[0-9]*)
			SIGNAL="${1##-}"
			DEFAULT=false
			shift
			;;
		-*)
			SIGNAL="${1##-}"
			SIGNAL="$(kill -l -- "$SIGNAL")" || return 1
			DEFAULT=false
			ANNOUNCE=
			shift
			;;
# Allow the process name to be in any argument for Red Hat compatibility.
		*)
			[ -z "$NAME" ] || return 1
			NAME="$1"
			shift
			;;
		esac
	done

# We need the absolute pathname for /proc/*/exe checks.
	if [ -z "$NAME" ]; then
		msg_usage "stop_daemon [options]... {program}..."
		return 1
	fi
	WHICH="$(absolute "$NAME")" || return 1
	[ -n "$CMDNAME" ] &&
		BASENAME="$(basename "$CMDNAME")" ||
		BASENAME="$(basename "$NAME")" || return 1

	[ -n "$DISPNAME" ] || DISPNAME="$BASENAME"

# Try to guess the PID file if one isn't specified manually.
	if [ -z "$PIDFILE" ]; then
		PIDFILE="/var/run/$BASENAME.pid"
		[ -f "$PIDFILE" ] || PIDFILE=
	elif [ "$PIDFILE" = none ]; then
		PIDFILE=
	fi

	if [ -n "$CMDNAME" -a -z "$PIDFILE" ]; then
		echo "stop_daemon: --name is set but --pidfile is not set" >&2
		return 1
	fi

	FLAGS="--stop"
	[ -z "$CMDNAME" ] &&
		FLAGS="$FLAGS --exec $WHICH" ||
		FLAGS="$FLAGS --name $CMDNAME"
	[ -z "$PIDFILE" ] || FLAGS="$FLAGS --pidfile $PIDFILE"
	[ -z "$EXPECT" ] || FLAGS="$FLAGS --user $EXPECT"
	[ -z "$RETRY" ] || FLAGS="$FLAGS --retry $RETRY"

	if [ "$DEFAULT" = true ]; then
		MESSAGE="$BASENAME shutdown"
	else
		MESSAGE="sending signal $SIGNAL to $BASENAME"
	fi

# Is it running at all?
	if ! start-stop-daemon $FLAGS --test > /dev/null; then
		msg_not_running "$DISPNAME"
		[ -z "$LOCKFILE" ] || rm -f "$LOCKFILE"
		passed "$MESSAGE"
		STATUS=$?
		echo
		return $STATUS
	fi

# Announce the action.
	[ -z "$ANNOUNCE" ] || msg_stopping "$DISPNAME"

# Actually tell the daemon to stop.
#	echo "FLAGS: '$FLAGS' SIGNAL=$SIGNAL"
	start-stop-daemon $FLAGS --signal "$SIGNAL"
	STATUS=$?

# We really want to be sure the daemon is dead, unless we're sending a
# custom signal.
	if [ "$DEFAULT" = true -a $STATUS -eq 0 ]; then
		usleep 100000
		if start-stop-daemon $FLAGS --test > /dev/null; then
			sleep 1
			SIGNAL="$(kill -l KILL)" || SIGNAL=9
			start-stop-daemon $FLAGS --signal "$SIGNAL" > /dev/null
		fi
		[ -z "$PIDFILE" ] || rm -f "$PIDFILE"
	fi
	if [ $STATUS = 0 ]; then
		[ -z "$LOCKFILE" -o "$SIGNAL" = "$HUPSIG" ] || rm -f "$LOCKFILE"
		[ "$BOOTUP" != verbose ] || echo -n " $DISPNAME "
		success "$MESSAGE"
	else
		failure "$MESSAGE"
	fi
	echo

	return $STATUS
}

start()
{
	action "Setting network parameters... " 'sysctl -e -p /etc/net/sysctl.conf >/dev/null 2>&1'
	start_daemon --lockfile "$LOCKFILE" --pidfile "$PIDFILE" --expect-user root -- NetworkManager --pid-file=$PIDFILE
	RETVAL=$?
	return $RETVAL
}

stop()
{
	stop_daemon_private --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --expect-user root --retry 4 -- NetworkManager
	RETVAL=$?
	killall nm-system-settings >/dev/null 2>&1
	killall nm-dispatcher.action >/dev/null 2>&1
	return $RETVAL
}

restart()
{
	stop
	start
}

nm_sleep()
{
	[ -x "$DBUS_SEND" ] &&
	action "Put NetworkManager to sleep" "$DBUS_SEND" --system \
						--dest=org.freedesktop.NetworkManager \
						--type=method_call \
						/org/freedesktop/NetworkManager \
						org.freedesktop.NetworkManager.sleep
}

nm_wake()
{
	[ -x "$DBUS_SEND" ] &&
	action "To wake NetworkManager" "$DBUS_SEND" --system \
						--dest=org.freedesktop.NetworkManager \
						--type=method_call \
						/org/freedesktop/NetworkManager \
						org.freedesktop.NetworkManager.wake
}

# See how we were called.
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	status)
		status --pidfile "$PIDFILE" --expect-user root -- NetworkManager
		RETVAL=$?
		;;
	reload|restart)
		restart
		;;
	condstop)
		if [ -e "$LOCKFILE" ]; then
			stop
		fi
		;;
	condreload|condrestart)
		if [ -e "$LOCKFILE" ]; then
			restart
		fi
		;;
	sleep)
		nm_sleep
		;;
	wake)
		nm_wake
		;;
	*)
		msg_usage "${0##*/} {start|stop|reload|restart|condstop|condrestart|condreload|status|sleep|wake}"
		RETVAL=1
esac

exit $RETVAL
