system_configuration/root/etc/pcp.env

239 lines
6.5 KiB
Bash
Raw Normal View History

2023-04-15 01:23:32 -07:00
#
# Copyright (c) 2000,2003 Silicon Graphics, Inc. All Rights Reserved.
# Copyright (c) 2010 Aconex. 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.
#
# This file is sourced by PCP scripts to set the environment
# variables defined in the file named $PCP_CONF (or /etc/pcp.conf
# if $PCP_CONF is not defined). Any variable already defined in
# the environment is not changed.
#
# Note: any variables NOT starting with PCP_ will be ignored.
# This is a security issue so don't change it.
#
if [ -z "$PCP_ENV_DONE" ]
then
if [ -n "$PCP_CONF" ]
then
__CONF="$PCP_CONF"
elif [ -n "$PCP_DIR" ]
then
__CONF="$PCP_DIR/etc/pcp.conf"
else
__CONF=/etc/pcp.conf
fi
if [ ! -f "$__CONF" ]
then
echo "pcp.env: Fatal Error: \"$__CONF\" not found" >&2
exit 1
fi
eval `sed -e 's/"//g' $__CONF \
| awk -F= '
/^PCP_/ && NF == 2 {
exports=exports" "$1
printf "%s=${%s:-\"%s\"}\n", $1, $1, $2
}
END { print "export", exports }'`
# prevent doing all of this more than once per process ...
#
export PCP_ENV_DONE=y
fi
# Always need to set $PATH ... sudo -E leaves $PCP_ENV_DONE set, but
# clears/resets $PATH.
#
# Note when we're adding directories into $PATH (as opposed to the
# directory already being in $PATH), the order is important: any
# dirs with PCP-specific binaries should end up ahead of more generic
# dirs in the final $PATH to avoid conflicts with names of non-pcp
# binaries, by ensuring the pcp ones are found first.
#
# Also, there are a small number of commands that we need, e.g. in
# PMDA Install scripts, that are not necessariy on the default $PATH,
# e.g. chown in /usr/sbin on *BSD. Put these after the PCP ones, but
# ahead of the default $PATH.
#
for dir in /usr/sbin \
${PCP_BIN_DIR} ${PCP_BINADM_DIR} \
${PCP_SHARE_DIR}/bin ${PCP_PLATFORM_PATHS}
do
if [ -d $dir ]
then
if echo ":$PATH:" | grep ":$dir:" >/dev/null 2>&1
then
:
else
PATH="$dir:$PATH"
fi
fi
done
export PATH
# Also need to always do this because it may be resetting things
# that sudo has cleared from the environment, e.g. PERL5LIB
#
# Optionally augment or over-ride settings with per-user configuration
#
if [ -f $HOME/.pcp/pcp.conf ]
then
eval `sed -e 's/"//g' -e '/^#/d' $HOME/.pcp/pcp.conf \
| awk -F= '
NF == 2 {
exports=exports" "$1
printf "%s=${%s:-\"%s\"}\n", $1, $1, $2
}
END { print "export", exports }'`
fi
# Find PIDs by matching the name ($1)
# Executable alias name avoidance algorithm ...
# - if name contains a / use it literally and consider nothing else
# - if name matches an executable in $PCP_BIN_DIR, use that full pathname
# - if name matches an executable in $PCP_BINADM_DIR, use that full pathname
# - if find(1) can locate name on this week's $PATH, use that full pathname
# - if name matches an executable in $PCP_BIN_DIR and/or $PCP_BINADM_DIR
# and/or find(1) matches name, use _all_ of the pathnames in the order
# above (needed e.g. for pmlogger in $PCP_BIN_DIR and symlink in
# $PCP_BINADM_DIR)
# - if -a is specified also match on /name (this was the original behaviour
# before the pathname matching was added)
# - otherwise use name as is
#
_get_pids_by_name()
{
if [ $# -eq 2 -a "X$1" = X-a ]
then
__all=true
shift
else
__all=false
fi
if [ $# -ne 1 ]
then
echo "Usage: _get_pids_by_name [-a] process-name" >&2
exit 1
fi
if [ "X$tmp" = X ]
then
echo "_get_pids_by_name requires a \$tmp setting" >&2
exit 1
elif [ -d "$tmp" ]
then
__tmp="$tmp/pcp.env" # from mktemp
else
__tmp=$tmp.pcp.env # from PCP QA
fi
__name="$1"
rm -f $__tmp.*
touch $__tmp.path
case "$1"
in
*/*)
rm -f $__tmp.path
;;
*)
if [ -n "$PCP_BIN_DIR" -a -x "$PCP_BIN_DIR/$1" ]
then
if ! grep "$PCP_BIN_DIR/$1" $__tmp.path >/dev/null
then
echo "$PCP_BIN_DIR/$1" >>$__tmp.path
fi
fi
if [ -n "$PCP_BINADM_DIR" -a -x "$PCP_BINADM_DIR/$1" ]
then
if ! grep "$PCP_BINADM_DIR/$1" $__tmp.path >/dev/null
then
echo "$PCP_BINADM_DIR/$1" >>$__tmp.path
fi
fi
__which="`which "$1" 2>/dev/null`"
if [ -n "$__which" ]
then
if ! grep "$__which" $__tmp.path >/dev/null
then
echo "$__which" >>$__tmp.path
fi
fi
;;
esac
# Algorithm ... all ps(1) variants have a time of the form MM:SS
# or HH:MM:SS or HH:MM.SS before the psargs field, so we're using
# this as the search anchor.
#
# Matches with $1 (process-name) occur if the first psarg is one
# of the paths identified above or ends in /$1 (if -a specified)
# or starts ($1) (blame Mac OS X for the last one)
# ... the matching uses sed's regular expressions, so passing a
# regex into $1 will work.
# some preprocessing to condition the ps(1) output lines
#
cat <<End-of-File >$__tmp.sed
s/$/ /
s/[ ][ ]*/ /g
s/^ //
s/^[^ ]* //
End-of-File
if [ -f $__tmp.path ]
then
# not a literal use of $1, at least one matching pathname found
#
sed <$__tmp.path >>$__tmp.sed \
-e 's/\//\\\//g' \
-e 's/.*/\/[0-9][:\\.][0-9][0-9] *& \/s\/ .*\/\/p/'
fi
# optionally add -a case
#
if $__all
then
echo "$1" | sed >>$__tmp.sed \
-e 's/\//\\\//g' \
-e 's/.*/\/[0-9][:\\.][0-9][0-9] *[^ ]*\\\/& \/s\/ .*\/\/p/'
fi
# add literal cases
#
# exact match
echo "$1" | sed >>$__tmp.sed \
-e 's/\//\\\//g' \
-e 's/.*/\/[0-9][:\\.][0-9][0-9] *& \/s\/ .*\/\/p/'
# Mac OS X variant
echo "$1" | sed >>$__tmp.sed \
-e 's/\//\\\//g' \
-e 's/.*/\/[0-9][:\\.][0-9][0-9] *(&) \/s\/ .*\/\/p/'
# need to sort in case of multiple matches from the sed(1) patterns
#
$PCP_PS_PROG $PCP_PS_ALL_FLAGS \
| sed -n -f $__tmp.sed \
| sort -n -u
rm -f $__tmp.*
}
# Redundant now ... use _get_pids_by_name -a ...
# Maintained here for backwards compatibility.
#
_get_pids_by_args()
{
if [ $# -lt 1 ]
then
echo "Usage: _get_pids_by_args process-name [args...]" >&2
exit 1
fi
# Matches on command and its arguments ... note escaping any / in
# the process name happens in _get_pids_by_name()
#
_get_pids_by_name -a "$@"
}