#!/bin/sh
# PCP QA Test No. 1620
# Exercise pmlogger response with a pmproxy SIGHUP.
#
# Copyright (c) 2025 Red Hat.  All Rights Reserved.
#

if [ $# -eq 0 ]
then
    seq=`basename $0`
    echo "QA output created by $seq"
else
    # use $seq from caller, unless not set
    [ -n "$seq" ] || seq=`basename $0`
    echo "QA output created by `basename $0` $*"
fi

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

do_valgrind=false
if [ "$1" = "--valgrind" ]
then
    _check_valgrind
    do_valgrind=true
fi

_cleanup()
{
    cd $here
    _restore_config $PCP_SYSCONF_DIR/pmproxy/pmproxy.conf

    [ -d $archive_path ] && $sudo rm -fr $archive_path
    if $pmproxy_was_running
    then
        echo "Restart pmproxy ..." >>$seq_full
        _service pmproxy restart >>$seq_full 2>&1
        _wait_for_pmproxy
    else
        echo "Stopping pmproxy ..." >>$seq_full
        _service pmproxy stop >>$seq_full 2>&1
    fi
    _restore_auto_restart pmproxy

    $sudo rm -rf $tmp $tmp.*
}

status=0	# success is the default!
signal=$PCP_BINADM_DIR/pmsignal
trap "_cleanup; exit \$status" 0 1 2 3 15

_filter()
{
    sed \
	-e "s@$tmp@TMP@g" \
	-e "s@$archive_path@ARCHIVE_PATH@g" \
	-e "s/TMP\.data\./LOCAL_ARCHIVE./g" \
	-e "s/2[0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]\./REMOTE_ARCHIVE./g" \
	-e "s/2[0-9][0-9]*\.[0-9][0-9]\.[0-9][0-9]-[0-9][0-9]\./REMOTE_ARCHIVE./g" \
    # end
}

_filter_metrics()
{
    sed \
	-e "/^pmcd\.*/d" \
	-e "/^event\.*/d" \
    | LC_COLLATE=POSIX sort
}

_save_logs()
{
    echo === pmlogger log >> $seq_full
    cat pmlogger.log >> $seq_full
    echo === pmproxy log >> $seq_full
    cat $PCP_LOG_DIR/pmproxy/pmproxy.log >> $seq_full
}

# real QA test starts here
archive_host=`hostname`
archive_path=$PCP_REMOTE_ARCHIVE_DIR/$archive_host
archive_botch=$PCP_LOG_DIR/pmproxy/pmproxy

pmproxy_was_running=false
[ -f $PCP_RUN_DIR/pmproxy.pid ] && pmproxy_was_running=true
echo "pmproxy_was_running=$pmproxy_was_running" >>$seq_full

_save_config $PCP_SYSCONF_DIR/pmproxy/pmproxy.conf

_stop_auto_restart pmproxy
if ! _service pmproxy stop >>$seq_full 2>&1; then _exit 1; fi

$sudo rm -fr $archive_path $archive_botch

# pmproxy config
cat >$tmp.conf << End-Of-File
# Installed by PCP QA test $seq on `date`
[pmproxy]
pcp.enabled = false
http.enabled = true
[pmlogger]
enabled = true
[discover]
enabled = false
[pmseries]
enabled = false
End-Of-File
$sudo cp $tmp.conf $PCP_SYSCONF_DIR/pmproxy/pmproxy.conf

if ! _service pmproxy start 2>&1; then _exit 1; fi | _filter_pmproxy_start
_wait_for_pmproxy || _exit 1
pmproxy_pid=`cat $PCP_RUN_DIR/pmproxy.pid`

export PCP_DERIVED_CONFIG=""

# pmlogger config
cat >$tmp.conf << End-Of-File
log mandatory on once {
    hinv.ncpu
    hinv.ndisk
}
log mandatory on every 1 second {
    disk.all.read
    disk.all.write
    kernel.all.load
    kernel.all.pswitch
}
End-Of-File

echo "=== Running pmlogger in remote recording mode"
remote_mode="-c $tmp.conf -T 15sec http://localhost:44322"
((sleep 10; $sudo $signal -s HUP $pmproxy_pid)&) >/dev/null 2>&1
if $do_valgrind
then
    _run_valgrind pmlogger $remote_mode
else
    pmlogger $remote_mode
fi \
| _filter
# pmlogger has been running for 15sec, plenty long enough
# for sleep 10; send signal; pmproxy to catch signal

echo "## checking for pmproxy SIGHUP"
grep SIGHUP $PCP_REMOTE_ARCHIVE_DIR/pmproxy.log | _filter_pmproxy_log
_save_logs

if [ -d $archive_path ]
then
    echo "## found remote archive files"
    ls -1 $archive_path | tee -a $seq_full | _filter | LC_COLLATE=POSIX sort
    echo "## with the following metrics"
    pminfo -a $archive_path | _filter_metrics
else
    echo "Archive push failed: $archive_path directory not created"
    status=1
    exit
fi
if [ -d $archive_botch ]
then
    echo "Bad archive path $archive_botch found but should not be"
    status=1
    exit
fi

# success, all done
exit
