From 5ebf53255459c7708bba0352556a9a940a71a229 Mon Sep 17 00:00:00 2001 From: Alexey Gladkov Date: Fri, 3 Jan 2025 18:55:52 +0100 Subject: [PATCH] Use bash-specific optimizations in the init.d functions Signed-off-by: Alexey Gladkov --- runtime/data/etc/rc.d/init.d/functions | 186 ++++++++++++------------- runtime/data/etc/rc.d/init.d/outformat | 19 +-- 2 files changed, 99 insertions(+), 106 deletions(-) diff --git a/runtime/data/etc/rc.d/init.d/functions b/runtime/data/etc/rc.d/init.d/functions index 64753705..e327b795 100644 --- a/runtime/data/etc/rc.d/init.d/functions +++ b/runtime/data/etc/rc.d/init.d/functions @@ -56,7 +56,7 @@ fi start_daemon() { # Process options. - local ANNOUNCE=1 BACKGROUND='' BASENAME='' CHECK='' CMDNAME='' DISPNAME='' EXPECT='' FLAGS='' LOCKFILE='' MAKE_PIDFILE='' NICE=0 PIDFILE='' STATUS='' SU='' WHICH='' + local FLAGS ANNOUNCE=1 BACKGROUND='' BASENAME='' CHECK='' CMDNAME='' DISPNAME='' LOCKFILE='' MAKE_PIDFILE='' NICE=0 PIDFILE='' STATUS='' WHICH='' while [ "$1" != "${1##[-+]}" ]; do case "$1" in @@ -110,18 +110,25 @@ start_daemon() msg_usage "start_daemon [options]... {program}..." return 1 fi + if [ -n "$CHECK" ] && [ -n "$CMDNAME" ]; then echo >&2 "start_daemon: --check and --name are mutually exclusive options" return 1 fi + if [ -n "$CMDNAME" ] && [ -z "$PIDFILE" ]; then echo >&2 "start_daemon: --name is set but --pidfile is not set" return 1 fi # We need the absolute pathname. - [ -z "$CHECK" ] || CHECK="$(absolute "$CHECK")" || return 1 - WHICH="$(absolute "$1")" || return 1 + [ -z "$CHECK" ] || + CHECK="$(absolute "$CHECK")" || + return 1 + + WHICH="$(absolute "$1")" || + return 1 + if [ -n "$CMDNAME" ]; then BASENAME="${CMDNAME##*/}" elif [ -n "$CHECK" ]; then @@ -130,36 +137,34 @@ start_daemon() BASENAME="${1##*/}" fi shift - [ -n "$BASENAME" ] || return 1 - [ -n "$DISPNAME" ] || DISPNAME="$BASENAME" + + [ -n "$BASENAME" ] || + return 1 + + DISPNAME="${DISPNAME:-$BASENAME}" [ "${RDLOG-}" != 'console' ] || ANNOUNCE='' - # Use a safe umask - #umask 077 - - # Don't export these because they may be invalid under another UID and the - # directories may be gone while the daemon is still running. - local HOME='' TMP='' TMPDIR='' + FLAGS=("--start" "-N" "$NICE") - FLAGS="--start -N $NICE" if [ -n "$CMDNAME" ]; then - FLAGS="$FLAGS --startas $WHICH --name $CMDNAME" + FLAGS+=("--startas" "$WHICH" "--name" "$CMDNAME") elif [ -n "$CHECK" ]; then - FLAGS="$FLAGS --exec $CHECK --startas $WHICH" + FLAGS+=("--exec" "$CHECK" "--startas" "$WHICH") else - FLAGS="$FLAGS --exec $WHICH" + FLAGS+=("--exec" "$WHICH") fi - [ -z "$PIDFILE" ] || FLAGS="$FLAGS --pidfile $PIDFILE" - [ -z "$BACKGROUND" ] || FLAGS="$FLAGS $BACKGROUND" - [ -z "$MAKE_PIDFILE" ] || FLAGS="$FLAGS $MAKE_PIDFILE" + [ -z "$PIDFILE" ] || FLAGS+=("--pidfile" "$PIDFILE") + [ -z "$BACKGROUND" ] || FLAGS+=("$BACKGROUND") + [ -z "$MAKE_PIDFILE" ] || FLAGS+=("$MAKE_PIDFILE") # Announce the action. - [ -z "$ANNOUNCE" ] || msg_starting "$DISPNAME" + [ -z "$ANNOUNCE" ] || + msg_starting "$DISPNAME" # Actually start the daemon. - start-stop-daemon $FLAGS -- "$@" + start-stop-daemon "${FLAGS[@]}" -- "$@" STATUS=$? if [ $STATUS = 0 ]; then @@ -173,13 +178,35 @@ start_daemon() return $STATUS } +guess_basename_dispname() +{ + [ -n "$CMDNAME" ] && + BASENAME="${CMDNAME##*/}" || + BASENAME="${NAME##*/}" || + return 1 + + DISPNAME="${DISPNAME:-$BASENAME}" +} + +guess_pidfile() +{ + # Try to guess the PID file if one isn't specified manually. + if [ -z "$PIDFILE" ]; then + PIDFILE="/var/run/$BASENAME.pid" + [ -f "$PIDFILE" ] || PIDFILE= + elif [ "$PIDFILE" = none ]; then + PIDFILE= + fi +} + stop_daemon() { # Process options. - local ANNOUNCE=1 BASENAME='' CMDNAME='' DEFAULT=true DISPNAME='' EXPECT='' FLAGS='' LOCKFILE='' MESSAGE='' NAME='' PIDFILE='' RETRY='' SIGNAL='' STATUS='' WHICH='' + local FLAGS ANNOUNCE=1 BASENAME='' CMDNAME='' DEFAULT=true DISPNAME='' LOCKFILE='' MESSAGE='' NAME='' PIDFILE='' RETRY='' SIGNAL='' STATUS='' WHICH='' # start-stop-daemon wants a signal number. SIGNAL="$(/bin/kill -l TERM)" || SIGNAL=15 + while [ $# -ge 1 ]; do case "$1" in --) shift @@ -234,51 +261,44 @@ stop_daemon() msg_usage "stop_daemon [options]... {program}..." return 1 fi - WHICH="$(absolute "$NAME")" || return 1 - [ -n "$CMDNAME" ] && - BASENAME="${CMDNAME##*/}" || - BASENAME="${NAME##*/}" || return 1 - [ -n "$DISPNAME" ] || DISPNAME="$BASENAME" + WHICH="$(absolute "$NAME")" || + return 1 [ "${RDLOG-}" != 'console' ] || ANNOUNCE='' - # Try to guess the PID file if one isn't specified manually. - if [ -z "$PIDFILE" ]; then - PIDFILE="/var/run/$BASENAME.pid" - [ -f "$PIDFILE" ] || PIDFILE= - elif [ "$PIDFILE" = none ]; then - PIDFILE= - fi + guess_basename_dispname + guess_pidfile if [ -n "$CMDNAME" ] && [ -z "$PIDFILE" ]; then echo "stop_daemon: --name is set but --pidfile is not set" >&2 return 1 fi - FLAGS="--stop -q" + FLAGS=("--stop" "-q") + [ -z "$CMDNAME" ] && - FLAGS="$FLAGS --exec $WHICH" || - FLAGS="$FLAGS --name $CMDNAME" - [ -z "$PIDFILE" ] || FLAGS="$FLAGS --pidfile $PIDFILE" -# [ -z "$RETRY" ] || FLAGS="$FLAGS --retry $RETRY" + FLAGS+=("--exec" "$WHICH") || + FLAGS+=("--name" "$CMDNAME") - if [ "$DEFAULT" = true ]; then - MESSAGE="$BASENAME shutdown" - else - MESSAGE="sending signal $SIGNAL to $BASENAME" - fi + [ -z "$PIDFILE" ] || + FLAGS+=("--pidfile" "$PIDFILE") # Announce the action. - [ -z "$ANNOUNCE" ] || msg_stopping "$DISPNAME" + [ -z "$ANNOUNCE" ] || + msg_stopping "$DISPNAME" # Actually tell the daemon to stop. - start-stop-daemon $FLAGS --signal "$SIGNAL" + start-stop-daemon "${FLAGS[@]}" --signal "$SIGNAL" STATUS=$? + [ "$DEFAULT" = true ] && + MESSAGE="$BASENAME shutdown" || + MESSAGE="sending signal $SIGNAL to $BASENAME" + if [ $STATUS = 0 ]; then - [ -z "$PIDFILE" ] || rm -f "$PIDFILE" + [ -z "$PIDFILE" ] || rm -f "$PIDFILE" [ -z "$LOCKFILE" ] || rm -f "$LOCKFILE" [ "$BOOTUP" != verbose ] || echo -n " $DISPNAME " success "$MESSAGE" @@ -298,7 +318,7 @@ status() fi # Process options. - local BASENAME='' CMDNAME='' DISPNAME='' EXPECT='' FLAGS='' LOCKFILE='' PIDFILE='' WHICH='' + local FLAGS BASENAME='' CMDNAME='' DISPNAME='' LOCKFILE='' PIDFILE='' WHICH='' while [ "$1" != "${1##-}" ]; do case "$1" in @@ -332,20 +352,12 @@ status() msg_usage "status [options]... {program}" return 1 fi - WHICH="$(absolute "$1")" || return 1 - [ -n "$CMDNAME" ] && - BASENAME="${CMDNAME##*/}" || - BASENAME="${1##*/}" || return 1 - [ -n "$DISPNAME" ] || DISPNAME="$BASENAME" + WHICH="$(absolute "$1")" || + return 1 - # Try to guess the PID file if one isn't specified manually. - if [ -z "$PIDFILE" ]; then - PIDFILE="/var/run/$BASENAME.pid" - test -f "$PIDFILE" || PIDFILE= - elif [ "$PIDFILE" = none ]; then - PIDFILE= - fi + guess_basename_dispname + guess_pidfile if [ -n "$CMDNAME" ] && [ -z "$PIDFILE" ]; then echo "status: --name is set but --pidfile is not set" >&2 @@ -353,14 +365,17 @@ status() fi # Actually determine the status. - FLAGS="--stop --test" - [ -z "$CMDNAME" ] && - FLAGS="$FLAGS --exec $WHICH" || - FLAGS="$FLAGS --name $CMDNAME" - [ -z "$PIDFILE" ] || FLAGS="$FLAGS --pidfile $PIDFILE" + FLAGS=("--stop" "--test") + + [ -n "$CMDNAME" ] && + FLAGS+=("--name" "$CMDNAME") || + FLAGS+=("--exec" "$WHICH") + + [ -z "$PIDFILE" ] || + FLAGS+=("--pidfile" "$PIDFILE") # Report it. - if start-stop-daemon $FLAGS >/dev/null; then + if start-stop-daemon "${FLAGS[@]}" >/dev/null; then echo "$DISPNAME is running" return 0 fi @@ -370,8 +385,7 @@ status() return 1 fi - [ -n "$LOCKFILE" ] || LOCKFILE="/var/lock/subsys/$BASENAME" - if [ -f "$LOCKFILE" ]; then + if [ -f "${LOCKFILE:-/var/lock/subsys/$BASENAME}" ]; then echo "$DISPNAME is dead, but subsystem is locked" return 2 fi @@ -444,6 +458,13 @@ echo_passed() return 1 } +msg_starting() { echo_msg "Starting $1 service: "; } +msg_stopping() { echo_msg "Stopping $1 service: "; } +msg_reloading() { echo_msg "Reloading $1 service: "; } +msg_already_running() { echo_msg "Service $1 is already running."; } +msg_not_running() { echo_msg "Service $1 is not running."; } +msg_usage() { printf "Usage: %s\n" "$*" >&2; } + # Log that something succeeded success() { @@ -509,34 +530,3 @@ action_shell() [ $rc -eq 0 ] && success "$STRING" || failure "$STRING" return $rc } - -msg_starting() -{ - echo_msg "Starting $1 service: " -} - -msg_already_running() -{ - echo_msg "Service $1 is already running." -} - - -msg_stopping() -{ - echo_msg "Stopping $1 service: " -} - -msg_not_running() -{ - echo_msg "Service $1 is not running." -} - -msg_reloading() -{ - echo_msg "Reloading $1 service: " -} - -msg_usage() -{ - printf "Usage: %s\n" "$*" >&2 -} diff --git a/runtime/data/etc/rc.d/init.d/outformat b/runtime/data/etc/rc.d/init.d/outformat index d39215b5..636b04eb 100644 --- a/runtime/data/etc/rc.d/init.d/outformat +++ b/runtime/data/etc/rc.d/init.d/outformat @@ -6,14 +6,17 @@ [ -n "${RES_OFFSET-}" ] && [ "$RES_OFFSET" -gt 0 ] 2>/dev/null || RES_OFFSET=8 # Terminal sequence to move to that position. -TO_COL=$(pos=$((${COLUMNS:-80} - $RES_OFFSET)); [ $pos -le 0 ] || printf "\033[%dG" $pos;) +TO_COL=$(( ${COLUMNS:-80} - $RES_OFFSET )) +[ "$TO_COL" -gt 0 ] 2>/dev/null || TO_COL=1 + +printf -v TO_COL "\033[%dG" "$TO_COL" # Enumerate colors -: "${BLACK:=0}" "${RED:=1}" "${GREEN:=2}" "${YELLOW:=3}" "${BLUE:=4}" "${MAGENTA:=5}" "${CYAN:=6}" "${WHITE:=7}" +# "${BLACK:=0}" "${RED:=1}" "${GREEN:=2}" "${YELLOW:=3}" "${BLUE:=4}" "${MAGENTA:=5}" "${CYAN:=6}" "${WHITE:=7}" -COLOR_SUCCESS=$(printf "\033[1m\033[3%dm" $GREEN) -COLOR_FAILURE=$(printf "\033[1m\033[3%dm" $RED) -COLOR_WARNING=$(printf "\033[1m\033[3%dm" $YELLOW) -COLOR_INFO=$(printf "\033[1m\033[3%dm" $CYAN) -COLOR_BANNER=$(printf "\033[3%dm\033[4%dm" $BLUE $YELLOW) -COLOR_NORMAL=$(printf "\033[39;49m\033[0;10m") +printf -v COLOR_SUCCESS "\033[1m\033[3%dm" "${GREEN:-2}" +printf -v COLOR_FAILURE "\033[1m\033[3%dm" "${RED:-1}" +printf -v COLOR_WARNING "\033[1m\033[3%dm" "${YELLOW:-3}" +printf -v COLOR_INFO "\033[1m\033[3%dm" "${CYAN:-6}" +printf -v COLOR_BANNER "\033[3%dm\033[4%dm" "${BLUE:-4}" "${YELLOW:-3}" +printf -v COLOR_NORMAL "\033[39;49m\033[0;10m"