[jethro] Fix yocto bug in useradd calls
[AGL/meta-agl.git] / meta-agl / classes / useradd_base.bbclass
diff --git a/meta-agl/classes/useradd_base.bbclass b/meta-agl/classes/useradd_base.bbclass
new file mode 100644 (file)
index 0000000..9b8f5c2
--- /dev/null
@@ -0,0 +1,151 @@
+# This bbclass provides basic functionality for user/group settings.
+# This bbclass is intended to be inherited by useradd.bbclass and
+# extrausers.bbclass.
+
+# The following functions basically have similar logic.
+# *) Perform necessary checks before invoking the actual command
+# *) Invoke the actual command with flock
+# *) 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"
+       bbnote "${PN}: Performing groupadd with [$opts]"
+       local groupname=`echo "$opts" | awk '{ print $NF }'`
+       local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
+       if test "x$group_exists" = "x"; then
+               opts=`echo $opts | sed s/\'/\"/g`
+               eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupadd $opts\' || true
+               group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
+               if test "x$group_exists" = "x"; then
+                       bbfatal "${PN}: groupadd command did not succeed."
+               fi
+       else
+               bbnote "${PN}: group $groupname already exists, not re-creating it"
+       fi
+}
+
+perform_useradd () {
+       local rootdir="$1"
+       local opts="$2"
+       bbnote "${PN}: Performing useradd with [$opts]"
+       local username=`echo "$opts" | awk '{ print $NF }'`
+       local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
+       if test "x$user_exists" = "x"; then
+               opts=`echo $opts | sed s/\'/\"/g`
+               eval flock -x -w 100 $rootdir${sysconfdir} -c  \'$PSEUDO useradd $opts\' || true
+               user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
+               if test "x$user_exists" = "x"; then
+                       bbfatal "${PN}: useradd command did not succeed."
+               fi
+       else
+               bbnote "${PN}: user $username already exists, not re-creating it"
+       fi
+}
+
+perform_groupmems () {
+       local rootdir="$1"
+       local opts="$2"
+       bbnote "${PN}: Performing groupmems with [$opts]"
+       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 "${PN}: 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
+               eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupmems $opts\' || true
+               mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`"
+               if test "x$mem_exists" = "x"; then
+                       bbfatal "${PN}: groupmems command did not succeed."
+               fi
+       else
+               bbnote "${PN}: 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"
+       bbnote "${PN}: Performing groupdel with [$opts]"
+       local groupname=`echo "$opts" | awk '{ print $NF }'`
+       local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
+       if test "x$group_exists" != "x"; then
+               eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupdel $opts\' || true
+               group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
+               if test "x$group_exists" != "x"; then
+                       bbfatal "${PN}: groupdel command did not succeed."
+               fi
+       else
+               bbnote "${PN}: group $groupname doesn't exist, not removing it"
+       fi
+}
+
+perform_userdel () {
+       local rootdir="$1"
+       local opts="$2"
+       bbnote "${PN}: Performing userdel with [$opts]"
+       local username=`echo "$opts" | awk '{ print $NF }'`
+       local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
+       if test "x$user_exists" != "x"; then
+               eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO userdel $opts\' || true
+               user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
+               if test "x$user_exists" != "x"; then
+                       bbfatal "${PN}: userdel command did not succeed."
+               fi
+       else
+               bbnote "${PN}: 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"
+       bbnote "${PN}: Performing groupmod with [$opts]"
+       local groupname=`echo "$opts" | awk '{ print $NF }'`
+       local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
+       if test "x$group_exists" != "x"; then
+               eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupmod $opts\'
+               if test $? != 0; then
+                       bbwarn "${PN}: groupmod command did not succeed."
+               fi
+       else
+               bbwarn "${PN}: 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"
+       bbnote "${PN}: Performing usermod with [$opts]"
+       local username=`echo "$opts" | awk '{ print $NF }'`
+       local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
+       if test "x$user_exists" != "x"; then
+               eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO usermod $opts\'
+               if test $? != 0; then
+                       bbfatal "${PN}: usermod command did not succeed."
+               fi
+       else
+               bbwarn "${PN}: user $username doesn't exist, unable to modify it"
+       fi
+       set -e
+}