ba877004d152a547db2f1f120b5a034a13ca72d3
[darcs-mirror-metainit.git] / create-sysvinit-file.pl
1 #!/usr/bin/perl -w
2 #
3 # Creates a sysvinit file from a metainit description.
4
5 use Parse;
6
7 # Parse the metainit in
8 %initparams = parse($ARGV[0]);
9
10 # Print the "dynamic" part of the initskript
11 print << EOF
12 #! /bin/sh
13 ### BEGIN INIT INFO
14 # Provides:          $initparams{Name}
15 # Required-Start:    $initparams{Required-Start}
16 # Required-Stop:     $initparams{Required-Stop}
17 # Default-Start:     2 3 4 5
18 # Default-Stop:      0 1 6
19 ### END INIT INFO
20
21 # WARNING:
22 # This initscript has been autogenerated my metainit.
23 # Do not edit this file, but edit the corresponding metainit
24 # config.
25
26 # PATH should only include /usr/* if it runs after the mountnfs.sh script
27 PATH=/sbin:/usr/sbin:/bin:/usr/bin
28 DESC="Description of the service"
29 NAME=$parsed{Name}
30 DAEMON=$parsed{Path}
31 DAEMON_ARGS=$parsed{Args}
32 PIDFILE=/var/run/\$NAME.pid
33 SCRIPTNAME=/etc/init.d/\$NAME
34 EOF
35
36 # ... and the rest of the initscript, that is identical for all
37 # metainit-created scripts.
38 print << 'EOF'
39 # Exit if the package is not installed
40 [ -x "$DAEMON" ] || exit 0
41
42 # Read configuration variable file if it is present
43 [ -r /etc/default/$NAME ] && . /etc/default/$NAME
44
45 # Load the VERBOSE setting and other rcS variables
46 . /lib/init/vars.sh
47
48 # Define LSB log_* functions.
49 # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
50 . /lib/lsb/init-functions
51
52 #
53 # Function that starts the daemon/service
54 #
55 do_start()
56 {
57         # Return
58         #   0 if daemon has been started
59         #   1 if daemon was already running
60         #   2 if daemon could not be started
61         start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
62                 || return 1
63         start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
64                 $DAEMON_ARGS \
65                 || return 2
66         # Add code here, if necessary, that waits for the process to be ready
67         # to handle requests from services started subsequently which depend
68         # on this one.  As a last resort, sleep for some time.
69 }
70
71 #
72 # Function that stops the daemon/service
73 #
74 do_stop()
75 {
76         # Return
77         #   0 if daemon has been stopped
78         #   1 if daemon was already stopped
79         #   2 if daemon could not be stopped
80         #   other if a failure occurred
81         start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
82         RETVAL="$?"
83         [ "$RETVAL" = 2 ] && return 2
84         # Wait for children to finish too if this is a daemon that forks
85         # and if the daemon is only ever run from this initscript.
86         # If the above conditions are not satisfied then add some other code
87         # that waits for the process to drop all resources that could be
88         # needed by services started subsequently.  A last resort is to
89         # sleep for some time.
90         start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
91         [ "$?" = 2 ] && return 2
92         # Many daemons don't delete their pidfiles when they exit.
93         rm -f $PIDFILE
94         return "$RETVAL"
95 }
96
97 #
98 # Function that sends a SIGHUP to the daemon/service
99 #
100 do_reload() {
101         #
102         # If the daemon can reload its configuration without
103         # restarting (for example, when it is sent a SIGHUP),
104         # then implement that here.
105         #
106         start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
107         return 0
108 }
109
110 case "$1" in
111   start)
112         [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
113         do_start
114         case "$?" in
115                 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
116                 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
117         esac
118         ;;
119   stop)
120         [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
121         do_stop
122         case "$?" in
123                 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
124                 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
125         esac
126         ;;
127   #reload|force-reload)
128         #
129         # If do_reload() is not implemented then leave this commented out
130         # and leave 'force-reload' as an alias for 'restart'.
131         #
132         #log_daemon_msg "Reloading $DESC" "$NAME"
133         #do_reload
134         #log_end_msg $?
135         #;;
136   restart|force-reload)
137         #
138         # If the "reload" option is implemented then remove the
139         # 'force-reload' alias
140         #
141         log_daemon_msg "Restarting $DESC" "$NAME"
142         do_stop
143         case "$?" in
144           0|1)
145                 do_start
146                 case "$?" in
147                         0) log_end_msg 0 ;;
148                         1) log_end_msg 1 ;; # Old process is still running
149                         *) log_end_msg 1 ;; # Failed to start
150                 esac
151                 ;;
152           *)
153                 # Failed to stop
154                 log_end_msg 1
155                 ;;
156         esac
157         ;;
158   *)
159         #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
160         echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
161         exit 3
162         ;;
163 esac
164 EOF