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 25echo "Checking for required user/group ids" 26echo "" 27 28# Check ids and create if needed. 29NO_NOBODY_ID=1 30NO_BIN_ID=1 31NO_DAEMON_ID=1 32NO_NOBODY_GRP=1 33NO_BIN_GRP=1 34NO_DAEMON_GRP=1 35NO_USERS_GRP=1 36NO_SYS_GRP=1 37 38group="$DESTDIR/etc/group" 39passwd="$DESTDIR/etc/passwd" 40 41# find entry. 42fe() { 43 ID=$1 44 FILE=$2 45 [ -e "$FILE" ] || return $? 46 grep -q "^$ID:" "$FILE" 47} 48 49prompt_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 66if [ -z ${EUID} ] ; then 67 EUID=$(id -u) 68fi 69 70for 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 75done 76 77fe bin "$passwd"; NO_BIN_ID=$? 78fe daemon "$passwd"; NO_DAEMON_ID=$? 79fe nobody "$passwd"; NO_NOBODY_ID=$? 80 81fe bin "$group"; NO_BIN_GRP=$? 82fe daemon "$group"; NO_DAEMON_GRP=$? 83fe nobody "$group" || fe nogroup "$group"; NO_NOBODY_GRP=$? 84fe sys "$group"; NO_SYS_GRP=$? 85fe users "$group"; NO_USERS_GRP=$? 86 87prompt_for_create 88 89debug_vals() { 90 91echo "Missing the following group / user entries:" 92echo "Group file: $group" 93echo "Password file: $passwd" 94echo "nobody: $NO_NOBODY_ID" 95echo "bin: $NO_BIN_ID" 96echo "daemon: $NO_DAEMON_ID" 97echo "nobody[/nogroup] grp: $NO_NOBODY_GRP" 98echo "bin grp: $NO_BIN_GRP" 99echo "daemon grp: $NO_DAEMON_GRP" 100echo "sys grp: $NO_SYS_GRP" 101echo "users grp: $NO_USERS_GRP" 102echo "" 103 104} 105 106#debug_vals 107 108if [ $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 113fi 114 115make_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} 133make_user_group nobody 65534 $NO_NOBODY_ID $NO_NOBODY_GRP 134make_user_group bin 1 $NO_BIN_ID $NO_BIN_GRP 135make_user_group daemon 2 $NO_DAEMON_ID $NO_DAEMON_GRP 136 137if [ $NO_USERS_GRP -eq 0 ] ; then 138 echo "Users group found." 139elif [ $CREATE_ENTRIES -ne 0 ] ; then 140 echo 'users:x:100:' >> "$group" 141fi 142 143if [ $NO_SYS_GRP -eq 0 ] ; then 144 echo "Sys group found." 145elif [ $CREATE_ENTRIES -ne 0 ] ; then 146 echo 'sys:x:3:' >> "$group" 147fi 148 149MISSING_ENTRY=0 150 151# For entries that exist in both $group and $passwd. 152for 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 162done 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. 166if ! fe "nobody" "$passwd" || ! (fe "nogroup" "$group" || fe "nobody" "$group") 167then 168 MISSING_ENTRY=1 169fi 170 171# For entries that only exist in $group. 172for i in users sys; do 173 if ! fe "$i" "$group" ; then 174 MISSING_ENTRY=1 175 fi 176done 177 178if [ $MISSING_ENTRY -eq 0 ] ; then 179 echo "Required users/groups exist." 180 exit 0 181fi 182 183echo "" 184echo "*****************************************" 185echo "* Required users/groups do NOT exist!!! *" 186echo "* *" 187echo "* Some kernel/syscall tests will FAIL! *" 188echo "*****************************************" 189exit 1 190