#!/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 >$here/$iam.out case $agent in cisco) cd $here ./common.install.cisco $iam $agentdir ;; *) $sudo ./Install >$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 /' &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 /' $tmp.list # arg after -x group_list=` if $rflag then sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' &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 }' $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 /' &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 /' $tmp.group $PCP_AWK_PROG /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 /' >$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