1# This bbclass provides basic functionality for user/group settings.
2# This bbclass is intended to be inherited by useradd.bbclass and
3# extrausers.bbclass.
4
5# The following functions basically have similar logic.
6# *) Perform necessary checks before invoking the actual command
7# *) Invoke the actual command with flock
8# *) Error out if an error occurs.
9
10# Note that before invoking these functions, make sure the global variable
11# PSEUDO is set up correctly.
12
13perform_groupadd () {
14	local rootdir="$1"
15	local opts="$2"
16	bbnote "${PN}: Performing groupadd with [$opts]"
17	local groupname=`echo "$opts" | awk '{ print $NF }'`
18	local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
19	if test "x$group_exists" = "x"; then
20		eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO groupadd \$opts\" || true
21		group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
22		if test "x$group_exists" = "x"; then
23			bbfatal "${PN}: groupadd command did not succeed."
24		fi
25	else
26		bbnote "${PN}: group $groupname already exists, not re-creating it"
27	fi
28}
29
30perform_useradd () {
31	local rootdir="$1"
32	local opts="$2"
33	bbnote "${PN}: Performing useradd with [$opts]"
34	local username=`echo "$opts" | awk '{ print $NF }'`
35	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
36	if test "x$user_exists" = "x"; then
37		eval flock -x $rootdir${sysconfdir} -c  \"$PSEUDO useradd \$opts\" || true
38		user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
39		if test "x$user_exists" = "x"; then
40			bbfatal "${PN}: useradd command did not succeed."
41		fi
42	else
43		bbnote "${PN}: user $username already exists, not re-creating it"
44	fi
45}
46
47perform_groupmems () {
48	local rootdir="$1"
49	local opts="$2"
50	bbnote "${PN}: Performing groupmems with [$opts]"
51	local groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'`
52	local username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'`
53	bbnote "${PN}: Running groupmems command with group $groupname and user $username"
54	local mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*$" $rootdir/etc/group || true`"
55	if test "x$mem_exists" = "x"; then
56		eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO groupmems \$opts\" || true
57		mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*$" $rootdir/etc/group || true`"
58		if test "x$mem_exists" = "x"; then
59			bbfatal "${PN}: groupmems command did not succeed."
60		fi
61	else
62		bbnote "${PN}: group $groupname already contains $username, not re-adding it"
63	fi
64}
65
66perform_groupdel () {
67	local rootdir="$1"
68	local opts="$2"
69	bbnote "${PN}: Performing groupdel with [$opts]"
70	local groupname=`echo "$opts" | awk '{ print $NF }'`
71	local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
72
73	if test "x$group_exists" != "x"; then
74		local awk_input='BEGIN {FS=":"}; $1=="'$groupname'" { print $3 }'
75		local groupid=`echo "$awk_input" | awk -f- $rootdir/etc/group`
76		local awk_check_users='BEGIN {FS=":"}; $4=="'$groupid'" {print $1}'
77		local other_users=`echo "$awk_check_users" | awk -f- $rootdir/etc/passwd`
78
79		if test "x$other_users" = "x"; then
80			eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO groupdel \$opts\" || true
81			group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
82			if test "x$group_exists" != "x"; then
83				bbfatal "${PN}: groupdel command did not succeed."
84			fi
85		else
86			bbnote "${PN}: '$groupname' is primary group for users '$other_users', not removing it"
87		fi
88	else
89		bbnote "${PN}: group $groupname doesn't exist, not removing it"
90	fi
91}
92
93perform_userdel () {
94	local rootdir="$1"
95	local opts="$2"
96	bbnote "${PN}: Performing userdel with [$opts]"
97	local username=`echo "$opts" | awk '{ print $NF }'`
98	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
99	if test "x$user_exists" != "x"; then
100		eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO userdel \$opts\" || true
101		user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
102		if test "x$user_exists" != "x"; then
103			bbfatal "${PN}: userdel command did not succeed."
104		fi
105	else
106		bbnote "${PN}: user $username doesn't exist, not removing it"
107	fi
108}
109
110perform_groupmod () {
111	# Other than the return value of groupmod, there's no simple way to judge whether the command
112	# succeeds, so we disable -e option temporarily
113	set +e
114	local rootdir="$1"
115	local opts="$2"
116	bbnote "${PN}: Performing groupmod with [$opts]"
117	local groupname=`echo "$opts" | awk '{ print $NF }'`
118	local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
119	if test "x$group_exists" != "x"; then
120		eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO groupmod \$opts\"
121		if test $? != 0; then
122			bbwarn "${PN}: groupmod command did not succeed."
123		fi
124	else
125		bbwarn "${PN}: group $groupname doesn't exist, unable to modify it"
126	fi
127	set -e
128}
129
130perform_usermod () {
131	# Same reason with groupmod, temporarily disable -e option
132	set +e
133	local rootdir="$1"
134	local opts="$2"
135	bbnote "${PN}: Performing usermod with [$opts]"
136	local username=`echo "$opts" | awk '{ print $NF }'`
137	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
138	if test "x$user_exists" != "x"; then
139		eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO usermod \$opts\"
140		if test $? != 0; then
141			bbfatal "${PN}: usermod command did not succeed."
142		fi
143	else
144		bbwarn "${PN}: user $username doesn't exist, unable to modify it"
145	fi
146	set -e
147}
148
149perform_passwd_expire () {
150	local rootdir="$1"
151	local opts="$2"
152	bbnote "${PN}: Performing equivalent of passwd --expire with [$opts]"
153	# Directly set sp_lstchg to 0 without using the passwd command: Only root can do that
154	local username=`echo "$opts" | awk '{ print $NF }'`
155	local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`"
156	if test "x$user_exists" != "x"; then
157		eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO sed -i \''s/^\('$username':[^:]*\):[^:]*:/\1:0:/'\' $rootdir/etc/shadow \" || true
158		local passwd_lastchanged="`grep "^$username:" $rootdir/etc/shadow | cut -d: -f3`"
159		if test "x$passwd_lastchanged" != "x0"; then
160			bbfatal "${PN}: passwd --expire operation did not succeed."
161		fi
162	else
163		bbnote "${PN}: user $username doesn't exist, not expiring its password"
164	fi
165}
166