• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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