[RFC,v2] fix: rebuild rootfs on change of USERS

Message ID 20250411101602.1656234-1-clara.kowalsky@siemens.com
State New
Headers show
Series [RFC,v2] fix: rebuild rootfs on change of USERS | expand

Commit Message

Clara Kowalsky April 11, 2025, 10:16 a.m. UTC
In case a change to the Isar created users is done, this currently
only re-triggers the do_rootfs_postprocess task. This task changes the
rootfs (e.g. home dirs are moved) and by that needs to operate on a
clean one. Otherwise old homedirs might still remain in the final rootfs
or move operations are not possible.

We fix this by ensuring that the do_rootfs_install task is executed
whenever a change to USERS is done. By that, we enter the
do_rootfs_postinstall with a clean rootfs.

Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com>
---
 meta/classes/image-account-extension.bbclass | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

Comments

Clara Kowalsky April 11, 2025, 10:18 a.m. UTC | #1
On 11.04.25 12:16, Clara Kowalsky wrote:
> In case a change to the Isar created users is done, this currently
> only re-triggers the do_rootfs_postprocess task. This task changes the
> rootfs (e.g. home dirs are moved) and by that needs to operate on a
> clean one. Otherwise old homedirs might still remain in the final rootfs
> or move operations are not possible.
> 
> We fix this by ensuring that the do_rootfs_install task is executed
> whenever a change to USERS is done. By that, we enter the
> do_rootfs_postinstall with a clean rootfs.
> 
> Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com>
> ---
>   meta/classes/image-account-extension.bbclass | 14 +++++++++-----
>   1 file changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/meta/classes/image-account-extension.bbclass b/meta/classes/image-account-extension.bbclass
> index ea956cd5..1c664be0 100644
> --- a/meta/classes/image-account-extension.bbclass
> +++ b/meta/classes/image-account-extension.bbclass
> @@ -11,11 +11,11 @@ GROUPS ??= ""
>   python() {
>       for entry in (d.getVar("GROUPS") or "").split():
>           group_entry = "GROUP_{}".format(entry)
> -        d.appendVarFlag("image_postprocess_accounts", "vardeps", " {}".format(group_entry))
> +        d.appendVarFlag("image_postprocess_groups", "vardeps", " {}".format(group_entry))
>   
>       for entry in (d.getVar("USERS") or "").split():
>           user_entry = "USER_{}".format(entry)
> -        d.appendVarFlag("image_postprocess_accounts", "vardeps", " {}".format(user_entry))
> +        d.appendVarFlag("image_postprocess_users", "vardeps", " {}".format(user_entry))
>   }
>   
>   def image_create_groups(d: "DataSmart") -> None:
> @@ -137,10 +137,14 @@ def image_create_users(d: "DataSmart") -> None:
>           if "force-passwd-change" in flags:
>               bb.process.run([*chroot, "/usr/bin/passwd", "--expire", entry])
>   
> +ROOTFS_POSTPROCESS_COMMAND += "image_postprocess_groups"
> +ROOTFS_INSTALL_COMMAND += "image_postprocess_users"
> +image_postprocess_groups[vardeps] += "GROUPS"
> +image_postprocess_users[vardeps] += "USERS"
>   
> -ROOTFS_POSTPROCESS_COMMAND += "image_postprocess_accounts"
> -image_postprocess_accounts[vardeps] += "USERS GROUPS"
> -python image_postprocess_accounts() {
> +python image_postprocess_groups() {
>       image_create_groups(d)
> +}
> +python image_postprocess_users() {
>       image_create_users(d)
>   }

This is still not ideal, as old home directories are not removed when 
removing the create-home flag or setting another directory via 
USER_foo[home] = <x>.
BR,
Clara
Felix Moessbauer April 11, 2025, 11:04 a.m. UTC | #2
On Fri, 2025-04-11 at 12:18 +0200, Clara Kowalsky wrote:
> 
> 
> On 11.04.25 12:16, Clara Kowalsky wrote:
> > In case a change to the Isar created users is done, this currently
> > only re-triggers the do_rootfs_postprocess task. This task changes
> > the
> > rootfs (e.g. home dirs are moved) and by that needs to operate on a
> > clean one. Otherwise old homedirs might still remain in the final
> > rootfs
> > or move operations are not possible.
> > 
> > We fix this by ensuring that the do_rootfs_install task is executed
> > whenever a change to USERS is done. By that, we enter the
> > do_rootfs_postinstall with a clean rootfs.
> > 
> > Signed-off-by: Clara Kowalsky <clara.kowalsky@siemens.com>
> > ---
> >   meta/classes/image-account-extension.bbclass | 14 +++++++++-----
> >   1 file changed, 9 insertions(+), 5 deletions(-)
> > 
> > diff --git a/meta/classes/image-account-extension.bbclass
> > b/meta/classes/image-account-extension.bbclass
> > index ea956cd5..1c664be0 100644
> > --- a/meta/classes/image-account-extension.bbclass
> > +++ b/meta/classes/image-account-extension.bbclass
> > @@ -11,11 +11,11 @@ GROUPS ??= ""
> >   python() {
> >       for entry in (d.getVar("GROUPS") or "").split():
> >           group_entry = "GROUP_{}".format(entry)
> > -        d.appendVarFlag("image_postprocess_accounts", "vardeps", "
> > {}".format(group_entry))
> > +        d.appendVarFlag("image_postprocess_groups", "vardeps", "
> > {}".format(group_entry))
> >   
> >       for entry in (d.getVar("USERS") or "").split():
> >           user_entry = "USER_{}".format(entry)
> > -        d.appendVarFlag("image_postprocess_accounts", "vardeps", "
> > {}".format(user_entry))
> > +        d.appendVarFlag("image_postprocess_users", "vardeps", "
> > {}".format(user_entry))
> >   }
> >   
> >   def image_create_groups(d: "DataSmart") -> None:
> > @@ -137,10 +137,14 @@ def image_create_users(d: "DataSmart") ->
> > None:
> >           if "force-passwd-change" in flags:
> >               bb.process.run([*chroot, "/usr/bin/passwd", "--
> > expire", entry])
> >   
> > +ROOTFS_POSTPROCESS_COMMAND += "image_postprocess_groups"
> > +ROOTFS_INSTALL_COMMAND += "image_postprocess_users"
> > +image_postprocess_groups[vardeps] += "GROUPS"
> > +image_postprocess_users[vardeps] += "USERS"

This moves the whole user creation to the rootfs_install task, which
also means that the result of the user creation is reflected in the
sstate cache (which might be ok, though). But I'm wondering if that is
logically correct, as IIRC the groups have to be created before the
users are created.

A more subtle change (based on my patch "fix: rebuild rootfs on change
of USERS") would be to just add USERS as well as all USERS_<x>
variables to the vardeps of do_rootfs_install. This should also solve
your case from below, as a removed user always means a change to the
USERS variable.

I'll try to come up with this in a v2 of my patch.

Felix

> >   
> > -ROOTFS_POSTPROCESS_COMMAND += "image_postprocess_accounts"
> > -image_postprocess_accounts[vardeps] += "USERS GROUPS"
> > -python image_postprocess_accounts() {
> > +python image_postprocess_groups() {
> >       image_create_groups(d)
> > +}
> > +python image_postprocess_users() {
> >       image_create_users(d)
> >   }
> 
> This is still not ideal, as old home directories are not removed when
> removing the create-home flag or setting another directory via 
> USER_foo[home] = <x>.
> BR,
> Clara

Patch

diff --git a/meta/classes/image-account-extension.bbclass b/meta/classes/image-account-extension.bbclass
index ea956cd5..1c664be0 100644
--- a/meta/classes/image-account-extension.bbclass
+++ b/meta/classes/image-account-extension.bbclass
@@ -11,11 +11,11 @@  GROUPS ??= ""
 python() {
     for entry in (d.getVar("GROUPS") or "").split():
         group_entry = "GROUP_{}".format(entry)
-        d.appendVarFlag("image_postprocess_accounts", "vardeps", " {}".format(group_entry))
+        d.appendVarFlag("image_postprocess_groups", "vardeps", " {}".format(group_entry))
 
     for entry in (d.getVar("USERS") or "").split():
         user_entry = "USER_{}".format(entry)
-        d.appendVarFlag("image_postprocess_accounts", "vardeps", " {}".format(user_entry))
+        d.appendVarFlag("image_postprocess_users", "vardeps", " {}".format(user_entry))
 }
 
 def image_create_groups(d: "DataSmart") -> None:
@@ -137,10 +137,14 @@  def image_create_users(d: "DataSmart") -> None:
         if "force-passwd-change" in flags:
             bb.process.run([*chroot, "/usr/bin/passwd", "--expire", entry])
 
+ROOTFS_POSTPROCESS_COMMAND += "image_postprocess_groups"
+ROOTFS_INSTALL_COMMAND += "image_postprocess_users"
+image_postprocess_groups[vardeps] += "GROUPS"
+image_postprocess_users[vardeps] += "USERS"
 
-ROOTFS_POSTPROCESS_COMMAND += "image_postprocess_accounts"
-image_postprocess_accounts[vardeps] += "USERS GROUPS"
-python image_postprocess_accounts() {
+python image_postprocess_groups() {
     image_create_groups(d)
+}
+python image_postprocess_users() {
     image_create_users(d)
 }