Lines 99-104
Link Here
|
99 |
esac |
99 |
esac |
100 |
} |
100 |
} |
101 |
|
101 |
|
|
|
102 |
# @FUNCTION: _get_next_id |
103 |
# @INTERNAL |
104 |
# @USAGE: <database> [id] |
105 |
# @DESCRIPTION: |
106 |
# Get the next available ID for a new entity. Pass a value for id |
107 |
# to suggest an ID to try first. Omit or pass -1 to just get the next |
108 |
# available ID. |
109 |
# |
110 |
# Supported databases: group passwd |
111 |
_get_next_id() { |
112 |
local db=$1; shift |
113 |
if [[ -z ${db} ]] ; then |
114 |
eerror "No database specified !" |
115 |
die "Cannot call _get_next_id without a database" |
116 |
fi |
117 |
|
118 |
case ${db} in |
119 |
passwd|group) ;; |
120 |
*) die "sorry, database '${db}' not yet supported; file a bug" ;; |
121 |
esac |
122 |
|
123 |
local eid=$2 |
124 |
if [[ -z ${eid} || ${eid} -eq -1 ]] ; then |
125 |
eid="next available" |
126 |
elif [[ ${eid} -gt 0 ]] ; then |
127 |
if [[ -n $(egetent ${db} ${eid}) ]] ; then |
128 |
eid="next available" |
129 |
fi |
130 |
else |
131 |
eerror "ID given but is not greater than 0 !" |
132 |
die "${eid} is not a valid ID" |
133 |
fi |
134 |
# not necessary on linux #477804 |
135 |
if [[ ${CHOST} != *-linux* && ${eid} == "next available" ]]; then |
136 |
for ((eid = 101; eid <= 999; eid++)); do |
137 |
[[ -z $(egetent passwd ${eid}) ]] && break |
138 |
done |
139 |
fi |
140 |
echo ${eid} |
141 |
} |
142 |
|
102 |
# @FUNCTION: enewuser |
143 |
# @FUNCTION: enewuser |
103 |
# @USAGE: <user> [uid] [shell] [homedir] [groups] |
144 |
# @USAGE: <user> [uid] [shell] [homedir] [groups] |
104 |
# @DESCRIPTION: |
145 |
# @DESCRIPTION: |
Lines 127-150
Link Here
|
127 |
|
168 |
|
128 |
# handle uid |
169 |
# handle uid |
129 |
local euid=$1; shift |
170 |
local euid=$1; shift |
130 |
if [[ -n ${euid} && ${euid} != -1 ]] ; then |
171 |
euid=$(_get_next_id passwd ${euid}) |
131 |
if [[ ${euid} -gt 0 ]] ; then |
172 |
if [[ ${euid} != "next available" ]] ; then |
132 |
if [[ -n $(egetent passwd ${euid}) ]] ; then |
173 |
opts+=( -u ${euid} ) |
133 |
euid="next" |
|
|
134 |
fi |
135 |
else |
136 |
eerror "Userid given but is not greater than 0 !" |
137 |
die "${euid} is not a valid UID" |
138 |
fi |
139 |
else |
140 |
euid="next" |
141 |
fi |
142 |
if [[ ${euid} == "next" ]] ; then |
143 |
for ((euid = 101; euid <= 999; euid++)); do |
144 |
[[ -z $(egetent passwd ${euid}) ]] && break |
145 |
done |
146 |
fi |
174 |
fi |
147 |
opts+=( -u ${euid} ) |
|
|
148 |
einfo " - Userid: ${euid}" |
175 |
einfo " - Userid: ${euid}" |
149 |
|
176 |
|
150 |
# handle shell |
177 |
# handle shell |
Lines 284-301
Link Here
|
284 |
|
311 |
|
285 |
# handle gid |
312 |
# handle gid |
286 |
local egid=$1; shift |
313 |
local egid=$1; shift |
287 |
if [[ ! -z ${egid} ]] ; then |
314 |
egid=$(_get_next_id group ${egid}) |
288 |
if [[ ${egid} -gt 0 ]] ; then |
|
|
289 |
if [[ -n $(egetent group ${egid}) ]] ; then |
290 |
egid="next available; requested gid taken" |
291 |
fi |
292 |
else |
293 |
eerror "Groupid given but is not greater than 0 !" |
294 |
die "${egid} is not a valid GID" |
295 |
fi |
296 |
else |
297 |
egid="next available" |
298 |
fi |
299 |
einfo " - Groupid: ${egid}" |
315 |
einfo " - Groupid: ${egid}" |
300 |
|
316 |
|
301 |
# handle extra |
317 |
# handle extra |
Lines 303-344
Link Here
|
303 |
die "extra arguments no longer supported; please file a bug" |
319 |
die "extra arguments no longer supported; please file a bug" |
304 |
fi |
320 |
fi |
305 |
|
321 |
|
306 |
# Some targets need to find the next available GID manually |
|
|
307 |
_enewgroup_next_gid() { |
308 |
if [[ ${egid} == *[!0-9]* ]] ; then |
309 |
# Non numeric |
310 |
for ((egid = 101; egid <= 999; egid++)) ; do |
311 |
[[ -z $(egetent group ${egid}) ]] && break |
312 |
done |
313 |
fi |
314 |
} |
315 |
|
316 |
# add the group |
322 |
# add the group |
317 |
case ${CHOST} in |
323 |
case ${CHOST} in |
318 |
*-darwin*) |
324 |
*-darwin*) |
319 |
_enewgroup_next_gid |
|
|
320 |
dscl . create "/groups/${egroup}" gid ${egid} |
325 |
dscl . create "/groups/${egroup}" gid ${egid} |
321 |
dscl . create "/groups/${egroup}" passwd '*' |
326 |
dscl . create "/groups/${egroup}" passwd '*' |
322 |
;; |
327 |
;; |
323 |
|
328 |
|
324 |
*-freebsd*|*-dragonfly*) |
329 |
*-freebsd*|*-dragonfly*) |
325 |
_enewgroup_next_gid |
|
|
326 |
pw groupadd "${egroup}" -g ${egid} || die |
330 |
pw groupadd "${egroup}" -g ${egid} || die |
327 |
;; |
331 |
;; |
328 |
|
332 |
|
329 |
*-netbsd*) |
333 |
# OpenBSD doesn't support -r, so avoid using undefined flags |
330 |
_enewgroup_next_gid |
334 |
*-netbsd*|*-openbsd*) |
331 |
groupadd -g ${egid} "${egroup}" || die |
335 |
groupadd -g ${egid} "${egroup}" || die |
332 |
;; |
336 |
;; |
333 |
|
337 |
|
334 |
*) |
338 |
*) |
335 |
local opts |
|
|
336 |
if [[ ${egid} == *[!0-9]* ]] ; then |
337 |
# Non numeric; let groupadd figure out a GID for us |
338 |
opts="" |
339 |
else |
340 |
opts="-g ${egid}" |
341 |
fi |
342 |
# We specify -r so that we get a GID in the system range from login.defs |
339 |
# We specify -r so that we get a GID in the system range from login.defs |
343 |
groupadd -r ${opts} "${egroup}" || die |
340 |
groupadd -r ${opts} "${egroup}" || die |
344 |
;; |
341 |
;; |