On Sun, Mar 27, 2022 at 04:37:10PM -0700, Matt Turner wrote: > From: Patrice Clement > > * stage4/groups: create a a list of groups. > * stage4/users: create a list of users. users can also be added to > groups using the "foo.bar=wheel,audio,baz" format. > * stage4/ssh_public_keys: copy an SSH public key into the stage4 user's home > (.ssh/authorized_keys) and set the file permission to 0644. > > Bug: https://bugs.gentoo.org/236905 > --- > catalyst/base/stagebase.py | 70 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 70 insertions(+) > > diff --git a/catalyst/base/stagebase.py b/catalyst/base/stagebase.py > index de1e30ef..76feb5f0 100644 > --- a/catalyst/base/stagebase.py > +++ b/catalyst/base/stagebase.py > @@ -894,6 +930,40 @@ class StageBase(TargetBase, ClearBase, GenBase): > cmd(['rsync', '-a', x + '/', > self.settings['stage_path']], > env=self.env) > > + def groups(self): > + for x in self.settings["groups"].split():
For users() and ssh_public_keys() the setting is used as-is, but for groups it is .split(). None of them handle 0/1/2+ length settings as they get converted into lists and strings. These need to be able to handle both cases. INFO:catalyst:groups to create: [] INFO:catalyst:users to create: [] INFO:catalyst:ssh public keys to copy: [] ... Traceback (most recent call last): File "/catalyst/base/stagebase.py", line 38, in run_sequence func() File "/catalyst/base/stagebase.py", line 934, in groups for x in self.settings["groups"].split(): AttributeError: 'list' object has no attribute 'split' > + log.notice("Creating group: '%s'", x) > + cmd(["groupadd", "-R", self.settings['chroot_path'], x], > env=self.env) > + > + def users(self): > + for x in self.settings["users"]: With the specfile fragment: stage4/groups: a stage4/users: me=a INFO:catalyst:groups to create: a INFO:catalyst:users to create: me=a INFO:catalyst:ssh public keys to copy: [] ... NOTICE:catalyst:--- Running action sequence: groups NOTICE:catalyst:Creating group: 'a' NOTICE:catalyst:--- Running action sequence: users NOTICE:catalyst:Creating user: 'm=' NOTICE:catalyst:Creating user: 'e=' NOTICE:catalyst:Creating user: '=' useradd: invalid user name '=': use --badname to ignore ERROR:catalyst:CatalystError: cmd(['useradd', '-R', '/substrate/tmp/stage4-amd64', '-m', '=']) exited 3 > + usr, grp = '', '' > + try: > + usr, grp = x.split("=") > + except ValueError: > + usr = x > + log.debug("users: '=' separator not found on line " + x) > + log.debug("users: missing separator means no groups found") > + uacmd = ["useradd", "-R", self.settings['chroot_path'], "-m", x] > + if grp != '': > + uacmd = ["useradd", "-R", self.settings['chroot_path'], > "-m", "-G", grp, usr] > + log.notice("Creating user: '%s'", f"{usr}={grp}") > + cmd(uacmd, env=self.env) > + > + def ssh_public_keys(self): > + for x in self.settings["ssh_public_keys"]: > + usr, pub_key_src = '', '' > + try: > + usr, pub_key_src = x.split("=") > + except ValueError: > + raise CatalystError(f"ssh_public_keys: '=' separator not > found on line {x}") > + log.notice("Copying SSH public key for user: '%s'", usr) > + pub_key_dest = self.settings['chroot_path'] + > f"/home/{usr}/.ssh/authorized_keys" > + cpcmd = ["cp", "-av", pub_key_src, pub_key_dest] > + cmd(cpcmd, env=self.env) > + chcmd = ["chmod", "0644", pub_key_dest] > + cmd(chcmd, env=self.env) > + > def bind(self): > for x in [x for x in self.mount if self.mount[x]['enable']]: > if str(self.mount[x]['source']) == 'config': > -- > 2.34.1 > >