#!/bin/sh
# PCP QA Test No. 1438
# exercise __pmAcc*() methods
#
# non-valgrind variant, see qa/1439 for the valgrind variant
#
# Copyright (c) 2023 Ken McDonell.  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
elif _prefer_valgrind
then
    [ $PCPQA_VALGRIND = both ] || \
	_notrun "valgrind variant qa/1439 will be run"
fi

root_group_is_wheel=false
case $PCP_PLATFORM
in
    darwin|freebsd|netbsd|openbsd)
	root_group_is_wheel=true
	;;
esac

uids="root bin daemon pcp"
for name in $uids
do
    grep "^$name:" /etc/passwd >/dev/null || _notrun "no user $name in passwd file"
done

for name in $uids
do
    [ "$name" = root ] && $root_group_is_wheel && name=wheel
    grep "^$name:" /etc/group >/dev/null || _notrun "no group $name in group file"
done

_cleanup()
{
    cd $here
    $sudo rm -rf $tmp $tmp.*
}

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

echo "root_group_is_wheel=$root_group_is_wheel" >>$seq.full

_filter()
{
    tee -a $seq.full \
    | sed -f $tmp.sed
}

# real QA test starts here

if $root_group_is_wheel
then
    gids="`echo $uids | sed -e 's/root/wheel/'`"
else
    gids="$uids"
fi

echo "=== users ===" | tee -a $seq.full
for name in $uids
do
    $PCP_AWK_PROG </etc/passwd >>$tmp.sed -F ':' '
$1 == "'$name'" { printf "s/  *%d %s/ %7s %s/\n",$3,$1,toupper($1),$1 }
'
done
for name in $gids
do
    $PCP_AWK_PROG </etc/group >>$tmp.sed -F ':' '
$1 == "'$name'" {
	    printf "/ %s /s/ [^ ]*,%d(%s)/ %s(%s)/\n",toupper($1),$3,$1,toupper($1),$1
	    printf "/ %s /s/ %d(%s)/ %s(%s)/\n",toupper($1),$3,$1,toupper($1),$1
	}'
done
$root_group_is_wheel && echo 's/[0-9][0-9]*(wheel)/ROOT(root)/' >>$tmp.sed
# some of our target users may be in other groups, esp user "root",
# and some of the target users may be in some of the other target
# groups, so cull the extra ones
#
echo 's/,[0-9][0-9]*([^)]*)//g' >>$tmp.sed
echo 's/,[A-Z][A-Z]*([^)]*)//g' >>$tmp.sed
cat $tmp.sed >>$seq.full
if $do_valgrind
then
    _run_valgrind src/usergroup -u $uids
else
    src/usergroup -u $uids 2>&1
fi \
| sed -e "s@$tmp@TMP@g" \
| _filter

echo "=== groups ===" | tee -a $seq.full
rm -f $tmp.sed
for name in $gids
do
    $PCP_AWK_PROG </etc/group >>$tmp.sed -F ':' '
$1 == "'$name'" { printf "s/  *%d %s/ %7s %s/\n",$3,$1,toupper($1),$1 }
'
done
for name in $uids
do
    $PCP_AWK_PROG </etc/passwd >>$tmp.sed -F ':' '
$1 == "'$name'" {
	    printf "/ %s /s/ [^ ]*,%d(%s)/ %s(%s)/\n",toupper($1),$3,$1,toupper($1),$1
	    printf "/ %s /s/ %d(%s)/ %s(%s)/\n",toupper($1),$3,$1,toupper($1),$1
	}'
done
$root_group_is_wheel && echo 's/ WHEEL wheel /  ROOT root  /' >>$tmp.sed
$root_group_is_wheel && echo 's/[0-9][0-9]*(root)/ROOT(root)/' >>$tmp.sed
# some of our target groups may be have other users, esp user "root",
# and some of the target users may be in some of the other target
# groups, so cull the extra ones
#
echo 's/,[0-9][0-9]*([^)]*)//g' >>$tmp.sed
echo 's/,[A-Z][A-Z]*([^)]*)//g' >>$tmp.sed
cat $tmp.sed >>$seq.full
if $do_valgrind
then
    _run_valgrind src/usergroup -g $gids
else
    src/usergroup -g $gids 2>&1
fi \
| sed -e "s@$tmp@TMP@g" \
| _filter

# success, all done
exit
