summaryrefslogtreecommitdiff
path: root/src/pmcd/rc-proc.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmcd/rc-proc.sh')
-rw-r--r--src/pmcd/rc-proc.sh394
1 files changed, 394 insertions, 0 deletions
diff --git a/src/pmcd/rc-proc.sh b/src/pmcd/rc-proc.sh
new file mode 100644
index 0000000..3897c7f
--- /dev/null
+++ b/src/pmcd/rc-proc.sh
@@ -0,0 +1,394 @@
+#
+# Common sh(1) procedures to be used in PCP rc scripts
+#
+# Copyright (c) 2014 Red Hat.
+# Copyright (c) 2000,2003 Silicon Graphics, Inc. All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+
+# source the PCP configuration environment variables
+. $PCP_DIR/etc/pcp.env
+
+# These functions use chkconfig if available, else tolerate missing chkconfig
+# command (as on SUSE) by manipulating symlinks in /etc/rc.d directly.
+#
+# Usage:
+#
+# is_chkconfig_on : return 0 if $1 is chkconfig "on" else 1
+# chkconfig_on : chkconfig $1 "on"
+# chkconfig_off : chkconfig $1 "off"
+# chkconfig_on_msg: echo a message about how to chkconfig $1 on
+#
+
+#
+# private functions
+#
+_which()
+{
+ # some versions of which(1) have historically not reflected the
+ # correct exit status ... but it appears that all modern platforms
+ # get this correct
+ #
+ # keeping the old logic structure, just in case
+ #
+
+ if $PCP_WHICH_PROG $1 >/dev/null 2>&1
+ then
+ if [ "$PCP_PLATFORM" = broken ]
+ then
+ if $PCP_WHICH_PROG $1 | grep "no $1" >/dev/null
+ then
+ :
+ else
+ return 0
+ fi
+ else
+ return 0
+ fi
+ fi
+ return 1
+}
+
+_cmds_exist()
+{
+ _have_flag=false
+ [ -f $PCP_RC_DIR/$1 ] && _have_flag=true
+
+ _have_systemctl=false
+ _which systemctl && _have_systemctl=true
+ _have_runlevel=false
+ _which runlevel && _have_runlevel=true
+ _have_chkconfig=false
+ _which chkconfig && _have_chkconfig=true
+ _have_sysvrcconf=false
+ _which sysvrcconf && _have_sysvrcconf=true
+ _have_rcupdate=false
+ _which rc-update && _have_rcupdate=true
+ _have_svcadm=false
+ _which svcadm && _have_svcadm=true
+}
+
+#
+# return the run levels for $1
+#
+_runlevels()
+{
+ $PCP_AWK_PROG '/^# chkconfig:/ {print $3}' $PCP_RC_DIR/$1 | sed -e 's/[0-9]/& /g'
+}
+
+#
+# return rc start number for $1
+#
+_runlevel_start()
+{
+ $PCP_AWK_PROG '/^# chkconfig:/ {print $4}' $PCP_RC_DIR/$1
+}
+
+#
+# return runlevel stop number for $1
+#
+_runlevel_stop()
+{
+ $PCP_AWK_PROG '/^# chkconfig:/ {print $5}' $PCP_RC_DIR/$1
+}
+
+#
+# Return 0 if $1 is chkconfig "on" (enabled) at the current run level
+# Handles missing chkconfig command and other assorted atrocities.
+#
+is_chkconfig_on()
+{
+ # if non-default install, everything is "on"
+ [ -n "$PCP_DIR" ] && return 0
+
+ LANG=C
+ _flag=$1
+
+ _ret=1 # return "off" by default
+ _rl=3 # default run level if !_have_runlevel
+
+ _cmds_exist $_flag
+ $_have_runlevel && _rl=`runlevel | $PCP_AWK_PROG '{print $2}'`
+
+ if [ "$PCP_PLATFORM" = mingw -o "$PCP_PLATFORM" = "freebsd" ]
+ then
+ # unknown mechanism, just do it
+ _ret=0
+ elif [ "$PCP_PLATFORM" = "darwin" ]
+ then
+ case "$1"
+ in
+ pmcd) [ "`. /etc/hostconfig; echo $PMCD`" = "-YES-" ] && _ret=0 ;;
+ pmlogger) [ "`. /etc/hostconfig; echo $PMLOGGER`" = "-YES-" ] && _ret=0 ;;
+ pmie) [ "`. /etc/hostconfig; echo $PMIE`" = "-YES-" ] && _ret=0 ;;
+ pmproxy) [ "`. /etc/hostconfig; echo $PMPROXY`" = "-YES-" ] && _ret=0 ;;
+ pmwebd) [ "`. /etc/hostconfig; echo $PMWEBD`" = "-YES-" ] && _ret=0 ;;
+ esac
+ elif $_have_systemctl
+ then
+ systemctl is-enabled "$_flag".service >/dev/null 2>&1 && _ret=0
+ elif $_have_chkconfig
+ then
+ chkconfig --list "$_flag" 2>&1 | grep $_rl":on" >/dev/null 2>&1 && _ret=0
+ elif $_have_sysvrcconf
+ then
+ sysv-rc-conf --list "$_flag" 2>&1 | grep $_rl":on" >/dev/null 2>&1 && _ret=0
+ elif $_have_rcupdate
+ then
+ rc-update show 2>&1 | grep "$_flag" >/dev/null 2>&1 && _ret=0
+ elif $_have_svcadm
+ then
+ svcs -l pcp/$_flag | grep "enabled *true" >/dev/null 2>&1 && _ret=0
+ else
+ #
+ # don't know, fallback to using the existence of rc symlinks
+ #
+ if [ -f /etc/debian_version ]; then
+ ls /etc/rc$_rl.d/S[0-9]*$_flag >/dev/null 2>&1 && _ret=0
+ else
+ ls /etc/rc.d/rc$_rl.d/S[0-9]*$_flag >/dev/null 2>&1 && _ret=0
+ fi
+ fi
+
+ return $_ret
+}
+
+#
+# chkconfig "on" $1
+# Handles missing chkconfig command.
+#
+chkconfig_on()
+{
+ # if non-default install, everything is "on"
+ [ -n "$PCP_DIR" ] && return 0
+
+ _flag=$1
+ [ -z "$_flag" ] && return 1 # fail
+
+ _cmds_exist $_flag
+ $_have_flag || return 1 # fail
+
+ if [ "$PCP_PLATFORM" = mingw -o "$PCP_PLATFORM" = "freebsd" ]
+ then
+ # unknown mechanism, just pretend
+ return 0
+ elif [ "$PCP_PLATFORM" = "darwin" ]
+ then
+ echo "To enable $_flag, add the following line to /etc/hostconfig:"
+ case "$_flag"
+ in
+ pmcd) echo "PMCD=-YES-" ;;
+ pmlogger) echo "PMLOGGER=-YES-" ;;
+ pmie) echo "PMIE=-YES-" ;;
+ pmproxy) echo "PMPROXY=-YES-" ;;
+ pmwebd) echo "PMWEBD=-YES-" ;;
+ esac
+ elif $_have_systemctl
+ then
+ systemctl --no-reload enable "$_flag".service >/dev/null 2>&1
+ elif $_have_chkconfig
+ then
+ chkconfig "$_flag" on >/dev/null 2>&1
+ elif $_have_sysvrcconf
+ then
+ sysv-rc-conf "$_flag" on >/dev/null 2>&1
+ elif $_have_rcupdate
+ then
+ rc-update add "$_flag" >/dev/null 2>&1
+ elif $_have_svcadm
+ then
+ svcadm enable pcp/$_flag >/dev/null 2>&1
+ else
+ _start=`_runlevel_start $_flag`
+ _stop=`_runlevel_stop $_flag`
+ if [ -f /etc/debian_version ]
+ then
+ update-rc.d -f $_flag defaults s$_start k$_stop
+ else
+ for _r in `_runlevels $_flag`
+ do
+ ln -sf ../init.d/$_flag /etc/rc.d/rc$_r.d/S$_start""$_flag >/dev/null 2>&1
+ ln -sf ../init.d/$_flag /etc/rc.d/rc$_r.d/K$_stop""$_flag >/dev/null 2>&1
+ done
+ fi
+ fi
+
+ return 0
+}
+
+#
+# chkconfig "off" $1
+# Handles missing chkconfig command.
+#
+chkconfig_off()
+{
+ # if non-default install, everything is "on"
+ [ -n "$PCP_DIR" ] && return 1
+
+ _flag=$1
+ [ -z "$_flag" ] && return 1 # fail
+
+ _cmds_exist $_flag
+ $_have_flag || return 1 # fail
+
+ if [ "$PCP_PLATFORM" = mingw -o "$PCP_PLATFORM" = "freebsd" ]
+ then
+ # unknown mechanism, just pretend
+ return 0
+ elif $_have_systemctl
+ then
+ systemctl --no-reload disable "$_flag".service >/dev/null 2>&1
+ elif $_have_chkconfig
+ then
+ chkconfig --level 2345 "$_flag" off >/dev/null 2>&1
+ elif $_have_sysvrcconf
+ then
+ sysv-rc-conf --level 2345 "$_flag" off >/dev/null 2>&1
+ elif $_have_rcupdate
+ then
+ rc-update delete "$_flag" >/dev/null 2>&1
+ elif $_have_svcadm
+ then
+ svcadm disable pcp/$_flag >/dev/null 2>&1
+ else
+ # remove the symlinks
+ if [ -f /etc/debian_version ]
+ then
+ update-rc.d -f $_flag remove
+ else
+ rm -f /etc/rc.d/rc[0-9].d/[SK][0-9]*$_flag >/dev/null 2>&1
+ fi
+ fi
+
+ return 0
+}
+
+#
+# Echo a message about how to chkconfig $1 "on"
+# Tolerates missing chkconfig command
+#
+chkconfig_on_msg()
+{
+ _flag=$1
+ _cmds_exist $_flag
+ $_have_flag || return 1 # fail
+
+ if [ "$PCP_PLATFORM" = mingw -o "$PCP_PLATFORM" = "freebsd" ]
+ then
+ # no mechanism, just pretend
+ #
+ return 0
+ else
+ echo " To enable $_flag, run the following as root:"
+ if $_have_systemctl
+ then
+ _cmd=`$PCP_WHICH_PROG systemctl`
+ echo " # $_cmd enable $_flag.service"
+ elif $_have_chkconfig
+ then
+ _cmd=`$PCP_WHICH_PROG chkconfig`
+ echo " # $_cmd $_flag on"
+ elif $_have_sysvrcconf
+ then
+ _cmd=`$PCP_WHICH_PROG sysvrcconf`
+ echo " # $_cmd $_flag on"
+ elif $_have_rcupdate
+ then
+ _cmd=`$PCP_WHICH_PROG rc-update`
+ echo " # $_cmd add $_flag"
+ elif $_have_svcadm
+ then
+ _cmd=`$PCP_WHICH_PROG svcadm`
+ echo " # $_cmd enable pcp/$_flag"
+ else
+ _start=`_runlevel_start $_flag`
+ _stop=`_runlevel_stop $_flag`
+ if [ -f /etc/debian_version ]
+ then
+ echo " update-rc.d -f $_flag remove"
+ echo " update-rc.d $_flag defaults $_start $_stop"
+ else
+ for _r in `_runlevels $_flag`
+ do
+ echo " # ln -sf ../init.d/$_flag /etc/rc.d/rc$_r.d/S$_start""$_flag"
+ echo " # ln -sf ../init.d/$_flag /etc/rc.d/rc$_r.d/K$_stop""$_flag"
+ done
+ fi
+ fi
+ fi
+
+ return 0
+}
+
+#
+# load some rc functions if available
+#
+# In openSUSE 12.1, /etc/rc.status intercepts our rc script and passes
+# control to systemctl which uses systemd ... the result is that messages
+# from our rc scripts are sent to syslog by default, and there is no
+# apparent way to revert to the classical behaviour, so this "hack" allows
+# PCP QA to set $PCPQA_NO_RC_STATUS and continue to see stdout and stderr
+# from our rc scripts
+# - Ken 1 Dec 2011
+#
+if [ -r /etc/rc.status -a -z "${PCPQA_NO_RC_STATUS+set}" ]
+then
+ # SuSE style
+ . /etc/rc.status
+ RC_STATUS=rc_status
+ RC_RESET=rc_reset
+ RC_CHECKPROC=checkproc
+else
+ # Roll our own
+ RC_STATUS=_RC_STATUS
+ _RC_STATUS()
+ {
+ _rc_status=$?
+ if [ "$1" = "-v" ]
+ then
+ if [ $_rc_status -eq 0 ]
+ then $ECHO
+ else
+ $ECHO "failed (status=$_rc_status)"
+ fi
+ fi
+ return $_rc_status
+ }
+
+ RC_RESET=_RC_RESET
+ _RC_RESET()
+ {
+ _rc_status=0
+ return $_rc_status
+ }
+
+ RC_CHECKPROC=_RC_CHECKPROC
+ _RC_CHECKPROC()
+ {
+ # usage
+ [ $# -ne 1 ] && return 2
+
+ # running
+ _b=`basename "$1"`
+ _n=`_get_pids_by_name $_b | wc -l`
+ [ $_n -ge 1 ] && return 0
+
+ # not running, but pid exists
+ [ -e /var/run/$_b.pid ] && return 1
+
+ # program not installed
+ [ ! -e "$1" ] && return 5
+
+ # not running and no pid
+ return 3
+ }
+fi