blob: 7f5b9b721947d74c1d74e7887b11d98576390218 [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001# 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05007# *) Invoke the actual command with flock
Patrick Williamsc124f4f2015-09-15 14:41:29 -05008# *) 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"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050016 bbnote "${PN}: Performing groupadd with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050017 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050020 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
Patrick Williamsc124f4f2015-09-15 14:41:29 -050025 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"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050033 bbnote "${PN}: Performing useradd with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050034 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050037 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
Patrick Williamsc124f4f2015-09-15 14:41:29 -050042 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"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050050 bbnote "${PN}: Performing groupmems with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050051 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"
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080054 local mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*$" $rootdir/etc/group || true`"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050055 if test "x$mem_exists" = "x"; then
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050056 eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO groupmems \$opts\" || true
Brad Bishop1a4b7ee2018-12-16 17:11:34 -080057 mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*$" $rootdir/etc/group || true`"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050058 if test "x$mem_exists" = "x"; then
59 bbfatal "${PN}: groupmems command did not succeed."
60 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -050061 else
Patrick Williamsf1e5d692016-03-30 15:21:19 -050062 bbnote "${PN}: group $groupname already contains $username, not re-adding it"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050063 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -050064}
65
66perform_groupdel () {
67 local rootdir="$1"
68 local opts="$2"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050069 bbnote "${PN}: Performing groupdel with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050070 local groupname=`echo "$opts" | awk '{ print $NF }'`
71 local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`"
Brad Bishop6e60e8b2018-02-01 10:27:11 -050072
Patrick Williamsc124f4f2015-09-15 14:41:29 -050073 if test "x$group_exists" != "x"; then
Brad Bishop6e60e8b2018-02-01 10:27:11 -050074 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"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050087 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -050088 else
Patrick Williamsf1e5d692016-03-30 15:21:19 -050089 bbnote "${PN}: group $groupname doesn't exist, not removing it"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050090 fi
91}
92
93perform_userdel () {
94 local rootdir="$1"
95 local opts="$2"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050096 bbnote "${PN}: Performing userdel with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -050097 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500100 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
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500105 else
Patrick Williamsf1e5d692016-03-30 15:21:19 -0500106 bbnote "${PN}: user $username doesn't exist, not removing it"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500107 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"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500116 bbnote "${PN}: Performing groupmod with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500117 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500120 eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO groupmod \$opts\"
121 if test $? != 0; then
122 bbwarn "${PN}: groupmod command did not succeed."
123 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500124 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"
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500135 bbnote "${PN}: Performing usermod with [$opts]"
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500136 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -0500139 eval flock -x $rootdir${sysconfdir} -c \"$PSEUDO usermod \$opts\"
140 if test $? != 0; then
141 bbfatal "${PN}: usermod command did not succeed."
142 fi
Patrick Williamsc124f4f2015-09-15 14:41:29 -0500143 else
144 bbwarn "${PN}: user $username doesn't exist, unable to modify it"
145 fi
146 set -e
147}
Andrew Geissler6ce62a22020-11-30 19:58:47 -0600148
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}