Add a method for image level user/group configuration
v3 cover Add a method for image level user/group configuration
From: Chen Qi <[email protected]>
This patchset mainly does two things:
1. code refactor to avoid code duplication
2. add a method for image level user/group configuration
The following changes since commit a63229917a5708de2d161aba0d67168ce0da6365:
meta-yocto-bsp: update reference board SRCREVs (2013-07-10 09:45:51 +0100)
are available in the git repository at:
git://git.pokylinux.org/poky-contrib ChenQi/user_group_settings
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=ChenQi/user_group_settings
Chen Qi (3):
userbase.bbclass: add a new bbclass
useradd.bbclass: code refactor
usersettings.bbclass: add a new bbclass
meta/classes/useradd.bbclass | 103 ++--------------- meta/classes/userbase.bbclass | 230 +++++++++++++++++++++++++++++++++++++ meta/classes/usersettings.bbclass | 48 ++++++++ 3 files changed, 290 insertions(+), 91 deletions(-) create mode 100644 meta/classes/userbase.bbclass create mode 100644 meta/classes/usersettings.bbclass
Signature · 1 line
1.7.9.5
PATCH v3 1/3 userbase.bbclass: add a new bbclass
From: Chen Qi <[email protected]>
This class is mainly a collection of basic functions for user/group settings.
This class is intended to be inherited by useradd.bbclass and the usersettings.bbclass.
[YOCTO #4074]
--- meta/classes/userbase.bbclass | 230 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 meta/classes/userbase.bbclass
meta/classes/userbase.bbclass new file +230 -0
@@ -0,0 +1,230 @@ +# This bbclass provides basic functionality for user/group settings. +# This bbclass is intended to be inherited by useradd.bbclass and +# usersettings.bbclass. + +# The following functions basically have similar logic. +# *) Perform necessary checks before invoking the actual command +# *) Invoke the actual command, make retries if necessary +# *) Error out if an error occurs. + +# Note that before invoking these functions, make sure the global variable +# PSEUDO is set up correctly. + +perform_groupadd () { + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing groupadd with [$opts] and $retries times of retry" + local groupname=`echo "$opts" | awk '{ print $NF }'` + local group_exists=`grep "^$groupname:" $rootdir/etc/group || true` + if test "x$group_exists" = "x"; then + local count=0 + while true; do + eval $PSEUDO groupadd $opts || true + group_exists=`grep "^$groupname:" $rootdir/etc/group || true` + if test "x$group_exists" = "x"; then + bbwarn "groupadd command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + bbfatal "Tried running groupadd command $retries times without scucess, giving up" + fi + done + else + bbwarn "group $groupname already exists, not re-creating it" + fi +} + +perform_useradd () { + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing useradd with [$opts] and $retries times of retry" + local username=`echo "$opts" | awk '{ print $NF }'` + local user_exists=`grep "^$username:" $rootdir/etc/passwd || true` + if test "x$user_exists" = "x"; then + local count=0 + while true; do + eval $PSEUDO useradd $opts || true + user_exists=`grep "^$username:" $rootdir/etc/passwd || true` + if test "x$user_exists" = "x"; then + bbwarn "useradd command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + bbfatal "Tried running useradd command $retries times without scucess, giving up" + fi + done + else + bbwarn "user $username already exists, not re-creating it" + fi +} + +perform_groupmems () { + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing groupmems with [$opts] and $retries times of retry" + local groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'` + local username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'` + bbnote "Running groupmems command with group $groupname and user $username" + # groupmems fails if /etc/gshadow does not exist + local gshadow="" + if [ -f $rootdir${sysconfdir}/gshadow ]; then + gshadow="yes" + else + gshadow="no" + touch $rootdir${sysconfdir}/gshadow + fi + local mem_exists=`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true` + if test "x$mem_exists" = "x"; then + local count=0 + while true; do + eval $PSEUDO groupmems $opts || true + mem_exists=`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true` + if test "x$mem_exists" = "x"; then + bbwarn "groupmems command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + if test "x$gshadow" = "xno"; then + rm -f $rootdir${sysconfdir}/gshadow + rm -f $rootdir${sysconfdir}/gshadow- + fi + bbfatal "Tried running groupmems command $retries times without scucess, giving up" + fi + done + else + bbwarn "group $groupname already contains $username, not re-adding it" + fi + if test "x$gshadow" = "xno"; then + rm -f $rootdir${sysconfdir}/gshadow + rm -f $rootdir${sysconfdir}/gshadow- + fi +} + +perform_groupdel () { + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing groupdel with [$opts] and $retries times of retry" + local groupname=`echo "$opts" | awk '{ print $NF }'` + local group_exists=`grep "^$groupname:" $rootdir/etc/group || true` + if test "x$group_exists" != "x"; then + local count=0 + while true; do + eval $PSEUDO groupdel $opts || true + group_exists=`grep "^$groupname:" $rootdir/etc/group || true` + if test "x$group_exists" != "x"; then + bbwarn "groupdel command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + bbfatal "Tried running groupdel command $retries times without scucess, giving up" + fi + done + else + bbwarn "group $groupname doesn't exist, not removing it" + fi +} + +perform_userdel () { + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing userdel with [$opts] and $retries times of retry" + local username=`echo "$opts" | awk '{ print $NF }'` + local user_exists=`grep "^$username:" $rootdir/etc/passwd || true` + if test "x$user_exists" != "x"; then + local count=0 + while true; do + eval $PSEUDO userdel $opts || true + user_exists=`grep "^$username:" $rootdir/etc/passwd || true` + if test "x$user_exists" != "x"; then + bbwarn "userdel command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + bbfatal "Tried running userdel command $retries times without scucess, giving up" + fi + done + else + bbwarn "user $username doesn't exist, not removing it" + fi +} + +perform_groupmod () { + # Other than the return value of groupmod, there's no simple way to judge whether the command + # succeeds, so we disable -e option temporarily + set +e + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing groupmod with [$opts] and $retries times of retry" + local groupname=`echo "$opts" | awk '{ print $NF }'` + local group_exists=`grep "^$groupname:" $rootdir/etc/group || true` + if test "x$group_exists" != "x"; then + local count=0 + while true; do + eval $PSEUDO groupmod $opts + if test $? != 0; then + bbwarn "groupmod command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + bbfatal "Tried running groupmod command $retries times without scucess, giving up" + fi + done + else + bbfatal "group $groupname doesn't exist, unable to modify it" + fi + set -e +} + +perform_usermod () { + # Same reason with groupmod, temporarily disable -e option + set +e + local rootdir="$1" + local opts="$2" + local retries="$3" + bbnote "Performing usermod with [$opts] and $retries times of retry" + local username=`echo "$opts" | awk '{ print $NF }'` + local user_exists=`grep "^$username:" $rootdir/etc/passwd || true` + if test "x$user_exists" != "x"; then + local count=0 + while true; do + eval $PSEUDO usermod $opts + if test $? != 0; then + bbwarn "usermod command did not succeed. Retrying..." + sleep 1 + else + break + fi + count=`expr $count + 1` + if test $count = $retries; then + bbfatal "Tried running usermod command $retries times without scucess, giving up" + fi + done + else + bbfatal "user $username doesn't exist, unable to modify it" + fi + set -e +}
Signature · 1 line
1.7.9.5
PATCH v3 2/3 useradd.bbclass: code refactor
In reply to [email protected]From: Chen Qi <[email protected]>
The basic functions have moved to userbase.bbclass. So this class only needs to inherit userbase.bbclass and use the functions defined there. The reason is to avoid code duplication with usersettings.bbclass.
[YOCTO #4074]
--- meta/classes/useradd.bbclass | 103 +++++------------------------------------- 1 file changed, 12 insertions(+), 91 deletions(-)
meta/classes/useradd.bbclass +12 -91
@@ -1,3 +1,5 @@ +inherit userbase + # base-passwd-cross provides the default passwd and group files in the # target sysroot, and shadow -native and -sysroot provide the utilities # and support files needed to add and modify user and group accounts
@@ -44,30 +46,7 @@ if test "x$GROUPADD_PARAM" != "x"; then opts=`echo "$GROUPADD_PARAM" | cut -d ';' -f 1` remaining=`echo "$GROUPADD_PARAM" | cut -d ';' -f 2-` while test "x$opts" != "x"; do - groupname=`echo "$opts" | awk '{ print $NF }'` - group_exists=`grep "^$groupname:" $SYSROOT/etc/group || true` - if test "x$group_exists" = "x"; then - count=1 - while true; do - eval $PSEUDO groupadd $OPT $opts || true - group_exists=`grep "^$groupname:" $SYSROOT/etc/group || true` - if test "x$group_exists" = "x"; then - # File locking issues can require us to retry the command - echo "WARNING: groupadd command did not succeed. Retrying..." - sleep 1 - else - break - fi - count=`expr $count + 1` - if test $count = 11; then - echo "ERROR: tried running groupadd command 10 times without success, giving up" - exit 1 - fi - done - else - echo "Note: group $groupname already exists, not re-creating it" - fi - + perform_groupadd "$SYSROOT" "$OPT $opts" 10 if test "x$opts" = "x$remaining"; then break fi
@@ -83,32 +62,7 @@ if test "x$USERADD_PARAM" != "x"; then opts=`echo "$USERADD_PARAM" | cut -d ';' -f 1` remaining=`echo "$USERADD_PARAM" | cut -d ';' -f 2-` while test "x$opts" != "x"; do - # useradd does not have a -f option, so we have to check if the - # username already exists manually - username=`echo "$opts" | awk '{ print $NF }'` - user_exists=`grep "^$username:" $SYSROOT/etc/passwd || true` - if test "x$user_exists" = "x"; then - count=1 - while true; do - eval $PSEUDO useradd $OPT $opts || true - user_exists=`grep "^$username:" $SYSROOT/etc/passwd || true` - if test "x$user_exists" = "x"; then - # File locking issues can require us to retry the command - echo "WARNING: useradd command did not succeed. Retrying..." - sleep 1 - else - break - fi - count=`expr $count + 1` - if test $count = 11; then - echo "ERROR: tried running useradd command 10 times without success, giving up" - exit 1 - fi - done - else - echo "Note: username $username already exists, not re-creating it" - fi - + perform_useradd "$SYSROOT" "$OPT $opts" 10 if test "x$opts" = "x$remaining"; then break fi
@@ -119,58 +73,18 @@ fi if test "x$GROUPMEMS_PARAM" != "x"; then echo "Running groupmems commands..." - # groupmems fails if /etc/gshadow does not exist - if [ -f $SYSROOT${sysconfdir}/gshadow ]; then - gshadow="yes" - else - gshadow="no" - touch $SYSROOT${sysconfdir}/gshadow - fi # Invoke multiple instances of groupmems for parameter lists # separated by ';' opts=`echo "$GROUPMEMS_PARAM" | cut -d ';' -f 1` remaining=`echo "$GROUPMEMS_PARAM" | cut -d ';' -f 2-` while test "x$opts" != "x"; do - groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'` - username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'` - echo "$groupname $username" - mem_exists=`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $SYSROOT/etc/group || true` - if test "x$mem_exists" = "x"; then - count=1 - while true; do - eval $PSEUDO groupmems $OPT $opts || true - mem_exists=`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $SYSROOT/etc/group || true` - if test "x$mem_exists" = "x"; then - # File locking issues can require us to retry the command - echo "WARNING: groupmems command did not succeed. Retrying..." - sleep 1 - else - break - fi - count=`expr $count + 1` - if test $count = 11; then - echo "ERROR: tried running groupmems command 10 times without success, giving up" - if test "x$gshadow" = "xno"; then - rm -f $SYSROOT${sysconfdir}/gshadow - rm -f $SYSROOT${sysconfdir}/gshadow- - fi - exit 1 - fi - done - else - echo "Note: group $groupname already contains $username, not re-adding it" - fi - + perform_groupmems "$SYSROOT" "$OPT $opts" 10 if test "x$opts" = "x$remaining"; then break fi opts=`echo "$remaining" | cut -d ';' -f 1` remaining=`echo "$remaining" | cut -d ';' -f 2-` done - if test "x$gshadow" = "xno"; then - rm -f $SYSROOT${sysconfdir}/gshadow - rm -f $SYSROOT${sysconfdir}/gshadow- - fi fi }
@@ -254,6 +168,13 @@ fakeroot python populate_packages_prepend () { preinst = d.getVar('pkg_preinst_%s' % pkg, True) or d.getVar('pkg_preinst', True) if not preinst: preinst = '#!/bin/sh\n' + preinst += 'perform_groupadd () {\n%s}\n' % d.getVar('perform_groupadd', True) + preinst += 'perform_useradd () {\n%s}\n' % d.getVar('perform_useradd', True) + preinst += 'perform_groupmems () {\n%s}\n' % d.getVar('perform_groupmems', True) + preinst += 'perform_groupdel () {\n%s}\n' % d.getVar('perform_groupdel', True) + preinst += 'perform_userdel () {\n%s}\n' % d.getVar('perform_userdel', True) + preinst += 'perform_groupmod () {\n%s}\n' % d.getVar('perform_groupmod', True) + preinst += 'perform_usermod () {\n%s}\n' % d.getVar('perform_usermod', True) preinst += d.getVar('useradd_preinst', True) d.setVar('pkg_preinst_%s' % pkg, preinst)
Signature · 1 line
1.7.9.5
PATCH v3 3/3 usersettings.bbclass: add a new bbclass
In reply to [email protected]From: Chen Qi <[email protected]>
This class is dedicated to image level user/group configuration. It inherits userbase.bbclass.
Users need to inherit this class in their layers or local.conf to make the setting of USER_GROUP_SETTINGS effective.
For detailed configuration format of USER_GROUP_SETTINGS, please refer to local.conf.sample.extended.
[YOCTO #4074]
--- meta/classes/usersettings.bbclass | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 meta/classes/usersettings.bbclass
meta/classes/usersettings.bbclass new file +48 -0
@@ -0,0 +1,48 @@ +# This bbclass is mainly used for image level user/group configuration. +# Inherit this class if you want to make USER_GROUP_SETTINGS effective. +inherit userbase + +IMAGE_INSTALL_append += "${@['', 'base-passwd shadow'][bool(d.getVar('USER_GROUP_SETTINGS', True))]}" + +# Image level user / group settings +ROOTFS_POSTPROCESS_COMMAND_append = " set_user_group;" + +# Image level user / group settings +set_user_group () { + user_group_settings="${USER_GROUP_SETTINGS}" + export PSEUDO="${FAKEROOTENV} ${STAGING_DIR_NATIVE}${bindir}/pseudo" + setting=`echo $user_group_settings | cut -d ';' -f1` + remaining=`echo $user_group_settings | cut -d ';' -f2-` + while test "x$setting" != "x"; do + action=`echo $setting | cut -d ',' -f1` + opts=`echo $setting | cut -d ',' -f2` + # Different from useradd.bbclass, there's no file locking issue here, as + # this setting is actually a serial process. So we only retry once. + case $action in + useradd) + perform_useradd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupadd) + perform_groupadd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + userdel) + perform_userdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupdel) + perform_groupdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + usermod) + perform_usermod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupmod) + perform_groupmod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + *) + bbfatal "Incorrect setting for USER_GROUP_SETTINGS" + ;; + esac + # iterate to the next setting + setting=`echo $remaining | cut -d ';' -f1` + remaining=`echo $remaining | cut -d ';' -f2-` + done +}
Signature · 1 line
1.7.9.5
Hi Qi,
Quoted 22 lines · On Thursday 11 July 2013 19:11:36 [email protected] wrote:
From: Chen Qi <[email protected]>
This patchset mainly does two things:
1. code refactor to avoid code duplication
2. add a method for image level user/group configurationThe following changes since commit
a63229917a5708de2d161aba0d67168ce0da6365:meta-yocto-bsp: update reference board SRCREVs (2013-07-10 09:45:51 +0100)
are available in the git repository at:
git://git.pokylinux.org/poky-contribChenQi/user_group_settingshttp://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=ChenQi/user_group_set
tingsChen Qi (3):
userbase.bbclass: add a new bbclass
useradd.bbclass: code refactor
usersettings.bbclass: add a new bbclass
Quoted 7 lines
meta/classes/useradd.bbclass | 103 ++--------------- meta/classes/userbase.bbclass | 230 +++++++++++++++++++++++++++++++++++++ meta/classes/usersettings.bbclass | 48 ++++++++ 3 files changed, 290 insertions(+), 91 deletions(-) create mode 100644 meta/classes/userbase.bbclass create mode 100644 meta/classes/usersettings.bbclass
In terms of naming I'd rather see the base class be called useradd_base to match the naming of similar existing classes. For the new class, I'm not sure usersettings is really an appropriate name, perhaps something like "useradd_real" or "useraccount" or something else that more accurately reflects what it is for?
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
Re: [PATCH V3 3/3] usersettings.bbclass: add a new bbclass
In reply to [email protected]Quoted 25 lines · On Thursday 11 July 2013 19:11:39 [email protected] wrote:
From: Chen Qi <[email protected]>
This class is dedicated to image level user/group configuration. It inherits userbase.bbclass.
Users need to inherit this class in their layers or local.conf to make the setting of
USER_GROUP_SETTINGSeffective.For detailed configuration format of
USER_GROUP_SETTINGS, please refer to local.conf.sample.extended.[YOCTO #4074]
Signed-off-by Chen Qi <[email protected]>--- meta/classes/usersettings.bbclass | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 meta/classes/usersettings.bbclass(quoted diff) +0
-0b/meta/classes/usersettings.bbclass new file mode 100644 index 0000000..e5a5156
meta/classes/usersettings.bbclass line 5
Quoted 5 lines
meta/classes/usersettings.bbclass new file +5
-0@@ -0,0 +1,48 @@ +# This bbclass is mainly used for image level user/group configuration. +# Inherit this class if you want to make USER_GROUP_SETTINGS effective. +inherit userbase + +IMAGE_INSTALL_append += "${@['', 'base-passwd shadow'][bool(d.getVar('USER_GROUP_SETTINGS', True))]}"
This is a bit ugly. We should avoid using _append += since it is confusing, and we have base_conditional for things like this. I'd suggest:
IMAGE_INSTALL_append = "${@base_conditional('USER_GROUP_SETTINGS', '1', ' base-passwd shadow', '', d)}"
Quoted 25 lines
meta/classes/usersettings.bbclass new file +25
-0+# Image level user / group settings +ROOTFS_POSTPROCESS_COMMAND_append = " set_user_group;" + +# Image level user / group settings +set_user_group () { + user_group_settings="${USER_GROUP_SETTINGS}" + export PSEUDO="${FAKEROOTENV} ${STAGING_DIR_NATIVE}${bindir}/pseudo" + setting=`echo $user_group_settings | cut -d ';' -f1` + remaining=`echo $user_group_settings | cut -d ';' -f2-` + while test "x$setting" != "x"; do + action=`echo $setting | cut -d ',' -f1` + opts=`echo $setting | cut -d ',' -f2` + # Different from useradd.bbclass, there's no file locking issue here, as + # this setting is actually a serial process. So we only retry once. + case $action in + useradd) + perform_useradd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupadd) + perform_groupadd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + userdel) + perform_userdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupdel)
meta/classes/usersettings.bbclass line 41
Quoted 10 lines
meta/classes/usersettings.bbclass new file +10
-0+ perform_groupdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + usermod) + perform_usermod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupmod) + perform_groupmod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + *) + bbfatal "Incorrect setting for USER_GROUP_SETTINGS"
Could you please make it report $action in the error so it's clear which value is invalid?
meta/classes/usersettings.bbclass line 48
Quoted 7 lines
meta/classes/usersettings.bbclass new file +7
-0+ ;; + esac + # iterate to the next setting + setting=`echo $remaining | cut -d ';' -f1` + remaining=`echo $remaining | cut -d ';' -f2-` + done +}
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
Re: [PATCH V3 3/3] usersettings.bbclass: add a new bbclass
Quoted 9 lines · On Thursday 11 July 2013 13:58:17 Paul Eggleton wrote:
Quoted 2 lines · On Thursday 11 July 2013 19:11:39 [email protected] wrote:
+IMAGE_INSTALL_append += "${@['', 'base-passwd shadow'][bool(d.getVar('USER_GROUP_SETTINGS', True))]}"
This is a bit ugly. We should avoid using
_append+= since it is confusing, and we havebase_conditionalfor things like this. I'd suggest:
IMAGE_INSTALL_append= "${@base_conditional('USER_GROUP_SETTINGS', '1', ' base-passwd shadow', '', d)}"
Actually reading this again I've misinterpreted what it's supposed to be doing. Unfortunately I don't think we have a neat base_ifset() or similar so perhaps this will need to be left as-is. I still think we should avoid _append += however.
Cheers,
Paul
Signature · 2 lines
Paul Eggleton Intel Open Source Technology Centre
Re: [PATCH V3 3/3] usersettings.bbclass: add a new bbclass
In reply to [email protected]Quoted 25 lines · On 7/11/13 6:11 AM, [email protected] wrote:
From: Chen Qi <[email protected]>
This class is dedicated to image level user/group configuration. It inherits userbase.bbclass.
Users need to inherit this class in their layers or local.conf to make the setting of
USER_GROUP_SETTINGSeffective.For detailed configuration format of
USER_GROUP_SETTINGS, please refer to local.conf.sample.extended.[YOCTO #4074]
Signed-off-by Chen Qi <[email protected]>--- meta/classes/usersettings.bbclass | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+)create mode 100644 meta/classes/usersettings.bbclass
meta/classes/usersettings.bbclass new file +0
-0
meta/classes/usersettings.bbclass line 3
Quoted 3 lines
meta/classes/usersettings.bbclass new file +3
-0@@ -0,0 +1,48 @@ +# This bbclass is mainly used for image level user/group configuration. +# Inherit this class if you want to make USER_GROUP_SETTINGS effective. +inherit userbase
One request, in the comment above, please put some examples of the using the new functionality. It's not completely clear to me looking at this what may be expected of the user.
--Mark
Quoted 46 lines
meta/classes/usersettings.bbclass new file +45
-0+ +IMAGE_INSTALL_append += "${@['', 'base-passwd shadow'][bool(d.getVar('USER_GROUP_SETTINGS', True))]}" + +# Image level user / group settings +ROOTFS_POSTPROCESS_COMMAND_append = " set_user_group;" + +# Image level user / group settings +set_user_group () { + user_group_settings="${USER_GROUP_SETTINGS}" + export PSEUDO="${FAKEROOTENV} ${STAGING_DIR_NATIVE}${bindir}/pseudo" + setting=`echo $user_group_settings | cut -d ';' -f1` + remaining=`echo $user_group_settings | cut -d ';' -f2-` + while test "x$setting" != "x"; do + action=`echo $setting | cut -d ',' -f1` + opts=`echo $setting | cut -d ',' -f2` + # Different from useradd.bbclass, there's no file locking issue here, as + # this setting is actually a serial process. So we only retry once. + case $action in + useradd) + perform_useradd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupadd) + perform_groupadd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + userdel) + perform_userdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupdel) + perform_groupdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + usermod) + perform_usermod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + groupmod) + perform_groupmod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts" 1 + ;; + *) + bbfatal "Incorrect setting for USER_GROUP_SETTINGS" + ;; + esac + # iterate to the next setting + setting=`echo $remaining | cut -d ';' -f1` + remaining=`echo $remaining | cut -d ';' -f2-` + done +}
Quoted 33 lines · Paul Eggleton
Hi Qi,
Quoted 22 lines · On Thursday 11 July 2013 19:11:36 [email protected] wrote:
From: Chen Qi <[email protected]>
This patchset mainly does two things:
1. code refactor to avoid code duplication
2. add a method for image level user/group configurationThe following changes since commit
a63229917a5708de2d161aba0d67168ce0da6365:meta-yocto-bsp: update reference board SRCREVs (2013-07-10 09:45:51 +0100)are available in the git repository at:
git://git.pokylinux.org/poky-contribChenQi/user_group_settingshttp://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=ChenQi/user_group_set
tingsChen Qi (3):
userbase.bbclass: add a new bbclass
useradd.bbclass: code refactor
usersettings.bbclass: add a new bbclassQuoted 7 lines
meta/classes/useradd.bbclass | 103 ++--------------- meta/classes/userbase.bbclass | 230 +++++++++++++++++++++++++++++++++++++ meta/classes/usersettings.bbclass | 48 ++++++++ 3 files changed, 290 insertions(+), 91 deletions(-)create mode 100644 meta/classes/userbase.bbclass create mode 100644 meta/classes/usersettings.bbclass
Quoted 6 lines
In terms of naming I'd rather see the base class be called
useradd_baseto match the naming of similar existing classes. For the new class, I'm not sure usersettings is really an appropriate name, perhaps something like "useradd_real" or "useraccount" or something else that more accurately reflects what it is for?
I think this is a better approach than what you had orignally.
I agree the naming is not correct currently, useraccount or maybe extrausers, also when you rename the class the USER_GROUP_SETTING should also be renamed to reflect that, something like EXTRA_USERS_PARAMS or USER_ACCOUNT_PARAMS to match the class name.
You also need to provide full documentation on this new variable, please send details to Scott Rifenbark.
Quoted 3 lines
Cheers,
Paul