Statistics
| Branch: | Tag: | Revision:

root / conf / init.d / nfdhcpd @ cf51ea5b

History | View | Annotate | Download (6.5 kB)

1 cf51ea5b Dimitris Aragiorgis
#!/bin/sh
2 cf51ea5b Dimitris Aragiorgis
#
3 cf51ea5b Dimitris Aragiorgis
# This is free software; you may redistribute it and/or modify
4 cf51ea5b Dimitris Aragiorgis
# it under the terms of the GNU General Public License as
5 cf51ea5b Dimitris Aragiorgis
# published by the Free Software Foundation; either version 2,
6 cf51ea5b Dimitris Aragiorgis
# or (at your option) any later version.
7 cf51ea5b Dimitris Aragiorgis
#
8 cf51ea5b Dimitris Aragiorgis
# This is distributed in the hope that it will be useful, but
9 cf51ea5b Dimitris Aragiorgis
# WITHOUT ANY WARRANTY; without even the implied warranty of
10 cf51ea5b Dimitris Aragiorgis
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 cf51ea5b Dimitris Aragiorgis
# GNU General Public License for more details.
12 cf51ea5b Dimitris Aragiorgis
#
13 cf51ea5b Dimitris Aragiorgis
# You should have received a copy of the GNU General Public License with
14 cf51ea5b Dimitris Aragiorgis
# the Debian operating system, in /usr/share/common-licenses/GPL;  if
15 cf51ea5b Dimitris Aragiorgis
# not, write to the Free Software Foundation, Inc., 59 Temple Place,
16 cf51ea5b Dimitris Aragiorgis
# Suite 330, Boston, MA 02111-1307 USA
17 cf51ea5b Dimitris Aragiorgis
#
18 cf51ea5b Dimitris Aragiorgis
### BEGIN INIT INFO
19 cf51ea5b Dimitris Aragiorgis
# Provides:          nfdhcpd
20 cf51ea5b Dimitris Aragiorgis
# Required-Start:    $network $local_fs $remote_fs
21 cf51ea5b Dimitris Aragiorgis
# Required-Stop:     $remote_fs
22 cf51ea5b Dimitris Aragiorgis
# Should-Start:
23 cf51ea5b Dimitris Aragiorgis
# Should-Stop:
24 cf51ea5b Dimitris Aragiorgis
# Default-Start:     2 3 4 5
25 cf51ea5b Dimitris Aragiorgis
# Default-Stop:      0 1 6
26 cf51ea5b Dimitris Aragiorgis
# Short-Description: NFQueue DHCP/RA server
27 cf51ea5b Dimitris Aragiorgis
### END INIT INFO
28 cf51ea5b Dimitris Aragiorgis
29 cf51ea5b Dimitris Aragiorgis
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
30 cf51ea5b Dimitris Aragiorgis
31 cf51ea5b Dimitris Aragiorgis
DAEMON=/usr/sbin/nfdhcpd
32 cf51ea5b Dimitris Aragiorgis
NAME=nfdhcpd
33 cf51ea5b Dimitris Aragiorgis
DESC="NFQUEUE-based DHCP/RA server" 
34 cf51ea5b Dimitris Aragiorgis
LOGDIR=/var/log/nfdhcpd
35 cf51ea5b Dimitris Aragiorgis
36 cf51ea5b Dimitris Aragiorgis
PIDFILE=/var/run/$NAME.pid
37 cf51ea5b Dimitris Aragiorgis
38 cf51ea5b Dimitris Aragiorgis
test -x $DAEMON || exit 0
39 cf51ea5b Dimitris Aragiorgis
40 cf51ea5b Dimitris Aragiorgis
. /lib/lsb/init-functions
41 cf51ea5b Dimitris Aragiorgis
42 cf51ea5b Dimitris Aragiorgis
# Default options, these can be overriden by the information
43 cf51ea5b Dimitris Aragiorgis
# at /etc/default/$NAME
44 cf51ea5b Dimitris Aragiorgis
DAEMON_OPTS=""          # Additional options given to the server
45 cf51ea5b Dimitris Aragiorgis
46 cf51ea5b Dimitris Aragiorgis
DIETIME=2              # Time to wait for the server to die, in seconds
47 cf51ea5b Dimitris Aragiorgis
                        # If this value is set too low you might not
48 cf51ea5b Dimitris Aragiorgis
                        # let some servers to die gracefully and
49 cf51ea5b Dimitris Aragiorgis
                        # 'restart' will not work
50 cf51ea5b Dimitris Aragiorgis
51 cf51ea5b Dimitris Aragiorgis
STARTTIME=1             # Time to wait for the server to start, in seconds
52 cf51ea5b Dimitris Aragiorgis
                        # If this value is set each time the server is
53 cf51ea5b Dimitris Aragiorgis
                        # started (on start or restart) the script will
54 cf51ea5b Dimitris Aragiorgis
                        # stall to try to determine if it is running
55 cf51ea5b Dimitris Aragiorgis
                        # If it is not set and the server takes time
56 cf51ea5b Dimitris Aragiorgis
                        # to setup a pid file the log message might 
57 cf51ea5b Dimitris Aragiorgis
                        # be a false positive (says it did not start
58 cf51ea5b Dimitris Aragiorgis
                        # when it actually did)
59 cf51ea5b Dimitris Aragiorgis
                        
60 cf51ea5b Dimitris Aragiorgis
LOGFILE=$LOGDIR/$NAME.log  # Server logfile
61 cf51ea5b Dimitris Aragiorgis
#DAEMONUSER=nfdhcp   # Users to run the daemons as. If this value
62 cf51ea5b Dimitris Aragiorgis
                        # is set start-stop-daemon will chuid the server
63 cf51ea5b Dimitris Aragiorgis
64 cf51ea5b Dimitris Aragiorgis
# Include defaults if available
65 cf51ea5b Dimitris Aragiorgis
if [ -f /etc/default/$NAME ] ; then
66 cf51ea5b Dimitris Aragiorgis
	. /etc/default/$NAME
67 cf51ea5b Dimitris Aragiorgis
fi
68 cf51ea5b Dimitris Aragiorgis
69 cf51ea5b Dimitris Aragiorgis
# Use this if you want the user to explicitly set 'RUN' in
70 cf51ea5b Dimitris Aragiorgis
# /etc/default/
71 cf51ea5b Dimitris Aragiorgis
if [ "x$RUN" != "xyes" ] ; then
72 cf51ea5b Dimitris Aragiorgis
    log_failure_msg "$NAME disabled, please adjust the configuration to your needs "
73 cf51ea5b Dimitris Aragiorgis
    log_failure_msg "and then set RUN to 'yes' in /etc/default/$NAME to enable it."
74 cf51ea5b Dimitris Aragiorgis
    exit 1
75 cf51ea5b Dimitris Aragiorgis
fi
76 cf51ea5b Dimitris Aragiorgis
77 cf51ea5b Dimitris Aragiorgis
# Check that the user exists (if we set a user)
78 cf51ea5b Dimitris Aragiorgis
# Does the user exist?
79 cf51ea5b Dimitris Aragiorgis
set -e
80 cf51ea5b Dimitris Aragiorgis
81 cf51ea5b Dimitris Aragiorgis
running_pid() {
82 cf51ea5b Dimitris Aragiorgis
# Check if a given process pid's cmdline matches a given name
83 cf51ea5b Dimitris Aragiorgis
    pid=$1
84 cf51ea5b Dimitris Aragiorgis
    name=$2
85 cf51ea5b Dimitris Aragiorgis
    [ -z "$pid" ] && return 1
86 cf51ea5b Dimitris Aragiorgis
    [ ! -d /proc/$pid ] &&  return 1
87 cf51ea5b Dimitris Aragiorgis
    cmd=`cat /proc/$pid/cmdline | tr "\000" "\n"|head -n 1 |cut -d : -f 1`
88 cf51ea5b Dimitris Aragiorgis
    # Is this the expected server
89 cf51ea5b Dimitris Aragiorgis
    [ "$cmd" != "$name" ] &&  return 1
90 cf51ea5b Dimitris Aragiorgis
    return 0
91 cf51ea5b Dimitris Aragiorgis
}
92 cf51ea5b Dimitris Aragiorgis
93 cf51ea5b Dimitris Aragiorgis
running() {
94 cf51ea5b Dimitris Aragiorgis
# Check if the process is running looking at /proc
95 cf51ea5b Dimitris Aragiorgis
# (works for all users)
96 cf51ea5b Dimitris Aragiorgis
97 cf51ea5b Dimitris Aragiorgis
    # No pidfile, probably no daemon present
98 cf51ea5b Dimitris Aragiorgis
    [ ! -f "$PIDFILE" ] && return 1
99 cf51ea5b Dimitris Aragiorgis
    pid=`cat $PIDFILE`
100 cf51ea5b Dimitris Aragiorgis
    running_pid $pid python || return 1
101 cf51ea5b Dimitris Aragiorgis
    return 0
102 cf51ea5b Dimitris Aragiorgis
}
103 cf51ea5b Dimitris Aragiorgis
104 cf51ea5b Dimitris Aragiorgis
start_server() {
105 cf51ea5b Dimitris Aragiorgis
	start_daemon -p $PIDFILE $DAEMON $DAEMON_OPTS
106 cf51ea5b Dimitris Aragiorgis
	errcode=$?
107 cf51ea5b Dimitris Aragiorgis
	return $errcode
108 cf51ea5b Dimitris Aragiorgis
}
109 cf51ea5b Dimitris Aragiorgis
110 cf51ea5b Dimitris Aragiorgis
stop_server() {
111 cf51ea5b Dimitris Aragiorgis
	killproc -p $PIDFILE $DAEMON
112 cf51ea5b Dimitris Aragiorgis
	rrcode=$?
113 cf51ea5b Dimitris Aragiorgis
	return $errcode
114 cf51ea5b Dimitris Aragiorgis
}
115 cf51ea5b Dimitris Aragiorgis
116 cf51ea5b Dimitris Aragiorgis
reload_server() {
117 cf51ea5b Dimitris Aragiorgis
    [ ! -f "$PIDFILE" ] && return 1
118 cf51ea5b Dimitris Aragiorgis
    pid=pidofproc $PIDFILE # This is the daemon's pid
119 cf51ea5b Dimitris Aragiorgis
    # Send a SIGHUP
120 cf51ea5b Dimitris Aragiorgis
    kill -1 $pid
121 cf51ea5b Dimitris Aragiorgis
    return $?
122 cf51ea5b Dimitris Aragiorgis
}
123 cf51ea5b Dimitris Aragiorgis
124 cf51ea5b Dimitris Aragiorgis
force_stop() {
125 cf51ea5b Dimitris Aragiorgis
# Force the process to die killing it manually
126 cf51ea5b Dimitris Aragiorgis
	[ ! -e "$PIDFILE" ] && return
127 cf51ea5b Dimitris Aragiorgis
	if running ; then
128 cf51ea5b Dimitris Aragiorgis
		kill -15 $pid
129 cf51ea5b Dimitris Aragiorgis
	# Is it really dead?
130 cf51ea5b Dimitris Aragiorgis
		sleep "$DIETIME"s
131 cf51ea5b Dimitris Aragiorgis
		if running ; then
132 cf51ea5b Dimitris Aragiorgis
			kill -9 $pid
133 cf51ea5b Dimitris Aragiorgis
			sleep "$DIETIME"s
134 cf51ea5b Dimitris Aragiorgis
			if running ; then
135 cf51ea5b Dimitris Aragiorgis
				echo "Cannot kill $NAME (pid=$pid)!"
136 cf51ea5b Dimitris Aragiorgis
				exit 1
137 cf51ea5b Dimitris Aragiorgis
			fi
138 cf51ea5b Dimitris Aragiorgis
		fi
139 cf51ea5b Dimitris Aragiorgis
	fi
140 cf51ea5b Dimitris Aragiorgis
	rm -f $PIDFILE
141 cf51ea5b Dimitris Aragiorgis
}
142 cf51ea5b Dimitris Aragiorgis
143 cf51ea5b Dimitris Aragiorgis
144 cf51ea5b Dimitris Aragiorgis
case "$1" in
145 cf51ea5b Dimitris Aragiorgis
  start)
146 cf51ea5b Dimitris Aragiorgis
	log_daemon_msg "Starting $DESC " "$NAME"
147 cf51ea5b Dimitris Aragiorgis
        # Check if it's running first
148 cf51ea5b Dimitris Aragiorgis
        if running ;  then
149 cf51ea5b Dimitris Aragiorgis
            log_progress_msg "apparently already running"
150 cf51ea5b Dimitris Aragiorgis
            log_end_msg 0
151 cf51ea5b Dimitris Aragiorgis
            exit 0
152 cf51ea5b Dimitris Aragiorgis
        fi
153 cf51ea5b Dimitris Aragiorgis
        if start_server ; then
154 cf51ea5b Dimitris Aragiorgis
            # NOTE: Some servers might die some time after they start,
155 cf51ea5b Dimitris Aragiorgis
            # this code will detect this issue if STARTTIME is set
156 cf51ea5b Dimitris Aragiorgis
            # to a reasonable value
157 cf51ea5b Dimitris Aragiorgis
            [ -n "$STARTTIME" ] && sleep $STARTTIME # Wait some time 
158 cf51ea5b Dimitris Aragiorgis
            if  running ;  then
159 cf51ea5b Dimitris Aragiorgis
                # It's ok, the server started and is running
160 cf51ea5b Dimitris Aragiorgis
                log_end_msg 0
161 cf51ea5b Dimitris Aragiorgis
            else
162 cf51ea5b Dimitris Aragiorgis
                # It is not running after we did start
163 cf51ea5b Dimitris Aragiorgis
                log_end_msg 1
164 cf51ea5b Dimitris Aragiorgis
            fi
165 cf51ea5b Dimitris Aragiorgis
        else
166 cf51ea5b Dimitris Aragiorgis
            # Either we could not start it
167 cf51ea5b Dimitris Aragiorgis
            log_end_msg 1
168 cf51ea5b Dimitris Aragiorgis
        fi
169 cf51ea5b Dimitris Aragiorgis
	;;
170 cf51ea5b Dimitris Aragiorgis
  stop)
171 cf51ea5b Dimitris Aragiorgis
        log_daemon_msg "Stopping $DESC" "$NAME"
172 cf51ea5b Dimitris Aragiorgis
        if running ; then
173 cf51ea5b Dimitris Aragiorgis
            # Only stop the server if we see it running
174 cf51ea5b Dimitris Aragiorgis
			errcode=0
175 cf51ea5b Dimitris Aragiorgis
            stop_server || errcode=$?
176 cf51ea5b Dimitris Aragiorgis
            log_end_msg $errcode
177 cf51ea5b Dimitris Aragiorgis
        else
178 cf51ea5b Dimitris Aragiorgis
            # If it's not running don't do anything
179 cf51ea5b Dimitris Aragiorgis
            log_progress_msg "apparently not running"
180 cf51ea5b Dimitris Aragiorgis
            log_end_msg 0
181 cf51ea5b Dimitris Aragiorgis
            exit 0
182 cf51ea5b Dimitris Aragiorgis
        fi
183 cf51ea5b Dimitris Aragiorgis
        ;;
184 cf51ea5b Dimitris Aragiorgis
  force-stop)
185 cf51ea5b Dimitris Aragiorgis
        # First try to stop gracefully the program
186 cf51ea5b Dimitris Aragiorgis
        $0 stop
187 cf51ea5b Dimitris Aragiorgis
        if running; then
188 cf51ea5b Dimitris Aragiorgis
            # If it's still running try to kill it more forcefully
189 cf51ea5b Dimitris Aragiorgis
            log_daemon_msg "Stopping (force) $DESC" "$NAME"
190 cf51ea5b Dimitris Aragiorgis
			errcode=0
191 cf51ea5b Dimitris Aragiorgis
            force_stop || errcode=$?
192 cf51ea5b Dimitris Aragiorgis
            log_end_msg $errcode
193 cf51ea5b Dimitris Aragiorgis
        fi
194 cf51ea5b Dimitris Aragiorgis
	;;
195 cf51ea5b Dimitris Aragiorgis
  restart|force-reload)
196 cf51ea5b Dimitris Aragiorgis
        log_daemon_msg "Restarting $DESC" "$NAME"
197 cf51ea5b Dimitris Aragiorgis
		errcode=0
198 cf51ea5b Dimitris Aragiorgis
        stop_server || errcode=$?
199 cf51ea5b Dimitris Aragiorgis
        # Wait some sensible amount, some server need this
200 cf51ea5b Dimitris Aragiorgis
        [ -n "$DIETIME" ] && sleep $DIETIME
201 cf51ea5b Dimitris Aragiorgis
        start_server || errcode=$?
202 cf51ea5b Dimitris Aragiorgis
        [ -n "$STARTTIME" ] && sleep $STARTTIME
203 cf51ea5b Dimitris Aragiorgis
        running || errcode=$?
204 cf51ea5b Dimitris Aragiorgis
        log_end_msg $errcode
205 cf51ea5b Dimitris Aragiorgis
	;;
206 cf51ea5b Dimitris Aragiorgis
  status)
207 cf51ea5b Dimitris Aragiorgis
208 cf51ea5b Dimitris Aragiorgis
        log_daemon_msg "Checking status of $DESC" "$NAME"
209 cf51ea5b Dimitris Aragiorgis
        if running ;  then
210 cf51ea5b Dimitris Aragiorgis
            log_progress_msg "running"
211 cf51ea5b Dimitris Aragiorgis
            log_end_msg 0
212 cf51ea5b Dimitris Aragiorgis
        else
213 cf51ea5b Dimitris Aragiorgis
            log_progress_msg "apparently not running"
214 cf51ea5b Dimitris Aragiorgis
            log_end_msg 1
215 cf51ea5b Dimitris Aragiorgis
            exit 1
216 cf51ea5b Dimitris Aragiorgis
        fi
217 cf51ea5b Dimitris Aragiorgis
        ;;
218 cf51ea5b Dimitris Aragiorgis
  reload)
219 cf51ea5b Dimitris Aragiorgis
        log_warning_msg "Reloading $NAME daemon: not implemented, as the daemon"
220 cf51ea5b Dimitris Aragiorgis
        log_warning_msg "cannot re-read the config file (use restart)."
221 cf51ea5b Dimitris Aragiorgis
	;;
222 cf51ea5b Dimitris Aragiorgis
  *)
223 cf51ea5b Dimitris Aragiorgis
	N=/etc/init.d/$NAME
224 cf51ea5b Dimitris Aragiorgis
	echo "Usage: $N {start|stop|force-stop|restart|force-reload|status}" >&2
225 cf51ea5b Dimitris Aragiorgis
	exit 1
226 cf51ea5b Dimitris Aragiorgis
	;;
227 cf51ea5b Dimitris Aragiorgis
esac
228 cf51ea5b Dimitris Aragiorgis
229 cf51ea5b Dimitris Aragiorgis
exit 0