123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- #!/bin/sh
- ### BEGIN INIT INFO
- # Provides: softflowd
- # Required-Start: $network $remote_fs $syslog
- # Required-Stop: $network $remote_fs $syslog
- # Default-Start: 2 3 4 5
- # Default-Stop: 0 1 6
- # Short-Description: Flow-based network traffic analyser
- # Description: Manage all softflowd exports defined in
- # /etc/softflowd/*.conf
- ### END INIT INFO
- PATH=/sbin:/usr/sbin:/bin:/usr/bin
- NAME=softflowd
- DESC='Flow-based network traffic analyser'
- SOFTFLOWD="/usr/sbin/$NAME"
- PIDDIR="/var/run/$NAME/"
- PRIVDROP_CHROOT_DIR='/var/run/softflowd/chroot'
- [ -x "$SOFTFLOWD" ] || exit 0
- if [ "$1" = 'start' ] ; then
- mkdir -p "$PRIVDROP_CHROOT_DIR"
- if [ -e /var/run/softflowd.ctl ] ; then
- [ -L /var/run/softflowd.ctl ] || rm /var/run/softflowd.ctl
- fi
- [ -e /var/run/softflowd.ctl ] || ln -s /var/run/softflowd/default.ctl /var/run/softflowd.ctl
- install -D -p /etc/protocols "$PRIVDROP_CHROOT_DIR/etc/protocols"
- fi
- # Load the VERBOSE setting and other rcS variables
- . /lib/init/vars.sh
- # Define LSB functions
- . /lib/lsb/init-functions
- # Start a softflowd instance
- #
- # Return
- # 0 if daemon has been started
- # 1 if daemon was already running
- # 2 if daemon could not be started
- do_start () {
- local INSTANCE="$1"
- local CONFIG="$2"
- sh -n "$CONFIG" 2>/dev/null || return 2
- interface=
- options=
- . "$CONFIG"
- [ "$interface" ] || return 2
- local PIDFILE="$PIDDIR$INSTANCE.pid"
- local CTLSOCK="$PIDDIR$INSTANCE.ctl"
- start-stop-daemon --start --quiet \
- --pidfile "$PIDFILE" --exec "$SOFTFLOWD" --test > /dev/null \
- || return 1
- start-stop-daemon --start --quiet \
- --pidfile "$PIDFILE" \
- --exec "$SOFTFLOWD" -- \
- -p "$PIDFILE" -c "$CTLSOCK" \
- -i "$interface" $options \
- || return 2
- sleep 1
- start-stop-daemon --start --quiet \
- --pidfile "$PIDFILE" --exec "$SOFTFLOWD" --test > /dev/null \
- && return 2
- }
- # Stop a softflowd instance
- #
- # Return
- # 0 if daemon has been stopped
- # 1 if daemon was already stopped
- # 2 if daemon could not be stopped
- # other if a failure occurred
- do_stop () {
- local INSTANCE="$1"
- local PIDFILE="$PIDDIR/$INSTANCE.pid"
- start-stop-daemon --stop --quiet \
- --retry=TERM/30/KILL/5 --pidfile "$PIDFILE" --name "$NAME"
- RETVAL="$?"
- [ "$RETVAL" = 2 ] && return 2
- # Many daemons don't delete their pidfiles when they exit.
- rm -f "$PIDFILE"
- return "$RETVAL"
- }
- EXIT=0
- do_action () {
- local CONFIG="$1"
- INSTANCE="$(basename "${CONFIG%%.conf}")"
- case "$ACTION" in
- start)
- [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$INSTANCE"
- do_start "$INSTANCE" "$CONFIG"
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2)
- [ "$VERBOSE" != no ] && log_end_msg 1
- EXIT=1
- ;;
- esac
- ;;
- stop)
- [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$INSTANCE"
- do_stop "$INSTANCE"
- case "$?" in
- 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
- 2)
- [ "$VERBOSE" != no ] && log_end_msg 1
- EXIT=1
- ;;
- esac
- ;;
- status)
- status_of_proc -p "$PIDDIR/$INSTANCE.pid" "$SOFTFLOWD" "softflowd instance $INSTANCE" || EXIT=$?
- ;;
- restart|force-reload)
- log_daemon_msg "Restarting $DESC" "$INSTANCE"
- do_stop "$INSTANCE"
- case "$?" in
- 0|1)
- do_start "$INSTANCE" "$CONFIG"
- case "$?" in
- 0) log_end_msg 0 ;;
- *)
- # Old process is still running or
- # failed to start
- log_end_msg 1 ;;
- esac
- ;;
- *)
- # Failed to stop
- log_end_msg 1
- ;;
- esac
- ;;
- *)
- echo "Usage: /etc/init.d/softflowd {start|stop|status|restart|force-reload} [<instance> ...]" >&2
- exit 3
- ;;
- esac
- }
- ACTION="$1"
- shift
- if [ "$1" ] ; then
- while [ "$1" ] ; do
- CONFIG="/etc/softflowd/$1.conf"
- if [ -f "$CONFIG" ] ; then
- do_action "$CONFIG"
- fi
- shift
- done
- else
- for CONFIG in /etc/softflowd/*.conf ; do
- if [ -f "$CONFIG" ] ; then
- do_action "$CONFIG"
- fi
- done
- fi
- exit $EXIT
|