The individual fixes: 1) A complete QA failure produces a readable email now 2) the nssqa has goes thru a central Exit 3) hanging processes under NT and Win2K are killed (tail -f) 4) Functionallity is implemented to kill other remaining processes (killpif file) 5) improved general cleanup in Exit functions 6) the header is sourced from the nssqa dir rateher than /u/sonmi/bin 7) Problems with QA being reported as passed even if missing fixed 8) Most problems with the "missing Platform list" fixed 9) One QA failure path (cd to a dir without permission) did not give errormessage about the reason of failure before 10) fixed html errors in generated email 11) stopped filtering the "bad password" cases as real failures (was fixed in nssqa a while ago, but still filtered 12) removing more tmp files from /tmp (decreased debugging) git-svn-id: svn://10.0.0.236/trunk@85336 18797224-902f-48f8-a5cc-f745e15eee43
1033 lines
25 KiB
Bash
1033 lines
25 KiB
Bash
#! /bin/sh
|
|
|
|
########################################################################
|
|
#
|
|
# /u/sonmi/bin/header - /u/svbld/bin/init/nss/header
|
|
#
|
|
# variables, utilities and shellfunktions global to NSS QA
|
|
# needs to work on all Unix platforms
|
|
#
|
|
# included from (don't expect this to be up to date)
|
|
# --------------------------------------------------
|
|
# qa_stat
|
|
# mksymlinks
|
|
# nssqa
|
|
#
|
|
# parameters
|
|
# ----------
|
|
# nssversion (supported: 30b, 31, tip)
|
|
# builddate (default - today)
|
|
#
|
|
# options
|
|
# -------
|
|
# -y answer all questions with y - use at your own risk... ignores warnings
|
|
# -s silent (only usefull with -y)
|
|
# -h, -? - you guessed right - displays this text
|
|
# -d debug
|
|
# -f <filename> - write the (error)output to filename
|
|
# -fcronfile produces the resultfiles in the same locations
|
|
# as would have been produced with -cron
|
|
# -m <mailinglist> - send filename to mailinglist (csl) only useful
|
|
# with -f
|
|
# -l <mozroot> run on a local build O_LOCAL
|
|
# -cron equivalient to -y -s -d -f $RESULTDIR/$HOST.<scriptname>
|
|
#
|
|
# special strings
|
|
# ---------------
|
|
# FIXME ... known problems, search for this string
|
|
# NOTE .... unexpected behavior
|
|
#
|
|
# moduls (not yet)
|
|
# ----------------
|
|
# --# INIT
|
|
# --# USERCOM
|
|
# --# UTILS
|
|
#
|
|
# FIXME - split in init / usercom / utils
|
|
#
|
|
########################################################################
|
|
|
|
#------------------------------# INIT #------------------------------
|
|
|
|
# below the option flags get initialized
|
|
|
|
if [ -z "$QASCRIPT_DIR" ]
|
|
then
|
|
QASCRIPT_DIR=`dirname $0`
|
|
if [ "$QASCRIPT_DIR" = '.' ]
|
|
then
|
|
QASCRIPT_DIR=`pwd`
|
|
fi
|
|
fi
|
|
export QASCRIPT_DIR
|
|
|
|
O_ALWAYS_YES=OFF # turned on by -y answer all questions with y
|
|
|
|
if [ -z "$O_INIT" ] # header is global, some including scripts may not
|
|
then # want the init to run, the others don't need to bother
|
|
O_INIT=ON
|
|
fi
|
|
if [ -z "$O_PARAM" ] # header is global, some including scripts may not
|
|
then # require parameters, the others don't need to bother
|
|
O_PARAM=ON
|
|
fi
|
|
if [ -z "$O_OPTIONS" ] # header is global, some including scripts may not
|
|
then # permit options, they don't need to bother
|
|
O_OPTIONS=OFF
|
|
fi
|
|
O_SILENT=OFF # turned on by -s silent (only usefull with -y)
|
|
O_DEBUG=OFF # turned on by -d - calls to Debug produce output when ON
|
|
O_FILE=OFF # turned on by -f echo all output to a file $FILENAME
|
|
O_CRON=OFF # turned on by -cron cron use only
|
|
O_CRONFILE=OFF # turned on by -cron cron and -fcron
|
|
O_LOCAL=OFF # turned on by -l run on a local build in $MOZROOT
|
|
O_MAIL=OFF # turned on by -m - sends email
|
|
|
|
if [ -z "$DOMSUF" ]
|
|
then
|
|
|
|
DOMSUF=red.iplanet.com
|
|
DS_WAS_SET=FALSE
|
|
else
|
|
DS_WAS_SET=TRUE
|
|
fi
|
|
|
|
TMPFILES=""
|
|
|
|
WAIT_FOR=600 # if waiting for an event sleep n seconds before rechecking
|
|
# recomended value 10 minutes 600
|
|
WAIT_TIMES=30 # recheck n times before giving up - recomended 30 - total of 5h
|
|
|
|
if [ -z "$QAYEAR" ] # may I introduce - the y2k+1 bug? QA for last year
|
|
then # might not work
|
|
QAYEAR=`date +%Y`
|
|
fi
|
|
|
|
if [ -z "$TMP" ]
|
|
then
|
|
if [ -z "$TEMP" ]
|
|
then
|
|
TMP="/tmp"
|
|
else
|
|
TMP=$TEMP
|
|
fi
|
|
fi
|
|
if [ ! -w "$TMP" ]
|
|
then
|
|
echo "Can't write to tmp directory $TMP - exiting"
|
|
echo "Can't write to tmp directory $TMP - exiting" >&2
|
|
exit 1
|
|
fi
|
|
|
|
KILLPIDS="$TMP/killpids.$$"
|
|
export KILLERPIDS
|
|
TMPFILES="$TMPFILES $KILLPIDS"
|
|
|
|
KILL_SELFSERV=OFF # if sourcing script sets this to on cleanup will also
|
|
# kill the running selfserv processes
|
|
|
|
# Set the masterbuilds
|
|
|
|
if [ -z "$MASTERBUILD" ]
|
|
then
|
|
MASTERBUILD=y2sun2_Solaris8
|
|
#MASTERBUILD=shame_Solaris2.6
|
|
MB_WAS_SET=FALSE
|
|
else
|
|
MB_WAS_SET=TRUE
|
|
fi
|
|
|
|
if [ -z "$BUILDNUMBER" ]
|
|
then
|
|
BUILDNUMBER=1
|
|
fi
|
|
export BUILDNUMBER
|
|
if [ -z "$NT_MASTERBUILD" ]
|
|
then
|
|
NT_MASTERBUILD=blowfish_NT4.0_Win95
|
|
NT_MB_WAS_SET=FALSE
|
|
else
|
|
NT_MB_WAS_SET=TRUE
|
|
fi
|
|
O_LDIR=OFF #local QA dir for NT, temporary
|
|
|
|
if [ -z "$WIN_WAIT_FOREVER" ] # header is global, some including scripts
|
|
then # want the init to wait forever for directories to
|
|
# appear (windows only) if OFF exit, if ON wait forever
|
|
WIN_WAIT_FOREVER=OFF
|
|
fi
|
|
|
|
EARLY_EXIT=TRUE #before the report file has been created, causes Exit to
|
|
#create it
|
|
|
|
################################### glob_init ##########################
|
|
# global shell function, main initialisation function
|
|
########################################################################
|
|
glob_init()
|
|
{
|
|
if [ $O_PARAM = "ON" ]
|
|
then
|
|
eval_opts $* # parse parameters and options - set flags
|
|
fi
|
|
#if [ $O_CRON = "ON" ] # if running from cron HOST needs to be
|
|
#then # known early, so the output file name
|
|
set_host # can be constructed. If running interactive
|
|
#fi # it needs to be called by sourcing script
|
|
. $QASCRIPT_DIR/set_environment #finds out if we are running on Windows
|
|
Debug "OPerating system: $os_name $os_full"
|
|
if [ $O_WIN = "ON" ]
|
|
then
|
|
#set_host
|
|
write_to_tmpfile
|
|
else
|
|
Debug "Not a Windows OS"
|
|
fi
|
|
umask 0
|
|
set_dirs
|
|
set_files
|
|
set_vars
|
|
}
|
|
|
|
################################### set_vars ###########################
|
|
# global shell function, sets the environment variables, part of init
|
|
########################################################################
|
|
set_vars()
|
|
{
|
|
if [ -z "$LOGNAME" ]
|
|
then
|
|
if [ $O_WIN = "ON" ]
|
|
then
|
|
LOGNAME=$USERNAME
|
|
else
|
|
LOGNAME=$USER
|
|
fi
|
|
if [ -z "$LOGNAME" ]
|
|
then
|
|
LOGNAME=$UNAME
|
|
if [ -z "$LOGNAME" ]
|
|
then
|
|
LOGNAME=`basename $HOME`
|
|
fi
|
|
fi
|
|
fi
|
|
if [ -z "$LOGNAME" ]
|
|
then
|
|
Exit "Can't determine current user"
|
|
fi
|
|
}
|
|
|
|
################################### set_dirs ###########################
|
|
# global shell function, sets the nt masterbuild directories, part of init
|
|
########################################################################
|
|
find_nt_masterbuild()
|
|
{
|
|
NT_MASTERDIR=${D2}/${NT_MASTERBUILD}
|
|
if [ "${NT_MB_WAS_SET}" = "FALSE" -a ! -d $NT_MASTERDIR ] ; then
|
|
if [ -d ${D2}/*NT4* ] ; then
|
|
NT_MASTERBUILD=` cd ${D2}; ls -d *NT4* `
|
|
Debug "NT_MASTERBUILD $NT_MASTERBUILD"
|
|
NT_MASTERDIR=${D2}/${NT_MASTERBUILD}
|
|
fi
|
|
fi
|
|
Debug "NT_MASTERDIR $NT_MASTERDIR"
|
|
}
|
|
|
|
################################### set_dirs ###########################
|
|
# global shell function, sets the directories, part of init
|
|
########################################################################
|
|
set_dirs()
|
|
{
|
|
#O_LOCAL
|
|
if [ "$O_WIN" = "ON" ]
|
|
then
|
|
win_set_dirs
|
|
else
|
|
D1=/h/hs-sca15c/export/builds/mccrel/nss/nss$NSSVER
|
|
D3=${D2}/${MASTERBUILD}
|
|
UXDIST=${D3}/mozilla/dist
|
|
RESULTDIR=${D3}/mozilla/tests_results/security
|
|
fi
|
|
|
|
D2=${D1}/builds/${QAYEAR}${BUILDDATE}.${BUILDNUMBER}
|
|
UX_MASTERDIR=${D2}/${MASTERBUILD}
|
|
find_nt_masterbuild
|
|
|
|
UXDIST=${UX_MASTERDIR}/mozilla/dist
|
|
NTDIST=${NT_MASTERDIR}/mozilla/dist
|
|
|
|
RESULTDIR=${UX_MASTERDIR}/mozilla/tests_results/security
|
|
|
|
|
|
#O_LOCAL
|
|
if [ "$O_WIN" = "ON" ]
|
|
then
|
|
MASTERBUILD=$NT_MASTERBUILD
|
|
MOZILLA_ROOT=${NT_MASTERDIR}/mozilla
|
|
else
|
|
MOZILLA_ROOT=${UX_MASTERDIR}/mozilla
|
|
fi
|
|
|
|
TESTSCRIPTDIR=${MOZILLA_ROOT}/security/nss/tests
|
|
|
|
if [ ! -d $TESTSCRIPTDIR ]
|
|
then
|
|
if [ "$O_WIN" = "ON" -a "$WIN_WAIT_FOREVER" = "ON" ]
|
|
then
|
|
WaitForever $TESTSCRIPTDIR/all.sh 1
|
|
else
|
|
Exit "Test directory $TESTSCRIPTDIR does not exist"
|
|
fi
|
|
fi
|
|
|
|
COMMON=${TESTSCRIPTDIR}/common
|
|
|
|
set_objdir
|
|
|
|
|
|
Debug "NTDIST $NTDIST"
|
|
Debug "UXDIST $UXDIST"
|
|
Debug "TESTSCRIPTDIR $TESTSCRIPTDIR"
|
|
Debug "RESULTDIR $RESULTDIR"
|
|
Debug "TMP $TMP"
|
|
Debug "LOCALDIST_BIN $LOCALDIST_BIN"
|
|
Debug "COMMON $COMMON"
|
|
Debug "MOZILLA_ROOT $MOZILLA_ROOT"
|
|
|
|
export D1 D2 NTDIST UXDIST RESULTDIR TESTSCRIPTDIR
|
|
export UX_MASTERDIR NT_MASTERDIR COMMON MOZILLA_ROOT
|
|
}
|
|
|
|
################################### set_files ###########################
|
|
# global shell function, sets filenames, initializes files, part of init
|
|
########################################################################
|
|
set_files()
|
|
{
|
|
if [ $O_CRONFILE = "ON" ]
|
|
then
|
|
Debug "attempting to create resultfiles"
|
|
NEWFILENAME=$RESULTDIR/$HOST.`basename $0`
|
|
if [ ! -d $RESULTDIR ]
|
|
then
|
|
mkdir -p $RESULTDIR || Exit "Error: can't make $RESULTDIR"
|
|
fi
|
|
if [ ! -w $RESULTDIR ] ; then
|
|
Exit "can't touch $NEWFILENAME"
|
|
fi
|
|
Debug "About to touch $NEWFILENAME "
|
|
touch $NEWFILENAME || Exit "Error: can't touch $NEWFILENAME"
|
|
Debug "About to cat $FILENAME >>$NEWFILENAME "
|
|
cat $FILENAME >>$NEWFILENAME || Exit "Error: can't append $FILENAME to $NEWFILENAME"
|
|
TMPFILES="$TMPFILES $FILENAME"
|
|
FILENAME=$NEWFILENAME
|
|
Debug "Writing output to $FILENAME"
|
|
fi
|
|
}
|
|
|
|
################################### eval_opts ##########################
|
|
# global shell function, for NT and cron operation, first a tmpfile
|
|
# needs to be created
|
|
########################################################################
|
|
write_to_tmpfile()
|
|
{
|
|
O_CRONFILE=ON
|
|
Debug "Writing to the TMPFILE"
|
|
O_FILE=ON
|
|
FILENAME=${TMP}/nsstmp.$$ # for now write to the temporary file
|
|
# since we don't know the hostname yet
|
|
# will be inserted to the real file later
|
|
TMPFILES="$TMPFILES nsstmp.$$"
|
|
touch $FILENAME || Exit "Error: can't touch $FILENAME"
|
|
Debug "Writing output to $FILENAME"
|
|
}
|
|
|
|
################################### eval_opts ##########################
|
|
# global shell function, evapuates options and parameters, sets flags
|
|
# variables and defaults
|
|
########################################################################
|
|
eval_opts()
|
|
{
|
|
while [ -n "$1" ]
|
|
do
|
|
case $1 in
|
|
-cron)
|
|
O_CRON=ON
|
|
O_SILENT=ON
|
|
O_DEBUG=ON # FIXME take out!
|
|
O_ALWAYS_YES=ON
|
|
write_to_tmpfile
|
|
|
|
export O_CRON
|
|
;;
|
|
-l)
|
|
O_LOCAL=ON #Now what -
|
|
shift
|
|
MOZROOT=$1
|
|
if [ -z "$MOZROOT" ]
|
|
then
|
|
glob_usage "Error: -l requires a directory to follow, for example $HOME/src/tip1025 "
|
|
fi
|
|
Warning "-l not implemented yet (or only halfway)"
|
|
Debug "testing locally on $MOZROOT"
|
|
;;
|
|
-S*|-s*)
|
|
O_SILENT=ON
|
|
;;
|
|
-Y*|-y)
|
|
O_ALWAYS_YES=ON
|
|
;;
|
|
-d*|-D)
|
|
O_DEBUG=ON
|
|
#set -x
|
|
;;
|
|
-m*|-M*)
|
|
O_MAIL=ON
|
|
shift
|
|
MAILINGLIST=$1
|
|
if [ -z "$MAILINGLIST" ]
|
|
then
|
|
glob_usage "Error: -m requires a mailinglist to follow, for example sonmi,wtc,nelsonb "
|
|
fi
|
|
Debug "Sending result to $MAILINGLIST"
|
|
;;
|
|
-fcron*|-F[Cc][Rr][Oo][Nn]*)
|
|
write_to_tmpfile
|
|
;;
|
|
-f|-F)
|
|
O_FILE=ON
|
|
shift
|
|
FILENAME=$1
|
|
if [ -z "$FILENAME" ]
|
|
then
|
|
glob_usage "Error: -f requires a filename to follow"
|
|
fi
|
|
#rm -f $FILENAME 2>/dev/null
|
|
touch $FILENAME || Exit "Error: can't touch $FILENAME"
|
|
#NOTE we append rather that creating
|
|
Debug "Writing output to $FILENAME"
|
|
;;
|
|
-h|-help|"-?")
|
|
glob_usage
|
|
;;
|
|
-*)
|
|
glob_usage "Error: Can't handle option $1"
|
|
;;
|
|
?*)
|
|
NSSVER=$1
|
|
if [ -z "$NSSVER" ]
|
|
then
|
|
NSSVER="tip"
|
|
Debug "NSS Version: Parameters missing - defaulting to tip!"
|
|
else
|
|
BUILDDATE=$2
|
|
if [ -z "$BUILDDATE" ]
|
|
then
|
|
BUILDDATE=`date +%m%d`
|
|
Debug "Builddate: Parameters missing - defaulting to today!"
|
|
else
|
|
shift
|
|
fi
|
|
fi
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
Debug "Builddate $BUILDDATE NssVersion $NSSVER"
|
|
|
|
if [ -z "$BUILDDATE" ]
|
|
then
|
|
BUILDDATE=`date +%m%d`
|
|
Debug "Builddate: Parameters missing - defaulting to today!"
|
|
fi
|
|
if [ -z "$NSSVER" ]
|
|
then
|
|
NSSVER="tip"
|
|
Debug "NSS Version: Parameters missing - defaulting to tip!"
|
|
fi
|
|
|
|
Debug "Builddate $BUILDDATE NssVersion $NSSVER"
|
|
export BUILDDATE NSSVER
|
|
}
|
|
|
|
######################### win_set_dirs ################################
|
|
# global shell function, interactively finds the directories in case
|
|
# windows can't get to the default
|
|
########################################################################
|
|
win_set_dirs()
|
|
{
|
|
Debug "set Windows Directories..."
|
|
TMP=`echo "$TMP" | sed -e 's/\\\/\//g'`
|
|
Debug "TMP reformated to $TMP"
|
|
if [ "$O_CYGNUS" = ON ]
|
|
then
|
|
D1=/cygdrive/w/nss/nss$NSSVER
|
|
else
|
|
D1=w:/nss/nss$NSSVER
|
|
fi
|
|
if [ ! -w $D1 ]
|
|
then
|
|
Echo "Windows special... can't write in $D1"
|
|
if [ "$O_CYGNUS" = ON ]
|
|
then
|
|
D1=/cygdrive/u/nss/nss$NSSVER
|
|
else
|
|
D1="u:/nss/nss$NSSVER"
|
|
fi
|
|
else
|
|
Debug "D1 set to $D1"
|
|
return
|
|
fi
|
|
|
|
while [ ! -w $D1 ]
|
|
do
|
|
if [ "$O_CRONFILE" = "ON" ]
|
|
then
|
|
Exit "cant write in $D1"
|
|
fi
|
|
Warning "cant write in $D1"
|
|
Echo "input start directory (u:/nss, d:/src/nss, f:/shared/nss) "
|
|
read D
|
|
if [ -n "$D" ]
|
|
then
|
|
D1=$D/nss$NSSVER
|
|
fi
|
|
done
|
|
Debug "D1 set to $D1"
|
|
}
|
|
|
|
########################### set_host ##################################
|
|
# global shell function, sets required variables HOST and DOMSUF, and asks
|
|
# the user if it has been set right
|
|
########################################################################
|
|
set_host()
|
|
{
|
|
set_host_done=0
|
|
|
|
if [ $DS_WAS_SET = FALSE ] #give chance to overwrite, espec. for NT
|
|
then
|
|
Debug "Domainname was not set..."
|
|
DOMSUF=`domainname 2>/dev/null`
|
|
if [ -z "$DOMSUF" ]
|
|
then
|
|
Debug "domainname command did not work ..."
|
|
DOMSUF=`echo $HOST | grep '\.' | sed -e "s/[^\.]*\.//"`
|
|
|
|
if [ -z "$DOMSUF" ]
|
|
then
|
|
Debug "Domainname not part of the hostname"
|
|
DOMSUF=`cat /etc/defaultdomain 2>/dev/null`
|
|
if [ -z "$DOMSUF" ]
|
|
then
|
|
Debug "Domainname needs to be hardcoded to red.iplanet.com"
|
|
DOMSUF="red.iplanet.com"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
case $HOST in
|
|
*\.*)
|
|
Debug "HOSTNAME $HOST contains Dot"
|
|
HOST=`echo $HOST | sed -e "s/\..*//"`
|
|
;;
|
|
esac
|
|
if [ -z "$HOST" ]
|
|
then
|
|
HOST=`uname -n`
|
|
case $HOST in
|
|
*\.*)
|
|
Debug "HOSTNAME $HOST contains Dot"
|
|
HOST=`echo $HOST | sed -e "s/\..*//"`
|
|
;;
|
|
esac
|
|
fi
|
|
if [ $O_DEBUG = "ON" ]
|
|
then
|
|
while [ $set_host_done -eq 0 ]
|
|
do
|
|
Echo
|
|
ask "DOMSUF=$DOMSUF, HOST=$HOST - OK", "y" "n" &&
|
|
set_host_done=1
|
|
if [ $set_host_done -eq 0 ]
|
|
then
|
|
Echo "input DOMSUF: "
|
|
read D
|
|
if [ -n "$D" ]
|
|
then
|
|
DOMSUF=$D
|
|
fi
|
|
Echo "input HOST: "
|
|
read H
|
|
if [ -n "$H" ]
|
|
then
|
|
HOST=$H
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
export HOST DOMSUF
|
|
Debug "HOST: $HOST, DOMSUF: $DOMSUF"
|
|
}
|
|
|
|
#-----------------------------# UTILS #----------------------------------
|
|
|
|
################################### set_objdir #########################
|
|
# global shell function, sets the object directories and DIST
|
|
########################################################################
|
|
set_objdir()
|
|
{
|
|
OBJDIR=`cd ${TESTSCRIPTDIR}/common; gmake objdir_name`
|
|
OS_ARCH=`cd ${TESTSCRIPTDIR}/common; gmake os_arch`
|
|
|
|
#at this point $MASTEBUILD is be either NT or unix
|
|
|
|
LOCALDIST=${D1}/builds/${QAYEAR}${BUILDDATE}.${BUILDNUMBER}/${MASTERBUILD}/mozilla/dist
|
|
LOCALDIST_BIN=${LOCALDIST}/${OBJDIR}/bin
|
|
|
|
DIST=$LOCALDIST
|
|
|
|
#FIXME - test so PATH won't contai it double
|
|
PATH=$TESTSCRIPTDIR:$LOCALDIST_BIN:$BASEPATH
|
|
PATH_CONTAINS_BIN="TRUE"
|
|
export PATH_CONTAINS_BIN
|
|
Debug "Path after set_objdir $PATH"
|
|
|
|
Debug "PATH $PATH"
|
|
|
|
export OBJDIR OS_ARCH LOCALDIST LOCALDIST_BIN DIST PATH
|
|
}
|
|
########################### Ps #########################################
|
|
# global shell function , attempts a platform specific ps
|
|
########################################################################
|
|
Ps()
|
|
{
|
|
#AIX, OSF ps -ef, solaris /usr/5bin/ps -ef, win ps -ef but no user id
|
|
#linux ps -ef, HP
|
|
|
|
if [ $os_name = "SunOS" ]
|
|
then
|
|
/usr/5bin/ps -ef
|
|
else
|
|
ps -ef
|
|
fi
|
|
}
|
|
|
|
########################### kill_by_name ################################
|
|
# global shell function , kills the process whose name is given as
|
|
# parameter
|
|
########################################################################
|
|
kill_by_name()
|
|
{
|
|
for PID in `Ps | grep "$1" | grep -v grep | \
|
|
sed -e "s/^ *//g" -e "s/^[^ ]* //" -e "s/^ *//g" -e "s/ .*//g"`
|
|
do
|
|
if [ $O_WIN = "ON" -a $O_CYGNUS = "ON" ]
|
|
then
|
|
ask "Do you want to kill Process $PID (`Ps | grep $PID | \
|
|
grep -v grep | awk '{ print $1, $2, $6, $7, $8, $9 }' | \
|
|
sed -e "s/[0-9]:[0-6][0-9]//g" | grep $PID `)" \
|
|
"y" "n" && {
|
|
kill $PID
|
|
sleep 1
|
|
kill -9 $PID 2>/dev/null
|
|
}
|
|
else
|
|
ask "Do you want to kill Process $PID (`Ps | grep $PID | \
|
|
grep -v grep | awk '{ print $1, $2, $8, $9, $10, $11 }' | \
|
|
sed -e "s/[0-9]:[0-6][0-9]//g" | grep $PID `)" \
|
|
"y" "n" && {
|
|
kill $PID
|
|
sleep 1
|
|
kill -9 $PID 2>/dev/null
|
|
}
|
|
fi
|
|
done
|
|
}
|
|
|
|
############################### early_exit ###################################
|
|
# global shell function , attempts a little more usefull user notification
|
|
# of a complete failure
|
|
########################################################################
|
|
|
|
early_exit()
|
|
{
|
|
if [ -z "$DOCDIR" ]
|
|
then
|
|
DOCDIR=`dirname $0`/../doc
|
|
fi
|
|
if [ -f $DOCDIR/QAerror.html ]
|
|
then
|
|
Debug "Found QA errorheader"
|
|
rm ${FILENAME}.err 2>/dev/null
|
|
cp $DOCDIR/QAerror.html ${FILENAME}.err
|
|
echo "$1" >>${FILENAME}.err
|
|
echo '</font></b></h1>' >>${FILENAME}.err
|
|
if [ -n "$FILENAME" -a -f "$FILENAME" ]
|
|
then
|
|
cat $FILENAME | sed -e "s/^/<br>/" >>${FILENAME}.err
|
|
fi
|
|
echo '</body></html>' >>${FILENAME}.err
|
|
cat ${FILENAME}.err | rmail $MAILINGLIST
|
|
|
|
rm ${FILENAME}.err 2>/dev/null
|
|
#echo "cat ${FILENAME}.err | rmail $MAILINGLIST "
|
|
fi
|
|
}
|
|
|
|
############################### Exit ###################################
|
|
# global shell function , central exiting point
|
|
# cleanup: temporary files, kill the remaining selfservers if sourcing
|
|
# script sets KILL_SELFSERV
|
|
########################################################################
|
|
Exit()
|
|
{
|
|
Echo $1
|
|
if [ "$O_CRON" = "OFF" ]
|
|
then
|
|
echo $1 >&2
|
|
fi
|
|
if [ -f "${KILLPIDS}" ]
|
|
then
|
|
Debug "Attempting to kill background processes...`cat ${KILLPIDS}`"
|
|
kill `cat "${KILLPIDS}"`
|
|
sleep 1
|
|
kill -9 `cat "${KILLPIDS}"`
|
|
fi
|
|
if [ -n "${TMPFILES}" ]
|
|
then
|
|
Debug "rm -f ${TMPFILES}"
|
|
rm -f $TMPFILES 2>/dev/null
|
|
fi
|
|
O_ALWAYS_YES=ON # set to non-interactive - don't ask anymore questions here
|
|
if [ $KILL_SELFSERV = "ON" ]
|
|
then
|
|
kill_by_name selfserv
|
|
fi
|
|
if [ $O_MAIL = "ON" -a $O_FILE = "ON" ]
|
|
then
|
|
if [ $EARLY_EXIT = TRUE ] #before the report file has been created
|
|
then
|
|
early_exit "$1"
|
|
elif [ -n "$FILENAME" -a -f "$FILENAME" ]
|
|
then
|
|
cat $FILENAME | rmail $MAILINGLIST
|
|
fi
|
|
rm $FILENAME 2>/dev/null
|
|
elif [ $O_MAIL = "ON" -a $EARLY_EXIT = TRUE ]
|
|
then
|
|
early_exit "$1"
|
|
rm $FILENAME 2>/dev/null
|
|
fi
|
|
#chmod a+rw ${RESULTDIR} ${RESULTDIR}/* ${RESULTDIR}/*/* &
|
|
exit
|
|
}
|
|
|
|
trap "rm -f ${TMPFILES} 2>/dev/null; Exit 'killed... cleaning up...'" 2 3 15
|
|
|
|
################################ Wait ##################################
|
|
# global shell function to wait for an event to happen, 1st parameter
|
|
# filename to watch, 2nd parameter 0 - wait for it to disappear, 1 wait
|
|
# for it to be created.
|
|
# uses the variables WAIT_FOR and WAIT_TIMES
|
|
# WAIT_FOR: if waiting for an event sleep n seconds before rechecking
|
|
# recomended value 10 minutes 600
|
|
# WAIT_TIMES: recheck n times before giving up to prevent endless loop
|
|
# recomended 30 - total of 5h
|
|
########################################################################
|
|
|
|
Wait()
|
|
{
|
|
i=0
|
|
Debug "Waiting for $1"
|
|
while [ $i -lt $WAIT_TIMES ]
|
|
do
|
|
i=`expr $i + 1`
|
|
if [ -f "$1" -a $2 -eq 1 ] # if file exists and is supposed to
|
|
then
|
|
return
|
|
fi
|
|
if [ ! -f "$1" -a $2 -eq 0 ] # not exists and not supposed to exist
|
|
then
|
|
return
|
|
fi
|
|
Debug "Waiting for $1, loop #$i, about to sleep $WAIT_FOR seconds zzzz..."
|
|
sleep $WAIT_FOR
|
|
done
|
|
TOTAL=`expr $WAIT_TIMES \* $WAIT_FOR / 60`
|
|
Exit "I HAVE WAITED LONG ENOUGH FOR $1 NOW, I'M GONE! (THAT WAS A TOTAL OF $TOTAL MINUTES) I have better things to do... "
|
|
}
|
|
|
|
################################ WaitForever ##################################
|
|
# global shell function to wait for an event to happen, 1st parameter
|
|
# filename to watch, 2nd parameter 0 - wait for it to disappear, 1 wait
|
|
# for it to be created.
|
|
# because we daon't have any relyable cron on NT...
|
|
########################################################################
|
|
|
|
WaitForever()
|
|
{
|
|
i=0
|
|
Debug "Waiting for $1"
|
|
TOTAL=0
|
|
while [ 1 ]
|
|
do
|
|
i=`expr $i + 1`
|
|
if [ -f "$1" -a $2 -eq 1 ] # if file exists and is supposed to
|
|
then
|
|
return
|
|
fi
|
|
if [ ! -f "$1" -a $2 -eq 0 ] # not exists and not supposed to exist
|
|
then
|
|
return
|
|
fi
|
|
Debug "Waiting for $1, loop #$i, about to sleep $WAIT_FOR seconds Total $TOTAL"
|
|
sleep $WAIT_FOR
|
|
TOTAL=`expr $i \* $WAIT_FOR / 60`
|
|
if [ -n "$MAX_FOREVER" ] # we are cheating. Forever can be very short...
|
|
then
|
|
if [ "$TOTAL" -gt "$MAX_FOREVER" ]
|
|
then
|
|
Exit "I HAVE WAITED LONG ENOUGH FOR $1 NOW, I'M GONE! (THAT WAS A TOTAL OF $TOTAL MINUTES) I have better things to do... "
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
################################### is_running #########################
|
|
# global shell function , implements primitive locking mechanism
|
|
# filename is passed as a parameter, if filename.* exists we assume calling
|
|
# script is running already and exit, otherwise filename.processid is
|
|
# created
|
|
########################################################################
|
|
is_running()
|
|
{
|
|
Debug "Testing if $0 is already running... file ${1} - ${1}.$$"
|
|
if [ -f ${1}.* ]
|
|
then
|
|
Exit "$0 seems to be running already ($1 exists) - Exiting"
|
|
fi
|
|
TMPFILES="$TMPFILES ${1}.$$"
|
|
echo "running $0 on `date` PID $$" >${1}.$$
|
|
Debug "wrote \"running $0 on `date` PID $$\" to ${1}.$$"
|
|
|
|
}
|
|
|
|
#---------------------------# USERCOM #---------------------------------
|
|
############################## Echo #####################################
|
|
# global shell function , depending on the options the output gets written
|
|
# to a file, or is being discarded
|
|
# FIXME \n and \c are mistreates by differnet shells, and linux has /bin/echo
|
|
# instead of /usr/bin/echo
|
|
########################################################################
|
|
Echo ()
|
|
{
|
|
if [ $O_SILENT = OFF ]
|
|
then
|
|
echo "$*"
|
|
#/usr/bin/echo "$*"
|
|
fi
|
|
if [ $O_FILE = ON ]
|
|
then
|
|
echo "$*" >>$FILENAME
|
|
fi
|
|
}
|
|
|
|
################################### ask ################################
|
|
# global shell function, Asks the a question, and gives the returns 0
|
|
# on the 1st choice, 1 on the 2nd choice
|
|
#
|
|
# PARAMETERS:
|
|
# $1 question text
|
|
# $2 1st choice
|
|
# $3 2nd choice
|
|
#
|
|
# MODIFIERS:
|
|
# -y O_ALWAYS_YES will assume a first choice always (not neccessaryly "y")
|
|
#
|
|
# RETURN:
|
|
# 0 - User picked 1st choice
|
|
# 1 - User picked 2nd choice
|
|
#
|
|
# EXAMPLE
|
|
# ask "Would you like to continue" "y" "n" || Exit
|
|
# will produce the string "Would you like to continue (y/n) ?",
|
|
# read input from keyboard (or assume a yes with option -y)
|
|
# - on a yes it will return 0, on a no it will return 1, the
|
|
# shell interprets it as error and the || Exit will be executed
|
|
#
|
|
# NOTE: NEVER use "n" as the second parameter - it will mess up -y
|
|
# don't ask "Continue" "n" "y" || Exit # it will Exit on a "y"
|
|
#
|
|
########################################################################
|
|
Ask()
|
|
{
|
|
ask $*
|
|
}
|
|
|
|
ask()
|
|
{
|
|
if [ $O_ALWAYS_YES = ON ]
|
|
then
|
|
Echo "$1 ($2/$3) ?"
|
|
Echo "YES!"
|
|
return 0
|
|
fi
|
|
A=""
|
|
while [ 1 ]
|
|
do
|
|
|
|
Echo "$1 ($2/$3) ?"
|
|
read A
|
|
if [ -n "$A" ]
|
|
then
|
|
if [ $A = $2 ]
|
|
then
|
|
return 0
|
|
elif [ $A = $3 ]
|
|
then
|
|
return 1
|
|
fi
|
|
fi
|
|
done
|
|
return 0
|
|
}
|
|
|
|
################################### Warning ############################
|
|
# global shell function, Asks the user a "... continue? (y/n)" question,
|
|
# and exits when the user answers with no
|
|
# NOTE -y will answer the warnings always with yes
|
|
########################################################################
|
|
Warning ()
|
|
{
|
|
ask "WARNING: $0: \n $* continue " "y" "n" || Exit
|
|
}
|
|
|
|
################################### Debug ############################
|
|
# global shell function, when option -d Debugging output is written
|
|
########################################################################
|
|
Debug()
|
|
{
|
|
if [ $O_DEBUG = ON ]
|
|
then
|
|
Echo "DEBUG: (`date +%H:%M`) $0: $*"
|
|
fi
|
|
}
|
|
|
|
################################### line ###############################
|
|
# global shell function, supposed to make output more readable...
|
|
########################################################################
|
|
line()
|
|
{
|
|
Echo
|
|
#Echo "======================================================================="
|
|
#Echo
|
|
}
|
|
|
|
################################### opt_usage ##########################
|
|
# global shell function, tells user about available options
|
|
########################################################################
|
|
opt_usage()
|
|
{
|
|
if [ $O_OPTIONS = "ON" ]
|
|
then
|
|
Echo
|
|
line
|
|
Echo
|
|
Echo " -y answer all questions with y - use at your own risk..."
|
|
Echo " -s silent (only usefull with -y)"
|
|
Echo " -h, -? - you guessed right - displays this text"
|
|
Echo " -d debug"
|
|
Echo " -f <filename> - write the (error)output to filename"
|
|
Echo " -fcronfile produces the resultfiles in the same locations"
|
|
Echo " as would have been produced with -cron"
|
|
Echo " -m <mailinglist> - send filename to mailinglist (csl "
|
|
Echo " example sonmi,nelsonb,wtc) only useful with -f"
|
|
Echo " -cron equivalient to -y -s -d -f \$RESULTDIR/\$HOST.nssqa"
|
|
Echo " -l <mozroot> run on a local build"
|
|
fi
|
|
|
|
}
|
|
|
|
################################### glob_usage #########################
|
|
# global shell function, how to use the calling script (parameters, options)
|
|
########################################################################
|
|
glob_usage()
|
|
{
|
|
line
|
|
Echo $1
|
|
Echo
|
|
if [ $O_OPTIONS = "ON" ]
|
|
then
|
|
Echo "usage $0 [options] nssversion builddate"
|
|
else
|
|
Echo "usage $0 nssversion builddate"
|
|
fi
|
|
|
|
Echo " for example: $0 30b 0926"
|
|
Echo " $0 31 1002"
|
|
opt_usage
|
|
Echo
|
|
Exit "$1"
|
|
}
|
|
|
|
tell()
|
|
{
|
|
if [ $O_SILENT = OFF ]
|
|
then
|
|
line
|
|
pwd
|
|
ls -CF
|
|
line
|
|
fi
|
|
if [ $O_FILE = ON ]
|
|
then
|
|
line
|
|
pwd >>$FILENAME
|
|
ls -CF >>$FILENAME
|
|
line
|
|
fi
|
|
}
|
|
|
|
|
|
#set_host()
|
|
#{
|
|
#set_host_done=0
|
|
#HOST=`echo $HOST | sed -e "s/.red.iplanet.com//"`
|
|
#DOMSUF=`cat /etc/defaultdomain 2>/dev/null`
|
|
#if [ -z "$DOMSUF" ]
|
|
#then
|
|
#DOMSUF="red.iplanet.com"
|
|
#fi
|
|
#if [ -z "$HOST" ]
|
|
#then
|
|
#HOST=`uname -n | sed -e "s/.red.iplanet.com//"`
|
|
#fi
|
|
#while [ $set_host_done -eq 0 ]
|
|
#do
|
|
#Echo
|
|
#ask "DOMSUF=$DOMSUF, HOST=$HOST - OK", "y" "n" &&
|
|
#set_host_done=1
|
|
#if [ $set_host_done -eq 0 ]
|
|
#then
|
|
#Echo "input DOMSUF: "
|
|
#read D
|
|
#if [ -n "$D" ]
|
|
#then
|
|
#DOMSUF=$D
|
|
#fi
|
|
#Echo "input HOST: "
|
|
#read H
|
|
#if [ -n "$H" ]
|
|
#then
|
|
#HOST=$H
|
|
#fi
|
|
#fi
|
|
#done
|
|
#export HOST DOMSUF
|
|
#Debug "HOST: $HOST, DOMSUF: $DOMSUF"
|
|
#}
|
|
|
|
if [ $O_INIT = "ON" ]
|
|
then
|
|
glob_init $*
|
|
fi
|
|
EARLY_EXIT=FALSE
|