#! /bin/sh
# PCP QA Test No. 338
# pmlogger_daily ... do you work at all?
#
# NEW VERSION for YYYYDDMM style naming convention (see also 530)
#
# Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check

# This test is not stable in the vicinity of a timezone change, e.g.
# daylight saving or summer time transitions.
# Don't run if this happened in the last 2 days.
#
now_hr=`pmdate '%H'`
now_min=`pmdate '%M'`
now_hr_2=`pmdate -2d '%H'`
[ $now_hr != $now_hr_2 ] && \
_notrun "timezone change? now = ${now_hr}H:??M, 2 days ago = ${now_hr_2}H:??M"

# This test is also unstable when run close to the new day boundary.
# Don't run if within 10 minutes of midnight.
#
[ "$now_hr" = "00" -a $now_min -lt 10 ] && \
_notrun "current time - $now_hr:$now_min - is too close to midnight"

_filter()
{
    if fmt --help 2>&1 | grep '.-w, ' >/dev/null
    then
	# GNU-style fmt(1)
	# -w, --width=WIDTH         maximum line width (default of 75 columns)
	cmd="fmt -w 76"
    elif fmt --help 2>&1 | grep '.-w .* width' >/dev/null
    then
	# FreeBSD-style fmt
        # -w <n> set maximum width to <n>
	cmd="fmt -w 76"
    elif fmt --help 2>&1 | grep '.-w width' >/dev/null
    then
	# OpenBSD-style fmt
        # -w width
	cmd="fmt -w 76"
    elif fmt --help 2>&1 | grep '.-[mg] ' >/dev/null
    then
	# NetBSD's version of fmt is different (may apply to other variants) ...
	cmd="fmt -g 76 -m 77"
    else
	echo "Warning: no clue how to set max line length for fmt(1)"
	cmd="fmt"
    fi
    tee -a $seq.full \
    | $PCP_AWK_PROG '
BEGIN				{ cmd = "'"`echo $cmd`"'" }
/^Archive files older than/	{ eatlines=1; longone="   "; print; next }
eatlines			{ if ( match ($0, "^    ") ) {
				    for ( i=1; i <=NF; i++ ) {
					longone = sprintf ("%s %s",longone,$i)
				    }
				  } else {
				    print longone | cmd
				    close (cmd)
				    longone = ""; eatlines = 0 
				    print  
				  }
				  next
				}
END				{ if ( eatlines ) {
				    print longone | cmd
				    close (cmd)
				  }
				}
				{ print }' \
    | sed -f $tmp/sed \
    | sed \
	-e "s;$tmp;TMP;g" \
	-e "s/`hostname`/HOST/g" \
	-e "s/localhost/HOST/g" \
	-e "s/local:/HOST/g" \
	-e "s/`hostname | sed -e 's/\..*//'`/HOST/g" \
	-e '/\/var\/adm\/pcplog\/NOTICES/d' \
	-e 's/-rw-r--r--\./-rw-r--r--/' \
    | $PCP_AWK_PROG '
/-rw-r--r--/	{ print $1,"...",$5,"...",$9; next }
		{ print }' \
    | _filter_cron_scripts
}

_cleanup()
{
    cd $here
    $sudo rm -f $tmp.*
    $sudo rm -rf $tmp
    $sudo mv $PCP_LOG_DIR/NOTICES.$$ $PCP_LOG_DIR/NOTICES
}

status=1	# failure is the default!
trap "_cleanup; exit \$status" 0 1 2 3 15
$sudo rm -rf $tmp $tmp.*

# take explicit control of the umask
umask 022

$sudo mv $PCP_LOG_DIR/NOTICES $PCP_LOG_DIR/NOTICES.$$
rm -f $seq.full
mkdir $tmp

# real QA test starts here
unset verbose
verbose_text=''
for loop in 1 2
do
    echo >$tmp/sed
    for day in 0 1 2 3 4 5
    do
	fmt=%Y%m%d
	# aiming for the time to be 00:02 and 00:04 on each day,
	# even if that is ahead of NOW for today
	#
	now_hr=`pmdate %H`
	hour=-$now_hr
	now_min=`pmdate %M`
	min2=`expr 2 - $now_min`
	[ "$min2" -ge 0 ] && min2="+$min2"
	min4=`expr 4 - $now_min`
	[ "$min4" -ge 0 ] && min4="+$min4"
	namea=`pmdate -${day}d ${hour}H ${min2}M $fmt.%H.%M`
	nameb=`pmdate -${day}d ${hour}H ${min4}M $fmt.%H.%M`
	yesterday=`pmdate -1d ${hour}H ${min2}M $fmt`
	stampa=`echo $namea | sed -e 's/\.//g'`
	stampb=`echo $nameb | sed -e 's/\.//g'`
	echo "s/$namea/NOW-$day.00.02/g" >>$tmp/sed
	echo "s/$nameb/NOW-$day.00.04/g" >>$tmp/sed

	for ext in 0 index meta
	do
	    cp archives/arch_a.$ext $tmp/$namea.$ext
	    touch -t $stampa $tmp/$namea.$ext
	    cp archives/arch_b.$ext $tmp/$nameb.$ext
	    touch -t $stampb $tmp/$nameb.$ext
	done
    done
    echo "s/NOW-0/TODAY/g" >>$tmp/sed
    echo "s/NOW-1/YESTERDAY/g" >>$tmp/sed
    echo "s/`pmdate %Y%m%d`/TODAY/g" >>$tmp/sed
    echo "s/$yesterday/YESTERDAY/g" >>$tmp/sed

    echo >$tmp/control '$version=1.1
LOCALHOSTNAME	n   n	'"$tmp"'	./config'

    cat $tmp/sed >>$seq.full
    echo >>$seq.full

    echo
    echo "=== [$verbose_text] regular show ==="
    echo "=== [$verbose_text] regular show ===" >>$seq.full
    $sudo $PCP_BINADM_DIR/pmlogger_daily -o -x forever -c $tmp/control -k 3 $verbose -l $tmp.log

    $sudo cat $tmp.log | _filter
    ls -lt $tmp >>$seq.full
    ls $tmp | sed -f $tmp/sed | tee -a $seq.full | LC_COLLATE=POSIX sort

    echo
    echo "=== [$verbose_text] nothing to do but cull some more ==="
    echo "=== [$verbose_text] nothing to do but cull some more ===" >>$seq.full
    for ext in 0 index meta
    do
	mv $tmp/$yesterday.$ext $tmp/save.$ext
    done
    $sudo $PCP_BINADM_DIR/pmlogger_daily -o -x forever -c $tmp/control -k 2 $verbose -l $tmp.log
    $sudo cat $tmp.log | _filter
    ls -lt $tmp >>$seq.full
    ls $tmp | sed -f $tmp/sed | tee -a $seq.full | LC_COLLATE=POSIX sort

    echo
    echo "=== [$verbose_text] error, output already exists ==="
    echo "=== [$verbose_text] error, output already exists ===" >>$seq.full
    for ext in 0 index meta
    do
	cp archives/arch_a.$ext $tmp/$yesterday.17.18.$ext
	mv $tmp/save.$ext $tmp/$yesterday.$ext
    done
    $sudo $PCP_BINADM_DIR/pmlogger_daily -o -x forever -c $tmp/control -k 2 $verbose -l $tmp.log
    $sudo cat $tmp.log | _filter
    ls -lt $tmp >>$seq.full
    ls $tmp | sed -f $tmp/sed | tee -a $seq.full | LC_COLLATE=POSIX sort

    verbose=-V
    verbose_text='verbose'
    rm -f $tmp/*
done

# all done
status=0
exit
