summaryrefslogtreecommitdiff
path: root/ltp_framework/IDcheck.sh
diff options
context:
space:
mode:
Diffstat (limited to 'ltp_framework/IDcheck.sh')
-rwxr-xr-xltp_framework/IDcheck.sh189
1 files changed, 189 insertions, 0 deletions
diff --git a/ltp_framework/IDcheck.sh b/ltp_framework/IDcheck.sh
new file mode 100755
index 0000000..d453c91
--- /dev/null
+++ b/ltp_framework/IDcheck.sh
@@ -0,0 +1,189 @@
+#!/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
+ FILE=$2
+ [ -e "$FILE" ] || return $?
+ grep -q "^$ID:" "$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
+ [Yy]*) 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" || fe nogroup "$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[/nogroup] 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 65534 $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 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
+
+# nobody is a standard group on all distros, apart from debian based ones;
+# let's account for the fact that they use the nogroup group instead.
+if ! fe "nobody" "$passwd" || ! (fe "nogroup" "$group" || fe "nobody" "$group")
+then
+ MISSING_ENTRY=1
+fi
+
+# For entries that only exist in $group.
+for i in users sys; do
+ if ! fe "$i" "$group" ; 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