diff options
Diffstat (limited to 'rc.d/init.d/functions')
-rw-r--r-- | rc.d/init.d/functions | 342 |
1 files changed, 265 insertions, 77 deletions
diff --git a/rc.d/init.d/functions b/rc.d/init.d/functions index 1437b252..43b3abe4 100644 --- a/rc.d/init.d/functions +++ b/rc.d/init.d/functions @@ -5,6 +5,13 @@ # TEXTDOMAIN=initscripts +TEXTDOMAINDIR=/etc/locale +LOCPATH=/etc/locale +export TEXTDOMAINDIR LOCPATH + +TMP=/tmp +TMPDIR=/tmp +export TMP TMPDIR # Make sure umask is sane umask 022 @@ -50,22 +57,41 @@ systemctl_redirect () { action "$s" /bin/systemctl $options $command "$prog.service" } -# Get a sane screen width + +[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype <&2)" +# Get a sane screen width, and default to 80 when exact info not available +[ -z "${COLUMNS:-}" ] && COLUMNS=`stty -a 2>/dev/null | sed -n 's/.*columns \([0-9]*\);.*/\1/p'` [ -z "${COLUMNS:-}" ] && COLUMNS=80 -if [ -z "${CONSOLETYPE:-}" ]; then - if [ -c "/dev/stderr" ]; then - CONSOLETYPE="$(/sbin/consoletype < /dev/stderr 2>/dev/null)" - else - CONSOLETYPE="serial" - fi -fi +function load_i18_settings() { + if [ -f /etc/sysconfig/i18n -o -f /etc/locale.conf ]; then + if [ -z "$NOLOCALE" ]; then + if [ -f /etc/locale.conf ]; then + . /etc/locale.conf + else + . /etc/sysconfig/i18n + fi + if [ "$CONSOLETYPE" != "pty" ]; then + [ "$CONSOLE_NOT_LOCALIZED" = "yes" ] && GP_LANG=C + [ "$CONSOLE_NOT_LOCALIZED" = "yes" ] && GP_LANGUAGE=C + fi + if [ -z "$GP_LANG" ]; then + [ -n "$LC_CTYPE" ] && GP_LANG=$LC_CTYPE || GP_LANG=$LC_MESSAGES + fi + if [ -z "$GP_LANGUAGE" ]; then + [ -n "$LANGUAGE" ] && GP_LANGUAGE=$LANGUAGE || GP_LANGUAGE=$GP_LANG + fi + fi + fi +} -if [ -z "${NOLOCALE:-}" ] && [ -z "${LANGSH_SOURCED:-}" ] && [ -f /etc/sysconfig/i18n -o -f /etc/locale.conf ] ; then - . /etc/profile.d/lang.sh 2>/dev/null - # avoid propagating LANGSH_SOURCED any further - unset LANGSH_SOURCED -fi +function reset_i18_settings() { + local CONSOLE_NOT_LOCALIZED=yes + LC_ALL=C + load_i18_settings +} + +load_i18_settings # Read in our configuration if [ -z "${BOOTUP:-}" ]; then @@ -75,7 +101,7 @@ if [ -z "${BOOTUP:-}" ]; then # This all seem confusing? Look in /etc/sysconfig/init, # or in /usr/share/doc/initscripts-*/sysconfig.txt BOOTUP=color - RES_COL=60 + RES_COL=$((COLUMNS - 15)) MOVE_TO_COL="echo -en \\033[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \\033[1;32m" SETCOLOR_FAILURE="echo -en \\033[1;31m" @@ -93,6 +119,60 @@ if [ -z "${BOOTUP:-}" ]; then fi fi +gprintf() { + if [ -x /bin/gettext -a -n "$1" ]; then + if [ -n "$GP_LANG" ]; then + local TEXT=`LC_ALL=$GP_LANG LANGUAGE=$GP_LANGUAGE gettext -e --domain=$TEXTDOMAIN -- "$1"` + else + local TEXT=`gettext -e --domain=$TEXTDOMAIN -- "$1"` + fi + else + local TEXT=$1 + fi + [ "${1#*\\n}" ] || TEXT="$TEXT\n" + + shift + printf -- "$TEXT" "$@" +} + +# Frontend to gprintf (support up to 4 %s in format string) +# returns the message transleted in GPRINTF_MSG and +# the resting parms in GPRINTF_REST +# This simplifies a lot the call of functions like action, +# now with i18n support +gprintf_msg_rest() { +case "$1" in + *%s*%s*%s*%s*) + GPRINTF_MSG=$(gprintf "$1" "$2" "$3" "$4" "$5") + shift 5;; + *%s*%s*%s*) + GPRINTF_MSG=$(gprintf "$1" "$2" "$3" "$4") + shift 4;; + *%s*%s*) + GPRINTF_MSG=$(gprintf "$1" "$2" "$3") + shift 3;; + *%s*) + GPRINTF_MSG=$(gprintf "$1" "$2") + shift 2;; + *) + GPRINTF_MSG=$(gprintf "$1") + shift;; +esac +GPRINTF_REST="$@" +} + +# Check if $pid (could be plural) are running with +# the same root as this script +inmyroot() { + local i r + + for i in $* ; do + [ "/proc/$i/root" -ef "/proc/$$/root" ] && r="$r $i" + done + echo "$r" +} + + # Interpret escape sequences in an fstab entry fstab_decode_str() { fstab-decode echo "$1" @@ -159,23 +239,23 @@ __umount_loopback_loop() { local remaining devremaining sig=-15 local retry=3 - remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts) - devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts) + remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" && $2 !~ /^\/live\// {print $2}' /proc/mounts) + devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" && $2 !~ /^\/live\// {print $1}' /proc/mounts) while [ -n "$remaining" -a "$retry" -gt 0 ]; do if [ "$retry" -eq 3 ]; then - action $"Unmounting loopback filesystems: " \ + action "Unmounting loopback filesystems: " \ fstab-decode umount $remaining else - action $"Unmounting loopback filesystems (retry):" \ + action "Unmounting loopback filesystems (retry):" \ fstab-decode umount $remaining fi for dev in $devremaining ; do losetup $dev > /dev/null 2>&1 && \ - action $"Detaching loopback device $dev: " \ + action "Detaching loopback device %s: " $dev \ losetup -d $dev done - remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $2}' /proc/mounts) - devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" {print $1}' /proc/mounts) + remaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" && $2 !~ /^\/live\// {print $2}' /proc/mounts) + devremaining=$(awk '$1 ~ /^\/dev\/loop/ && $2 != "/" && $2 !~ /^\/live\// {print $1}' /proc/mounts) [ -z "$remaining" ] && break fstab-decode /sbin/fuser -k -m $sig $remaining >/dev/null sleep 3 @@ -229,7 +309,7 @@ daemon() { nicelevel=0 while [ "$1" != "${1##[-+]}" ]; do case $1 in - '') echo $"$0: Usage: daemon [+/-nicelevel] {program}" + '') gprintf "%s: Usage: daemon [+/-nicelevel] {program}\n" $0 return 1;; --check) base=$2 @@ -265,7 +345,7 @@ daemon() { nice="nice -n $1" shift ;; - *) echo $"$0: Usage: daemon [+/-nicelevel] {program}" + *) gprintf "%s: Usage: daemon [+/-nicelevel] {program}\n" $0 return 1;; esac done @@ -304,10 +384,11 @@ daemon() { if [ -z "$user" ]; then $cgroup $nice /bin/bash -c "$corelimit >/dev/null 2>&1 ; $*" else - $cgroup $nice runuser -s /bin/bash $user -c "$corelimit >/dev/null 2>&1 ; $*" + $cgroup $nice su -s /bin/bash - $user -c "$corelimit >/dev/null 2>&1 ; $*" fi - - [ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup" + rc=$? + [ $rc = 0 ] && success "%s startup" $base || failure "%s startup" $base + return $rc } # A function to stop a program. @@ -317,7 +398,7 @@ killproc() { RC=0; delay=3 # Test syntax. if [ "$#" -eq 0 ]; then - echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]" + gprintf "Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]" return 1 fi if [ "$1" = "-p" ]; then @@ -347,6 +428,9 @@ killproc() { fi fi + # Avoid killing processes not running in the same root + [ -n "$pid" ] && pid="`inmyroot $pid`" + # Kill it. if [ -n "$pid" ] ; then [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base " @@ -370,14 +454,14 @@ killproc() { fi checkpid $pid RC=$? - [ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown" + [ "$RC" -eq 0 ] && failure "%s shutdown" $base || success "%s shutdown" $base RC=$((! $RC)) # use specified level only else if checkpid $pid; then kill $killlevel $pid >/dev/null 2>&1 RC=$? - [ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel" + [ "$RC" -eq 0 ] && success "%s %s" $base $killlevel || failure "%s %s" $base $killlevel elif [ -n "${LSB:-}" ]; then RC=7 # Program is not running fi @@ -386,7 +470,7 @@ killproc() { if [ -n "${LSB:-}" -a -n "$killlevel" ]; then RC=7 # Program is not running else - failure $"$base shutdown" + failure "%s shutdown" $base RC=0 fi fi @@ -403,8 +487,8 @@ pidfileofproc() { local pid # Test syntax. - if [ "$#" = 0 ] ; then - echo $"Usage: pidfileofproc {program}" + if [ "$#" -eq 0 ] ; then + gprintf "Usage: pidfileofproc {program}\n" return 1 fi @@ -419,7 +503,7 @@ pidofproc() { # Test syntax. if [ "$#" = 0 ]; then - echo $"Usage: pidofproc [-p pidfile] {program}" + gprintf "Usage: pidofproc [-p pidfile] {program}\n" return 1 fi if [ "$1" = "-p" ]; then @@ -445,7 +529,7 @@ status() { # Test syntax. if [ "$#" = 0 ] ; then - echo $"Usage: status [-p pidfile] {program}" + gprintf "Usage: status [-p pidfile] {program}\n" return 1 fi if [ "$1" = "-p" ]; then @@ -470,21 +554,21 @@ status() { pid="$(__pids_pidof "$1")" fi if [ -n "$pid" ]; then - echo $"${base} (pid $pid) is running..." + gprintf "%s (pid %s) is running...\n" ${base} "$pid" return 0 fi case "$RC" in 0) - echo $"${base} (pid $pid) is running..." + gprintf "%s (pid %s) is running...\n" ${base} "$pid" return 0 ;; 1) - echo $"${base} dead but pid file exists" + gprintf "%s dead but pid file exists\n" ${base} return 1 ;; 4) - echo $"${base} status unknown due to insufficient privileges." + gprintf "%s status unknown due to insufficient privileges." ${base} return 4 ;; esac @@ -493,10 +577,10 @@ status() { fi # See if /var/lock/subsys/${lock_file} exists if [ -f /var/lock/subsys/${lock_file} ]; then - echo $"${base} dead but subsys locked" + gprintf "%s dead but subsys locked\n" ${base} return 2 fi - echo $"${base} is stopped" + gprintf "%s is stopped\n" ${base} return 3 } @@ -504,7 +588,7 @@ echo_success() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL echo -n "[" [ "$BOOTUP" = "color" ] && $SETCOLOR_SUCCESS - echo -n $" OK " + gprintf " OK " [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]" echo -ne "\r" @@ -515,7 +599,7 @@ echo_failure() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL echo -n "[" [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE - echo -n $"FAILED" + gprintf "FAILED" [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]" echo -ne "\r" @@ -526,7 +610,7 @@ echo_passed() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL echo -n "[" [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING - echo -n $"PASSED" + gprintf "PASSED" [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]" echo -ne "\r" @@ -537,7 +621,7 @@ echo_warning() { [ "$BOOTUP" = "color" ] && $MOVE_TO_COL echo -n "[" [ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING - echo -n $"WARNING" + gprintf "WARNING" [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL echo -n "]" echo -ne "\r" @@ -546,14 +630,15 @@ echo_warning() { # Inform the graphical boot of our current state update_boot_stage() { - if [ -x /bin/plymouth ]; then - /bin/plymouth --update="$1" - fi - return 0 + rc_splash "$1" } # Log that something succeeded success() { + gprintf_msg_rest "$@" + #if [ -z "${IN_INITLOG:-}" ]; then + # initlog $INITLOG_ARGS -n $0 -s "$GPRINTF_MSG" -e 1 + #fi [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_success return 0 } @@ -561,14 +646,21 @@ success() { # Log that something failed failure() { local rc=$? + gprintf_msg_rest "$@" + #if [ -z "${IN_INITLOG:-}" ]; then + # initlog $INITLOG_ARGS -n $0 -s "$GPRINTF_MSG" -e 2 + #fi [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_failure - [ -x /bin/plymouth ] && /bin/plymouth --details return $rc } # Log that something passed, but may have had errors. Useful for fsck passed() { local rc=$? + gprintf_msg_rest "$@" + #if [ -z "${IN_INITLOG:-}" ]; then + # initlog $INITLOG_ARGS -n $0 -s "$GPRINTF_MSG" -e 1 + #fi [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_passed return $rc } @@ -576,18 +668,21 @@ passed() { # Log a warning warning() { local rc=$? + gprintf_msg_rest "$@" + #if [ -z "${IN_INITLOG:-}" ]; then + # initlog $INITLOG_ARGS -n $0 -s "$1" -e 1 + #fi [ "$BOOTUP" != "verbose" -a -z "${LSB:-}" ] && echo_warning return $rc } # Run some action. Log its output. action() { - local STRING rc + local rc + gprintf_msg_rest "$@" + echo -n "$GPRINTF_MSG " - STRING=$1 - echo -n "$STRING " - shift - "$@" && success $"$STRING" || failure $"$STRING" + $GPRINTF_REST && success "$GPRINTF_MSG" || failure "$GPRINTF_MSG" rc=$? echo return $rc @@ -599,22 +694,108 @@ strstr() { return 0 } + # Confirm whether we really want to run this service confirm() { - [ -x /bin/plymouth ] && /bin/plymouth --hide-splash - while : ; do - echo -n $"Start service $1 (Y)es/(N)o/(C)ontinue? [Y] " - read answer - if strstr $"yY" "$answer" || [ "$answer" = "" ] ; then - return 0 - elif strstr $"cC" "$answer" ; then - rm -f /var/run/confirm - [ -x /bin/plymouth ] && /bin/plymouth --show-splash - return 2 - elif strstr $"nN" "$answer" ; then - return 1 - fi - done + gprintf "Start service %s (Y)es/(N)o/(C)ontinue? [Y] \n" $1 + local YES=`gprintf "yY"` + local NOT=`gprintf "nN"` + local CNT=`gprintf "cC"` + read answer + + if strstr "$YES" "$answer" || [ "$answer" = "" ] ; then + return 0 + elif strstr "$CNT" "$answer" ; then + return 2 + elif strstr "$NOT" "$answer" ; then + return 1 + fi + confirm $* +} + +initsplash() { + [[ -f /etc/sysconfig/bootsplash ]] && source /etc/sysconfig/bootsplash + [[ -n $SPLASH ]] && splash_rc=$SPLASH + [[ -x /sbin/plymouthd ]] || splash_rc=no + if [ -x /sbin/plymouthd ]; then + splash_mode=plymouth + if [ -r /proc/cmdline ] && grep -q splash /proc/cmdline && [ "$splash_rc" != "no" ]; then + splash_rc=yes + else + splash_rc=no + /bin/plymouth quit 2>/dev/null + PLYMOUTH= + fi + else + splash_rc=no + fi + + [[ $splash_rc != "no" && $splash_rc != "No" && $splash_rc != "NO" ]] && export splash_rc=yes + [[ $splash_mode = "plymouth" ]] || splash_rc= + if [[ -z "$1" ]]; then + set `/sbin/runlevel` + __runlevel=$2 + __previous=$1 + else + __runlevel=$1 + __previous=N + fi + [ "$splash_mode" = "plymouth" -a "$splash_rc" = "yes" -a -e /sys/class/graphics/fb0 ] && [ "$__runlevel" = 0 -o "$__runlevel" = 6 ] && /sbin/plymouthd --mode=shutdown + export splash_mode splash_rc +} + +rc_splash() { + [[ "$splash_rc" = "yes" ]] || return + if [ "$splash_mode" = "plymouth" ]; then + if [ "$1" = "start" ]; then + /bin/plymouth --show-splash 2>/dev/null + if [ "$2" = "1" ]; then + /bin/plymouth message --text="`OUTPUT_CHARSET=UTF-8 gprintf 'Booting the system... Press Esc for verbose mode.'`" 2> /dev/null + elif [ "$2" = "0" ]; then + /bin/plymouth message --text="`OUTPUT_CHARSET=UTF-8 gprintf 'Shutting down the system... Press Esc for verbose mode.'`" 2> /dev/null + else + /bin/plymouth message --text="`OUTPUT_CHARSET=UTF-8 gprintf 'Restarting the system... Press Esc for verbose mode.'`" 2> /dev/null + fi + elif [ "$1" = "stop" -o "$1" = "exit" ]; then + /bin/plymouth quit 2>/dev/null + elif [ "$1" = "umount" ]; then + /bin/plymouth quit --retain-splash 2>/dev/null + elif [ "$1" = "verbose" ]; then + /bin/plymouth --hide-splash 2>/dev/null + else + /bin/plymouth --update "$1" 2>/dev/null + fi + fi +} + +# +# This function finds the encoding of the current locale (it can +# be overwritten by a "CHARSET" variable if needed); the call +# to "locale charmap" should return the proper value; in case it +# fails, a guess from the locale name is done. +# this function is also defined in setsysfont script +# if you change it here change it there too, to have the same behaviour +# +get_locale_encoding() { + CHARSET=${CHARSET=`LC_ALL=$GP_LANG locale charmap 2> /dev/null`} + case "$CHARSET" in + ANSI_X3.4-1968) + # this means that the locale has not been + # correctly initialized; we will look at the + # locale naming and use the known + # default values for various languages + case "${LC_ALL}${LC_CTYPE}${LANG}" in + # the locale tells it is in UTF-8, or it is a language + # we know must be in UTF-8 by default + *.utf8*|*.UTF-8*| \ + am*|an*|ar*|as*|az*|bn*|cy*|eo*|fa*|gn*|gu*|he*|hi*|hy*| \ + id*|ka*|kn*|ku*|ky*|lo*|m*|ne*|om*|pa*|ph*|se*|sr*|st*| \ + ta*|te*|tg*|ti*|tk*|tl*|tt*|ug*|ur*|uz*|vi*|xh*|y*) + CHARSET="UTF-8" ;; + esac + ;; + esac + echo "$CHARSET" } # resolve a device node to its major:minor numbers in decimal or hex @@ -703,14 +884,14 @@ init_crypto() { if ! key_is_random "$key"; then lsl=$(ls -l "$key") if [ "${lsl:4:6}" != "------" ]; then - echo $"INSECURE MODE FOR $key" + gprintf "INSECURE MODE FOR %s\n" $key fi fi if [ "$owner" != root ]; then - echo $"INSECURE OWNER FOR $key" + gprintf "INSECURE OWNER FOR %s\n" $key fi else - echo $"Key file for $dst not found, skipping" + gprintf "Key file for %s not found, skipping\n" $dst ret=1 continue fi @@ -748,21 +929,21 @@ init_crypto() { cipher) params="$params -c $value" if [ -z "$value" ]; then - echo $"$dst: no value for cipher option, skipping" + gprintf "%s: no value for cipher option, skipping\n" $dst skip="yes" fi ;; size) params="$params -s $value" if [ -z "$value" ]; then - echo $"$dst: no value for size option, skipping" + gprintf "%s: no value for size option, skipping\n" $dst skip="yes" fi ;; hash) params="$params -h $value" if [ -z "$value" ]; then - echo $"$dst: no value for hash option, skipping" + gprintf "%s: no value for hash option, skipping\n" $dst skip="yes" fi ;; @@ -785,7 +966,7 @@ init_crypto() { fi if [ -z "$makeswap" ] && cryptsetup isLuks "$src" 2>/dev/null ; then if key_is_random "$key"; then - echo $"$dst: LUKS requires non-random key, skipping" + gprintf "%s: LUKS requires non-random key, skipping\n" $dst ret=1 continue fi @@ -800,8 +981,15 @@ init_crypto() { mount_point="$(find_crypto_mount_point $dst)" [ -n "$mount_point" ] || mount_point=${src##*/} prompt=$(printf $"%s is password protected" "$mount_point") - plymouth ask-for-password --prompt "$prompt" --command="/sbin/cryptsetup luksOpen -T1 $src $dst" <&1 - rc=$? + if [ "$splash_rc" = yes ] && [ -d /usr/share/plymouth ]; then + plymouth ask-for-password --prompt "$prompt" --command="/sbin/cryptsetup luksOpen -T1 $src $dst" --number-of-tries=3 <&1 + rc=$? + else + # stop splash to ask for password + rc_splash verbose + /sbin/cryptsetup luksOpen "$src" "$dst" <&1 && success || failure + rc=$? + fi fi else if [ -z "$key" ]; then |