diff options
Diffstat (limited to 'qa/common')
-rwxr-xr-x | qa/common | 761 |
1 files changed, 761 insertions, 0 deletions
diff --git a/qa/common b/qa/common new file mode 100755 index 0000000..9ef32f2 --- /dev/null +++ b/qa/common @@ -0,0 +1,761 @@ +#!/bin/sh +# +# common procedures for PCP QA scripts +# +# Copyright (c) 1997-2002 Silicon Graphics, Inc. All Rights Reserved. +# + +# for _wait_for_pmlogger() and _change_config() +. ./common.check + +# per product QA script customization +# +. ./common.setup +[ -z "$DEFAULT_HOST" ] && DEFAULT_HOST=`hostname` + +_setenvironment() +{ + MSGVERB="text:action" + export MSGVERB + export PCP_BINADM_DIR +} + +_log_fyi() +{ + echo "FYI ... here are the PMCD logs" + for log + do + if [ ! -f $log ] + then + # try in the other place + # + case $log + in + $PCP_LOG_DIR/pmcd/*) + __try=`echo $log | sed -e "s;/pmcd/;/;"` + ;; + *) + __try=`echo $log | sed -e "s;$PCP_LOG_DIR/;$PCP_LOG_DIR/pmcd/;"` + ;; + esac + [ -f $__try ] && log=$__try + fi + if [ -f $log ] + then + echo "::::::::: start $log ::::::::" + cat $log + echo ":::::::::: end $log :::::::::" + + [ $log != $PCP_LOG_DIR/pmcd/pmcd.log ] && $sudo rm -f $log + else + echo "$log: not found" + fi + done +} + +_havesudo() +{ + if [ -z "$PCP_DIR" ] + then + setuid=`$sudo id | sed -e 's/(.*//' -e 's/.*=//'` + if [ "$setuid" != 0 ] + then + echo "\"sudo\" is not an executable setuid root. This is fatal." + echo "As root, you need to setup your sudoers file for pcpqa." + exit 1 + fi + fi +} + +_haveagents() +{ + restart=false + here=`pwd` + + # PMDAs than need to be here for QA + # + COMMON_PMDAS="sample sampledso simple" + if [ -d $PCP_PMDAS_DIR/cisco ] + then + # cisco PMDA requires that you can reach a router + # + if which ping >/dev/null 2>&1 + then + # Note: PCP_QA_CISCOROUTER needs to be defined in common.rc + if ping -c 1 $PCP_QA_CISCOROUTER >/dev/null 2>&1 + then + COMMON_PMDAS="$COMMON_PMDAS cisco" + fi + fi + fi + + for agent in $COMMON_PMDAS + do + probe=$agent + agentlog=$PCP_LOG_DIR/pmcd/$agent.log + + # make this empty to stop any attempt to reinstall + # + agentdir=$PCP_PMDAS_DIR/$agent + + case $agent + in + cisco) + probe=cisco.bytes_in + ;; + sample) + probe=sample.milliseconds + ;; + sampledso) + probe=sampledso.milliseconds + agentdir=$PCP_PMDAS_DIR/sample + ;; + simple) + probe=simple.numfetch + ;; + weblog) + probe=web.allservers.numalive + ;; + webping) + probe=webping.count + ;; + oracle) + eval "probe=oracle.$ORACLE_SID.version" + eval "agentlog=$PCP_LOG_DIR/pmcd/oracle-$ORACLE_SID.log" + agentdir='' + ;; + oraping) + probe=oraping.control.count + ;; + esac + reinstall=false + while true + do + [ $diff = true ] || echo "PMDA probe: pminfo -h $QA_HOST -f $probe" + if pminfo -h $QA_HOST -f $probe 2>&1 \ + | tail -1 \ + | egrep "^[ ]*((value)|(inst))[ ]" >/dev/null + then + break + else + echo "PMDA $agent is not responding" + if $restart + then + : + else + _log_fyi $PCP_LOG_DIR/pmcd/pmcd.log $agentlog + echo "Restarting PMCD ..." + $sudo $PCP_RC_DIR/pcp restart + restart=true + fi + if $reinstall + then + [ -f $here/$iam.out ] && cat $here/$iam.out + echo "Cannot make PMDA $agent work, ... giving up!" + exit 1 + else + if [ -z "$agentdir" ] + then + echo "Skip PMDA re-install" + break + elif [ -d "$agentdir" ] + then + echo "Trying to re-install PMDA $agent from $agentdir ..." + _log_fyi $PCP_LOG_DIR/pmcd/pmcd.log $agentlog + cd $agentdir + unset ROOT TOOLROOT MAKEFLAGS + $sudo ./Remove </dev/null >>$here/$iam.out + case $agent + in + cisco) + cd $here + ./common.install.cisco $iam $agentdir + ;; + *) + $sudo ./Install </dev/null >>$here/$iam.out + ;; + esac + cd $here + reinstall=true + else + echo "Cannot find PMDA directory ($agentdir)" + echo "to re-install, ... giving up!" + exit 1 + fi + fi + fi + done + done +} + +_havelogger() +{ + if [ -z "`_get_pids_by_name 'pmlogger.*-P'`" ] + then + echo "Primary pmlogger not running ..." + echo "chkconfig pmlogger on, and restart PMCD" + _change_config pmlogger on + [ -z "$PCP_PMLOGGERCONTROL_PATH" ] && \ + PCP_PMLOGGERCONTROL_PATH="$PCP_SYSCONF_DIR/pmlogger/control" + if sed -e '/^#/d' "$PCP_PMLOGGERCONTROL_PATH" \ + | $PCP_AWK_PROG '$2 == "y" && $3 == "n" { sts=1 } END { exit 1-sts }' + then + : echo "have primary pmlogger line in control file" + else + : echo "no primary pmlogger line in control file" + if $PCP_AWK_PROG '$2 == "y" && $3 == "n" { sts=1} END { exit 1-sts }' <$PCP_PMLOGGERCONTROL_PATH + then + : echo uncomment + sed <$PCP_PMLOGGERCONTROL_PATH >$tmp.tmp \ + -e '/^#[^ ][^ ]*[ ][ ]*y/s/#//' + $sudo cp $tmp.tmp $PCP_PMLOGGERCONTROL_PATH + else + : echo add + cp $PCP_PMLOGGERCONTROL_PATH $tmp.tmp + if [ -e $PCP_LOG_DIR/pmlogger ] + then + cat >>$tmp.tmp <<'End-of-File' + +# added by PCP QA +LOCALHOSTNAME y n PCP_LOG_DIR/pmlogger/LOCALHOSTNAME -c config.default +End-of-File + else + cat >>$tmp.tmp <<'End-of-File' + +# added by PCP QA +LOCALHOSTNAME y n PCP_LOG_DIR/LOCALHOSTNAME -c config.default +End-of-File + fi + $sudo cp $tmp.tmp $PCP_PMLOGGERCONTROL_PATH + fi + fi + $sudo $PCP_RC_DIR/pcp restart + _wait_for_pmlogger + fi +} + +_havepmcdtrace() +{ + fix=false + for trace in traceconn tracepdu + do + bit=`pminfo -h $QA_HOST -f pmcd.control.$trace | sed -n -e '/value/s/ *value *//p'` + if [ "X$bit" != X1 ] + then + pminfo -h $QA_HOST -f pmcd.control.$trace + echo "PMCD event tracing not enabled!" + fix=true + fi + done + if $fix + then + echo "fix options, and restart PMCD" + [ -z "PCP_PMCDOPTIONS_PATH" ] && \ + PCP_PMCDOPTIONS_PATH="$PCP_SYSCONF_DIR/pmcd/pmcd.options" + PCPQA_PMCDOPTIONS="$PCP_PMCDOPTIONS_PATH" + sed <$PCPQA_PMCDOPTIONS >$tmp.tmp -e '/^-T/s/^/#/' + cat >>$tmp.tmp <<'End-of-File' + +# added by PCP QA +-T 3 +End-of-File + $sudo cp $tmp.tmp $PCPQA_PMCDOPTIONS + $sudo $PCP_RC_DIR/pcp restart + _wait_for_pmlogger + fi + +} + +here=`pwd` +rm -f $here/$iam.out +_setenvironment + +check=${check-true} +quick=${quick-false} + +# Try and guess what "make" is called ... configure leaves a comment +# like this +#NB: don't override $(MAKE); gnumake sets it well, propagating -j etc. +#MAKE = /usr/local/bin/gmake +# in builddefs, so try there ... +# +if [ -f $PCP_INC_DIR/builddefs ] +then + make=`sed <$PCP_INC_DIR/builddefs -n -e '/^#NB: don.t override \$(MAKE);/{ +N +s/.*MAKE[ ]*=[ ]*//p +}'` + [ -n "$make" ] && export MAKE=$make +fi + +if $check +then + if $quick + then + : + else + if [ -f GNUmakefile.install ] + then + # running QA in the tree + ${MAKE:-make} -f GNUmakefile.install >/tmp/$$.make 2>&1 + ( cd qt; ./setup-executables ) + else + ${MAKE:-make} >/tmp/$$.make 2>&1 + fi + if [ $? != 0 ] + then + cat /tmp/$$.make + echo "Warning: ${MAKE:-make} failed -- some tests may be missing" + warn=1 + fi + rm -f /tmp/$$.make + fi +fi + +diff=diff +if [ ! -z "$DISPLAY" ] +then + which tkdiff >/dev/null 2>&1 && diff=tkdiff + which xdiff >/dev/null 2>&1 && diff=xdiff + which xxdiff >/dev/null 2>&1 && diff=xxdiff + which gdiff >/dev/null 2>&1 && diff=gdiff +fi + +color=false +verbose=false +paranoid=false +group=false +xgroup=false +rflag=false +selbygroup=false +snarf='' +showme=false +sortme=false +have_test_arg=false +check_config=false +rm -f $tmp.list $tmp.tmp $tmp.sed + +for r +do + + if $group + then + selbygroup=true + + # arg after -g + group_list=` + if $rflag + then + sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group + else + sed -e '/[0-9]:\(retired\|reserved\) /d' <group + fi \ + | sed -n -e 's/$/ /' -e "/^[0-9][0-9]*.* $r /"'{ +s/ .*//p +}'` + if [ -z "$group_list" ] + then + echo "Group \"$r\" is empty or not defined; ignored" >&2 + else + [ ! -s $tmp.list ] && touch $tmp.list + for t in $group_list + do + if grep -s "^$t\$" $tmp.list >/dev/null + then + : + else + echo "$t" >>$tmp.list + fi + done + fi + group=false + continue + + elif $xgroup + then + selbygroup=true + + # if no test numbers, do everything from group file + [ -s $tmp.list ] || \ + if $rflag + then + sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group + else + sed -e '/[0-9]:\(retired\|reserved\) /d' <group + fi \ + | sed -n -e '/^[0-9]/s/[ ].*//p' >$tmp.list + + # arg after -x + group_list=` + if $rflag + then + sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group + else + sed -e '/[0-9]:\(retired\|reserved\) /d' <group + fi \ + | sed -n \ + -e "/^[0-9].* $r /s/[ ].*//p" \ + -e "/^[0-9].* $r\$/s/[ ].*//p"` + if [ -z "$group_list" ] + then + echo "Group \"$r\" is empty or not defined; ignored" >&2 + else + numsed=0 + rm -f $tmp.sed + for t in $group_list + do + if [ $numsed -gt 100 ] + then + sed -f $tmp.sed <$tmp.list >$tmp.tmp + mv $tmp.tmp $tmp.list + numsed=0 + rm -f $tmp.sed + fi + echo "/^$t\$/d" >>$tmp.sed + numsed=`expr $numsed + 1` + done + sed -f $tmp.sed <$tmp.list >$tmp.tmp + mv $tmp.tmp $tmp.list + fi + xgroup=false + continue + + elif [ ! -z "$snarf" ] + then + case $snarf + in + d) + QA_DIR=$r + ;; + h) + QA_HOST=$r + ;; + u) + QA_USER=$r + ;; + esac + snarf='' + continue + fi + + xpand=true + range=false + case "$r" + in + + -\?) # usage + echo "Usage: $0 [options] [testlist]"' + +common options + -v verbose + +check options + -c check configuration files [off] + -C color mode output [off] + -g group include tests from these groups (multiple flags allowed) + -G report groups and number of tests per group + -l line mode diff [xdiff] + -s sssh mode diff [no diff, regular output] + -n show me, do not run tests + -q quick, no PMDA checks (you are on your own) + -r include reserved and retired tests + -t turn on tracing + -T output timestamps + -x group exclude tests from these groups (multiple flags allowed) + +show-me options + -d QA_DIR [isms/pcp2.0/qa] + -h QA_HOST ['`hostname`'] + -u QA_USER [pcpqa] +' + exit 0 + ;; + + -c) # check config files + check_config=true + xpand=false + ;; + + -C) # color mode for results and summaries + color=true + xpand=false + ;; + + -d) # directory for show-me + snarf=d + xpand=false + ;; + + -G) # -G report groups and number of tests per group + sed -n -e '/^[a-z]/{ +s/[ ].*// +p +}' <group >$tmp.group + cat $tmp.group + echo === + LC_COLLATE=POSIX sort $tmp.group \ + | while read group + do + num=` + if $rflag + then + sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group + else + sed -e '/[0-9]:\(retired\|reserved\) /d' <group + fi \ + | egrep "^[0-9].*[ ]$group([ ]|$)" \ + | wc -l \ + | sed -e 's/ //g'` + printf "%-20.20s %3d\n" $group $num + done + exit 0 + ;; + + -g) # -g group ... pick from group file + group=true + xpand=false + ;; + + -h) # host for show-me + snarf=h + xpand=false + ;; + + -l) # line mode for diff, not gdiff over modems + diff=diff + xpand=false + ;; + + -n) # show me, don't do it + showme=true + quick=true + xpand=false + ;; + + -q) # "quick", no PMDA checks (you are on your own) + quick=true + xpand=false + ;; + + -r) # include reserved and retired tests + rflag=true + xpand=false + ;; + + -s) # sssh mode for diff, no diff at all + diff=true + xpand=false + ;; + + -t) # turn on tracing + qatrace=true + xpand=false + ;; + + -T) # turn on timestamp output + timestamp=true + xpand=false + ;; + + -u) # user for show-me + snarf=u + xpand=false + ;; + + -v) + verbose=true + xpand=false + ;; + + -x) # -x group ... exclude from group file + xgroup=true + xpand=false + ;; + + '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]') + echo "No tests?" >&2 + status=1 + exit $status + ;; + + [0-9]*-[0-9]*) + eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'` + range=true + ;; + + [0-9]*-) + eval `echo $r | sed -e 's/^/start=/' -e 's/-//'` + end=`echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/ *$//' -e 's/.* //'` + if [ -z "$end" ] + then + echo "No tests in range \"$r\"?" >&2 + status=1 + exit $status + fi + range=true + ;; + + *) + start=$r + end=$r + ;; + + esac + + if $xpand + then + start=`echo $start | sed -e 's/^0*\(.\)/\1/'` + end=`echo $end | sed -e 's/^0*\(.\)/\1/'` + have_test_arg=true + if $rflag + then + sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group + else + sed -e '/[0-9]:\(retired\|reserved\) /d' <group + fi >$tmp.group + $PCP_AWK_PROG </dev/null ' +BEGIN { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \ + | while read id + do + # if test not present, silently forget about it + [ -f $id ] || continue + if egrep -s "^$id([ ]|$)" $tmp.group >/dev/null + then + # in group file ... OK + echo $id >>$tmp.list + elif egrep -s "^$id:retired([ ]|$)" group >/dev/null + then + # in group file, but retired + echo "$id - retired test, ignored" + elif egrep -s "^$id:reserved([ ]|$)" group >/dev/null + then + # in group file, but reserved + echo "$id - reserved test, ignored" + else + # oops + $range || echo "$id - unknown test, ignored" + fi + done + fi + +done + +if [ -s $tmp.list ] +then + # found some valid test numbers ... this is good + : +else + if $have_test_arg + then + # had test numbers, but none in group file ... do nothing + touch $tmp.list + else + if $selbygroup + then + echo "No tests selected?" >&2 + exit 1 + else + # no test numbers, do everything from group file + touch $tmp.list + if $rflag + then + sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group + else + sed -e '/[0-9]:\(retired\|reserved\) /d' <group + fi \ + | sed -n -e '/^[0-9]/{ +s/[ ].*// +p +}' \ + | while read id + do + [ -f $id ] || continue + echo $id >>$tmp.list + done + fi + fi +fi + +list=`sort -n $tmp.list` +rm -f $tmp.list $tmp.tmp $tmp.sed + +# re-process the product-specific setup in case command line args have +# changed things, e.g. -h hostname +# +. ./common.setup + +[ -z "$QA_HOST" ] && QA_HOST=$DEFAULT_HOST +export QA_HOST QA_DIR QA_USER + +if $check +then + x=`pminfo -h $QA_HOST -v pmcd.control.timeout 2>&1` + if [ ! -z "$x" ] + then + echo "Is pmcd running on host $QA_HOST? Simple test produces ..." + echo "$x" + exit 1 + fi +fi + +case $iam +in + show-me) + # don't need sudo + ;; + *) + + _havesudo + ;; +esac + +case $iam +in + check|remake) + # $PCP_RC_DIR/pcp needs this to produce deterministic output now + # + _change_config verbose on + ;; +esac + +if $quick +then + : +else + ./mk.localconfig + + $OPTION_AGENTS && _haveagents + $OPTION_LOGGER && _havelogger + $OPTION_PMCD_TRACE && _havepmcdtrace + + if [ -f GNUmakefile.install ] + then + # running QA in the tree + ${MAKE:-make} -f GNUmakefile.install setup + else + ${MAKE:-make} setup + fi + if [ $? != 0 ] + then + echo "Error: ${MAKE:-make} setup failed" + exit 1 + fi + + # since pmcd no longer runs as root, normal users must be able + # to read all dirs on the path to the qa home ... + # + x=`pwd` + while [ -n "$x" -a "$x" != / ] + do + prot=`ls -ld "$x" | sed -e 's/[ ].*//'` + case $prot + in + dr?xr?xr?[xt]*) + ;; + *) + echo "Warning: parent directory $x (mode=$prot) not world readable and searchable" + ;; + esac + x=`dirname $x` + done +fi |