summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-04-12 18:29:09 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-04-14 09:47:08 +0100
commitb5c383074ae4e09b63f43066b25b5ccb0df00276 (patch)
treea7450a53323b00909bc8ae9b77b23dd3f473422b /meta
parent053e545b9d4d7985757bd79019e53d59d5c11eea (diff)
downloadpoky-b5c383074ae4e09b63f43066b25b5ccb0df00276.tar.gz
base-passwd/useradd: Various improvements to useradd with RSS
Currently there are multiple issues with useradd: * If base-passwd rebuilds, it wipes out recipe specific user/group additions to sysroots and causes errors * If recipe A adds a user and recipe B depends on A, it can't see any of the users/groups A adds. This patch changes base-passwd so it always works as a postinst script within the sysroot and copies in the master files, then runs any postinst-useradd-* scripts afterwards to add additional user/groups. The postinst-useradd-* scripts are tweaked so that if /etc/passwd doesn't exist they just exit, knowning they'll be executed later. We also add a dummy entry to the dummy passwd file from pseudo so we can avoid this too. There is a problem where if recipe A adds a user and recipe B depends on A but doesn't care about users, it may not have a dependency on the useradd/groupadd tools which would therefore not be available in B's sysroot. We therefore also tweak postinst-useradd-* scripts so that if the tools aren't present we simply don't add users. If you need the users, you add a dependency on the tools in the recipe and they'll be added. We add postinst-* to SSTATE_SCAN_FILES since almost any postinst script of this kind is going to need relocation help. We also ensure that the postinst-useradd script is written into the sstate object as the current script was only being added in a recipe local way. Thanks to Peter Kjellerstedt <pkj@axis.com> and Patrick Ohly for some pieces of this patch. [Yocto #11124] (From OE-Core rev: 1b5afaf437f7a1107d4edca8eeb668b9618a5488) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/sstate.bbclass2
-rw-r--r--meta/classes/useradd.bbclass27
-rw-r--r--meta/recipes-core/base-passwd/base-passwd_3.5.29.bb28
-rw-r--r--meta/recipes-devtools/pseudo/files/fallback-passwd1
4 files changed, 51 insertions, 7 deletions
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index 5b66c011e6..e50a38597d 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -31,7 +31,7 @@ SSTATE_DUPWHITELIST += "${STAGING_ETCDIR_NATIVE}/sgml ${STAGING_DATADIR_NATIVE}/
31# Archive the sources for many architectures in one deploy folder 31# Archive the sources for many architectures in one deploy folder
32SSTATE_DUPWHITELIST += "${DEPLOY_DIR_SRC}" 32SSTATE_DUPWHITELIST += "${DEPLOY_DIR_SRC}"
33 33
34SSTATE_SCAN_FILES ?= "*.la *-config *_config" 34SSTATE_SCAN_FILES ?= "*.la *-config *_config postinst-*"
35SSTATE_SCAN_CMD ??= 'find ${SSTATE_BUILDDIR} \( -name "${@"\" -o -name \"".join(d.getVar("SSTATE_SCAN_FILES").split())}" \) -type f' 35SSTATE_SCAN_CMD ??= 'find ${SSTATE_BUILDDIR} \( -name "${@"\" -o -name \"".join(d.getVar("SSTATE_SCAN_FILES").split())}" \) -type f'
36SSTATE_SCAN_CMD_NATIVE ??= 'grep -Irl -e ${RECIPE_SYSROOT} -e ${RECIPE_SYSROOT_NATIVE} ${SSTATE_BUILDDIR}' 36SSTATE_SCAN_CMD_NATIVE ??= 'grep -Irl -e ${RECIPE_SYSROOT} -e ${RECIPE_SYSROOT_NATIVE} ${SSTATE_BUILDDIR}'
37 37
diff --git a/meta/classes/useradd.bbclass b/meta/classes/useradd.bbclass
index 1f7afa4f8e..4373677bd6 100644
--- a/meta/classes/useradd.bbclass
+++ b/meta/classes/useradd.bbclass
@@ -106,6 +106,21 @@ useradd_sysroot () {
106 # before do_prepare_recipe_sysroot 106 # before do_prepare_recipe_sysroot
107 D=${STAGING_DIR_TARGET} 107 D=${STAGING_DIR_TARGET}
108 108
109 # base-passwd's postinst may not have run yet in which case we'll get called later, just exit.
110 # Beware that in some cases we might see the fake pseudo passwd here, in which case we also must
111 # exit.
112 if [ ! -f $D${sysconfdir}/passwd ] ||
113 grep -q this-is-the-pseudo-passwd $D${sysconfdir}/passwd; then
114 exit 0
115 fi
116
117 # It is also possible we may be in a recipe which doesn't have useradd dependencies and hence the
118 # useradd/groupadd tools are unavailable. If there is no dependency, we assume we don't want to
119 # create users in the sysroot
120 if ! command -v useradd; then
121 exit 0
122 fi
123
109 # Add groups and users defined for all recipe packages 124 # Add groups and users defined for all recipe packages
110 GROUPADD_PARAM="${@get_all_cmd_params(d, 'groupadd')}" 125 GROUPADD_PARAM="${@get_all_cmd_params(d, 'groupadd')}"
111 USERADD_PARAM="${@get_all_cmd_params(d, 'useradd')}" 126 USERADD_PARAM="${@get_all_cmd_params(d, 'useradd')}"
@@ -122,6 +137,7 @@ python useradd_sysroot_sstate () {
122 if task == "package_setscene": 137 if task == "package_setscene":
123 bb.build.exec_func("useradd_sysroot", d) 138 bb.build.exec_func("useradd_sysroot", d)
124 elif task == "prepare_recipe_sysroot": 139 elif task == "prepare_recipe_sysroot":
140 # Used to update this recipe's own sysroot so the user/groups are available to do_install
125 scriptfile = d.expand("${RECIPE_SYSROOT}${bindir}/postinst-useradd-${PN}") 141 scriptfile = d.expand("${RECIPE_SYSROOT}${bindir}/postinst-useradd-${PN}")
126 bb.utils.mkdirhier(os.path.dirname(scriptfile)) 142 bb.utils.mkdirhier(os.path.dirname(scriptfile))
127 with open(scriptfile, 'w') as script: 143 with open(scriptfile, 'w') as script:
@@ -130,12 +146,23 @@ python useradd_sysroot_sstate () {
130 script.write("useradd_sysroot\n") 146 script.write("useradd_sysroot\n")
131 os.chmod(scriptfile, 0o755) 147 os.chmod(scriptfile, 0o755)
132 bb.build.exec_func("useradd_sysroot", d) 148 bb.build.exec_func("useradd_sysroot", d)
149 elif task == "populate_sysroot":
150 # Used when installed in dependent task sysroots
151 scriptfile = d.expand("${SYSROOT_DESTDIR}${bindir}/postinst-useradd-${PN}")
152 bb.utils.mkdirhier(os.path.dirname(scriptfile))
153 with open(scriptfile, 'w') as script:
154 script.write("#!/bin/sh\n")
155 bb.data.emit_func("useradd_sysroot", script, d)
156 script.write("useradd_sysroot\n")
157 os.chmod(scriptfile, 0o755)
133} 158}
134 159
135do_prepare_recipe_sysroot[postfuncs] += "${SYSROOTFUNC}" 160do_prepare_recipe_sysroot[postfuncs] += "${SYSROOTFUNC}"
136SYSROOTFUNC_class-target = "useradd_sysroot_sstate" 161SYSROOTFUNC_class-target = "useradd_sysroot_sstate"
137SYSROOTFUNC = "" 162SYSROOTFUNC = ""
138 163
164SYSROOT_PREPROCESS_FUNCS += "${SYSROOTFUNC}"
165
139SSTATEPREINSTFUNCS_append_class-target = " useradd_sysroot_sstate" 166SSTATEPREINSTFUNCS_append_class-target = " useradd_sysroot_sstate"
140 167
141do_package_setscene[depends] += "${USERADDSETSCENEDEPS}" 168do_package_setscene[depends] += "${USERADDSETSCENEDEPS}"
diff --git a/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb b/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb
index e43bc0a007..c6be1c1d08 100644
--- a/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb
+++ b/meta/recipes-core/base-passwd/base-passwd_3.5.29.bb
@@ -43,16 +43,32 @@ do_install () {
43 install -p -m 644 ${S}/debian/copyright ${D}${docdir}/${BPN}/ 43 install -p -m 644 ${S}/debian/copyright ${D}${docdir}/${BPN}/
44} 44}
45 45
46basepasswd_sysroot_postinst() {
47#!/bin/sh
48
49# Install passwd.master and group.master to sysconfdir
50install -d -m 755 ${STAGING_DIR_TARGET}${sysconfdir}
51for i in passwd group; do
52 install -p -m 644 ${STAGING_DIR_TARGET}${datadir}/base-passwd/\$i.master \
53 ${STAGING_DIR_TARGET}${sysconfdir}/\$i
54done
55
56# Run any useradd postinsts
57for script in ${STAGING_DIR_TARGET}${bindir}/postinst-useradd-*; do
58 if [ -f \$script ]; then
59 \$script
60 fi
61done
62}
63
46SYSROOT_DIRS += "${sysconfdir}" 64SYSROOT_DIRS += "${sysconfdir}"
47SYSROOT_PREPROCESS_FUNCS += "base_passwd_tweaksysroot" 65SYSROOT_PREPROCESS_FUNCS += "base_passwd_tweaksysroot"
48 66
49base_passwd_tweaksysroot () { 67base_passwd_tweaksysroot () {
50 # Install passwd.master and group.master to sysconfdir 68 mkdir -p ${SYSROOT_DESTDIR}${bindir}
51 install -d -m 755 ${SYSROOT_DESTDIR}${sysconfdir} 69 dest=${SYSROOT_DESTDIR}${bindir}/postinst-${PN}
52 for i in passwd group; do 70 echo "${basepasswd_sysroot_postinst}" > $dest
53 install -p -m 644 ${SYSROOT_DESTDIR}${datadir}/base-passwd/$i.master \ 71 chmod 0755 $dest
54 ${SYSROOT_DESTDIR}${sysconfdir}/$i
55 done
56} 72}
57 73
58python populate_packages_prepend() { 74python populate_packages_prepend() {
diff --git a/meta/recipes-devtools/pseudo/files/fallback-passwd b/meta/recipes-devtools/pseudo/files/fallback-passwd
index 0889c5704c..08611baaf4 100644
--- a/meta/recipes-devtools/pseudo/files/fallback-passwd
+++ b/meta/recipes-devtools/pseudo/files/fallback-passwd
@@ -1,2 +1,3 @@
1root::0:0:root:/home/root:/bin/sh 1root::0:0:root:/home/root:/bin/sh
2pseudopasswd:*:1:1:this-is-the-pseudo-passwd:/nonexistent:/bin/sh
2nobody:*:65534:65534:nobody:/nonexistent:/bin/sh 3nobody:*:65534:65534:nobody:/nonexistent:/bin/sh