Home | History | Annotate | Download | only in ltp
      1 #!/bin/sh
      2 #
      3 #    Copyright (c) International Business Machines  Corp., 2001
      4 #
      5 #    This program is free software;  you can redistribute it and/or modify
      6 #    it under the terms of the GNU General Public License as published by
      7 #    the Free Software Foundation; either version 2 of the License, or
      8 #    (at your option) any later version.
      9 #
     10 #    This program is distributed in the hope that it will be useful,
     11 #    but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13 #    the GNU General Public License for more details.
     14 #
     15 #    You should have received a copy of the GNU General Public License
     16 #    along with this program;  if not, write to the Free Software
     17 #    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18 #
     19 #   FILE        : IDcheck.sh
     20 #   DESCRIPTION : checks for req'd users/groups and will create them if requested.
     21 #   HISTORY     : see the cvs log
     22 #
     23 
     24 # Prompt user if ids/groups should be created
     25 echo "Checking for required user/group ids"
     26 echo ""
     27 
     28 # Check ids and create if needed.
     29 NO_NOBODY_ID=1
     30 NO_BIN_ID=1
     31 NO_DAEMON_ID=1
     32 NO_NOBODY_GRP=1
     33 NO_BIN_GRP=1
     34 NO_DAEMON_GRP=1
     35 NO_USERS_GRP=1
     36 NO_SYS_GRP=1
     37 
     38 group="$DESTDIR/etc/group"
     39 passwd="$DESTDIR/etc/passwd"
     40 
     41 # find entry.
     42 fe() {
     43     ID=$1
     44     FILE=$2
     45     [ -e "$FILE" ] || return $?
     46     grep -q "^$ID:" "$FILE"
     47 }
     48 
     49 prompt_for_create() {
     50 	if [ -z "$CREATE_ENTRIES" ] ; then
     51 
     52 		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
     53 			echo -n "If any required user ids and/or groups are missing, would you like these created? [y/N]"
     54 			read ans
     55 			case "$ans" in
     56 			[Yy]*) CREATE_ENTRIES=1 ;;
     57 			*)     CREATE_ENTRIES=0 ;;
     58 			esac
     59 		else
     60 			CREATE_ENTRIES=0
     61 		fi
     62 
     63 	fi
     64 }
     65 
     66 if [ -z ${EUID} ] ; then
     67 	EUID=$(id -u)
     68 fi
     69 
     70 for i in "$passwd" "$group"; do
     71     if [ -e "$i" -a ! -r "$i" ] ; then
     72 	echo "$i not readable by uid $EUID"
     73 	exit 1
     74     fi
     75 done
     76 
     77 fe bin "$passwd"; NO_BIN_ID=$?
     78 fe daemon "$passwd"; NO_DAEMON_ID=$?
     79 fe nobody "$passwd"; NO_NOBODY_ID=$?
     80 
     81 fe bin "$group"; NO_BIN_GRP=$?
     82 fe daemon "$group"; NO_DAEMON_GRP=$?
     83 fe nobody "$group" || fe nogroup "$group"; NO_NOBODY_GRP=$?
     84 fe sys "$group"; NO_SYS_GRP=$?
     85 fe users "$group"; NO_USERS_GRP=$?
     86 
     87 prompt_for_create
     88 
     89 debug_vals() {
     90 
     91 echo "Missing the following group / user entries:"
     92 echo "Group file:		$group"
     93 echo "Password file:		$passwd"
     94 echo "nobody:			$NO_NOBODY_ID"
     95 echo "bin:			$NO_BIN_ID"
     96 echo "daemon:			$NO_DAEMON_ID"
     97 echo "nobody[/nogroup] grp:	$NO_NOBODY_GRP"
     98 echo "bin grp:			$NO_BIN_GRP"
     99 echo "daemon grp:		$NO_DAEMON_GRP"
    100 echo "sys grp:			$NO_SYS_GRP"
    101 echo "users grp:		$NO_USERS_GRP"
    102 echo ""
    103 
    104 }
    105 
    106 #debug_vals
    107 
    108 if [ $CREATE_ENTRIES -ne 0 ] ; then
    109     if ! touch "$group" "$passwd" 2>/dev/null; then
    110         echo "Failed to touch $group or $passwd"
    111         exit 1
    112     fi
    113 fi
    114 
    115 make_user_group() {
    116 	local name=$1 id=$2 no_id=$3 no_grp=$4
    117 
    118 	if [ $no_id -eq 0 -a $no_grp -eq 0 ] ; then
    119 		echo "'$name' user id and group found."
    120 	elif [ $CREATE_ENTRIES -ne 0 ] ; then
    121 		echo "Creating entries for $name"
    122 
    123 		# Avoid chicken and egg issue with id(1) call
    124 		# made above and below.
    125 		if ! fe "$name" "$passwd" && [ $no_id -ne 0 ] ; then
    126 			echo "${name}:x:${id}:${id}:${name}::" >> "$passwd"
    127 		fi
    128 		if [ $no_grp -ne 0 ] ; then
    129 			echo "${name}:x:$(id -u ${name}):" >> "$group"
    130 		fi
    131 	fi
    132 }
    133 make_user_group nobody 65534 $NO_NOBODY_ID $NO_NOBODY_GRP
    134 make_user_group bin 1 $NO_BIN_ID $NO_BIN_GRP
    135 make_user_group daemon 2 $NO_DAEMON_ID $NO_DAEMON_GRP
    136 
    137 if [ $NO_USERS_GRP -eq 0 ] ; then
    138 	echo "Users group found."
    139 elif [ $CREATE_ENTRIES -ne 0 ] ; then
    140 	echo 'users:x:100:' >> "$group"
    141 fi
    142 
    143 if [ $NO_SYS_GRP -eq 0 ] ; then
    144 	echo "Sys group found."
    145 elif [ $CREATE_ENTRIES -ne 0 ] ; then
    146 	echo 'sys:x:3:' >> "$group"
    147 fi
    148 
    149 MISSING_ENTRY=0
    150 
    151 # For entries that exist in both $group and $passwd.
    152 for i in bin daemon; do
    153     for file in "$group" "$passwd"; do
    154         if ! fe "$i" "$file"; then
    155             MISSING_ENTRY=1
    156             break
    157         fi
    158     done
    159     if [ $MISSING_ENTRY -ne 0 ]; then
    160         break
    161     fi
    162 done
    163 
    164 # nobody is a standard group on all distros, apart from debian based ones;
    165 # let's account for the fact that they use the nogroup group instead.
    166 if ! fe "nobody" "$passwd" || ! (fe "nogroup" "$group" || fe "nobody" "$group")
    167 then
    168     MISSING_ENTRY=1
    169 fi
    170 
    171 # For entries that only exist in $group.
    172 for i in users sys; do
    173     if ! fe "$i" "$group" ; then
    174         MISSING_ENTRY=1
    175     fi
    176 done
    177 
    178 if [ $MISSING_ENTRY -eq 0 ] ; then
    179     echo "Required users/groups exist."
    180     exit 0
    181 fi
    182 
    183 echo ""
    184 echo "*****************************************"
    185 echo "* Required users/groups do NOT exist!!! *"
    186 echo "*                                       *"
    187 echo "* Some kernel/syscall tests will FAIL!  *"
    188 echo "*****************************************"
    189 exit 1
    190