Package: file-rc
Version: 0.8.15
Severity: wishlist
Tags: patch
User: [email protected]
Usertags: origin-ubuntu ubuntu-patch saucy

Hi,

In #671284, Steve patched sysv-rc's invoke-rc.d to add support for
handling Upstart jobs; and in #708720, he caused dh_installinit to add a
dependency on sysv-rc for packages shipping Upstart jobs in addition to
System V init scripts.  The combination of these means that, as Thorsten
Glaser pointed out to me this morning, forwarding Ubuntu's backlog of
Upstart jobs to Debian will cause a bunch of packages to be incompatible
with file-rc.  Now, I don't know how long file-rc is sticking around,
but it doesn't seem right for Upstart jobs to be the thing that force it
out, so I think we should fix this.

Fortunately, Steve's patch to sysv-rc's invoke-rc.d applies more or less
verbatim.  I've tested this successfully in an LXC container with one
Upstart job (ssh) and one System V init script (cron), with each of
sysvinit and upstart as the init daemon (in the latter case you have to
force it in despite dependencies, but it seems to work anyway).

diff -ru file-rc-0.8.15/debian/changelog file-rc-0.8.15+nmu1/debian/changelog
--- file-rc-0.8.15/debian/changelog     2013-03-26 07:01:37.000000000 +0000
+++ file-rc-0.8.15+nmu1/debian/changelog        2013-05-23 11:49:50.607314112 
+0100
@@ -1,3 +1,12 @@
+file-rc (0.8.15+nmu1) UNRELEASED; urgency=low
+
+  * Non-maintainer upload.
+  * Add upstart support to invoke-rc.d, per the policy discussion in bug
+    #591791.  This is a straight port of Steve Langasek's implementation in
+    sysv-rc.
+
+ -- Colin Watson <[email protected]>  Thu, 23 May 2013 11:48:40 +0100
+
 file-rc (0.8.15) unstable; urgency=low
 
   [ Michael Stapelberg ]
diff -ru file-rc-0.8.15/invoke-rc.d file-rc-0.8.15+nmu1/invoke-rc.d
--- file-rc-0.8.15/invoke-rc.d  2012-07-02 21:45:09.000000000 +0100
+++ file-rc-0.8.15+nmu1/invoke-rc.d     2013-05-23 15:28:37.954435538 +0100
@@ -33,6 +33,7 @@
 CFGFILE="/etc/runlevel.conf"
 BAKCFG="/etc/runlevel.fallback"
 LOCKFILE="/var/lock/runlevel.lock"
+UPSTARTDIR=/etc/init/
 # Should use filercconf if possible, and filercbak if filercconf is missing.
 
 valid_min_seq=0
@@ -48,6 +49,7 @@
 RETRY=
 RETURNFAILURE=
 RC=
+is_upstart=
 
 # Shell options
 set +e
@@ -275,9 +277,15 @@
        ;;
 esac
 
-## Verifies if the given initscript ID is known
-## For sysvinit, this error is critical
-if test ! -f "${INITDPREFIX}${INITSCRIPTID}" ; then
+# If we're running on upstart and there's an upstart job of this name, do
+# the rest with upstart instead of calling the init script.
+if which initctl >/dev/null && initctl version | grep -q upstart \
+   && [ -e "$UPSTARTDIR/${INITSCRIPTID}.conf" ]
+then
+    is_upstart=1
+elif test ! -f "${INITDPREFIX}${INITSCRIPTID}" ; then
+    ## Verifies if the given initscript ID is known
+    ## For sysvinit, this error is critical
     printerror unknown initscript, ${INITDPREFIX}${INITSCRIPTID} not found.
     exit 100
 fi
@@ -447,7 +455,7 @@
 esac
 
 # test if /etc/init.d/initscript is actually executable
-if testexec "${INITDPREFIX}${INITSCRIPTID}" ; then
+if [ -n "$is_upstart" ] || testexec "${INITDPREFIX}${INITSCRIPTID}" ; then
     if test x${RC} = x -a x${MODE} = xquery ; then
         RC=105
     fi
@@ -494,11 +502,25 @@
     ACTION="$@"
 }
 
+if [ -n "$is_upstart" ]; then
+    RUNNING=
+    DISABLED=
+    if status "$INITSCRIPTID" 2>/dev/null | grep -q ' start/'; then
+       RUNNING=1
+    fi
+    UPSTART_VERSION_RUNNING=$(initctl version|awk '{print $3}'|tr -d ')')
+
+    if dpkg --compare-versions "$UPSTART_VERSION_RUNNING" ge 0.9.7
+    then
+       initctl show-config -e "$INITSCRIPTID"|grep -q '^  start on' || 
DISABLED=1
+    fi
+fi
+
 ## Executes initscript
 ## note that $ACTION is a space-separated list of actions
 ## to be attempted in order until one suceeds.
 if test x${FORCE} != x -o ${RC} -eq 104 ; then
-    if testexec "${INITDPREFIX}${INITSCRIPTID}" ; then
+    if [ -n "$is_upstart" ] || testexec "${INITDPREFIX}${INITSCRIPTID}" ; then
        RC=102
        setechoactions ${ACTION}
        while test ! -z "${ACTION}" ; do
@@ -507,7 +529,48 @@
                printerror executing initscript action \"${saction}\"...
            fi
 
-           "${INITDPREFIX}${INITSCRIPTID}" "${saction}" "$@" && exit 0
+           if [ -n "$is_upstart" ]; then
+               case $saction in
+                   status)
+                       "$saction" "$INITSCRIPTID" && exit 0
+                       ;;
+                   start|stop)
+                       if [ -z "$RUNNING" ] && [ "$saction" = "stop" ]; then
+                           exit 0
+                       elif [ -n "$RUNNING" ] && [ "$saction" = "start" ]; then
+                           exit 0
+                       elif [ -n "$DISABLED" ] && [ "$saction" = "start" ]; 
then
+                           exit 0
+                       fi
+                       $saction "$INITSCRIPTID" && exit 0
+                       ;;
+                   restart)
+                       if [ -n "$RUNNING" ] ; then
+                           stop "$INITSCRIPTID"
+                       fi
+
+                       # If the job is disabled and is not currently
+                       # running, the job is not restarted. However, if
+                       # the job is disabled but has been forced into
+                       # the running state, we *do* stop and restart it
+                       # since this is expected behaviour
+                       # for the admin who forced the start.
+                       if [ -n "$DISABLED" ] && [ -z "$RUNNING" ]; then
+                           exit 0
+                       fi
+                       start "$INITSCRIPTID" && exit 0
+                       ;;
+                   reload|force-reload)
+                       reload "$INITSCRIPTID" && exit 0
+                       ;;
+                   *)
+                       # This will almost certainly fail, but give it a try
+                       initctl "$saction" "$INITSCRIPTID" && exit 0
+                       ;;
+               esac
+           else
+               "${INITDPREFIX}${INITSCRIPTID}" "${saction}" "$@" && exit 0
+           fi
            RC=$?
 
            if test ! -z "${ACTION}" ; then

Thanks,

-- 
Colin Watson                                       [[email protected]]


-- 
To UNSUBSCRIBE, email to [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]

Reply via email to