Gentoo Archives: gentoo-dev

From: "Jérémy Connat" <morderca@××××××××.net>
To: gentoo-dev@l.g.o
Cc: "Jérémy Connat" <morderca@××××××××.net>
Subject: [gentoo-dev] [PATCH 1/3] eclass/user.eclass: Fixing user/group creation when using different ROOT
Date: Fri, 15 Apr 2022 13:46:48
Message-Id: 20220415134628.23069-2-morderca@morderca.net
In Reply to: [gentoo-dev] [PATCH 0/3] eclass: Fixing user/group creation when using different ROOT by "Jérémy Connat"
1 When creating a user for another environement, user is created on the HOST and not the ROOT dir.
2 Adding "-R <CHROOT_DIR>" for all user* / group* commands fix the issue.
3
4 Signed-off-by: Jérémy Connat <morderca@××××××××.net>
5 ---
6 eclass/user.eclass | 128 +++++++++++++++++++++++++++++++++++++++------
7 1 file changed, 111 insertions(+), 17 deletions(-)
8
9 diff --git a/eclass/user.eclass b/eclass/user.eclass
10 index ff69be81c1e..aab549d0c47 100644
11 --- a/eclass/user.eclass
12 +++ b/eclass/user.eclass
13 @@ -117,6 +117,9 @@ enewuser() {
14 # options to pass to useradd
15 local opts=()
16
17 + # handle for ROOT != /
18 + [[ -n ${ROOT} ]] && opts+=( --prefix "${ROOT}" )
19 +
20 # handle uid
21 local euid=${1}; shift
22 if [[ -n ${euid} && ${euid} != -1 ]] ; then
23 @@ -207,13 +210,24 @@ enewuser() {
24 ;;
25
26 *-netbsd*)
27 - useradd "${opts[@]}" "${euser}" || die
28 + if [[ -n "${ROOT}" ]]; then
29 + ewarn "NetBSD's usermod does not support --prefix option."
30 + ewarn "Please use: \"useradd ${opts[@]} ${euser}\" in a chroot"
31 + else
32 + useradd "${opts[@]}" "${euser}" || die
33 + fi
34 ;;
35
36 *-openbsd*)
37 - # all ops the same, except the -g vs -g/-G ...
38 - useradd -u ${euid} -s "${eshell}" \
39 - -d "${ehome}" -g "${egroups}" "${euser}" || die
40 + if [[ -n "${ROOT}" ]]; then
41 + ewarn "OpenBSD's usermod does not support --prefix option."
42 + ewarn "Please use: \"useradd ${opts[@]} ${euser}\" in a chroot"
43 + else
44 + # all ops the same, except the -g vs -g/-G ...
45 + useradd -u ${euid} -s "${eshell}" \
46 + -d "${ehome}" -g "${egroups}" "${euser}" || die
47 + fi
48 +
49 ;;
50
51 *)
52 @@ -224,6 +238,10 @@ enewuser() {
53 if [[ -n ${create_home} && ! -e ${ROOT}/${ehome} ]] ; then
54 elog " - Creating ${ehome} in ${ROOT}"
55 mkdir -p "${ROOT}/${ehome}"
56 + # Use UID if we are in another ROOT than /
57 + if [[ -n "${ROOT}" ]]; then
58 + euser=$(egetent passwd ${euser} | cut -d: -f3)
59 + fi
60 chown "${euser}" "${ROOT}/${ehome}"
61 chmod 755 "${ROOT}/${ehome}"
62 fi
63 @@ -286,6 +304,10 @@ enewgroup() {
64 fi
65 elog " - Groupid: ${egid}"
66
67 + # handle different ROOT
68 + local opts
69 + [[ -n ${ROOT} ]] && opts=( --prefix "${ROOT}" )
70 +
71 # handle extra
72 if [[ $# -gt 0 ]] ; then
73 die "extra arguments no longer supported; please file a bug"
74 @@ -306,24 +328,29 @@ enewgroup() {
75 case ${CHOST} in
76 *-freebsd*|*-dragonfly*)
77 _enewgroup_next_gid
78 - pw groupadd "${egroup}" -g ${egid} || die
79 + pw groupadd "${opts[@]}" "${egroup}" -g ${egid} || die
80 ;;
81
82 *-netbsd*)
83 - _enewgroup_next_gid
84 - groupadd -g ${egid} "${egroup}" || die
85 + if [[ -n "${ROOT}" ]]; then
86 + ewarn "NetBSD's usermod does not support --prefix <dir> option."
87 + ewarn "Please use: \"groupadd -g ${egid} ${opts[@]} ${egroup}\" in a chroot"
88 + else
89 + _enewgroup_next_gid
90 + groupadd -g ${egid} "${opts[@]}" "${egroup}" || die
91 + fi
92 ;;
93
94 *)
95 - local opts
96 if [[ ${egid} == *[!0-9]* ]] ; then
97 # Non numeric; let groupadd figure out a GID for us
98 - opts=""
99 + #
100 + true # Do nothing but keep the previous comment.
101 else
102 - opts="-g ${egid}"
103 + opts+=( -g ${egid} )
104 fi
105 # We specify -r so that we get a GID in the system range from login.defs
106 - groupadd -r ${opts} "${egroup}" || die
107 + groupadd -r "${opts[@]}" "${egroup}" || die
108 ;;
109 esac
110 }
111 @@ -353,6 +380,10 @@ esethome() {
112 return 1
113 fi
114
115 + # Handle different ROOT
116 + local opts
117 + [[ -n ${ROOT} ]] && opts=( --prefix "${ROOT}" )
118 +
119 # handle homedir
120 local ehome=${1}; shift
121 if [[ -z ${ehome} ]] ; then
122 @@ -383,15 +414,28 @@ esethome() {
123 # update the home directory
124 case ${CHOST} in
125 *-freebsd*|*-dragonfly*)
126 - pw usermod "${euser}" -d "${ehome}" && return 0
127 + pw usermod "${opts[@]}" "${euser}" -d "${ehome}" && return 0
128 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update home"
129 eerror "There was an error when attempting to update the home directory for ${euser}"
130 eerror "Please update it manually on your system:"
131 eerror "\t pw usermod \"${euser}\" -d \"${ehome}\""
132 ;;
133
134 + *-netbsd*)
135 + if [[ -n "${ROOT}" ]]; then
136 + ewarn "NetBSD's usermod does not support --prefix <dir> option."
137 + ewarn "Please use: \"usermod ${opts[@]} -d ${ehome} ${euser}\" in a chroot"
138 + else
139 + usermod "${opts[@]}" -d "${ehome}" "${euser}" && return 0
140 + [[ $? == 8 ]] && eerror "${euser} is in use, cannot update home"
141 + eerror "There was an error when attempting to update the home directory for ${euser}"
142 + eerror "Please update it manually on your system (as root):"
143 + eerror "\t usermod -d \"${ehome}\" \"${euser}\""
144 + fi
145 + ;;
146 +
147 *)
148 - usermod -d "${ehome}" "${euser}" && return 0
149 + usermod "${opts[@]}" -d "${ehome}" "${euser}" && return 0
150 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update home"
151 eerror "There was an error when attempting to update the home directory for ${euser}"
152 eerror "Please update it manually on your system (as root):"
153 @@ -422,6 +466,10 @@ esetshell() {
154 return 1
155 fi
156
157 + # Handle different ROOT
158 + local opts
159 + [[ -n ${ROOT} ]] && opts=( --prefix "${ROOT}" )
160 +
161 # handle shell
162 local eshell=${1}; shift
163 if [[ -z ${eshell} ]] ; then
164 @@ -444,15 +492,28 @@ esetshell() {
165 # update the shell
166 case ${CHOST} in
167 *-freebsd*|*-dragonfly*)
168 - pw usermod "${euser}" -s "${eshell}" && return 0
169 + pw usermod "${opts[@]}" "${euser}" -s "${eshell}" && return 0
170 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update shell"
171 eerror "There was an error when attempting to update the shell for ${euser}"
172 eerror "Please update it manually on your system:"
173 eerror "\t pw usermod \"${euser}\" -s \"${eshell}\""
174 ;;
175
176 + *-netbsd*)
177 + if [[ -n "${ROOT}" ]]; then
178 + ewarn "NetBSD's usermod does not support --prefix <dir> option."
179 + ewarn "Please use: \"usermod ${opts[@]} -s ${eshell} ${euser}\" in a chroot"
180 + else
181 + usermod "${opts[@]}" -s "${eshell}" "${euser}" && return 0
182 + [[ $? == 8 ]] && eerror "${euser} is in use, cannot update shell"
183 + eerror "There was an error when attempting to update the shell for ${euser}"
184 + eerror "Please update it manually on your system (as root):"
185 + eerror "\t usermod -s \"${eshell}\" \"${euser}\""
186 + fi
187 + ;;
188 +
189 *)
190 - usermod -s "${eshell}" "${euser}" && return 0
191 + usermod "${opts[@]}" -s "${eshell}" "${euser}" && return 0
192 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update shell"
193 eerror "There was an error when attempting to update the shell for ${euser}"
194 eerror "Please update it manually on your system (as root):"
195 @@ -482,6 +543,10 @@ esetcomment() {
196 return 1
197 fi
198
199 + # Handle different ROOT
200 + local opts
201 + [[ -n ${ROOT} ]] && opts=( --prefix "${ROOT}" )
202 +
203 # handle comment
204 local ecomment=${1}; shift
205 if [[ -z ${ecomment} ]] ; then
206 @@ -500,15 +565,28 @@ esetcomment() {
207 # update the comment
208 case ${CHOST} in
209 *-freebsd*|*-dragonfly*)
210 - pw usermod "${euser}" -c "${ecomment}" && return 0
211 + pw usermod "${opts[@]}" "${euser}" -c "${ecomment}" && return 0
212 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update comment"
213 eerror "There was an error when attempting to update the comment for ${euser}"
214 eerror "Please update it manually on your system:"
215 eerror "\t pw usermod \"${euser}\" -c \"${ecomment}\""
216 ;;
217
218 + *-netbsd*)
219 + if [[ -n "${ROOT}" ]]; then
220 + ewarn "NetBSD's usermod does not support --prefix <dir> option."
221 + ewarn "Please use: \"usermod ${opts[@]} -c ${ecomment} ${euser}\" in a chroot"
222 + else
223 + usermod "${opts[@]}" -c "${ecomment}" "${euser}" && return 0
224 + [[ $? == 8 ]] && eerror "${euser} is in use, cannot update shell"
225 + eerror "There was an error when attempting to update the shell for ${euser}"
226 + eerror "Please update it manually on your system (as root):"
227 + eerror "\t usermod -s \"${eshell}\" \"${euser}\""
228 + fi
229 + ;;
230 +
231 *)
232 - usermod -c "${ecomment}" "${euser}" && return 0
233 + usermod "${opts[@]}" -c "${ecomment}" "${euser}" && return 0
234 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update comment"
235 eerror "There was an error when attempting to update the comment for ${euser}"
236 eerror "Please update it manually on your system (as root):"
237 @@ -567,6 +645,9 @@ esetgroups() {
238 elog "Updating groups for user '${euser}' ..."
239 elog " - Groups: ${egroups}"
240
241 + # Handle different ROOT
242 + [[ -n ${ROOT} ]] && opts+=( --prefix "${ROOT}" )
243 +
244 # update the group
245 case ${CHOST} in
246 *-freebsd*|*-dragonfly*)
247 @@ -577,6 +658,19 @@ esetgroups() {
248 eerror "\t pw usermod \"${euser}\" ${opts[*]}"
249 ;;
250
251 + *-netbsd*)
252 + if [[ -n "${ROOT}" ]]; then
253 + ewarn "NetBSD's usermod does not support --prefix <dir> option."
254 + ewarn "Please use: \"usermod ${opts[@]} ${euser}\" in a chroot"
255 + else
256 + usermod "${opts[@]}" "${euser}" && return 0
257 + [[ $? == 8 ]] && eerror "${euser} is in use, cannot update shell"
258 + eerror "There was an error when attempting to update the shell for ${euser}"
259 + eerror "Please update it manually on your system (as root):"
260 + eerror "\t usermod -s \"${eshell}\" \"${euser}\""
261 + fi
262 + ;;
263 +
264 *)
265 usermod "${opts[@]}" "${euser}" && return 0
266 [[ $? == 8 ]] && eerror "${euser} is in use, cannot update groups"
267 --
268 2.35.1