Comments
Patch
@@ -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 "$@"
@@ -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
@@ -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")
@@ -4,6 +4,7 @@
START=50
STOP=50
+ESSENTIAL_PROCESSES="dropbear"
SERVICE_USE_PID=1
@@ -2,6 +2,7 @@
START=20
STOP=90
+ESSENTIAL_PROCESSES="netifd hostapd wpa_supplicant udhcpc"
SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1
@@ -1,6 +1,7 @@
#!/bin/sh /etc/rc.common
START=11
+ESSENTIAL_PROCESSES="ubusd"
SERVICE_DAEMONIZE=1
SERVICE_WRITE_PID=1
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(-)