123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- # /lib/lsb/init-functions for Debian -*- shell-script -*-
- #
- #Copyright (c) 2002-08 Chris Lawrence
- #All rights reserved.
- #
- #Redistribution and use in source and binary forms, with or without
- #modification, are permitted provided that the following conditions
- #are met:
- #1. Redistributions of source code must retain the above copyright
- # notice, this list of conditions and the following disclaimer.
- #2. Redistributions in binary form must reproduce the above copyright
- # notice, this list of conditions and the following disclaimer in the
- # documentation and/or other materials provided with the distribution.
- #3. Neither the name of the author nor the names of other contributors
- # may be used to endorse or promote products derived from this software
- # without specific prior written permission.
- #
- #THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- #IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- #WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- #ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
- #LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- #CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- #SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- #BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- #WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
- #OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
- #EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- start_daemon () {
- local force nice pidfile exec args OPTIND
- force=""
- nice=0
- pidfile=/dev/null
- OPTIND=1
- while getopts fn:p: opt ; do
- case "$opt" in
- f) force="force";;
- n) nice="$OPTARG";;
- p) pidfile="$OPTARG";;
- esac
- done
-
- shift $(($OPTIND - 1))
- if [ "$1" = '--' ]; then
- shift
- fi
- exec="$1"; shift
- args="--start --nicelevel $nice --quiet --oknodo"
- if [ "$force" ]; then
- /sbin/start-stop-daemon $args \
- --chdir "$PWD" --startas $exec --pidfile /dev/null -- "$@"
- elif [ $pidfile ]; then
- /sbin/start-stop-daemon $args \
- --chdir "$PWD" --exec $exec --oknodo --pidfile "$pidfile" -- "$@"
- else
- /sbin/start-stop-daemon $args --chdir "$PWD" --exec $exec -- "$@"
- fi
- }
- pidofproc () {
- local pidfile base status specified pid OPTIND
- pidfile=
- specified=
-
- OPTIND=1
- while getopts p: opt ; do
- case "$opt" in
- p) pidfile="$OPTARG"
- specified="specified"
- ;;
- esac
- done
- shift $(($OPTIND - 1))
- if [ $# -ne 1 ]; then
- echo "$0: invalid arguments" >&2
- return 4
- fi
- base=${1##*/}
- if [ ! "$specified" ]; then
- pidfile="/var/run/$base.pid"
- fi
- if [ -n "${pidfile:-}" ]; then
- if [ -e "$pidfile" ]; then
- if [ -r "$pidfile" ]; then
- read pid < "$pidfile"
- if [ -n "${pid:-}" ]; then
- if $(kill -0 "${pid:-}" 2> /dev/null); then
- echo "$pid" || true
- return 0
- elif ps "${pid:-}" >/dev/null 2>&1; then
- echo "$pid" || true
- return 0 # program is running, but not owned by this user
- else
- return 1 # program is dead and /var/run pid file exists
- fi
- fi
- else
- return 4 # pid file not readable, hence status is unknown.
- fi
- else
- # pid file doesn't exist, try to find the pid nevertheless
- if [ -x /bin/pidof ] && [ ! "$specified" ]; then
- status="0"
- /bin/pidof -c -o %PPID -x $1 || status="$?"
- if [ "$status" = 1 ]; then
- return 3 # program is not running
- fi
- return 0
- fi
- return 3 # specified pid file doesn't exist, program probably stopped
- fi
- fi
- if [ "$specified" ]; then
- return 3 # almost certain it's not running
- fi
- return 4 # Unable to determine status
- }
- # start-stop-daemon uses the same algorithm as "pidofproc" above.
- killproc () {
- local pidfile sig status base name_param is_term_sig OPTIND
- pidfile=
- name_param=
- is_term_sig=
- OPTIND=1
- while getopts p: opt ; do
- case "$opt" in
- p) pidfile="$OPTARG";;
- esac
- done
- shift $(($OPTIND - 1))
- base=${1##*/}
- if [ ! $pidfile ]; then
- name_param="--name $base --pidfile /var/run/$base.pid"
- else
- name_param="--name $base --pidfile $pidfile"
- fi
- sig=$(echo ${2:-} | sed -e 's/^-\(.*\)/\1/')
- sig=$(echo $sig | sed -e 's/^SIG\(.*\)/\1/')
- if [ "$sig" = 15 ] || [ "$sig" = TERM ]; then
- is_term_sig="terminate_signal"
- fi
- status=0
- if [ ! "$is_term_sig" ]; then
- if [ -n "$sig" ]; then
- /sbin/start-stop-daemon --stop --signal "$sig" \
- --quiet $name_param || status="$?"
- else
- /sbin/start-stop-daemon --stop \
- --retry 5 \
- --quiet $name_param || status="$?"
- fi
- else
- /sbin/start-stop-daemon --stop --quiet \
- --oknodo $name_param || status="$?"
- fi
- if [ "$status" = 1 ]; then
- if [ -z "$sig" ]; then
- return 0
- fi
- return 3 # program is not running
- fi
- if [ "$status" = 0 ] && [ "$is_term_sig" ] && [ "$pidfile" ]; then
- pidofproc -p "$pidfile" "$1" >/dev/null || rm -f "$pidfile"
- fi
- return 0
- }
- # Return LSB status
- status_of_proc () {
- local pidfile daemon name status OPTIND
- pidfile=
- OPTIND=1
- while getopts p: opt ; do
- case "$opt" in
- p) pidfile="$OPTARG";;
- esac
- done
- shift $(($OPTIND - 1))
- if [ -n "$pidfile" ]; then
- pidfile="-p $pidfile"
- fi
- daemon="$1"
- name="$2"
- status="0"
- pidofproc $pidfile $daemon >/dev/null || status="$?"
- if [ "$status" = 0 ]; then
- log_success_msg "$name is running"
- return 0
- elif [ "$status" = 4 ]; then
- log_failure_msg "could not access PID file for $name"
- return $status
- else
- log_failure_msg "$name is not running"
- return $status
- fi
- }
- log_use_fancy_output () {
- TPUT=/usr/bin/tput
- EXPR=/usr/bin/expr
- if [ -t 1 ] &&
- [ "x${TERM:-}" != "x" ] &&
- [ "x${TERM:-}" != "xdumb" ] &&
- [ -x $TPUT ] && [ -x $EXPR ] &&
- $TPUT hpa 60 >/dev/null 2>&1 &&
- $TPUT setaf 1 >/dev/null 2>&1
- then
- [ -z $FANCYTTY ] && FANCYTTY=1 || true
- else
- FANCYTTY=0
- fi
- case "$FANCYTTY" in
- 1|Y|yes|true) true;;
- *) false;;
- esac
- }
- log_success_msg () {
- if [ -n "${1:-}" ]; then
- log_begin_msg $@
- fi
- log_end_msg 0
- }
- log_failure_msg () {
- if [ -n "${1:-}" ]; then
- log_begin_msg $@ "..."
- fi
- log_end_msg 1 || true
- }
- log_warning_msg () {
- if [ -n "${1:-}" ]; then
- log_begin_msg $@ "..."
- fi
- log_end_msg 255 || true
- }
- #
- # NON-LSB HELPER FUNCTIONS
- #
- # int get_lsb_header_val (char *scriptpathname, char *key)
- get_lsb_header_val () {
- if [ ! -f "$1" ] || [ -z "${2:-}" ]; then
- return 1
- fi
- LSB_S="### BEGIN INIT INFO"
- LSB_E="### END INIT INFO"
- sed -n "/$LSB_S/,/$LSB_E/ s/# $2: \+\(.*\)/\1/p" "$1"
- }
- # If the currently running init daemon is upstart, return zero; if the
- # calling init script belongs to a package which also provides a native
- # upstart job, it should generally exit non-zero in this case.
- init_is_upstart()
- {
- if [ -x /sbin/initctl ] && /sbin/initctl version 2>/dev/null | /bin/grep -q upstart; then
- return 0
- fi
- return 1
- }
- # int log_begin_message (char *message)
- log_begin_msg () {
- log_begin_msg_pre "$@"
- if [ -z "${1:-}" ]; then
- return 1
- fi
- echo -n "$@" || true
- log_begin_msg_post "$@"
- }
- # Sample usage:
- # log_daemon_msg "Starting GNOME Login Manager" "gdm"
- #
- # On Debian, would output "Starting GNOME Login Manager: gdm"
- # On Ubuntu, would output " * Starting GNOME Login Manager..."
- #
- # If the second argument is omitted, logging suitable for use with
- # log_progress_msg() is used:
- #
- # log_daemon_msg "Starting remote filesystem services"
- #
- # On Debian, would output "Starting remote filesystem services:"
- # On Ubuntu, would output " * Starting remote filesystem services..."
- log_daemon_msg () {
- if [ -z "${1:-}" ]; then
- return 1
- fi
- log_daemon_msg_pre "$@"
- if [ -z "${2:-}" ]; then
- echo -n "$1:" || true
- return
- fi
-
- echo -n "$1: $2" || true
- log_daemon_msg_post "$@"
- }
- # #319739
- #
- # Per policy docs:
- #
- # log_daemon_msg "Starting remote file system services"
- # log_progress_msg "nfsd"; start-stop-daemon --start --quiet nfsd
- # log_progress_msg "mountd"; start-stop-daemon --start --quiet mountd
- # log_progress_msg "ugidd"; start-stop-daemon --start --quiet ugidd
- # log_end_msg 0
- #
- # You could also do something fancy with log_end_msg here based on the
- # return values of start-stop-daemon; this is left as an exercise for
- # the reader...
- #
- # On Ubuntu, one would expect log_progress_msg to be a no-op.
- log_progress_msg () {
- if [ -z "${1:-}" ]; then
- return 1
- fi
- echo -n " $@" || true
- }
- # int log_end_message (int exitstatus)
- log_end_msg () {
- # If no arguments were passed, return
- if [ -z "${1:-}" ]; then
- return 1
- fi
- local retval
- retval=$1
- log_end_msg_pre "$@"
- # Only do the fancy stuff if we have an appropriate terminal
- # and if /usr is already mounted
- if log_use_fancy_output; then
- RED=$( $TPUT setaf 1)
- YELLOW=$( $TPUT setaf 3)
- NORMAL=$( $TPUT op)
- else
- RED=''
- YELLOW=''
- NORMAL=''
- fi
- if [ $1 -eq 0 ]; then
- echo "." || true
- elif [ $1 -eq 255 ]; then
- /bin/echo -e " ${YELLOW}(warning).${NORMAL}" || true
- else
- /bin/echo -e " ${RED}failed!${NORMAL}" || true
- fi
- log_end_msg_post "$@"
- return $retval
- }
- log_action_msg () {
- log_action_msg_pre "$@"
- echo "$@." || true
- log_action_msg_post "$@"
- }
- log_action_begin_msg () {
- log_action_begin_msg_pre "$@"
- echo -n "$@..." || true
- log_action_begin_msg_post "$@"
- }
- log_action_cont_msg () {
- echo -n "$@..." || true
- }
- log_action_end_msg () {
- local end
- log_action_end_msg_pre "$@"
- if [ -z "${2:-}" ]; then
- end="."
- else
- end=" ($2)."
- fi
- if [ $1 -eq 0 ]; then
- echo "done${end}" || true
- else
- if log_use_fancy_output; then
- RED=$( $TPUT setaf 1)
- NORMAL=$( $TPUT op)
- /bin/echo -e "${RED}failed${end}${NORMAL}" || true
- else
- echo "failed${end}" || true
- fi
- fi
- log_action_end_msg_post "$@"
- }
- # Pre&Post empty function declaration, to be overriden from /lib/lsb/init-functions.d/*
- log_daemon_msg_pre () { :; }
- log_daemon_msg_post () { :; }
- log_begin_msg_pre () { :; }
- log_begin_msg_post () { :; }
- log_end_msg_pre () { :; }
- log_end_msg_post () { :; }
- log_action_msg_pre () { :; }
- log_action_msg_post () { :; }
- log_action_begin_msg_pre () { :; }
- log_action_begin_msg_post () { :; }
- log_action_end_msg_pre () { :; }
- log_action_end_msg_post () { :; }
- # Include hooks from other packages in /lib/lsb/init-functions.d
- for hook in $(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null); do
- [ -r $hook ] && . $hook || true
- done
- FANCYTTY=
- [ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true
|