|
@@ -1,253 +1,159 @@
|
|
|
-#!/bin/sh
|
|
|
+#! /bin/sh
|
|
|
|
|
|
-# Copyright (c) 2007 Javier Fernandez-Sanguino <jfs@debian.org>
|
|
|
-#
|
|
|
-# This is free software; you may redistribute it and/or modify
|
|
|
-# it under the terms of the GNU General Public License as
|
|
|
-# published by the Free Software Foundation; either version 2,
|
|
|
-# or (at your option) any later version.
|
|
|
-#
|
|
|
-# This is distributed in the hope that it will be useful, but
|
|
|
-# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
-# GNU General Public License for more details.
|
|
|
-#
|
|
|
-# You should have received a copy of the GNU General Public License with
|
|
|
-# the Debian operating system, in /usr/share/common-licenses/GPL; if
|
|
|
-# not, write to the Free Software Foundation, Inc., 59 Temple Place,
|
|
|
-# Suite 330, Boston, MA 02111-1307 USA
|
|
|
-#
|
|
|
### BEGIN INIT INFO
|
|
|
# Provides: ngircd
|
|
|
-# Required-Start: $network $local_fs
|
|
|
-# Required-Stop:
|
|
|
-# Should-Start: $named
|
|
|
-# Should-Stop:
|
|
|
+# Required-Start: $network $local_fs $remote_fs
|
|
|
+# Required-Stop: $network $local_fs $remote_fs
|
|
|
+# Should-Start: $named $syslog
|
|
|
+# Should-Stop: $named $syslog
|
|
|
# Default-Start: 2 3 4 5
|
|
|
# Default-Stop: 0 1 6
|
|
|
# Short-Description: Next generation IRC daemon
|
|
|
# Description: Simple IRC daemon written from scratch
|
|
|
### END INIT INFO
|
|
|
|
|
|
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
|
|
|
-
|
|
|
-DAEMON=/usr/sbin/ngircd
|
|
|
-NAME=ngircd
|
|
|
-DESC="Next generation IRC daemon"
|
|
|
-LOGDIR=/var/log/
|
|
|
-
|
|
|
-PIDDIR=/var/run/ngircd
|
|
|
-PIDFILE=$PIDDIR/$NAME.pid
|
|
|
-
|
|
|
-test -x $DAEMON || exit 0
|
|
|
+# Author: Christoph Biedl <debian.axhn@manchmal.in-ulm.de>
|
|
|
|
|
|
-. /lib/lsb/init-functions
|
|
|
-
|
|
|
-DAEMON_OPTS="" # Additional options given to the server
|
|
|
-STARTTIME=1
|
|
|
-DIETIME=10 # Time to wait for the server to die, in seconds
|
|
|
+# Do NOT "set -e"
|
|
|
|
|
|
-LOGFILE=$LOGDIR/$NAME.log # Server logfile
|
|
|
-DAEMONUSER="irc"
|
|
|
+# PATH should only include /usr/* if it runs after the mountnfs.sh script
|
|
|
+PATH=/sbin:/usr/sbin:/bin:/usr/bin
|
|
|
+DESC='Next generation IRC daemon'
|
|
|
+NAME='ngircd'
|
|
|
+DAEMON="/usr/sbin/$NAME"
|
|
|
+DAEMON_ARGS=""
|
|
|
+PIDDIR='/var/run/ngircd'
|
|
|
+PIDFILE="$PIDDIR/$NAME.pid"
|
|
|
+SCRIPTNAME="/etc/init.d/$NAME"
|
|
|
+DAEMONUSER='irc' # also group
|
|
|
|
|
|
-if [ -n "$DAEMONUSER" ] ; then
|
|
|
- if getent passwd | grep -q "^$DAEMONUSER:"; then
|
|
|
- # Obtain the uid and gid
|
|
|
- DAEMONUID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $3}'`
|
|
|
- DAEMONGID=`getent passwd |grep "^$DAEMONUSER:" | awk -F : '{print $4}'`
|
|
|
- else
|
|
|
- log_failure_msg "The user $DAEMONUSER, required to run $NAME does not exist."
|
|
|
- exit 1
|
|
|
- fi
|
|
|
-fi
|
|
|
+# Exit if the package is not installed
|
|
|
+[ -x "$DAEMON" ] || exit 0
|
|
|
|
|
|
+# Read configuration variable file if it is present
|
|
|
+[ -r "/etc/default/$NAME" ] && . "/etc/default/$NAME"
|
|
|
|
|
|
-set -e
|
|
|
+# Load the VERBOSE setting and other rcS variables
|
|
|
+. /lib/init/vars.sh
|
|
|
|
|
|
-running_pid() {
|
|
|
-# Check if a given process pid's cmdline matches a given name
|
|
|
- pid=$1
|
|
|
- name=$2
|
|
|
- [ -z "$pid" ] && return 1
|
|
|
- [ ! -d /proc/$pid ] && return 1
|
|
|
- cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
|
|
|
- # Is this the expected server
|
|
|
- [ "$cmd" != "$name" ] && return 1
|
|
|
- return 0
|
|
|
-}
|
|
|
-
|
|
|
-running() {
|
|
|
-# Check if the process is running looking at /proc
|
|
|
-# (works for all users)
|
|
|
-
|
|
|
- # No pidfile, probably no daemon present
|
|
|
- [ ! -f "$PIDFILE" ] && return 1
|
|
|
- pid=`cat $PIDFILE`
|
|
|
- running_pid $pid $DAEMON || return 1
|
|
|
- return 0
|
|
|
-}
|
|
|
+# Define LSB log_* functions.
|
|
|
+# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
|
|
|
+# and status_of_proc is working.
|
|
|
+. /lib/lsb/init-functions
|
|
|
|
|
|
-start_server() {
|
|
|
-# Start the process using the wrapper
|
|
|
- if [ -z "$DAEMONUSER" ] ; then
|
|
|
- start_daemon -p $PIDFILE $DAEMON -- $DAEMON_OPTS
|
|
|
- errcode=$?
|
|
|
- else
|
|
|
-# if we are using a daemonuser then change the user id
|
|
|
- start-stop-daemon --start --quiet --pidfile $PIDFILE \
|
|
|
- --chuid $DAEMONUSER \
|
|
|
- --exec $DAEMON -- $DAEMON_OPTS
|
|
|
- errcode=$?
|
|
|
- fi
|
|
|
- return $errcode
|
|
|
-}
|
|
|
+# Assert PIDDIR
|
|
|
+[ ! -d "$PIDDIR" ] || mkdir -p "$PIDDIR"
|
|
|
+chown "$DAEMONUSER:$DAEMONUSER" "$PIDDIR"
|
|
|
|
|
|
-stop_server() {
|
|
|
-# Stop the process using the wrapper
|
|
|
- if [ -z "$DAEMONUSER" ] ; then
|
|
|
- killproc -p $PIDFILE $DAEMON
|
|
|
- errcode=$?
|
|
|
- else
|
|
|
-# if we are using a daemonuser then look for process that match
|
|
|
- start-stop-daemon --stop --quiet --pidfile $PIDFILE \
|
|
|
- --user $DAEMONUSER \
|
|
|
- --exec $DAEMON
|
|
|
- errcode=$?
|
|
|
- fi
|
|
|
+# Assert DAEMONUSER's home
|
|
|
+DAEMONHOME=$(getent passwd "$DAEMONUSER" | cut -d: -f6)
|
|
|
+[ -d "$DAEMONHOME" ] || mkdir -p "$DAEMONHOME"
|
|
|
+chown "$DAEMONUSER:$DAEMONUSER" "$DAEMONHOME"
|
|
|
|
|
|
- return $errcode
|
|
|
+#
|
|
|
+# Function that starts the daemon/service
|
|
|
+#
|
|
|
+do_start()
|
|
|
+{
|
|
|
+ # Return
|
|
|
+ # 0 if daemon has been started
|
|
|
+ # 1 if daemon was already running
|
|
|
+ # 2 if daemon could not be started
|
|
|
+ start-stop-daemon --start --quiet \
|
|
|
+ --pidfile "$PIDFILE" --exec "$DAEMON" \
|
|
|
+ --test > /dev/null || return 1
|
|
|
+ start-stop-daemon --start --quiet \
|
|
|
+ --pidfile "$PIDFILE" --exec "$DAEMON" -- \
|
|
|
+ $DAEMON_ARGS || return 2
|
|
|
+ # Add code here, if necessary, that waits for the process to be ready
|
|
|
+ # to handle requests from services started subsequently which depend
|
|
|
+ # on this one. As a last resort, sleep for some time.
|
|
|
}
|
|
|
|
|
|
-reload_server() {
|
|
|
- [ ! -f "$PIDFILE" ] && return 1
|
|
|
- pid=pidofproc $PIDFILE # This is the daemon's pid
|
|
|
- # Send a SIGHUP
|
|
|
- kill -1 $pid
|
|
|
- return $?
|
|
|
+#
|
|
|
+# Function that stops the daemon/service
|
|
|
+#
|
|
|
+do_stop()
|
|
|
+{
|
|
|
+ # 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
|
|
|
+ start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
|
|
|
+ --pidfile "$PIDFILE" --name "$NAME"
|
|
|
+ RETVAL="$?"
|
|
|
+ [ "$RETVAL" = 2 ] && return 2
|
|
|
+ # Wait for children to finish too if this is a daemon that forks
|
|
|
+ # and if the daemon is only ever run from this initscript.
|
|
|
+ # If the above conditions are not satisfied then add some other code
|
|
|
+ # that waits for the process to drop all resources that could be
|
|
|
+ # needed by services started subsequently. A last resort is to
|
|
|
+ # sleep for some time.
|
|
|
+ start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 \
|
|
|
+ --exec "$DAEMON"
|
|
|
+ [ "$?" = 2 ] && return 2
|
|
|
+ # Many daemons don't delete their pidfiles when they exit.
|
|
|
+ rm -f "$PIDFILE"
|
|
|
+ return "$RETVAL"
|
|
|
}
|
|
|
|
|
|
-force_stop() {
|
|
|
-# Force the process to die killing it manually
|
|
|
- [ ! -e "$PIDFILE" ] && return
|
|
|
- if running ; then
|
|
|
- kill -15 $pid
|
|
|
- # Is it really dead?
|
|
|
- sleep "$DIETIME"s
|
|
|
- if running ; then
|
|
|
- kill -9 $pid
|
|
|
- sleep "$DIETIME"s
|
|
|
- if running ; then
|
|
|
- echo "Cannot kill $NAME (pid=$pid)!"
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- fi
|
|
|
- fi
|
|
|
- rm -f $PIDFILE
|
|
|
+#
|
|
|
+# Function that sends a SIGHUP to the daemon/service
|
|
|
+#
|
|
|
+do_reload() {
|
|
|
+ start-stop-daemon --stop --signal 1 --quiet \
|
|
|
+ --pidfile "$PIDFILE" --name "$NAME"
|
|
|
+ return 0
|
|
|
}
|
|
|
|
|
|
-
|
|
|
case "$1" in
|
|
|
- start)
|
|
|
- log_daemon_msg "Starting $DESC " "$NAME"
|
|
|
- # Check if it's running first
|
|
|
- if running ; then
|
|
|
- log_progress_msg "apparently already running"
|
|
|
- log_end_msg 0
|
|
|
- exit 0
|
|
|
- fi
|
|
|
- # If $PIDDIR doesn't exist, create it and give it proper permissions
|
|
|
- # Useful if $PIDDIR is in a tmpfs
|
|
|
- if [ ! -d "$PIDDIR" ]; then
|
|
|
- mkdir $PIDDIR
|
|
|
- chown irc:irc $PIDDIR
|
|
|
- chmod 770 $PIDDIR
|
|
|
- fi
|
|
|
- if start_server ; then
|
|
|
- # NOTE: Some servers might die some time after they start,
|
|
|
- # this code will detect this issue if STARTTIME is set
|
|
|
- # to a reasonable value
|
|
|
- [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time
|
|
|
- if running ; then
|
|
|
- # It's ok, the server started and is running
|
|
|
- log_end_msg 0
|
|
|
- else
|
|
|
- # It is not running after we did start
|
|
|
- log_end_msg 1
|
|
|
- fi
|
|
|
- else
|
|
|
- # Either we could not start it
|
|
|
- log_end_msg 1
|
|
|
- fi
|
|
|
+start)
|
|
|
+ [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
|
|
|
+ do_start
|
|
|
+ case "$?" in
|
|
|
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
|
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
|
+ esac
|
|
|
+ ;;
|
|
|
+stop)
|
|
|
+ [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
|
|
|
+ do_stop
|
|
|
+ case "$?" in
|
|
|
+ 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
|
|
|
+ 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
|
|
|
+ esac
|
|
|
+ ;;
|
|
|
+status)
|
|
|
+ status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
|
|
|
+ ;;
|
|
|
+reload|force-reload)
|
|
|
+ log_daemon_msg "Reloading $DESC" "$NAME"
|
|
|
+ do_reload
|
|
|
+ log_end_msg $?
|
|
|
+ ;;
|
|
|
+restart)
|
|
|
+ log_daemon_msg "Restarting $DESC" "$NAME"
|
|
|
+ do_stop
|
|
|
+ case "$?" in
|
|
|
+ 0|1)
|
|
|
+ do_start
|
|
|
+ case "$?" in
|
|
|
+ 0) log_end_msg 0 ;;
|
|
|
+ 1) log_end_msg 1 ;; # Old process is still running
|
|
|
+ *) log_end_msg 1 ;; # Failed to start
|
|
|
+ esac
|
|
|
;;
|
|
|
- stop)
|
|
|
- log_daemon_msg "Stopping $DESC" "$NAME"
|
|
|
- if running ; then
|
|
|
- # Only stop the server if we see it running
|
|
|
- errcode=0
|
|
|
- stop_server || errcode=$?
|
|
|
- log_end_msg $errcode
|
|
|
- else
|
|
|
- # If it's not running don't do anything
|
|
|
- log_progress_msg "apparently not running"
|
|
|
- log_end_msg 0
|
|
|
- exit 0
|
|
|
- fi
|
|
|
- ;;
|
|
|
- force-stop)
|
|
|
- # First try to stop gracefully the program
|
|
|
- $0 stop
|
|
|
- if running; then
|
|
|
- # If it's still running try to kill it more forcefully
|
|
|
- log_daemon_msg "Stopping (force) $DESC" "$NAME"
|
|
|
- errcode=0
|
|
|
- force_stop || errcode=$?
|
|
|
- log_end_msg $errcode
|
|
|
- fi
|
|
|
- ;;
|
|
|
- restart|force-reload)
|
|
|
- log_daemon_msg "Restarting $DESC" "$NAME"
|
|
|
- errcode=0
|
|
|
- stop_server || errcode=$?
|
|
|
- # Wait some sensible amount, some server need this
|
|
|
- [ -n "$DIETIME" ] && sleep $DIETIME
|
|
|
- start_server || errcode=$?
|
|
|
- [ -n "$STARTTIME" ] && sleep $STARTTIME
|
|
|
- running || errcode=$?
|
|
|
- log_end_msg $errcode
|
|
|
- ;;
|
|
|
- status)
|
|
|
-
|
|
|
- log_daemon_msg "Checking status of $DESC" "$NAME"
|
|
|
- if running ; then
|
|
|
- log_progress_msg "running"
|
|
|
- log_end_msg 0
|
|
|
- else
|
|
|
- log_progress_msg "apparently not running"
|
|
|
- log_end_msg 1
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- ;;
|
|
|
- reload)
|
|
|
- log_daemon_msg "Reloading $DESC configuration files" "$NAME"
|
|
|
- if running ; then
|
|
|
- reload_server
|
|
|
- if ! running ; then
|
|
|
- # Process died after we tried to reload
|
|
|
- log_progress_msg "died on reload"
|
|
|
- log_end_msg 1
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- else
|
|
|
- log_progress_msg "server is not running"
|
|
|
- log_end_msg 1
|
|
|
- exit 1
|
|
|
- fi
|
|
|
- ;; #;;
|
|
|
- *)
|
|
|
- N=/etc/init.d/$NAME
|
|
|
- echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
|
|
|
- exit 1
|
|
|
+ *)
|
|
|
+ # Failed to stop
|
|
|
+ log_end_msg 1
|
|
|
;;
|
|
|
+ esac
|
|
|
+ ;;
|
|
|
+*)
|
|
|
+ echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
|
|
|
+ exit 3
|
|
|
+ ;;
|
|
|
esac
|
|
|
|
|
|
exit 0
|