From: Roy Marples Date: Wed, 8 Jan 2014 11:34:51 +0000 (+0000) Subject: Modern init systems such as OpenRC and systemd can be installed on top X-Git-Tag: v6.2.1~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c19ee2be35892274327ec29e27a268bbf85db53b;p=thirdparty%2Fdhcpcd.git Modern init systems such as OpenRC and systemd can be installed on top 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. --- diff --git a/configure b/configure index bff6d1e1..73392d9e 100755 --- 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 diff --git a/dhcpcd-run-hooks.in b/dhcpcd-run-hooks.in index 6961ed3b..93fdfda2 100644 --- a/dhcpcd-run-hooks.in +++ b/dhcpcd-run-hooks.in @@ -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 }