218 lines
5.8 KiB
Bash
Executable File
218 lines
5.8 KiB
Bash
Executable File
#!/bin/sh -e
|
|
|
|
### BEGIN INIT INFO
|
|
# Provides: fastd
|
|
# Required-Start: $network $remote_fs $syslog
|
|
# Required-Stop: $network $remote_fs $syslog
|
|
# Should-Start: network-manager
|
|
# Should-Stop: network-manager
|
|
# Default-Start: 2 3 4 5
|
|
# Default-Stop: 0 1 6
|
|
# Short-Description: Fast and Secure Tunneling Daemon
|
|
# Description: This script will start fastd tunnels as specified
|
|
# in /etc/default/fastd and /etc/fastd/*/fastd.conf
|
|
### END INIT INFO
|
|
|
|
# Derived from the OpenVPN init script
|
|
# Original version by Robert Leslie
|
|
# <rob@mars.org>, edited by iwj and cs
|
|
# Modified for openvpn by Alberto Gonzalez Iniesta <agi@inittab.org>
|
|
# Modified for restarting / starting / stopping single tunnels by Richard Mueller <mueller@teamix.net>
|
|
# Modified for fastd by Nils Schneider <nils@nilsschneider.net>
|
|
# Beautified by Thomas Hooge <pirat@hoogi.de>
|
|
|
|
. /lib/lsb/init-functions
|
|
|
|
test $DEBIAN_SCRIPT_DEBUG && set -v -x
|
|
|
|
DESC="Fast and Secure Tunneling Daemon"
|
|
NAME=fastd
|
|
DAEMON=/usr/local/bin/$NAME
|
|
CONFIG_DIR=/etc/fastd
|
|
SCRIPTNAME=/etc/init.d/$NAME
|
|
|
|
# Exit if the package is not installed
|
|
[ -x "$DAEMON" ] || exit 0
|
|
|
|
# Exit if the configuration directory is not existent
|
|
[ -d $CONFIG_DIR ] || exit 0
|
|
|
|
# Source defaults file; edit that file to configure this script.
|
|
AUTOSTART="all"
|
|
if test -e /etc/default/$NAME ; then
|
|
. /etc/default/$NAME
|
|
fi
|
|
|
|
if [ ! -d /var/run/fastd ]; then
|
|
mkdir /var/run/fastd/
|
|
chown fastd. /var/run/fastd
|
|
fi
|
|
|
|
start_vpn () {
|
|
STATUS=0
|
|
start-stop-daemon --start --quiet --oknodo \
|
|
--pidfile /var/run/fastd/$INSTANCE.pid \
|
|
--make-pidfile \
|
|
--background \
|
|
--exec $DAEMON -- \
|
|
--syslog-level info \
|
|
--config $CONFIG_DIR/$INSTANCE/fastd.conf \
|
|
|| STATUS=1
|
|
}
|
|
|
|
stop_vpn () {
|
|
kill `cat $PIDFILE` || true
|
|
rm -f $PIDFILE
|
|
log_end_msg 0
|
|
}
|
|
|
|
case "$1" in
|
|
start)
|
|
log_action_begin_msg "Starting $DESC"
|
|
|
|
# autostart fastds
|
|
if test -z "$2" ; then
|
|
# check if automatic startup is disabled by AUTOSTART=none
|
|
if test "x$AUTOSTART" = "xnone" -o -z "$AUTOSTART" ; then
|
|
log_warning_msg " Autostart disabled, no $NAME will be started."
|
|
exit 0
|
|
fi
|
|
if test -z "$AUTOSTART" -o "x$AUTOSTART" = "xall" ; then
|
|
# all fastds shall be started automatically
|
|
for CONFIG in `cd $CONFIG_DIR; ls */fastd.conf 2> /dev/null`; do
|
|
INSTANCE=${CONFIG%%/fastd.conf}
|
|
log_daemon_msg " Autostarting $NAME '$INSTANCE'"
|
|
start_vpn
|
|
done
|
|
else
|
|
# start only specified fastds
|
|
for INSTANCE in $AUTOSTART ; do
|
|
if test -e $CONFIG_DIR/$INSTANCE/fastd.conf ; then
|
|
log_daemon_msg " Autostarting $NAME '$INSTANCE'"
|
|
start_vpn
|
|
else
|
|
log_failure_msg " Autostarting $NAME '$INSTANCE': missing $CONFIG_DIR/$INSTANCE/fastd.conf file!"
|
|
STATUS=1
|
|
fi
|
|
done
|
|
fi
|
|
#start fastds from command line
|
|
else
|
|
while shift ; do
|
|
[ -z "$1" ] && break
|
|
INSTANCE=$1
|
|
if test -e $CONFIG_DIR/$INSTANCE/fastd.conf ; then
|
|
log_daemon_msg " Starting $NAME '$INSTANCE'"
|
|
start_vpn
|
|
else
|
|
log_failure_msg " Starting $NAME '$INSTANCE': missing $CONFIG_DIR/$INSTANCE/fastd.conf file!"
|
|
STATUS=1
|
|
fi
|
|
done
|
|
fi
|
|
log_end_msg ${STATUS:-0}
|
|
;;
|
|
stop)
|
|
log_action_begin_msg "Stopping $DESC"
|
|
if test -z "$2" ; then
|
|
PIDFILE=
|
|
for PIDFILE in `ls /var/run/fastd/*.pid 2> /dev/null`; do
|
|
INSTANCE=`echo $PIDFILE | cut -c16-`
|
|
INSTANCE=${INSTANCE%%.pid}
|
|
log_daemon_msg " Stopping $NAME '$INSTANCE'"
|
|
stop_vpn
|
|
done
|
|
if test -z "$PIDFILE" ; then
|
|
log_warning_msg " No $NAME is running."
|
|
fi
|
|
else
|
|
while shift ; do
|
|
[ -z "$1" ] && break
|
|
if test -e /var/run/fastd/$1.pid ; then
|
|
log_daemon_msg " Stopping $NAME '$1'"
|
|
PIDFILE=`ls /var/run/fastd/$1.pid 2> /dev/null`
|
|
INSTANCE=`echo $PIDFILE | cut -c16-`
|
|
INSTANCE=${INSTANCE%%.pid}
|
|
stop_vpn
|
|
else
|
|
log_failure_msg " Stopping $NAME '$1': No such $NAME is running."
|
|
fi
|
|
done
|
|
fi
|
|
;;
|
|
restart)
|
|
shift
|
|
$0 stop ${@}
|
|
sleep 1
|
|
$0 start ${@}
|
|
;;
|
|
status)
|
|
GLOBAL_STATUS=0
|
|
if test -z "$2" ; then
|
|
# We want status for all defined fastd.
|
|
# Returns success if all autostarted fastds are defined and running
|
|
if test "x$AUTOSTART" = "xnone" ; then
|
|
# Consider it a failure if AUTOSTART=none
|
|
log_warning_msg "No fastds autostarted"
|
|
GLOBAL_STATUS=1
|
|
else
|
|
if ! test -z "$AUTOSTART" -o "x$AUTOSTART" = "xall" ; then
|
|
# Consider it a failure if one of the autostarted fastd is not defined
|
|
for VPN in $AUTOSTART ; do
|
|
if ! test -f $CONFIG_DIR/$VPN/fastd.conf ; then
|
|
log_warning_msg "fastd '$VPN' is in AUTOSTART but is not defined"
|
|
GLOBAL_STATUS=1
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
for CONFIG in `cd $CONFIG_DIR; ls */fastd.conf 2> /dev/null`; do
|
|
INSTANCE=${CONFIG%%/fastd.conf}
|
|
# Is it an autostarted fastd?
|
|
if test -z "$AUTOSTART" -o "x$AUTOSTART" = "xall" ; then
|
|
AUTOVPN=1
|
|
else
|
|
if test "x$AUTOSTART" = "xnone" ; then
|
|
AUTOVPN=0
|
|
else
|
|
AUTOVPN=0
|
|
for VPN in $AUTOSTART; do
|
|
if test "x$VPN" = "x$NAME" ; then
|
|
AUTOVPN=1
|
|
fi
|
|
done
|
|
fi
|
|
fi
|
|
if test "x$AUTOVPN" = "x1" ; then
|
|
# If it is autostarted, then it contributes to global status
|
|
status_of_proc -p /var/run/fastd/${INSTANCE}.pid $NAME "$NAME '${INSTANCE}'" || GLOBAL_STATUS=1
|
|
else
|
|
status_of_proc -p /var/run/fastd/${INSTANCE}.pid $NAME "$NAME '${INSTANCE}' (non autostarted)" || true
|
|
fi
|
|
done
|
|
else
|
|
# We just want status for specified fastd.
|
|
# Returns success if all specified fastds are defined and running
|
|
while shift ; do
|
|
[ -z "$1" ] && break
|
|
INSTANCE=$1
|
|
if test -e $CONFIG_DIR/$INSTANCE/fastd.conf ; then
|
|
# Config exists
|
|
status_of_proc -p /var/run/fastd/${INSTANCE}.pid $NAME "$NAME '${INSTANCE}'" || GLOBAL_STATUS=1
|
|
else
|
|
# Config does not exist
|
|
log_warning_msg "$NAME '$INSTANCE': missing $CONFIG_DIR/$INSTANCE/fastd.conf file!"
|
|
GLOBAL_STATUS=1
|
|
fi
|
|
done
|
|
fi
|
|
exit $GLOBAL_STATUS
|
|
;;
|
|
*)
|
|
echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|