Patchwork [OpenWrt-Devel] add notion of essential processes for sysupgrade

login
register
Submitter Ryan Nowakowski
Date 2012-07-11 17:36:21
Message ID <20120711173621.GB11548@fattuba.com>
Download mbox | patch
Permalink /patch/2372/
State Rejected
Headers show

Comments

Ryan Nowakowski - 2012-07-11 17:36:21
Currently /lib/upgrade/common.sh contains a static list of essential
processes that shouldn't be killed during sysupgrade.  This changes
that static list into a dynamic one built from a ESSENTIAL_PROCESSES
shell variable in package init scripts.  That way, packages can declare
their own essential processes.  There's a corresponding patch for the
packages repo.

    * add /etc/rc.common listessential action
    * modify /lib/upgrade/common.sh to query essential processes
    * add ESSENTIAL_PROCESSES to appropriate init scripts

Signed-off-by: Ryan Nowakowski <tubaman@fattuba.com>
---
 package/base-files/files/etc/rc.common         |    8 +++++++-
 package/base-files/files/lib/upgrade/common.sh |   25 +++++++++++++++++++++---
 package/busybox/files/telnet                   |    1 +
 package/dropbear/files/dropbear.init           |    1 +
 package/netifd/files/etc/init.d/network        |    1 +
 package/ubus/files/ubus.init                   |    1 +
 6 files changed, 33 insertions(+), 4 deletions(-)

Patch

diff --git a/package/base-files/files/etc/rc.common b/package/base-files/files/etc/rc.common
index fa2df6c..092f0d7 100755
--- a/package/base-files/files/etc/rc.common
+++ b/package/base-files/files/etc/rc.common
@@ -56,6 +56,11 @@  enabled() {
 	[ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ]
 }
 
+listessential() {
+	name="$(basename "${initscript}")"
+	[ "$ESSENTIAL_PROCESSES" ] && echo "$ESSENTIAL_PROCESSES"
+}
+
 depends() {
 	return 0
 }
@@ -71,6 +76,7 @@  Available commands:
 	reload	Reload configuration files (or restart if that fails)
 	enable	Enable service autostart
 	disable	Disable service autostart
+	listessential	List the essential processes for sysupgrade
 $EXTRA_HELP
 EOF
 }
@@ -79,7 +85,7 @@  ${INIT_TRACE:+set -x}
 
 . "$initscript"
 
-ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}"
+ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends listessential ${EXTRA_COMMANDS}"
 list_contains ALL_COMMANDS "$action" || action=help
 [ "$action" = "reload" ] && action='eval reload "$@" || restart "$@" && :'
 $action "$@"
diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh
index e6de348..ce77845 100644
--- a/package/base-files/files/lib/upgrade/common.sh
+++ b/package/base-files/files/lib/upgrade/common.sh
@@ -5,6 +5,25 @@  RAM_ROOT=/tmp/root
 ldd() { LD_TRACE_LOADED_OBJECTS=1 $*; }
 libs() { ldd $* | awk '{print $3}'; }
 
+get_essential_processes() {
+	for script in /etc/init.d/*; do
+		grep '#!/bin/sh /etc/rc.common' $script >/dev/null || continue
+		sh /etc/rc.common $script listessential
+	done
+}
+
+ESSENTIAL="$(get_essential_processes)"
+
+is_essential() {
+	local process=$1
+	for p in $ESSENTIAL; do
+		if [ "$process" == "$p" ]; then
+			return 0
+		fi
+	done
+	return 1
+}
+
 install_file() { # <file> [ <file> ... ]
 	for file in "$@"; do
 		dest="$RAM_ROOT/$file"
@@ -98,12 +117,12 @@  kill_remaining() { # [ <signal> ]
 		[ -n "$cmdline" ] || continue
 
 		case "$name" in
-			# Skip essential services
-			*ash*|*init*|*watchdog*|*ssh*|*dropbear*|*telnet*|*login*|*hostapd*|*wpa_supplicant*) : ;;
+			# Skip essential core services
+			*ash*|*init*|*watchdog*|*login*) : ;;
 
 			# Killable process
 			*)
-				if [ $pid -ne $$ ] && [ $ppid -ne $$ ]; then
+				if [ $pid -ne $$ ] && [ $ppid -ne $$ ] && ! is_essential $name; then
 					echo -n "$name "
 					kill -$sig $pid 2>/dev/null
 				fi
diff --git a/package/busybox/files/telnet b/package/busybox/files/telnet
index 994e713..e08a94d 100755
--- a/package/busybox/files/telnet
+++ b/package/busybox/files/telnet
@@ -2,6 +2,7 @@ 
 # Copyright (C) 2006-2011 OpenWrt.org
 
 START=50
+ESSENTIAL_PROCESSES="telnet telnetd"
 
 has_root_pwd() {
 	local pwd=$([ -f "$1" ] && cat "$1")
diff --git a/package/dropbear/files/dropbear.init b/package/dropbear/files/dropbear.init
index c909d28..cf45190 100755
--- a/package/dropbear/files/dropbear.init
+++ b/package/dropbear/files/dropbear.init
@@ -4,6 +4,7 @@ 
 
 START=50
 STOP=50
+ESSENTIAL_PROCESSES="dropbear"
 
 SERVICE_USE_PID=1
 
diff --git a/package/netifd/files/etc/init.d/network b/package/netifd/files/etc/init.d/network
index ea93819..8595812 100755
--- a/package/netifd/files/etc/init.d/network
+++ b/package/netifd/files/etc/init.d/network
@@ -2,6 +2,7 @@ 
 
 START=20
 STOP=90
+ESSENTIAL_PROCESSES="netifd hostapd wpa_supplicant udhcpc"
 
 SERVICE_DAEMONIZE=1
 SERVICE_WRITE_PID=1
diff --git a/package/ubus/files/ubus.init b/package/ubus/files/ubus.init
index 70fe21c..8d09af6 100755
--- a/package/ubus/files/ubus.init
+++ b/package/ubus/files/ubus.init
@@ -1,6 +1,7 @@ 
 #!/bin/sh /etc/rc.common
 
 START=11
+ESSENTIAL_PROCESSES="ubusd"
 
 SERVICE_DAEMONIZE=1
 SERVICE_WRITE_PID=1