#!/bin/sh
# PCP QA Test No. 1473
# pmlogger_daily ... do you work at all?
#
# this is a variant of test 338 (single dir for archives)
# that uses $(date ...) to place the archives in multiple
# directories, and does not use -o
#
# Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
# Copyright (c) 2023 Ken McDonell.  All Rights Reserved.
#
# check-group-include: pmlogrewrite pmlogextract
#

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 4 days.
#
now_hr=`pmdate '%H'`
now_min=`pmdate '%M'`
now_hr_4=`pmdate -4d '%H'`
[ $now_hr != $now_hr_4 ] && \
_notrun "timezone change? now = ${now_hr}H:??M, 4 days ago = ${now_hr_4}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 74 -m 75"
    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 '/^Roll .*\/NOTICES/d' \
	-e '/^Start .*\/NOTICES/d' \
	-e '/^Add merge callback for: pmlogger_daily_report/d' \
	-e '/^Merge callbacks .../d' \
	-e '/^callback: .*pmlogger_daily_report/d' \
	-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
}

_fixperms()
{
    # pmlogger_daily runs as the user "pcp" ... fix ownership
    #
    $sudo touch $tmp.log
    find $tmp.log $tmp/* -type f | xargs $sudo chown $PCP_USER:$PCP_GROUP
    find $tmp/* -type d | xargs -r $sudo chown $PCP_USER:$PCP_GROUP
    $sudo chown $PCP_USER:$PCP_GROUP $tmp
}

NEEDREWRITE=$PCP_LOG_DIR/pmlogger/.NeedRewrite

_cleanup()
{
    cd $here
    $sudo rm -f $tmp.*
    $sudo rm -rf $tmp
    [ -f $PCP_LOG_DIR/NOTICES.$$ ] \
	&& $sudo mv $PCP_LOG_DIR/NOTICES.$$ $PCP_LOG_DIR/NOTICES
    [ -f $NEEDREWRITE.$seq ] && $sudo mv $NEEDREWRITE.$seq $NEEDREWRITE
}

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

[ -f $NEEDREWRITE ] && $sudo mv $NEEDREWRITE $NEEDREWRITE.$seq

# take explicit control of the umask
umask 022

[ -f $PCP_LOG_DIR/NOTICES ] \
    && $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 "s;$tmp;TMP;g" >$tmp.sed
    for day in 0 1 2 3 4 5
    do
	dir=`pmdate -${day}d %Y-%m-%d`
	mkdir $tmp/$dir
	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`
	yesterday_dir=`pmdate -1d ${hour}H ${min2}M %Y-%m-%d`
	stampa=`echo $namea | sed -e 's/\.//g'`
	stampb=`echo $nameb | sed -e 's/\.//g'`
	echo "s/$dir/TODAY-$day/g" >>$tmp.sed
	echo "s/$namea/TODAY-$day.00.02/g" >>$tmp.sed
	echo "s/$nameb/TODAY-$day.00.04/g" >>$tmp.sed
	echo "s/`pmdate -${day}d $fmt`/TODAY-$day/g" >>$tmp.sed

	for ext in 0 index meta
	do
	    $sudo cp archives/arch_a.$ext $tmp/$dir/$namea.$ext
	    $sudo touch -t $stampa $tmp/$dir/$namea.$ext
	    $sudo cp archives/arch_b.$ext $tmp/$dir/$nameb.$ext
	    $sudo touch -t $stampb $tmp/$dir/$nameb.$ext
	done
    done
    echo "s/TODAY-0/TODAY/g" >>$tmp.sed
    echo "s/TODAY-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"'/$(date +%Y-%m-%d)"	-c ./config'

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

    echo
    echo "=== [$verbose_text] regular old -o show ==="
    echo "=== [$verbose_text] regular old -o show ===" >>$seq.full
    _fixperms
    $sudo -u $PCP_USER -g $PCP_GROUP sh -c "umask 022; $PCP_BINADM_DIR/pmlogger_daily -o -D -x forever -c $tmp.control -k 4 $verbose -l $tmp.log"

    $sudo cat $tmp.log | _filter
    echo "--- remaining archives ---"
    ls -ltR $tmp >>$seq.full
    find $tmp -type f | tee -a $seq.full | sed -f $tmp.sed | LC_COLLATE=POSIX sort

    echo
    echo "=== [$verbose_text] no -o merge archives from before yesterday + rewrite all ==="
    echo "=== [$verbose_text] no -o merge archives from before yesterday + rewrite all ===" >>$seq.full
    $sudo -u $PCP_USER -g $PCP_GROUP sh -c "umask 022; $PCP_BINADM_DIR/pmlogger_daily -R -D -x forever -c $tmp.control -k 3 $verbose -l $tmp.log"
    $sudo cat $tmp.log | _filter
    echo "--- remaining archives ---"
    ls -ltR $tmp >>$seq.full
    find $tmp -type f | tee -a $seq.full | sed -f $tmp.sed | 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
	$sudo cp archives/arch_a.$ext $tmp/$yesterday_dir/$yesterday.17.18.$ext
	$sudo cp archives/arch_b.$ext $tmp/$yesterday_dir/$yesterday.19.20.$ext
    done
    _fixperms
    $sudo -u $PCP_USER -g $PCP_GROUP sh -c "umask 022; $PCP_BINADM_DIR/pmlogger_daily -D -x forever -c $tmp.control -k 3 $verbose -l $tmp.log"
    $sudo cat $tmp.log | _filter
    echo "--- remaining archives ---"
    ls -ltR $tmp >>$seq.full
    find $tmp -type f | tee -a $seq.full | sed -f $tmp.sed | LC_COLLATE=POSIX sort

    verbose=-V
    verbose_text='verbose'
    $sudo rm -rf $tmp/*
    # reset permissions for $tmp
    $sudo chown `id -u -n`:`id -g -n` $tmp 
done

# all done
status=0
exit
