3 # common procedures for PCP QA scripts
5 # Copyright (c) 1997-2002 Silicon Graphics, Inc. All Rights Reserved.
8 # for _wait_for_pmlogger() and _change_config()
11 # per product QA script customization
14 [ -z "$DEFAULT_HOST" ] && DEFAULT_HOST
=`hostname`
21 export PCP_DERIVED_CONFIG
=""
26 echo "FYI ... here are the PMCD logs"
31 # try in the other place
36 __try
=`echo $log | sed -e "s;/pmcd/;/;"`
39 __try
=`echo $log | sed -e "s;$PCP_LOG_DIR/;$PCP_LOG_DIR/pmcd/;"`
42 [ -f $__try ] && log
=$__try
46 echo "::::::::: start $log ::::::::"
48 echo ":::::::::: end $log :::::::::"
50 [ $log != $PCP_LOG_DIR/pmcd
/pmcd.log
] && $sudo rm -f $log
52 echo "$log: not found"
61 setuid
=`$sudo id | sed -e 's/(.*//' -e 's/.*=//'`
64 echo "\"sudo\" is not an executable setuid root. This is fatal."
65 echo "As root, you need to setup your sudoers file for pcpqa."
76 # PMDAs than need to be here for QA
78 COMMON_PMDAS
="sample sampledso simple"
79 if [ -d $PCP_PMDAS_DIR/cisco
]
81 # cisco PMDA requires that you can reach a router
83 if which ping >/dev
/null
2>&1
85 # Note: PCP_QA_CISCOROUTER needs to be defined in common.rc
86 if ping -c 1 $PCP_QA_CISCOROUTER >/dev
/null
2>&1
88 COMMON_PMDAS
="$COMMON_PMDAS cisco"
93 for agent
in $COMMON_PMDAS
96 agentlog
=$PCP_LOG_DIR/pmcd
/$agent.log
98 # make this empty to stop any attempt to reinstall
100 agentdir
=$PCP_PMDAS_DIR/$agent
108 probe
=sample.milliseconds
111 probe
=sampledso.milliseconds
112 agentdir
=$PCP_PMDAS_DIR/sample
115 probe
=simple.numfetch
121 [ $diff = true
] ||
echo "PMDA probe: pminfo -h $QA_HOST -f $probe"
122 if pminfo
-h $QA_HOST -f $probe 2>&1 \
124 |
egrep "^[ ]*((value)|(inst))[ ]" >/dev
/null
128 echo "PMDA $agent is not responding"
133 _log_fyi
$PCP_LOG_DIR/pmcd
/pmcd.log
$agentlog
134 echo "Restarting PMCD ..."
135 $sudo $PCP_RC_DIR/pcp restart
140 [ -f $_here/$iam.out
] && cat $_here/$iam.out
141 echo "Cannot make PMDA $agent work, ... giving up!"
144 if [ -z "$agentdir" ]
146 echo "Skip PMDA re-install"
148 elif [ -d "$agentdir" ]
150 echo "Trying to re-install PMDA $agent from $agentdir ..."
151 _log_fyi
$PCP_LOG_DIR/pmcd
/pmcd.log
$agentlog
153 unset ROOT TOOLROOT MAKEFLAGS
154 $sudo .
/Remove
</dev
/null
>>$_here/$iam.out
159 .
/common.
install.cisco
$iam $agentdir
162 $sudo .
/Install
</dev
/null
>>$_here/$iam.out
168 echo "Cannot find PMDA directory ($agentdir)"
169 echo "to re-install, ... giving up!"
180 if [ -z "`_get_pids_by_name 'pmlogger.*-P'`" ]
182 echo "Primary pmlogger not running ..."
183 echo "chkconfig pmlogger on, and restart PMCD"
184 _change_config pmlogger on
185 if sed -e '/^#/d' "${PCP_PMLOGGERCONTROL_PATH}" \
186 |
$PCP_AWK_PROG '$2 == "y" && $3 == "n" { sts=1 } END { exit 1-sts }'
188 : echo "have primary pmlogger line in main control file"
189 elif sed -e '/^#/d' "${PCP_PMLOGGERCONTROL_PATH}.d/local" \
190 |
$PCP_AWK_PROG '$2 == "y" && $3 == "n" { sts=1 } END { exit 1-sts }'
192 : echo "have primary pmlogger line in local control file"
194 : echo "no primary pmlogger line in control file"
195 if $PCP_AWK_PROG '$2 == "y" && $3 == "n" { sts=1} END { exit 1-sts }' <$PCP_PMLOGGERCONTROL_PATH
198 sed <$PCP_PMLOGGERCONTROL_PATH >$tmp.tmp \
199 -e '/^#[^ ][^ ]*[ ][ ]*y/s/#//'
200 $sudo cp $tmp.tmp
$PCP_PMLOGGERCONTROL_PATH
201 elif $PCP_AWK_PROG '$2 == "y" && $3 == "n" { sts=1} END { exit 1-sts }' <$PCP_PMLOGGERCONTROL_PATH.d
/local
204 sed <$PCP_PMLOGGERCONTROL_PATH.d
/local >$tmp.tmp \
205 -e '/^#[^ ][^ ]*[ ][ ]*y/s/#//'
206 $sudo cp $tmp.tmp
$PCP_PMLOGGERCONTROL_PATH.d
/local
209 cp $PCP_PMLOGGERCONTROL_PATH.d
/local $tmp.tmp
210 cat >>$tmp.tmp
<<'End-of-File'
213 LOCALHOSTNAME y n PCP_LOG_DIR/pmlogger/LOCALHOSTNAME -c config.default
215 $sudo cp $tmp.tmp
$PCP_PMLOGGERCONTROL_PATH.d
/local
218 $sudo $PCP_RC_DIR/pcp restart
225 # ensure critical daemons allow for remote access
227 if test -f "${PCP_SYSCONFIG_DIR}/pmcd"
229 sed <$PCP_SYSCONFIG_DIR/pmcd
>$tmp.tmp \
230 -e '/^PMCD_LOCAL=1/s/^/#/g'
231 diff $PCP_SYSCONFIG_DIR/pmcd
$tmp.tmp
>/dev
/null || \
232 $sudo cp $tmp.tmp
$PCP_SYSCONFIG_DIR/pmcd
235 if test -f "${PCP_SYSCONFIG_DIR}/pmproxy"
237 sed <$PCP_SYSCONFIG_DIR/pmproxy
>$tmp.tmp \
238 -e '/^PMPROXY_LOCAL=1/s/^/#/g'
239 diff $PCP_SYSCONFIG_DIR/pmproxy
$tmp.tmp
>/dev
/null || \
240 $sudo cp $tmp.tmp
$PCP_SYSCONFIG_DIR/pmproxy
243 if test -f "${PCP_SYSCONFIG_DIR}/pmlogger"
245 sed <$PCP_SYSCONFIG_DIR/pmlogger
>$tmp.tmp \
246 -e '/^PMLOGGER_LOCAL=1/s/^/#/g'
247 diff $PCP_SYSCONFIG_DIR/pmlogger
$tmp.tmp
>/dev
/null || \
248 $sudo cp $tmp.tmp
$PCP_SYSCONFIG_DIR/pmlogger
255 for trace
in traceconn tracepdu
257 bit
=`pminfo -h $QA_HOST -f pmcd.control.$trace | sed -n -e '/value/s/ *value *//p'`
260 pminfo
-h $QA_HOST -f pmcd.control.
$trace
261 echo "PMCD event tracing not enabled!"
267 echo "fix options, and restart PMCD"
268 [ -z "PCP_PMCDOPTIONS_PATH" ] && \
269 PCP_PMCDOPTIONS_PATH
="$PCP_SYSCONF_DIR/pmcd/pmcd.options"
270 PCPQA_PMCDOPTIONS
="$PCP_PMCDOPTIONS_PATH"
271 sed <$PCPQA_PMCDOPTIONS >$tmp.tmp
-e '/^-T/s/^/#/'
272 cat >>$tmp.tmp
<<'End-of-File'
277 $sudo cp $tmp.tmp
$PCPQA_PMCDOPTIONS
281 freebsd|netbsd|openbsd
)
285 $sudo chown root
:$grp $PCPQA_PMCDOPTIONS
286 $sudo $PCP_RC_DIR/pcp restart
299 # Try and guess what "make" is called ... configure leaves a comment
301 #NB: don't override $(MAKE); gnumake sets it well, propagating -j etc.
302 #MAKE = /usr/local/bin/gmake
303 # in builddefs, so try there ...
305 if [ -f $PCP_INC_DIR/builddefs
]
307 make=`sed <$PCP_INC_DIR/builddefs -n -e '/^#NB: don.t override \$(MAKE);/{
311 [ -n "$make" ] && export MAKE
=$make
320 if [ -f GNUmakefile.
install ]
322 # running QA in the tree
323 ${MAKE:-make} -f GNUmakefile.
install >/tmp
/$$.
make 2>&1
324 ( cd qt
; .
/setup-executables
)
326 ${MAKE:-make} >/tmp
/$$.
make 2>&1
331 echo "Warning: ${MAKE:-make} failed -- some tests may be missing"
339 if [ ! -z "$DISPLAY" ]
341 which tkdiff
>/dev
/null
2>&1 && diff=tkdiff
342 which xdiff
>/dev
/null
2>&1 && diff=xdiff
343 which xxdiff
>/dev
/null
2>&1 && diff=xxdiff
344 which gdiff
>/dev
/null
2>&1 && diff=gdiff
360 rm -f $tmp.list
$tmp.tmp
$tmp.
sed $tmp.exclude
373 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
375 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
377 | sed -n -e 's/$/ /' -e "/^[0-9][0-9]*.* $r /"'{
380 if [ -z "$group_list" ]
382 echo "Group \"$r\" is empty or not defined; ignored" >&2
384 [ ! -s $tmp.list
] && touch $tmp.list
387 if grep -s "^$t\$" $tmp.list
>/dev
/null
391 echo "$t" >>$tmp.list
402 # if no test numbers, do everything from group file
403 [ -s $tmp.list
] || \
406 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
408 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
410 |
sed -n -e '/^[0-9]/s/[ ].*//p' >$tmp.list
416 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
418 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
421 -e "/^[0-9].* $r /s/[ ].*//p" \
422 -e "/^[0-9].* $r\$/s/[ ].*//p"`
423 if [ -z "$group_list" ]
425 echo "Group \"$r\" is empty or not defined; ignored" >&2
431 if [ $numsed -gt 100 ]
433 sed -f $tmp.
sed <$tmp.list
>$tmp.tmp
434 mv $tmp.tmp
$tmp.list
438 echo "/^$t\$/d" >>$tmp.
sed
439 numsed
=`expr $numsed + 1`
441 sed -f $tmp.
sed <$tmp.list
>$tmp.tmp
442 mv $tmp.tmp
$tmp.list
449 # if no test numbers, do everything from group file
450 [ -s $tmp.list
] || \
453 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
455 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
457 |
sed -n -e '/^[0-9]/s/[ ].*//p' >$tmp.list
459 for t
in `echo "$r" | sed -e 's/,/ /g'`
461 echo "/^0*$t\$/d" >>$tmp.exclude
462 echo "/^0*$t:/d" >>$tmp.exclude
467 elif [ ! -z "$snarf" ]
491 echo "Usage: $0 [options] [testlist]"'
497 -c check configuration files [off]
498 -C color mode output [off]
499 -g group include tests from these groups (multiple flags allowed)
500 -G report groups and number of tests per group
501 -l line mode diff [xdiff]
502 -s sssh mode diff [no diff, regular output]
503 -n show me, do not run tests
504 -q quick, no PMDA checks (you are on your own)
505 -r include reserved and retired tests
508 -x group exclude tests from these groups (multiple flags allowed)
513 -d QA_DIR [isms/pcp2.0/qa]
514 -h QA_HOST ['`hostname`']
520 -c) # check config files
525 -C) # color mode for results and summaries
530 -d) # directory for show-me
535 -G) # -G report groups and number of tests per group
539 }' <group
>$tmp.group
542 LC_COLLATE
=POSIX
sort $tmp.group \
548 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
550 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
552 | egrep "^[0-9].*[ ]$group([ ]|$)" \
555 printf "%-20.20s %3d\n" $group $num
560 -g) # -g group ... pick from group file
565 -h) # host for show-me
570 -l) # line mode for diff, not gdiff over modems
575 -n) # show me, don't do it
581 -q) # "quick", no PMDA checks (you are on your own)
586 -r) # include reserved and retired tests
591 -s) # sssh mode for diff, no diff at all
596 -t) # turn on tracing
601 -T) # turn on timestamp output
606 -u) # user for show-me
616 -x) # -x group ... exclude from group file
621 -X) # -X seq[,seq...] ... exclude explicit tests
626 '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
633 eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
638 eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
639 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/.* //'`
642 echo "No tests in range \"$r\"?" >&2
658 start
=`echo $start | sed -e 's/^0*\(.\)/\1/'`
659 end
=`echo $end | sed -e 's/^0*\(.\)/\1/'`
663 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
665 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
667 $PCP_AWK_PROG </dev
/null
'
668 BEGIN { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
671 # if test not present, silently forget about it
672 [ -f $id ] ||
continue
673 if egrep -s "^$id([ ]|$)" $tmp.group
>/dev
/null
675 # in group file ... OK
677 elif egrep -s "^$id:retired([ ]|$)" group
>/dev
/null
679 # in group file, but retired
684 echo "$id - retired test, ignored"
686 elif egrep -s "^$id:reserved([ ]|$)" group
>/dev
/null
688 # in group file, but reserved
693 echo "$id - reserved test, ignored"
697 $range ||
echo "$id - unknown test, ignored"
706 # found some valid test numbers ... this is good
711 # had test numbers, but none in group file ... do nothing
716 echo "No tests selected?" >&2
719 # no test numbers, do everything from group file
723 sed -e 's/\([0-9]\):\(retired\|reserved\) /\1 /' <group
725 sed -e '/[0-9]:\(retired\|reserved\) /d' <group
727 |
sed -n -e '/^[0-9]/{
733 [ -f $id ] ||
continue
740 # handle -X exclusions
742 if [ -s $tmp.exclude
]
744 sed -f $tmp.exclude
<$tmp.list
>$tmp.tmp
745 mv $tmp.tmp
$tmp.list
748 list
=`sort -n $tmp.list`
749 rm -f $tmp.list
$tmp.tmp
$tmp.
sed $tmp.exclude
751 # re-process the product-specific setup in case command line args have
752 # changed things, e.g. -h hostname
756 [ -z "$QA_HOST" ] && QA_HOST
=$DEFAULT_HOST
757 export QA_HOST QA_DIR QA_USER
761 x
=`pminfo -h $QA_HOST -v pmcd.control.timeout 2>&1`
764 echo "Is pmcd running on host $QA_HOST? Simple test produces ..."
784 # $PCP_RC_DIR/pcp needs this to produce deterministic output now
786 _change_config verbose on
796 $OPTION_AGENTS && _haveagents
797 $OPTION_LOGGER && _havelogger
798 $OPTION_REMOTE && _haveremote
799 $OPTION_PMCD_TRACE && _havepmcdtrace
801 if [ -f GNUmakefile.
install ]
803 # running QA in the tree
804 ${MAKE:-make} -f GNUmakefile.
install setup
806 if ${MAKE:-make} -f GNUmakefile.
install setup
>$tmp.tmp
2>&1
811 echo "Warning: pmdas: $MAKE -f GNUmakefile.install setup failed"
814 if ${MAKE:-make} -f GNUmakefile.
install broken_v2.dir
>$tmp.tmp
2>&1
819 echo "Warning: pmdas/broken: $MAKE -f GNUmakefile.install broken_v2.dir failed"
827 echo "Error: ${MAKE:-make} setup failed"
831 # since pmcd no longer runs as root, normal users must be able
832 # to read all dirs on the path to the qa home ...
835 while [ -n "$x" -a "$x" != / ]
837 prot
=`ls -ldL "$x" | sed -e 's/[ ].*//'`
843 echo "Warning: parent directory $x (mode=$prot) not world readable and searchable"