From 01c165cd1b2ac601d5ae73d3cb5e82ccdd94ac94 Mon Sep 17 00:00:00 2001 From: Le Chi Thu Date: Tue, 3 Apr 2012 01:23:00 +0200 Subject: Initial commit --- ltp_framework/IDcheck.sh | 189 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100755 ltp_framework/IDcheck.sh (limited to 'ltp_framework/IDcheck.sh') 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 -- cgit v1.2.3