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