summaryrefslogtreecommitdiffstats
path: root/meta/classes/useradd.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'meta/classes/useradd.bbclass')
-rw-r--r--meta/classes/useradd.bbclass105
1 files changed, 70 insertions, 35 deletions
diff --git a/meta/classes/useradd.bbclass b/meta/classes/useradd.bbclass
index e5f3ba24f9..16a65ac323 100644
--- a/meta/classes/useradd.bbclass
+++ b/meta/classes/useradd.bbclass
@@ -1,9 +1,15 @@
1#
2# Copyright OpenEmbedded Contributors
3#
4# SPDX-License-Identifier: MIT
5#
6
1inherit useradd_base 7inherit useradd_base
2 8
3# base-passwd-cross provides the default passwd and group files in the 9# base-passwd-cross provides the default passwd and group files in the
4# target sysroot, and shadow -native and -sysroot provide the utilities 10# target sysroot, and shadow -native and -sysroot provide the utilities
5# and support files needed to add and modify user and group accounts 11# and support files needed to add and modify user and group accounts
6DEPENDS_append_class-target = " base-files shadow-native shadow-sysroot shadow base-passwd" 12DEPENDS:append:class-target = " base-files shadow-native shadow-sysroot shadow base-passwd"
7PACKAGE_WRITE_DEPS += "shadow-native" 13PACKAGE_WRITE_DEPS += "shadow-native"
8 14
9# This preinstall function can be run in four different contexts: 15# This preinstall function can be run in four different contexts:
@@ -97,6 +103,18 @@ fi
97} 103}
98 104
99useradd_sysroot () { 105useradd_sysroot () {
106 user_group_groupmems_add_sysroot user
107}
108
109groupadd_sysroot () {
110 user_group_groupmems_add_sysroot group
111}
112
113groupmemsadd_sysroot () {
114 user_group_groupmems_add_sysroot groupmems
115}
116
117user_group_groupmems_add_sysroot () {
100 # Pseudo may (do_prepare_recipe_sysroot) or may not (do_populate_sysroot_setscene) be running 118 # Pseudo may (do_prepare_recipe_sysroot) or may not (do_populate_sysroot_setscene) be running
101 # at this point so we're explicit about the environment so pseudo can load if 119 # at this point so we're explicit about the environment so pseudo can load if
102 # not already present. 120 # not already present.
@@ -125,9 +143,15 @@ useradd_sysroot () {
125 fi 143 fi
126 144
127 # Add groups and users defined for all recipe packages 145 # Add groups and users defined for all recipe packages
128 GROUPADD_PARAM="${@get_all_cmd_params(d, 'groupadd')}" 146 if test "$1" = "group"; then
129 USERADD_PARAM="${@get_all_cmd_params(d, 'useradd')}" 147 GROUPADD_PARAM="${@get_all_cmd_params(d, 'groupadd')}"
130 GROUPMEMS_PARAM="${@get_all_cmd_params(d, 'groupmems')}" 148 elif test "$1" = "user"; then
149 USERADD_PARAM="${@get_all_cmd_params(d, 'useradd')}"
150 elif test "$1" = "groupmems"; then
151 GROUPMEMS_PARAM="${@get_all_cmd_params(d, 'groupmems')}"
152 elif test "x$1" = "x"; then
153 bbwarn "missing type of passwd db action"
154 fi
131 155
132 # Tell the system to use the environment vars 156 # Tell the system to use the environment vars
133 UA_SYSROOT=1 157 UA_SYSROOT=1
@@ -142,38 +166,45 @@ useradd_sysroot () {
142EXTRA_STAGING_FIXMES += "PSEUDO_SYSROOT PSEUDO_LOCALSTATEDIR LOGFIFO" 166EXTRA_STAGING_FIXMES += "PSEUDO_SYSROOT PSEUDO_LOCALSTATEDIR LOGFIFO"
143 167
144python useradd_sysroot_sstate () { 168python useradd_sysroot_sstate () {
145 scriptfile = None 169 for type, sort_prefix in [("group", "01"), ("user", "02"), ("groupmems", "03")]:
146 task = d.getVar("BB_CURRENTTASK") 170 scriptfile = None
147 if task == "package_setscene": 171 task = d.getVar("BB_CURRENTTASK")
148 bb.build.exec_func("useradd_sysroot", d) 172 if task == "package_setscene":
149 elif task == "prepare_recipe_sysroot": 173 bb.build.exec_func(type + "add_sysroot", d)
150 # Used to update this recipe's own sysroot so the user/groups are available to do_install 174 elif task == "prepare_recipe_sysroot":
151 scriptfile = d.expand("${RECIPE_SYSROOT}${bindir}/postinst-useradd-${PN}") 175 # Used to update this recipe's own sysroot so the user/groups are available to do_install
152 bb.build.exec_func("useradd_sysroot", d) 176
153 elif task == "populate_sysroot": 177 # If do_populate_sysroot is triggered and we write the file here, there would be an overlapping
154 # Used when installed in dependent task sysroots 178 # files. See usergrouptests.UserGroupTests.test_add_task_between_p_sysroot_and_package
155 scriptfile = d.expand("${SYSROOT_DESTDIR}${bindir}/postinst-useradd-${PN}") 179 scriptfile = d.expand("${RECIPE_SYSROOT}${bindir}/postinst-useradd-" + sort_prefix + type + "-${PN}-recipedebug")
156 180
157 if scriptfile: 181 bb.build.exec_func(type + "add_sysroot", d)
158 bb.utils.mkdirhier(os.path.dirname(scriptfile)) 182 elif task == "populate_sysroot":
159 with open(scriptfile, 'w') as script: 183 # Used when installed in dependent task sysroots
160 script.write("#!/bin/sh\n") 184 scriptfile = d.expand("${SYSROOT_DESTDIR}${bindir}/postinst-useradd-" + sort_prefix + type + "-${PN}")
161 bb.data.emit_func("useradd_sysroot", script, d) 185
162 script.write("useradd_sysroot\n") 186 if scriptfile:
163 os.chmod(scriptfile, 0o755) 187 bb.utils.mkdirhier(os.path.dirname(scriptfile))
188 with open(scriptfile, 'w') as script:
189 script.write("#!/bin/sh -e\n")
190 bb.data.emit_func(type + "add_sysroot", script, d)
191 script.write(type + "add_sysroot\n")
192 os.chmod(scriptfile, 0o755)
164} 193}
165 194
166do_prepare_recipe_sysroot[postfuncs] += "${SYSROOTFUNC}" 195do_prepare_recipe_sysroot[postfuncs] += "${SYSROOTFUNC}"
167SYSROOTFUNC_class-target = "useradd_sysroot_sstate" 196SYSROOTFUNC:class-target = "useradd_sysroot_sstate"
168SYSROOTFUNC = "" 197SYSROOTFUNC = ""
169 198
170SYSROOT_PREPROCESS_FUNCS += "${SYSROOTFUNC}" 199SYSROOT_PREPROCESS_FUNCS += "${SYSROOTFUNC}"
171 200
172SSTATEPREINSTFUNCS_append_class-target = " useradd_sysroot_sstate" 201SSTATEPREINSTFUNCS:append:class-target = " useradd_sysroot_sstate"
173 202
203USERADD_DEPENDS ??= ""
204DEPENDS += "${USERADD_DEPENDS}"
174do_package_setscene[depends] += "${USERADDSETSCENEDEPS}" 205do_package_setscene[depends] += "${USERADDSETSCENEDEPS}"
175do_populate_sysroot_setscene[depends] += "${USERADDSETSCENEDEPS}" 206do_populate_sysroot_setscene[depends] += "${USERADDSETSCENEDEPS}"
176USERADDSETSCENEDEPS_class-target = "${MLPREFIX}base-passwd:do_populate_sysroot_setscene pseudo-native:do_populate_sysroot_setscene shadow-native:do_populate_sysroot_setscene ${MLPREFIX}shadow-sysroot:do_populate_sysroot_setscene" 207USERADDSETSCENEDEPS:class-target = "${MLPREFIX}base-passwd:do_populate_sysroot_setscene pseudo-native:do_populate_sysroot_setscene shadow-native:do_populate_sysroot_setscene ${MLPREFIX}shadow-sysroot:do_populate_sysroot_setscene ${@' '.join(['%s:do_populate_sysroot_setscene' % pkg for pkg in d.getVar("USERADD_DEPENDS").split()])}"
177USERADDSETSCENEDEPS = "" 208USERADDSETSCENEDEPS = ""
178 209
179# Recipe parse-time sanity checks 210# Recipe parse-time sanity checks
@@ -184,8 +215,8 @@ def update_useradd_after_parse(d):
184 bb.fatal("%s inherits useradd but doesn't set USERADD_PACKAGES" % d.getVar('FILE', False)) 215 bb.fatal("%s inherits useradd but doesn't set USERADD_PACKAGES" % d.getVar('FILE', False))
185 216
186 for pkg in useradd_packages.split(): 217 for pkg in useradd_packages.split():
187 d.appendVarFlag("do_populate_sysroot", "vardeps", "USERADD_PARAM_%s GROUPADD_PARAM_%s GROUPMEMS_PARAM_%s" % (pkg, pkg, pkg)) 218 d.appendVarFlag("do_populate_sysroot", "vardeps", " USERADD_PARAM:%s GROUPADD_PARAM:%s GROUPMEMS_PARAM:%s" % (pkg, pkg, pkg))
188 if not d.getVar('USERADD_PARAM_%s' % pkg) and not d.getVar('GROUPADD_PARAM_%s' % pkg) and not d.getVar('GROUPMEMS_PARAM_%s' % pkg): 219 if not d.getVar('USERADD_PARAM:%s' % pkg) and not d.getVar('GROUPADD_PARAM:%s' % pkg) and not d.getVar('GROUPMEMS_PARAM:%s' % pkg):
189 bb.fatal("%s inherits useradd but doesn't set USERADD_PARAM, GROUPADD_PARAM or GROUPMEMS_PARAM for package %s" % (d.getVar('FILE', False), pkg)) 220 bb.fatal("%s inherits useradd but doesn't set USERADD_PARAM, GROUPADD_PARAM or GROUPMEMS_PARAM for package %s" % (d.getVar('FILE', False), pkg))
190 221
191python __anonymous() { 222python __anonymous() {
@@ -199,7 +230,7 @@ python __anonymous() {
199def get_all_cmd_params(d, cmd_type): 230def get_all_cmd_params(d, cmd_type):
200 import string 231 import string
201 232
202 param_type = cmd_type.upper() + "_PARAM_%s" 233 param_type = cmd_type.upper() + "_PARAM:%s"
203 params = [] 234 params = []
204 235
205 useradd_packages = d.getVar('USERADD_PACKAGES') or "" 236 useradd_packages = d.getVar('USERADD_PACKAGES') or ""
@@ -211,7 +242,7 @@ def get_all_cmd_params(d, cmd_type):
211 return "; ".join(params) 242 return "; ".join(params)
212 243
213# Adds the preinst script into generated packages 244# Adds the preinst script into generated packages
214fakeroot python populate_packages_prepend () { 245fakeroot python populate_packages:prepend () {
215 def update_useradd_package(pkg): 246 def update_useradd_package(pkg):
216 bb.debug(1, 'adding user/group calls to preinst for %s' % pkg) 247 bb.debug(1, 'adding user/group calls to preinst for %s' % pkg)
217 248
@@ -220,7 +251,7 @@ fakeroot python populate_packages_prepend () {
220 required to execute on the target. Not doing so may cause 251 required to execute on the target. Not doing so may cause
221 useradd preinst to be invoked twice, causing unwanted warnings. 252 useradd preinst to be invoked twice, causing unwanted warnings.
222 """ 253 """
223 preinst = d.getVar('pkg_preinst_%s' % pkg) or d.getVar('pkg_preinst') 254 preinst = d.getVar('pkg_preinst:%s' % pkg) or d.getVar('pkg_preinst')
224 if not preinst: 255 if not preinst:
225 preinst = '#!/bin/sh\n' 256 preinst = '#!/bin/sh\n'
226 preinst += 'bbnote () {\n\techo "NOTE: $*"\n}\n' 257 preinst += 'bbnote () {\n\techo "NOTE: $*"\n}\n'
@@ -230,15 +261,19 @@ fakeroot python populate_packages_prepend () {
230 preinst += 'perform_useradd () {\n%s}\n' % d.getVar('perform_useradd') 261 preinst += 'perform_useradd () {\n%s}\n' % d.getVar('perform_useradd')
231 preinst += 'perform_groupmems () {\n%s}\n' % d.getVar('perform_groupmems') 262 preinst += 'perform_groupmems () {\n%s}\n' % d.getVar('perform_groupmems')
232 preinst += d.getVar('useradd_preinst') 263 preinst += d.getVar('useradd_preinst')
233 d.setVar('pkg_preinst_%s' % pkg, preinst) 264 # Expand out the *_PARAM variables to the package specific versions
265 for rep in ["GROUPADD_PARAM", "USERADD_PARAM", "GROUPMEMS_PARAM"]:
266 val = d.getVar(rep + ":" + pkg) or ""
267 preinst = preinst.replace("${" + rep + "}", val)
268 d.setVar('pkg_preinst:%s' % pkg, preinst)
234 269
235 # RDEPENDS setup 270 # RDEPENDS setup
236 rdepends = d.getVar("RDEPENDS_%s" % pkg) or "" 271 rdepends = d.getVar("RDEPENDS:%s" % pkg) or ""
237 rdepends += ' ' + d.getVar('MLPREFIX', False) + 'base-passwd' 272 rdepends += ' ' + d.getVar('MLPREFIX', False) + 'base-passwd'
238 rdepends += ' ' + d.getVar('MLPREFIX', False) + 'shadow' 273 rdepends += ' ' + d.getVar('MLPREFIX', False) + 'shadow'
239 # base-files is where the default /etc/skel is packaged 274 # base-files is where the default /etc/skel is packaged
240 rdepends += ' ' + d.getVar('MLPREFIX', False) + 'base-files' 275 rdepends += ' ' + d.getVar('MLPREFIX', False) + 'base-files'
241 d.setVar("RDEPENDS_%s" % pkg, rdepends) 276 d.setVar("RDEPENDS:%s" % pkg, rdepends)
242 277
243 # Add the user/group preinstall scripts and RDEPENDS requirements 278 # Add the user/group preinstall scripts and RDEPENDS requirements
244 # to packages specified by USERADD_PACKAGES 279 # to packages specified by USERADD_PACKAGES
@@ -252,4 +287,4 @@ fakeroot python populate_packages_prepend () {
252# Use the following to extend the useradd with custom functions 287# Use the following to extend the useradd with custom functions
253USERADDEXTENSION ?= "" 288USERADDEXTENSION ?= ""
254 289
255inherit ${USERADDEXTENSION} 290inherit_defer ${USERADDEXTENSION}