#!/bin/sh
#
#    Copyright (c) International Business Machines  Corp., 2001
#
#    This program is free software;  you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY;  without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
#    the GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program;  if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
#   FILE        : IDcheck.sh
#   DESCRIPTION : checks for req'd users/groups and will create them if requested.
#   HISTORY     : see the cvs log
#

# Prompt user if ids/groups should be created
echo "Checking for required user/group ids"
echo ""

# Check ids and create if needed.
NO_NOBODY_ID=1
NO_BIN_ID=1
NO_DAEMON_ID=1
NO_NOBODY_GRP=1
NO_BIN_GRP=1
NO_DAEMON_GRP=1
NO_USERS_GRP=1
NO_SYS_GRP=1

group="$DESTDIR/etc/group"
passwd="$DESTDIR/etc/passwd"

# find entry.
fe() {
    ID=$1; shift
    FILE=$1; shift
    [ -e "$FILE" ] || return $?
    awk "/^$ID:/ { FOUND=1 } END { if (\$FOUND == 1) { exit 1; } exit 0; }" \
    "$FILE"
}

prompt_for_create() {
	if [ -z "$CREATE_ENTRIES" ] ; then

		if [ $NO_NOBODY_ID -ne 0 -o $NO_BIN_ID -ne 0 -o $NO_DAEMON_ID -ne 0 -o $NO_NOBODY_GRP -ne 0 -o $NO_BIN_GRP -ne 0 -o $NO_DAEMON_GRP -ne 0 -o $NO_USERS_GRP -ne 0 -o $NO_SYS_GRP -ne 0 ] ; then
			echo -n "If any required user ids and/or groups are missing, would you like these created? [y/N]"
			read ans
			case "$ans" in
				Y*|y*) CREATE_ENTRIES=1 ;;
				*)     CREATE_ENTRIES=0 ;;
			esac
		else
			CREATE_ENTRIES=0
		fi

	fi
}

if [ -z ${EUID} ] ; then
	EUID=$(id -u)
fi

for i in "$passwd" "$group"; do
    if [ -e "$i" -a ! -r "$i" ] ; then
	echo "$i not readable by uid $EUID"
	exit 1
    fi
done

fe bin "$passwd"; NO_BIN_ID=$?
fe daemon "$passwd"; NO_DAEMON_ID=$?
fe nobody "$passwd"; NO_NOBODY_ID=$?

fe bin "$group"; NO_BIN_GRP=$?
fe daemon "$group"; NO_DAEMON_GRP=$?
fe nobody "$group"; NO_NOBODY_GRP=$?
fe sys "$group"; NO_SYS_GRP=$?
fe users "$group"; NO_USERS_GRP=$?

prompt_for_create

debug_vals() {

echo "Missing the following group / user entries:"
echo "Group file:    $group"
echo "Password file: $passwd"
echo "nobody:        $NO_NOBODY_ID"
echo "bin:           $NO_BIN_ID"
echo "daemon:        $NO_DAEMON_ID"
echo "nobody grp:    $NO_NOBODY_GRP"
echo "bin grp:       $NO_BIN_GRP"
echo "daemon grp:    $NO_DAEMON_GRP"
echo "sys grp:       $NO_SYS_GRP"
echo "users grp:     $NO_USERS_GRP"
echo ""

}

#debug_vals

if [ $CREATE_ENTRIES -ne 0 ] ; then
    if ! touch "$group" "$passwd" 2>/dev/null; then
        echo "Failed to touch $group or $passwd"
        exit 1
    fi
fi

make_user_group() {
	local name=$1 id=$2 no_id=$3 no_grp=$4

	if [ $no_id -eq 0 -a $no_grp -eq 0 ] ; then
		echo "'$name' user id and group found."
	elif [ $CREATE_ENTRIES -ne 0 ] ; then
		echo "Creating entries for $name"

		# Avoid chicken and egg issue with id(1) call
		# made above and below.
		if ! fe "$name" "$passwd" && [ $no_id -ne 0 ] ; then
			echo "${name}:x:${id}:${id}:${name}::" >> "$passwd"
		fi
		if [ $no_grp -ne 0 ] ; then
			echo "${name}:x:$(id -u ${name}):" >> "$group"
		fi
	fi
}
make_user_group nobody 99 $NO_NOBODY_ID $NO_NOBODY_GRP
make_user_group bin 1 $NO_BIN_ID $NO_BIN_GRP
make_user_group daemon 2 $NO_DAEMON_ID $NO_DAEMON_GRP

if [ $NO_USERS_GRP -eq 0 ] ; then
	echo "Users group found."
elif [ $CREATE_ENTRIES -ne 0 ] ; then
	echo 'users:x:100:' >> "$group"
fi

if [ $NO_SYS_GRP -eq 0 ] ; then
	echo "Sys group found."
elif [ $CREATE_ENTRIES -ne 0 ] ; then
	echo 'sys:x:3:' >> "$group"
fi

MISSING_ENTRY=0

# For entries that exist in both $group and $passwd.
for i in nobody bin daemon; do
    for file in "$group" "$passwd"; do
        if ! fe "$i" "$file"; then
            MISSING_ENTRY=1
            break
        fi
    done
    if [ $MISSING_ENTRY -ne 0 ]; then
        break
    fi
done

# For entries that only exist in $group.
for i in users sys; do
    if ! fe "$i" "$file"; then
        MISSING_ENTRY=1
    fi
done

if [ $MISSING_ENTRY -eq 0 ] ; then
    echo "Required users/groups exist."
    exit 0
fi

echo ""
echo "*****************************************"
echo "* Required users/groups do NOT exist!!! *"
echo "*                                       *"
echo "* Some kernel/syscall tests will FAIL!  *"
echo "*****************************************"
exit 1
