SVN: rc-scripts/branches/upstart_native/service
jajcus
jajcus at pld-linux.org
Thu May 6 11:37:11 CEST 2010
Author: jajcus
Date: Thu May 6 11:37:11 2010
New Revision: 11384
Modified:
rc-scripts/branches/upstart_native/service
Log:
- use initctl for upstart-controlled jobs
- be the LSB-compatible interface for the upstart-controlled jobs (upstart-job
script from upstart package is of no use, as its behaviour is very
LSB-incompatible)
Modified: rc-scripts/branches/upstart_native/service
==============================================================================
--- rc-scripts/branches/upstart_native/service (original)
+++ rc-scripts/branches/upstart_native/service Thu May 6 11:37:11 2010
@@ -10,6 +10,8 @@
SERVICE=
+. /etc/rc.d/init.d/functions
+
if [ -d /etc/rc.d/init.d ]; then
SERVICEDIR="/etc/rc.d/init.d"
else
@@ -21,6 +23,64 @@
exit 1
fi
+is_task() {
+ grep -q '^task' "/etc/init/$1.conf"
+}
+is_running() {
+ initctl status "$1" 2>/dev/null | grep -q running
+}
+upstart_start() {
+ local SERVICE=$1
+ is_running "${SERVICE}" && return 0
+ msg_starting "${SERVICE}"
+ if errors=$(/sbin/initctl start ${SERVICE} 2>&1) ; then
+ ok
+ return 0
+ else
+ fail
+ echo "$errors" >&2
+ return 1
+ fi
+}
+upstart_stop() {
+ local SERVICE=$1
+ if ! is_running "${SERVICE}" && ! is_task "${SERVICE}" ; then
+ return 0
+ fi
+ msg_stopping "${SERVICE}"
+ if errors=$(/sbin/initctl stop ${SERVICE}) ; then
+ ok
+ return 0
+ else
+ fail
+ echo "$errors" >&2
+ return 1
+ fi
+}
+upstart_status() {
+ # get service status
+ # should be compliant with
+ # http://refspecs.freestandards.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
+ local SERVICE=$1
+ local status
+ if is_task "${SERVICE}" ; then
+ # we probably should have a way to handle task status
+ return 0
+ fi
+ if ! status=$(/sbin/initctl status "${SERVICE}") ; then
+ # program or service status is not known
+ return 4
+ fi
+ if strstr "$status" "running" ; then
+ # program is running or service is OK
+ return 0
+ else
+ # program is not running
+ return 3
+ fi
+ # TODO: other statuses
+}
+
cd /
while [ $# -gt 0 ]; do
case "${1}" in
@@ -36,6 +96,9 @@
if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
cd ${SERVICEDIR}
for SERVICE in * ; do
+ if use_upstart && [ -f "/etc/init/${SERVICE}.conf" ] ; then
+ continue
+ fi
case "${SERVICE}" in
functions | halt | killall | single| linuxconf| kudzu | \
*rpmorig | *rpmnew | *rpmsave | *~ | *.orig)
@@ -47,10 +110,26 @@
;;
esac
done
+ if [ -d /etc/init ] && use_upstart ; then
+ cd /etc/init
+ for f in *.conf ; do
+ SERVICE="${f%.conf}"
+ case "${SERVICE}" in
+ control-alt-delete | rc | rcS-sulogin | rcS | start-ttys | tty)
+ ;;
+ *)
+ /sbin/initctl status "${SERVICE}"
+ ;;
+ esac
+ done
+ fi
exit 0
elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
SERVICE="${1}"
- if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
+ if [ -f "/etc/init/${SERVICE}.conf" ] && use_upstart ; then
+ upstart_stop
+ upstart_start
+ elif [ -x "${SERVICEDIR}/${SERVICE}" ]; then
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start
exit $?
@@ -58,6 +137,7 @@
elif [ -z "${SERVICE}" ]; then
SERVICE="${1}"
else
+ COMMAND="${1}"
OPTIONS="${OPTIONS} ${1}"
fi
shift
@@ -65,9 +145,59 @@
esac
done
+if [ -f "/etc/init/${SERVICE}.conf" ] && use_upstart ; then
+ case $COMMAND in
+ start)
+ upstart_start "${SERVICE}"
+ exit $?
+ ;;
+ stop)
+ upstart_stop "${SERVICE}"
+ exit $?
+ ;;
+ status)
+ upstart_status "${SERVICE}"
+ exit $?
+ ;;
+ force-reload)
+ if ! grep -Eq '#\s*pld-flags:.*no-sighup-reload' "/etc/init/${SERVICE}.conf" ; then
+ upstart_reload "${SERVICE}"
+ exit $?
+ else
+ upstart_stop "${SERVICE}"
+ upstart_start "${SERVICE}"
+ exit $?
+ fi
+ ;;
+ reload)
+ if ! grep -Eq '#\s*pld-flags:.*no-sighup-reload' "/etc/init/${SERVICE}.conf" ; then
+ upstart_reload "${SERVICE}"
+ exit $?
+ fi
+ if [ ! -x "${SERVICEDIR}/${SERVICE}" ]; then
+ msg_usage "$0 {start|stop|restart|status|force-reload}"
+ exit 3
+ fi
+ # if not handled here, pass it the rc.d/init.d script
+ ;;
+ *)
+ if [ ! -x "${SERVICEDIR}/${SERVICE}" ]; then
+ commands="start|stop|restart|status|force-reload"
+ if ! grep -Eq '#\s*pld-flags:.*no-sighup-reload' "/etc/init/${SERVICE}.conf" ; then
+ commands="$commands|reload"
+ fi
+ msg_usage "$0 {$commands}"
+ exit 3
+ fi
+ # pass the rest to the rc.d/init.d script
+ ;;
+ esac
+fi
+
if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
else
echo "${SERVICE}: unrecognized service" >&2
exit 1
fi
+
More information about the pld-cvs-commit
mailing list