summaryrefslogtreecommitdiff
path: root/meta/classes/useradd_base.bbclass
blob: 7aafe29a4ac1792bcdc93fb0fa7efbbe32f710be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
# This bbclass provides basic functionality for user/group settings.
# This bbclass is intended to be inherited by useradd.bbclass and
# extrausers.bbclass.

# The following functions basically have similar logic.
# *) Perform necessary checks before invoking the actual command
# *) Invoke the actual command, make retries if necessary
# *) Error out if an error occurs.

# Note that before invoking these functions, make sure the global variable
# PSEUDO is set up correctly.

perform_groupadd () {
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing groupadd with [$opts] and $retries times of retry"
	local groupname=`echo "$opts" | awk '{ print $NF }'`
	local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
	if test "x$group_exists" = "x"; then
		local count=0
		while true; do
			eval $PSEUDO groupadd $opts || true
			group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
			if test "x$group_exists" = "x"; then
				bbwarn "groupadd command did not succeed. Retrying..."
				sleep 1
			else
				break
			fi
			count=`expr $count + 1`
			if test $count = $retries; then
				bbfatal "Tried running groupadd command $retries times without scucess, giving up"
			fi
		done
	else
		bbwarn "group $groupname already exists, not re-creating it"
	fi
}

perform_useradd () {
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing useradd with [$opts] and $retries times of retry"
	local username=`echo "$opts" | awk '{ print $NF }'`
	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
	if test "x$user_exists" = "x"; then
	       local count=0
	       while true; do
		       eval $PSEUDO useradd $opts || true
		       user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
		       if test "x$user_exists" = "x"; then
			       bbwarn "useradd command did not succeed. Retrying..."
			       sleep 1
		       else
			       break
		       fi
		       count=`expr $count + 1`
		       if test $count = $retries; then
				bbfatal "Tried running useradd command $retries times without scucess, giving up"
		       fi
	       done
	else
		bbwarn "user $username already exists, not re-creating it"
	fi
}

perform_groupmems () {
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing groupmems with [$opts] and $retries times of retry"
	local groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'`
	local username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'`
	bbnote "Running groupmems command with group $groupname and user $username"
	# groupmems fails if /etc/gshadow does not exist
	local gshadow=""
	if [ -f $rootdir${sysconfdir}/gshadow ]; then
		gshadow="yes"
	else
		gshadow="no"
		touch $rootdir${sysconfdir}/gshadow
	fi
	local mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`"
	if test "x$mem_exists" = "x"; then
		local count=0
		while true; do
			eval $PSEUDO groupmems $opts || true
			mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`"
			if test "x$mem_exists" = "x"; then
				bbwarn "groupmems command did not succeed. Retrying..."
				sleep 1
			else
				break
			fi
			count=`expr $count + 1`
			if test $count = $retries; then
				if test "x$gshadow" = "xno"; then
					rm -f $rootdir${sysconfdir}/gshadow
					rm -f $rootdir${sysconfdir}/gshadow-
				fi
				bbfatal "Tried running groupmems command $retries times without scucess, giving up"
			fi
		done
	else
		bbwarn "group $groupname already contains $username, not re-adding it"
	fi
	if test "x$gshadow" = "xno"; then
		rm -f $rootdir${sysconfdir}/gshadow
		rm -f $rootdir${sysconfdir}/gshadow-
	fi
}

perform_groupdel () {
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing groupdel with [$opts] and $retries times of retry"
	local groupname=`echo "$opts" | awk '{ print $NF }'`
	local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
	if test "x$group_exists" != "x"; then
		local count=0
		while true; do
			eval $PSEUDO groupdel $opts || true
			group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
			if test "x$group_exists" != "x"; then
				bbwarn "groupdel command did not succeed. Retrying..."
				sleep 1
			else
				break
			fi
			count=`expr $count + 1`
			if test $count = $retries; then
				bbfatal "Tried running groupdel command $retries times without scucess, giving up"
			fi
		done
	else
		bbwarn "group $groupname doesn't exist, not removing it"
	fi
}

perform_userdel () {
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing userdel with [$opts] and $retries times of retry"
	local username=`echo "$opts" | awk '{ print $NF }'`
	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
	if test "x$user_exists" != "x"; then
	       local count=0
	       while true; do
		       eval $PSEUDO userdel $opts || true
		       user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
		       if test "x$user_exists" != "x"; then
			       bbwarn "userdel command did not succeed. Retrying..."
			       sleep 1
		       else
			       break
		       fi
		       count=`expr $count + 1`
		       if test $count = $retries; then
				bbfatal "Tried running userdel command $retries times without scucess, giving up"
		       fi
	       done
	else
		bbwarn "user $username doesn't exist, not removing it"
	fi
}

perform_groupmod () {
	# Other than the return value of groupmod, there's no simple way to judge whether the command
	# succeeds, so we disable -e option temporarily
	set +e
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing groupmod with [$opts] and $retries times of retry"
	local groupname=`echo "$opts" | awk '{ print $NF }'`
	local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
	if test "x$group_exists" != "x"; then
		local count=0
		while true; do
			eval $PSEUDO groupmod $opts
			if test $? != 0; then
				bbwarn "groupmod command did not succeed. Retrying..."
				sleep 1
			else
				break
			fi
			count=`expr $count + 1`
			if test $count = $retries; then
				bbfatal "Tried running groupmod command $retries times without scucess, giving up"
			fi
		done
	else
		bbwarn "group $groupname doesn't exist, unable to modify it"
	fi
	set -e
}

perform_usermod () {
	# Same reason with groupmod, temporarily disable -e option
	set +e
	local rootdir="$1"
	local opts="$2"
	local retries="$3"
	bbnote "Performing usermod with [$opts] and $retries times of retry"
	local username=`echo "$opts" | awk '{ print $NF }'`
	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
	if test "x$user_exists" != "x"; then
	       local count=0
	       while true; do
		       eval $PSEUDO usermod $opts
		       if test $? != 0; then
			       bbwarn "usermod command did not succeed. Retrying..."
			       sleep 1
		       else
			       break
		       fi
		       count=`expr $count + 1`
		       if test $count = $retries; then
				bbfatal "Tried running usermod command $retries times without scucess, giving up"
		       fi
	       done
	else
		bbwarn "user $username doesn't exist, unable to modify it"
	fi
	set -e
}