1#
2# Copyright OpenEmbedded Contributors
3#
4# SPDX-License-Identifier: MIT
5#
6
7# This bbclass is used for image level user/group configuration.
8# Inherit this class if you want to make EXTRA_USERS_PARAMS effective.
9
10# Below is an example showing how to use this functionality.
11# IMAGE_CLASSES += "extrausers"
12# EXTRA_USERS_PARAMS = "\
13#     useradd -p '' tester; \
14#     groupadd developers; \
15#     userdel nobody; \
16#     groupdel -g video; \
17#     groupmod -g 1020 developers; \
18#     usermod -s /bin/sh tester; \
19# "
20
21inherit useradd_base
22
23PACKAGE_INSTALL:append = " ${@['', 'base-passwd shadow'][bool(d.getVar('EXTRA_USERS_PARAMS'))]}"
24
25# Image level user / group settings
26ROOTFS_POSTPROCESS_COMMAND:append = " set_user_group"
27
28# Image level user / group settings
29set_user_group () {
30	user_group_settings="${EXTRA_USERS_PARAMS}"
31	export PSEUDO="${FAKEROOTENV} ${STAGING_DIR_NATIVE}${bindir}/pseudo"
32	setting=`echo $user_group_settings | cut -d ';' -f1`
33	remaining=`echo $user_group_settings | cut -d ';' -f2-`
34	while test "x$setting" != "x"; do
35		cmd=`echo $setting | cut -d ' ' -f1`
36		opts=`echo $setting | cut -d ' ' -f2-`
37		# Different from useradd.bbclass, there's no file locking issue here, as
38		# this setting is actually a serial process. So we only retry once.
39		case $cmd in
40			useradd)
41				perform_useradd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts"
42				;;
43			groupadd)
44				perform_groupadd "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts"
45				;;
46			userdel)
47				perform_userdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts"
48				;;
49			groupdel)
50				perform_groupdel "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts"
51				;;
52			usermod)
53				perform_usermod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts"
54				;;
55			passwd-expire)
56				perform_passwd_expire "${IMAGE_ROOTFS}" "$opts"
57				;;
58			groupmod)
59				perform_groupmod "${IMAGE_ROOTFS}" "-R ${IMAGE_ROOTFS} $opts"
60				;;
61			*)
62				bbfatal "Invalid command in EXTRA_USERS_PARAMS: $cmd"
63				;;
64		esac
65		# Avoid infinite loop if the last parameter doesn't end with ';'
66		if [ "$setting" = "$remaining" ]; then
67			break
68		fi
69		# iterate to the next setting
70		setting=`echo $remaining | cut -d ';' -f1`
71		remaining=`echo $remaining | cut -d ';' -f2-`
72	done
73}
74
75USERADDEXTENSION ?= ""
76
77inherit ${USERADDEXTENSION}
78