Re: [OE-core] [PATCH 1/3] useradd.bbclass: Fix order of postinst-useradd-*

Piotr Łobacz
2024-02-23T09:57:16Z

Dnia piątek, 23 lutego 2024 10:36:27 CET Chen Qi via lists.openembedded.org
pisze:
> 1. I can see what this patch mainly does is ensuring groups first, then
> user, then groupmems. But the current useradd_preinst, which is called
> by useradd_sysroot has already ensured this. Is that not working?

It is working but all postinst scripts are being called alphabetically which
in some corner cases is causing the failures...

> 2. You're using bb.warn as a method of outputting debugging information,
> which I don't think is appropriate.

> Regards,
> Qi
>
> On 2/22/24 22:53, Eilís 'pidge' Ní Fhlannagáin wrote:
> > From: Piotr Łobacz <p.lobacz@welotec.com>
> >
> > postinst-useradd-* haven't been running in order of dependency.
> >
> > This patch is reworked from Piotr Łobacz's patch and fixes:
> >
> > https://eur04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla
> > .yoctoproject.org%2Fshow_bug.cgi%3Fid%3D15084&data=05%7C02%7Cp.lobacz%40we
> > lotec.com%7C4b378de2bbf8442903fe08dc3452f110%7C25111a7f1d5a4c51a4ca7f8e440
> > 11b39%7C0%7C0%7C638442778043567095%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjA
> > wMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=NtJ
> > L1zoUYxbKRErJ9GBH6cx%2F2UMoSFAT53LLQ8XBzYk%3D&reserved=0
> > https://eur04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzill
> > a.yoctoproject.org%2Fshow_bug.cgi%3Fid%3D13904&data=05%7C02%7Cp.lobacz%40w
> > elotec.com%7C4b378de2bbf8442903fe08dc3452f110%7C25111a7f1d5a4c51a4ca7f8e44
> > 011b39%7C0%7C0%7C638442778043575031%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLj
> > AwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=wY
> > jvmpaXqsu8GzyGrYJflJA8oNxniQXkDKZ8GxKRnXY%3D&reserved=0
> >
> > It ensures that groups, users and groupmems are all run in the correct
> > order.
> >
> > Signed-off-by: Eilís 'pidge' Ní Fhlannagáin <pidge@baylibre.com>
> > ---
> >
> > meta/classes-global/staging.bbclass | 7 +--
> > meta/classes/useradd.bbclass | 72 ++++++++++++++++++-----------
> > 2 files changed, 49 insertions(+), 30 deletions(-)
> >
> > diff --git a/meta/classes-global/staging.bbclass
> > b/meta/classes-global/staging.bbclass index ab3e1d71b5..6c21510377 100644
> > --- a/meta/classes-global/staging.bbclass
> > +++ b/meta/classes-global/staging.bbclass
> >
> > @@ -245,8 +245,9 @@ def staging_populate_sysroot_dir(targetsysroot,
nativesysroot, native, d):
> > continue
> >
> > staging_processfixme(fixme, targetdir, targetsysroot, nativesysroot,
> > d)
> >
> > - for p in postinsts:
> > - bb.note("Running postinst {}, output:\n{}".format(p,
> > subprocess.check_output(p, shell=True, stderr=subprocess.STDOUT))) +
> > bb.warn(sorted(postinsts))
> > + for p in sorted(postinsts):
> > + bb.warn("Running postinst {}, output:\n{}".format(p,
> > subprocess.check_output(p, shell=True, stderr=subprocess.STDOUT)))>
> > #
> > # Manifests here are complicated. The main sysroot area has the unpacked
> > sstate>
> > @@ -629,7 +630,7 @@ python extend_recipe_sysroot() {
> >
> > for f in fixme:
> > staging_processfixme(fixme[f], f, recipesysroot,
> > recipesysrootnative, d)
> >
> > - for p in postinsts:
> >
> > + for p in sorted(postinsts):
> > bb.note("Running postinst {}, output:\n{}".format(p,
> > subprocess.check_output(p, shell=True,
> > stderr=subprocess.STDOUT)))>
> > for dep in manifests:
> > diff --git a/meta/classes/useradd.bbclass b/meta/classes/useradd.bbclass
> > index a58f8287c9..924eeadf9c 100644
> > --- a/meta/classes/useradd.bbclass
> > +++ b/meta/classes/useradd.bbclass
> > @@ -103,6 +103,18 @@ fi
> >
> > }
> >
> > useradd_sysroot () {
> >
> > + user_group_groupmems_add_sysroot user
> > +}
> > +
> > +groupadd_sysroot () {
> > + user_group_groupmems_add_sysroot group
> > +}
> > +
> > +groupmemsadd_sysroot () {
> > + user_group_groupmems_add_sysroot groupmems
> > +}
> > +
> > +user_group_groupmems_add_sysroot () {
> >
> > # Pseudo may (do_prepare_recipe_sysroot) or may not
> > (do_populate_sysroot_setscene) be running # at this point so
we're
> > explicit about the environment so pseudo can load if # not
already
> > present.
> >
> > @@ -130,10 +142,19 @@ useradd_sysroot () {
> >
> > exit 0
> >
> > fi
> >
> > - # Add groups and users defined for all recipe packages
> > - GROUPADD_PARAM="${@get_all_cmd_params(d, 'groupadd')}"
> > - USERADD_PARAM="${@get_all_cmd_params(d, 'useradd')}"
> > - GROUPMEMS_PARAM="${@get_all_cmd_params(d, 'groupmems')}"
> > + # Add groups and users defined for all recipe packages
> > + if test "x$1" = "xgroup"; then
> > + GROUPADD_PARAM="${@get_all_cmd_params(d, 'groupadd')}"
> > + fi
> > + if test "x$1" = "xuser"; then
> > + USERADD_PARAM="${@get_all_cmd_params(d, 'useradd')}"
> > + fi
> > + if test "x$1" = "xgroupmems"; then
> > + GROUPMEMS_PARAM="${@get_all_cmd_params(d,
'groupmems')}"
> > + fi
> > + if test "x$1" = "x"; then
> > + bbwarn "missing type of passwd db action"
> > + fi
> >
> > # Tell the system to use the environment vars
> > UA_SYSROOT=1
> >
> > @@ -148,29 +169,26 @@ useradd_sysroot () {
> >
> > EXTRA_STAGING_FIXMES += "PSEUDO_SYSROOT PSEUDO_LOCALSTATEDIR LOGFIFO"
> >
> > python useradd_sysroot_sstate () {
> >
> > - scriptfile = None
> > - task = d.getVar("BB_CURRENTTASK")
> > - if task == "package_setscene":
> > - bb.build.exec_func("useradd_sysroot", d)
> > - elif task == "prepare_recipe_sysroot":
> > - # Used to update this recipe's own sysroot so the user/groups are
> > available to do_install -
> > - # If do_populate_sysroot is triggered and we write the file here,
> > there would be an overlapping - # files. See
> > usergrouptests.UserGroupTests.test_add_task_between_p_sysroot_and_package
> > - scriptfile =
> > d.expand("${RECIPE_SYSROOT}${bindir}/postinst-useradd-${PN}-recipedebug")
> > -
> > - bb.build.exec_func("useradd_sysroot", d)
> > - elif task == "populate_sysroot":
> > - # Used when installed in dependent task sysroots
> > - scriptfile =
> > d.expand("${SYSROOT_DESTDIR}${bindir}/postinst-useradd-${PN}") -
> > - if scriptfile:
> > - bb.utils.mkdirhier(os.path.dirname(scriptfile))
> > - with open(scriptfile, 'w') as script:
> > - script.write("#!/bin/sh -e\n")
> > - bb.data.emit_func("useradd_sysroot", script, d)
> > - script.write("useradd_sysroot\n")
> > - os.chmod(scriptfile, 0o755)
> > + for type, sort_prefix in [("group", "01"), ("user", "02"),
> > ("groupmems", "03")]: + scriptfile = None
> > + task = d.getVar("BB_CURRENTTASK")
> > + if task == "package_setscene":
> > + bb.build.exec_func(f"{type}add_sysroot", d)
> > + elif task == "prepare_recipe_sysroot":
> > + # Used to update this recipe's own sysroot so the user/groups
> > are available to do_install + scriptfile =
> > d.expand("${RECIPE_SYSROOT}${bindir}/"
> > f"postinst-useradd-{sort_prefix}{type}" "-${PN}") +
> > bb.build.exec_func(f"{type}add_sysroot", d)
> > + elif task == "populate_sysroot":
> > + # Used when installed in dependent task sysroots
> > + scriptfile = d.expand("${SYSROOT_DESTDIR}${bindir}/"
> > f"postinst-useradd-{sort_prefix}{type}" "-${PN}") +
> > + if scriptfile:
> > + bb.utils.mkdirhier(os.path.dirname(scriptfile))
> > + with open(scriptfile, 'w') as script:
> > + script.write("#!/bin/sh\n")
> > + bb.data.emit_func(f"{type}add_sysroot", script, d)
> > + script.write(f"{type}add_sysroot\n")
> > + os.chmod(scriptfile, 0o755)
> >
> > }
> >
> > do_prepare_recipe_sysroot[postfuncs] += "${SYSROOTFUNC}"

BR
Piotr