1 | # Copyright 1999-2011 Gentoo Foundation |
1 | # Copyright 1999-2011 Gentoo Foundation |
2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/user.eclass,v 1.13 2011/11/26 06:50:27 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/user.eclass,v 1.14 2011/11/26 07:20:31 vapier Exp $ |
4 | |
4 | |
5 | # @ECLASS: user.eclass |
5 | # @ECLASS: user.eclass |
6 | # @MAINTAINER: |
6 | # @MAINTAINER: |
7 | # base-system@gentoo.org (Linux) |
7 | # base-system@gentoo.org (Linux) |
8 | # Joe Jezak <josejx@gmail.com> (OS X) |
8 | # Joe Jezak <josejx@gmail.com> (OS X) |
… | |
… | |
117 | return 0 |
117 | return 0 |
118 | fi |
118 | fi |
119 | einfo "Adding user '${euser}' to your system ..." |
119 | einfo "Adding user '${euser}' to your system ..." |
120 | |
120 | |
121 | # options to pass to useradd |
121 | # options to pass to useradd |
122 | local opts= |
122 | local opts=() |
123 | |
123 | |
124 | # handle uid |
124 | # handle uid |
125 | local euid=$1; shift |
125 | local euid=$1; shift |
126 | if [[ -n ${euid} && ${euid} != -1 ]] ; then |
126 | if [[ -n ${euid} && ${euid} != -1 ]] ; then |
127 | if [[ ${euid} -gt 0 ]] ; then |
127 | if [[ ${euid} -gt 0 ]] ; then |
… | |
… | |
138 | if [[ ${euid} == "next" ]] ; then |
138 | if [[ ${euid} == "next" ]] ; then |
139 | for ((euid = 101; euid <= 999; euid++)); do |
139 | for ((euid = 101; euid <= 999; euid++)); do |
140 | [[ -z $(egetent passwd ${euid}) ]] && break |
140 | [[ -z $(egetent passwd ${euid}) ]] && break |
141 | done |
141 | done |
142 | fi |
142 | fi |
143 | opts+=" -u ${euid}" |
143 | opts+=( -u ${euid} ) |
144 | einfo " - Userid: ${euid}" |
144 | einfo " - Userid: ${euid}" |
145 | |
145 | |
146 | # handle shell |
146 | # handle shell |
147 | local eshell=$1; shift |
147 | local eshell=$1; shift |
148 | if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then |
148 | if [[ ! -z ${eshell} ]] && [[ ${eshell} != "-1" ]] ; then |
… | |
… | |
168 | *) die "Unable to identify the default shell for userland ${USERLAND}" |
168 | *) die "Unable to identify the default shell for userland ${USERLAND}" |
169 | esac |
169 | esac |
170 | fi |
170 | fi |
171 | fi |
171 | fi |
172 | einfo " - Shell: ${eshell}" |
172 | einfo " - Shell: ${eshell}" |
173 | opts+=" -s ${eshell}" |
173 | opts+=( -s "${eshell}" ) |
174 | |
174 | |
175 | # handle homedir |
175 | # handle homedir |
176 | local ehome=$1; shift |
176 | local ehome=$1; shift |
177 | if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then |
177 | if [[ -z ${ehome} ]] || [[ ${ehome} == "-1" ]] ; then |
178 | ehome="/dev/null" |
178 | ehome="/dev/null" |
179 | fi |
179 | fi |
180 | einfo " - Home: ${ehome}" |
180 | einfo " - Home: ${ehome}" |
181 | opts+=" -d ${ehome}" |
181 | opts+=( -d "${ehome}" ) |
182 | |
182 | |
183 | # handle groups |
183 | # handle groups |
184 | local egroups=$1; shift |
184 | local egroups=$1; shift |
185 | if [[ ! -z ${egroups} ]] ; then |
185 | if [[ ! -z ${egroups} ]] ; then |
186 | local oldifs=${IFS} |
186 | local oldifs=${IFS} |
… | |
… | |
200 | fi |
200 | fi |
201 | export IFS="," |
201 | export IFS="," |
202 | done |
202 | done |
203 | export IFS=${oldifs} |
203 | export IFS=${oldifs} |
204 | |
204 | |
205 | opts+=" -g ${defgroup}" |
205 | opts+=( -g "${defgroup}" ) |
206 | if [[ ! -z ${exgroups} ]] ; then |
206 | if [[ ! -z ${exgroups} ]] ; then |
207 | opts+=" -G ${exgroups:1}" |
207 | opts+=( -G "${exgroups:1}" ) |
208 | fi |
208 | fi |
209 | else |
209 | else |
210 | egroups="(none)" |
210 | egroups="(none)" |
211 | fi |
211 | fi |
212 | einfo " - Groups: ${egroups}" |
212 | einfo " - Groups: ${egroups}" |
213 | |
213 | |
214 | # handle extra args |
214 | # handle extra args |
215 | if [[ $# -gt 0 ]] ; then |
215 | if [[ $# -gt 0 ]] ; then |
216 | die "extra arguments no longer supported; please file a bug" |
216 | die "extra arguments no longer supported; please file a bug" |
217 | else |
217 | else |
218 | set -- -c "added by portage for ${PN}" |
218 | local comment="added by portage for ${PN}" |
219 | einfo " - Extra: $@" |
219 | opts+=( -c "${comment}" ) |
|
|
220 | einfo " - GECOS: ${comment}" |
220 | fi |
221 | fi |
221 | |
222 | |
222 | # add the user |
223 | # add the user |
223 | case ${CHOST} in |
224 | case ${CHOST} in |
224 | *-darwin*) |
225 | *-darwin*) |
225 | ### Make the user |
226 | ### Make the user |
226 | dscl . create /users/${euser} uid ${euid} |
227 | dscl . create "/users/${euser}" uid ${euid} |
227 | dscl . create /users/${euser} shell ${eshell} |
228 | dscl . create "/users/${euser}" shell "${eshell}" |
228 | dscl . create /users/${euser} home ${ehome} |
229 | dscl . create "/users/${euser}" home "${ehome}" |
229 | dscl . create /users/${euser} realname "added by portage for ${PN}" |
230 | dscl . create "/users/${euser}" realname "added by portage for ${PN}" |
230 | ### Add the user to the groups specified |
231 | ### Add the user to the groups specified |
231 | local oldifs=${IFS} |
232 | local g oldifs=${IFS} |
232 | export IFS="," |
233 | export IFS="," |
233 | for g in ${egroups} ; do |
234 | for g in ${egroups} ; do |
234 | dscl . merge /groups/${g} users ${euser} |
235 | dscl . merge "/groups/${g}" users "${euser}" |
235 | done |
236 | done |
236 | export IFS=${oldifs} |
237 | export IFS=${oldifs} |
237 | ;; |
238 | ;; |
238 | |
239 | |
239 | *-freebsd*|*-dragonfly*) |
240 | *-freebsd*|*-dragonfly*) |
240 | pw useradd ${euser} ${opts} "$@" || die |
241 | pw useradd "${euser}" "${opts[@]}" || die |
241 | ;; |
242 | ;; |
242 | |
243 | |
243 | *-netbsd*) |
244 | *-netbsd*) |
244 | useradd ${opts} ${euser} "$@" || die |
245 | useradd "${opts[@]}" "${euser}" || die |
245 | ;; |
246 | ;; |
246 | |
247 | |
247 | *-openbsd*) |
248 | *-openbsd*) |
248 | # all ops the same, except the -g vs -g/-G ... |
249 | # all ops the same, except the -g vs -g/-G ... |
249 | useradd -u ${euid} -s ${eshell} \ |
250 | useradd -u ${euid} -s "${eshell}" \ |
250 | -d ${ehome} -g ${egroups} "$@" ${euser} || die |
251 | -d "${ehome}" -g "${egroups}" "${euser}" || die |
251 | ;; |
252 | ;; |
252 | |
253 | |
253 | *) |
254 | *) |
254 | useradd -r ${opts} "$@" ${euser} || die |
255 | useradd -r "${opts[@]}" "${euser}" || die |
255 | ;; |
256 | ;; |
256 | esac |
257 | esac |
257 | |
258 | |
258 | if [[ ! -e ${ROOT}/${ehome} ]] ; then |
259 | if [[ ! -e ${ROOT}/${ehome} ]] ; then |
259 | einfo " - Creating ${ehome} in ${ROOT}" |
260 | einfo " - Creating ${ehome} in ${ROOT}" |
260 | mkdir -p "${ROOT}/${ehome}" |
261 | mkdir -p "${ROOT}/${ehome}" |
261 | chown ${euser} "${ROOT}/${ehome}" |
262 | chown "${euser}" "${ROOT}/${ehome}" |
262 | chmod 755 "${ROOT}/${ehome}" |
263 | chmod 755 "${ROOT}/${ehome}" |
263 | fi |
264 | fi |
264 | } |
265 | } |
265 | |
266 | |
266 | # @FUNCTION: enewgroup |
267 | # @FUNCTION: enewgroup |
… | |
… | |
272 | # allocate the next available one. |
273 | # allocate the next available one. |
273 | enewgroup() { |
274 | enewgroup() { |
274 | _assert_pkg_ebuild_phase enewgroup |
275 | _assert_pkg_ebuild_phase enewgroup |
275 | |
276 | |
276 | # get the group |
277 | # get the group |
277 | local egroup="$1"; shift |
278 | local egroup=$1; shift |
278 | if [ -z "${egroup}" ] |
279 | if [[ -z ${egroup} ]] ; then |
279 | then |
|
|
280 | eerror "No group specified !" |
280 | eerror "No group specified !" |
281 | die "Cannot call enewgroup without a group" |
281 | die "Cannot call enewgroup without a group" |
282 | fi |
282 | fi |
283 | |
283 | |
284 | # see if group already exists |
284 | # see if group already exists |
285 | if [[ -n $(egetent group "${egroup}") ]]; then |
285 | if [[ -n $(egetent group "${egroup}") ]] ; then |
286 | return 0 |
286 | return 0 |
287 | fi |
287 | fi |
288 | einfo "Adding group '${egroup}' to your system ..." |
288 | einfo "Adding group '${egroup}' to your system ..." |
289 | |
289 | |
290 | # options to pass to useradd |
|
|
291 | local opts= |
|
|
292 | |
|
|
293 | # handle gid |
290 | # handle gid |
294 | local egid="$1"; shift |
291 | local egid=$1; shift |
295 | if [ ! -z "${egid}" ] |
292 | if [[ ! -z ${egid} ]] ; then |
296 | then |
|
|
297 | if [ "${egid}" -gt 0 ] |
293 | if [[ ${egid} -gt 0 ]] ; then |
298 | then |
|
|
299 | if [ -z "`egetent group ${egid}`" ] |
294 | if [[ -n $(egetent group ${egid}) ]] ; then |
300 | then |
|
|
301 | if [[ "${CHOST}" == *-darwin* ]]; then |
|
|
302 | opts+=" ${egid}" |
|
|
303 | else |
|
|
304 | opts+=" -g ${egid}" |
|
|
305 | fi |
|
|
306 | else |
|
|
307 | egid="next available; requested gid taken" |
295 | egid="next available; requested gid taken" |
308 | fi |
296 | fi |
309 | else |
297 | else |
310 | eerror "Groupid given but is not greater than 0 !" |
298 | eerror "Groupid given but is not greater than 0 !" |
311 | die "${egid} is not a valid GID" |
299 | die "${egid} is not a valid GID" |
… | |
… | |
314 | egid="next available" |
302 | egid="next available" |
315 | fi |
303 | fi |
316 | einfo " - Groupid: ${egid}" |
304 | einfo " - Groupid: ${egid}" |
317 | |
305 | |
318 | # handle extra |
306 | # handle extra |
319 | if [ $# -gt 0 ] ; then |
307 | if [[ $# -gt 0 ]] ; then |
320 | die "extra arguments no longer supported; please file a bug" |
308 | die "extra arguments no longer supported; please file a bug" |
321 | fi |
309 | fi |
322 | |
310 | |
323 | # add the group |
311 | # Some targets need to find the next available GID manually |
324 | case ${CHOST} in |
312 | _enewgroup_next_gid() { |
325 | *-darwin*) |
313 | if [[ ${egid} == *[!0-9]* ]] ; then |
326 | # If we need the next available |
|
|
327 | case ${egid} in |
|
|
328 | *[!0-9]*) # Non numeric |
314 | # Non numeric |
329 | for ((egid = 101; egid <= 999; egid++)); do |
315 | for ((egid = 101; egid <= 999; egid++)) ; do |
330 | [[ -z $(egetent group ${egid}) ]] && break |
316 | [[ -z $(egetent group ${egid}) ]] && break |
331 | done |
317 | done |
332 | esac |
318 | fi |
|
|
319 | } |
|
|
320 | |
|
|
321 | # add the group |
|
|
322 | case ${CHOST} in |
|
|
323 | *-darwin*) |
|
|
324 | _enewgroup_next_gid |
333 | dscl . create /groups/${egroup} gid ${egid} |
325 | dscl . create "/groups/${egroup}" gid ${egid} |
334 | dscl . create /groups/${egroup} passwd '*' |
326 | dscl . create "/groups/${egroup}" passwd '*' |
335 | ;; |
327 | ;; |
336 | |
328 | |
337 | *-freebsd*|*-dragonfly*) |
329 | *-freebsd*|*-dragonfly*) |
338 | case ${egid} in |
330 | _enewgroup_next_gid |
339 | *[!0-9]*) # Non numeric |
|
|
340 | for ((egid = 101; egid <= 999; egid++)); do |
|
|
341 | [[ -z $(egetent group ${egid}) ]] && break |
|
|
342 | done |
|
|
343 | esac |
|
|
344 | pw groupadd ${egroup} -g ${egid} || die |
331 | pw groupadd "${egroup}" -g ${egid} || die |
345 | ;; |
332 | ;; |
346 | |
333 | |
347 | *-netbsd*) |
334 | *-netbsd*) |
348 | case ${egid} in |
335 | _enewgroup_next_gid |
349 | *[!0-9]*) # Non numeric |
|
|
350 | for ((egid = 101; egid <= 999; egid++)); do |
|
|
351 | [[ -z $(egetent group ${egid}) ]] && break |
|
|
352 | done |
|
|
353 | esac |
|
|
354 | groupadd -g ${egid} ${egroup} || die |
336 | groupadd -g ${egid} "${egroup}" || die |
355 | ;; |
337 | ;; |
356 | |
338 | |
357 | *) |
339 | *) |
|
|
340 | local opts |
|
|
341 | if [[ ${egid} == *[!0-9]* ]] ; then |
|
|
342 | # Non numeric; let groupadd figure out a GID for us |
|
|
343 | opts="" |
|
|
344 | else |
|
|
345 | opts="-g ${egid}" |
|
|
346 | fi |
358 | # We specify -r so that we get a GID in the system range from login.defs |
347 | # We specify -r so that we get a GID in the system range from login.defs |
359 | groupadd -r ${opts} ${egroup} || die |
348 | groupadd -r ${opts} "${egroup}" || die |
360 | ;; |
349 | ;; |
361 | esac |
350 | esac |
362 | } |
351 | } |
363 | |
352 | |
364 | # @FUNCTION: egethome |
353 | # @FUNCTION: egethome |
… | |
… | |
377 | *) # Linux, NetBSD, OpenBSD, etc... |
366 | *) # Linux, NetBSD, OpenBSD, etc... |
378 | pos=6 |
367 | pos=6 |
379 | ;; |
368 | ;; |
380 | esac |
369 | esac |
381 | |
370 | |
382 | egetent passwd $1 | cut -d: -f${pos} |
371 | egetent passwd "$1" | cut -d: -f${pos} |
383 | } |
372 | } |
384 | |
373 | |
385 | # @FUNCTION: egetshell |
374 | # @FUNCTION: egetshell |
386 | # @USAGE: <user> |
375 | # @USAGE: <user> |
387 | # @DESCRIPTION: |
376 | # @DESCRIPTION: |