]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Modern init systems such as OpenRC and systemd can be installed on top
authorRoy Marples <roy@marples.name>
Wed, 8 Jan 2014 11:34:51 +0000 (11:34 +0000)
committerRoy Marples <roy@marples.name>
Wed, 8 Jan 2014 11:34:51 +0000 (11:34 +0000)
of the base system init.
However, the user can easily flip between them so we need to work out
which init system is in use at runtime rather than compile time.

configure
dhcpcd-run-hooks.in

index bff6d1e16dd20061faf79d83ad2c3f1052bc46d5..73392d9e41da90e5a558cef1b49202f1116abac9 100755 (executable)
--- a/configure
+++ b/configure
@@ -683,90 +683,23 @@ if [ "$DEV" = yes ]; then
        echo "MKDIRS+=  dev" >>$CONFIG_MK
 fi
 
-if [ -z "$SERVICECMD" ]; then
-       printf "Checking for OpenRC ... "
-       if [ -x /sbin/rc-service ]; then
-               SERVICEEXISTS="/sbin/rc-service -e \$1"
-               SERVICECMD="/sbin/rc-service \$1 -- -D \$2"
-               echo "yes"
-       else
-               echo "no"
-       fi
-fi
-if [ -z "$SERVICECMD" ]; then
-       printf "Checking for invoke-rc.d ... "
-       if [ -x /usr/sbin/invoke-rc.d ]; then
-               SERVICEEXISTS="/usr/sbin/invoke-rc.d --query --quiet \$1 start >/dev/null 2>&1 || [ \$? = 104 ]"
-               SERVICECMD="/usr/sbin/invoke-rc.d \$1 \$2"
-               echo "yes"
-       else
-               echo "no"
-       fi
-fi
-if [ -z "$SERVICECMD" ]; then
-       printf "Checking for service ... "
-       if [ -x /sbin/service ]; then
-               SERVICEEXISTS="/sbin/service \$1 >/dev/null 2>&1"
-               SERVICECMD="/sbin/service \$1 \$2"
-               echo "yes"
-       else
-               echo "no"
-       fi
-fi
-if [ -z "$SERVICECMD"  ]; then
-       printf "Checking for Slackware ... "
-       if [ -e /etc/slackware-version -a -d /etc/rc.d ]; then
-               SERVICEEXISTS="[ -x /etc/rc.d/rc.\$1 ]"
-               SERVICECMD="/etc/rc.d/rc.\$1 \$2"
-               SERVICESTATUS="/etc/rc.d/rc.\$1 status 1>/dev/null 2>&1"
-               echo "yes"
-       else
-               echo "no"
-       fi
-fi
-if [ -z "$SERVICECMD" ]; then
-       for x in /etc/init.d/rc.d /etc/rc.d /etc/init.d; do
-               printf "Checking for $x ... "
-               if [ -d $x ]; then
-                       SERVICEEXISTS="[ -x $x/\$1 ]"
-                       SERVICECMD="$x/\$1 \$2"
-                       echo "yes"
-                       break
-               else
-                       echo "no"
-               fi
-       done
-fi
-if [ -e /etc/arch-release ]; then
-       echo "Overriding service status check for Arch Linux"
-       SERVICESTATUS="[ -e /var/run/daemons/\$1 ]"
-fi
-
-if [ -z "$SERVICEEXISTS" -o -z "$SERVICECMD" ]; then
-       echo "$0: WARNING: No means of interacting with system services detected!"
-       SERVICEEXISTS="return 1"
-       SERVICECMD="return 1"
-fi
-if [ -z "$SERVICESTATUS" ]; then
-       SERVICESTATUS="service_command \$1 status >/dev/null 2>&1"
-fi
 # Transform for a make file
 SERVICEEXISTS=$(echo "$SERVICEEXISTS" | $SED \
        -e 's:\\:\\\\:g' \
        -e 's:\&:\\\&:g' \
-       -e 's:\$:\$\$:g' \
+       -e 's:\$:\\\\\$\$:g' \
 )
 echo "SERVICEEXISTS=   $SERVICEEXISTS" >>config.mk
 SERVICECMD=$(echo "$SERVICECMD" | $SED \
        -e 's:\\:\\\\:g' \
        -e 's:\&:\\\&:g' \
-       -e 's:\$:\$\$:g' \
+       -e 's:\$:\\\\\$\$:g' \
 )
 echo "SERVICECMD=      $SERVICECMD" >>config.mk
 SERVICESTATUS=$(echo "$SERVICESTATUS" | $SED \
        -e 's:\\:\\\\:g' \
        -e 's:\&:\\\&:g' \
-       -e 's:\$:\$\$:g' \
+       -e 's:\$:\\\\\$\$:g' \
 )
 echo "SERVICESTATUS=   $SERVICESTATUS" >>config.mk
 
index 6961ed3bb32c1848b4cdb20ea2a9ff0c1b1a7715..93fdfda26e6a5b71bcc2268b099c92bbefcd467c 100644 (file)
@@ -18,6 +18,7 @@ signature="$signature_base $from $ifname"
 signature_base_end="# End of dhcpcd"
 signature_end="$signature_base_end $from $ifname"
 state_dir=@RUNDIR@/dhcpcd
+_detected_init=false
 
 : ${if_up:=false}
 : ${if_down:=false}
@@ -193,31 +194,113 @@ valid_path()
        return 0
 }
 
+# With the advent of alternative init systems, it's possible to have
+# more than one installed. So we need to try and guess what one we're
+# using unless overriden by configure.
+detect_init()
+{
+       _service_exists="@SERVICEEXISTS@"
+       _service_cmd="@SERVICECMD@"
+       _service_status="@SERVICESTATUS@"
+
+       [ -n "$_service_cmd" ] && return 0
+
+       if ${_detected_init}; then
+               [ -n "$_service_cmd" ]
+               return $?
+       fi
+
+       # Detect the running init system.
+       # As systemd and OpenRC can be installed on top of legacy init
+       # systems we try to detect them first.
+       _service_status=
+       if [ -x /bin/systemctl -a -S /run/systemd/private ]; then
+               _service_exists="/bin/systemctl --quiet is-enabled \$1.service"
+               _service_status="/bin/systemctl --quiet is-active \$1.service"
+               _service_cmd="/bin/systemctl \$2 \$1.service"
+       elif [ -x /usr/bin/systemctl -a -S /run/systemd/private ]; then
+               _service_exists="/usr/bin/systemctl --quiet is-enabled \$1.service"
+               _service_status="/usr/bin/systemctl --quiet is-active \$1.service"
+               _service_cmd="/usr/bin/systemctl \$2 \$1.service"
+       elif [ -x /sbin/rc-service -a \
+           -s /libexec/rc/init.d/softlevel -o -s /run/openrc/softlevel ]
+       then
+               _service_exists="/sbin/rc-service -e \$1"
+               _service_cmd="/sbin/rc-service \$1 -- -D \$2"
+       elif [ -x /usr/sbin/invoke-rc.d ]; then
+               _service_exists="/usr/sbin/invoke-rc.d --query --quiet \$1 start >/dev/null 2>&1 || [ \$? = 104 ]"
+               _service_cmd="/usr/sbin/invoke-rc.d \$1 \$2"
+       elif [ -x /sbin/service ]; then
+               _service_exists="/sbin/service \$1 >/dev/null 2>&1"
+               _service_cmd="/sbin/service \$1 \$2"
+       elif [ -e /etc/slackware-version -a -d /etc/rc.d ]; then
+               _service_exists="[ -x /etc/rc.d/rc.\$1 ]"
+               _service_cmd="/etc/rc.d/rc.\$1 \$2"
+               _service_status="/etc/rc.d/rc.\$1 status 1>/dev/null 2>&1"
+       else
+               for x in /etc/init.d/rc.d /etc/rc.d /etc/init.d; do
+                       if [ -d $x ]; then
+                               _service_exists="[ -x $x/\$1 ]"
+                               _service_cmd="$x/\$1 \$2"
+                               break
+                       fi
+               done
+               if [ -e /etc/arch-release ]; then
+                       _service_status="[ -e /var/run/daemons/\$1 ]"
+               fi
+       fi
+
+       _detected_init=true
+       if [ -z "$_service_cmd" ]; then
+               syslog err "could not detect a useable init system"
+               return 1
+       fi
+       return 0
+}
+
 # Check a system service exists 
 service_exists()
 {
-       @SERVICEEXISTS@
+
+       if [ -z "$_service_exists" ]; then
+               detect_init || return 1
+       fi
+       eval $_service_exists
 }
 
 # Send a command to a system service
 service_cmd()
 {
-       @SERVICECMD@
+
+       if [ -z "$_service_cmd" ]; then
+               detect_init || return 1
+       fi
+       eval $_service_cmd
 }
 
 # Send a command to a system service if it is running
 service_status()
 {
-       @SERVICESTATUS@
+
+       if [ -z "$_service_cmd" ]; then
+               detect_init || return 1
+       fi
+       if [ -n "$_service_status" ]; then
+               eval $_service_status
+       else
+               service_command $1 status >/dev/null 2>&1
+       fi
 }
 
 # Handy macros for our hooks
 service_command()
 {
+
        service_exists $1 && service_cmd $1 $2
 }
 service_condcommand()
 {
+
        service_exists $1 && service_status $1 && service_cmd $1 $2
 }