diff options
author | Kai Kang <kai.kang@windriver.com> | 2016-02-29 17:19:32 +0800 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-03-20 23:12:27 +0000 |
commit | 57a525ca7271a8fe3913c61aa87cb0ba1674b4b2 (patch) | |
tree | 3ce9a1cdea084f0f063310c3f2441d52c62e8bb3 /meta/classes/useradd_base.bbclass | |
parent | 5d06f00471f9db89ea63bae1bc900fcdea5c6bf3 (diff) | |
download | poky-57a525ca7271a8fe3913c61aa87cb0ba1674b4b2.tar.gz |
useradd_base.bbclass: replace retry logic with flock
When perform useradd during populate sysroot, it locks files passwd.lock
and group.lock at same time. And then it meets a dead lock issue
randomly.
Use flock to reslove it by using an universal lock directory for all the
user and group related operations.
[YOCTO #9022]
(From OE-Core rev: 2ebf697b46c42cee8bfa6d2e6087397f8cce385c)
Signed-off-by: Kai Kang <kai.kang@windriver.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/useradd_base.bbclass')
-rw-r--r-- | meta/classes/useradd_base.bbclass | 165 |
1 files changed, 43 insertions, 122 deletions
diff --git a/meta/classes/useradd_base.bbclass b/meta/classes/useradd_base.bbclass index ab3cd353f0..9b8f5c2207 100644 --- a/meta/classes/useradd_base.bbclass +++ b/meta/classes/useradd_base.bbclass | |||
@@ -4,7 +4,7 @@ | |||
4 | 4 | ||
5 | # The following functions basically have similar logic. | 5 | # The following functions basically have similar logic. |
6 | # *) Perform necessary checks before invoking the actual command | 6 | # *) Perform necessary checks before invoking the actual command |
7 | # *) Invoke the actual command, make retries if necessary | 7 | # *) Invoke the actual command with flock |
8 | # *) Error out if an error occurs. | 8 | # *) Error out if an error occurs. |
9 | 9 | ||
10 | # Note that before invoking these functions, make sure the global variable | 10 | # Note that before invoking these functions, make sure the global variable |
@@ -13,26 +13,16 @@ | |||
13 | perform_groupadd () { | 13 | perform_groupadd () { |
14 | local rootdir="$1" | 14 | local rootdir="$1" |
15 | local opts="$2" | 15 | local opts="$2" |
16 | local retries="$3" | 16 | bbnote "${PN}: Performing groupadd with [$opts]" |
17 | bbnote "${PN}: Performing groupadd with [$opts] and $retries times of retry" | ||
18 | local groupname=`echo "$opts" | awk '{ print $NF }'` | 17 | local groupname=`echo "$opts" | awk '{ print $NF }'` |
19 | local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" | 18 | local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" |
20 | if test "x$group_exists" = "x"; then | 19 | if test "x$group_exists" = "x"; then |
21 | local count=0 | 20 | opts=`echo $opts | sed s/\'/\"/g` |
22 | while true; do | 21 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupadd $opts\' || true |
23 | eval $PSEUDO groupadd $opts || true | 22 | group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" |
24 | group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" | 23 | if test "x$group_exists" = "x"; then |
25 | if test "x$group_exists" = "x"; then | 24 | bbfatal "${PN}: groupadd command did not succeed." |
26 | bbwarn "${PN}: groupadd command did not succeed. Retrying..." | 25 | fi |
27 | else | ||
28 | break | ||
29 | fi | ||
30 | count=`expr $count + 1` | ||
31 | if test $count = $retries; then | ||
32 | bbfatal "${PN}: Tried running groupadd command $retries times without success, giving up" | ||
33 | fi | ||
34 | sleep $count | ||
35 | done | ||
36 | else | 26 | else |
37 | bbnote "${PN}: group $groupname already exists, not re-creating it" | 27 | bbnote "${PN}: group $groupname already exists, not re-creating it" |
38 | fi | 28 | fi |
@@ -41,26 +31,16 @@ perform_groupadd () { | |||
41 | perform_useradd () { | 31 | perform_useradd () { |
42 | local rootdir="$1" | 32 | local rootdir="$1" |
43 | local opts="$2" | 33 | local opts="$2" |
44 | local retries="$3" | 34 | bbnote "${PN}: Performing useradd with [$opts]" |
45 | bbnote "${PN}: Performing useradd with [$opts] and $retries times of retry" | ||
46 | local username=`echo "$opts" | awk '{ print $NF }'` | 35 | local username=`echo "$opts" | awk '{ print $NF }'` |
47 | local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" | 36 | local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" |
48 | if test "x$user_exists" = "x"; then | 37 | if test "x$user_exists" = "x"; then |
49 | local count=0 | 38 | opts=`echo $opts | sed s/\'/\"/g` |
50 | while true; do | 39 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO useradd $opts\' || true |
51 | eval $PSEUDO useradd $opts || true | 40 | user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" |
52 | user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" | 41 | if test "x$user_exists" = "x"; then |
53 | if test "x$user_exists" = "x"; then | 42 | bbfatal "${PN}: useradd command did not succeed." |
54 | bbwarn "${PN}: useradd command did not succeed. Retrying..." | 43 | fi |
55 | else | ||
56 | break | ||
57 | fi | ||
58 | count=`expr $count + 1` | ||
59 | if test $count = $retries; then | ||
60 | bbfatal "${PN}: Tried running useradd command $retries times without success, giving up" | ||
61 | fi | ||
62 | sleep $count | ||
63 | done | ||
64 | else | 44 | else |
65 | bbnote "${PN}: user $username already exists, not re-creating it" | 45 | bbnote "${PN}: user $username already exists, not re-creating it" |
66 | fi | 46 | fi |
@@ -69,8 +49,7 @@ perform_useradd () { | |||
69 | perform_groupmems () { | 49 | perform_groupmems () { |
70 | local rootdir="$1" | 50 | local rootdir="$1" |
71 | local opts="$2" | 51 | local opts="$2" |
72 | local retries="$3" | 52 | bbnote "${PN}: Performing groupmems with [$opts]" |
73 | bbnote "${PN}: Performing groupmems with [$opts] and $retries times of retry" | ||
74 | local groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'` | 53 | local groupname=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-g" || $i == "--group") print $(i+1) }'` |
75 | local username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'` | 54 | local username=`echo "$opts" | awk '{ for (i = 1; i < NF; i++) if ($i == "-a" || $i == "--add") print $(i+1) }'` |
76 | bbnote "${PN}: Running groupmems command with group $groupname and user $username" | 55 | bbnote "${PN}: Running groupmems command with group $groupname and user $username" |
@@ -84,25 +63,11 @@ perform_groupmems () { | |||
84 | fi | 63 | fi |
85 | local mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`" | 64 | local mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`" |
86 | if test "x$mem_exists" = "x"; then | 65 | if test "x$mem_exists" = "x"; then |
87 | local count=0 | 66 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupmems $opts\' || true |
88 | while true; do | 67 | mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`" |
89 | eval $PSEUDO groupmems $opts || true | 68 | if test "x$mem_exists" = "x"; then |
90 | mem_exists="`grep "^$groupname:[^:]*:[^:]*:\([^,]*,\)*$username\(,[^,]*\)*" $rootdir/etc/group || true`" | 69 | bbfatal "${PN}: groupmems command did not succeed." |
91 | if test "x$mem_exists" = "x"; then | 70 | fi |
92 | bbwarn "${PN}: groupmems command did not succeed. Retrying..." | ||
93 | else | ||
94 | break | ||
95 | fi | ||
96 | count=`expr $count + 1` | ||
97 | if test $count = $retries; then | ||
98 | if test "x$gshadow" = "xno"; then | ||
99 | rm -f $rootdir${sysconfdir}/gshadow | ||
100 | rm -f $rootdir${sysconfdir}/gshadow- | ||
101 | fi | ||
102 | bbfatal "${PN}: Tried running groupmems command $retries times without success, giving up" | ||
103 | fi | ||
104 | sleep $count | ||
105 | done | ||
106 | else | 71 | else |
107 | bbnote "${PN}: group $groupname already contains $username, not re-adding it" | 72 | bbnote "${PN}: group $groupname already contains $username, not re-adding it" |
108 | fi | 73 | fi |
@@ -115,26 +80,15 @@ perform_groupmems () { | |||
115 | perform_groupdel () { | 80 | perform_groupdel () { |
116 | local rootdir="$1" | 81 | local rootdir="$1" |
117 | local opts="$2" | 82 | local opts="$2" |
118 | local retries="$3" | 83 | bbnote "${PN}: Performing groupdel with [$opts]" |
119 | bbnote "${PN}: Performing groupdel with [$opts] and $retries times of retry" | ||
120 | local groupname=`echo "$opts" | awk '{ print $NF }'` | 84 | local groupname=`echo "$opts" | awk '{ print $NF }'` |
121 | local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" | 85 | local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" |
122 | if test "x$group_exists" != "x"; then | 86 | if test "x$group_exists" != "x"; then |
123 | local count=0 | 87 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupdel $opts\' || true |
124 | while true; do | 88 | group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" |
125 | eval $PSEUDO groupdel $opts || true | 89 | if test "x$group_exists" != "x"; then |
126 | group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" | 90 | bbfatal "${PN}: groupdel command did not succeed." |
127 | if test "x$group_exists" != "x"; then | 91 | fi |
128 | bbwarn "${PN}: groupdel command did not succeed. Retrying..." | ||
129 | else | ||
130 | break | ||
131 | fi | ||
132 | count=`expr $count + 1` | ||
133 | if test $count = $retries; then | ||
134 | bbfatal "${PN}: Tried running groupdel command $retries times without success, giving up" | ||
135 | fi | ||
136 | sleep $count | ||
137 | done | ||
138 | else | 92 | else |
139 | bbnote "${PN}: group $groupname doesn't exist, not removing it" | 93 | bbnote "${PN}: group $groupname doesn't exist, not removing it" |
140 | fi | 94 | fi |
@@ -143,26 +97,15 @@ perform_groupdel () { | |||
143 | perform_userdel () { | 97 | perform_userdel () { |
144 | local rootdir="$1" | 98 | local rootdir="$1" |
145 | local opts="$2" | 99 | local opts="$2" |
146 | local retries="$3" | 100 | bbnote "${PN}: Performing userdel with [$opts]" |
147 | bbnote "${PN}: Performing userdel with [$opts] and $retries times of retry" | ||
148 | local username=`echo "$opts" | awk '{ print $NF }'` | 101 | local username=`echo "$opts" | awk '{ print $NF }'` |
149 | local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" | 102 | local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" |
150 | if test "x$user_exists" != "x"; then | 103 | if test "x$user_exists" != "x"; then |
151 | local count=0 | 104 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO userdel $opts\' || true |
152 | while true; do | 105 | user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" |
153 | eval $PSEUDO userdel $opts || true | 106 | if test "x$user_exists" != "x"; then |
154 | user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" | 107 | bbfatal "${PN}: userdel command did not succeed." |
155 | if test "x$user_exists" != "x"; then | 108 | fi |
156 | bbwarn "${PN}: userdel command did not succeed. Retrying..." | ||
157 | else | ||
158 | break | ||
159 | fi | ||
160 | count=`expr $count + 1` | ||
161 | if test $count = $retries; then | ||
162 | bbfatal "${PN}: Tried running userdel command $retries times without success, giving up" | ||
163 | fi | ||
164 | sleep $count | ||
165 | done | ||
166 | else | 109 | else |
167 | bbnote "${PN}: user $username doesn't exist, not removing it" | 110 | bbnote "${PN}: user $username doesn't exist, not removing it" |
168 | fi | 111 | fi |
@@ -174,25 +117,14 @@ perform_groupmod () { | |||
174 | set +e | 117 | set +e |
175 | local rootdir="$1" | 118 | local rootdir="$1" |
176 | local opts="$2" | 119 | local opts="$2" |
177 | local retries="$3" | 120 | bbnote "${PN}: Performing groupmod with [$opts]" |
178 | bbnote "${PN}: Performing groupmod with [$opts] and $retries times of retry" | ||
179 | local groupname=`echo "$opts" | awk '{ print $NF }'` | 121 | local groupname=`echo "$opts" | awk '{ print $NF }'` |
180 | local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" | 122 | local group_exists="`grep "^$groupname:" $rootdir/etc/group || true`" |
181 | if test "x$group_exists" != "x"; then | 123 | if test "x$group_exists" != "x"; then |
182 | local count=0 | 124 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO groupmod $opts\' |
183 | while true; do | 125 | if test $? != 0; then |
184 | eval $PSEUDO groupmod $opts | 126 | bbwarn "${PN}: groupmod command did not succeed." |
185 | if test $? != 0; then | 127 | fi |
186 | bbwarn "${PN}: groupmod command did not succeed. Retrying..." | ||
187 | else | ||
188 | break | ||
189 | fi | ||
190 | count=`expr $count + 1` | ||
191 | if test $count = $retries; then | ||
192 | bbfatal "${PN}: Tried running groupmod command $retries times without success, giving up" | ||
193 | fi | ||
194 | sleep $count | ||
195 | done | ||
196 | else | 128 | else |
197 | bbwarn "${PN}: group $groupname doesn't exist, unable to modify it" | 129 | bbwarn "${PN}: group $groupname doesn't exist, unable to modify it" |
198 | fi | 130 | fi |
@@ -204,25 +136,14 @@ perform_usermod () { | |||
204 | set +e | 136 | set +e |
205 | local rootdir="$1" | 137 | local rootdir="$1" |
206 | local opts="$2" | 138 | local opts="$2" |
207 | local retries="$3" | 139 | bbnote "${PN}: Performing usermod with [$opts]" |
208 | bbnote "${PN}: Performing usermod with [$opts] and $retries times of retry" | ||
209 | local username=`echo "$opts" | awk '{ print $NF }'` | 140 | local username=`echo "$opts" | awk '{ print $NF }'` |
210 | local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" | 141 | local user_exists="`grep "^$username:" $rootdir/etc/passwd || true`" |
211 | if test "x$user_exists" != "x"; then | 142 | if test "x$user_exists" != "x"; then |
212 | local count=0 | 143 | eval flock -x -w 100 $rootdir${sysconfdir} -c \'$PSEUDO usermod $opts\' |
213 | while true; do | 144 | if test $? != 0; then |
214 | eval $PSEUDO usermod $opts | 145 | bbfatal "${PN}: usermod command did not succeed." |
215 | if test $? != 0; then | 146 | fi |
216 | bbwarn "${PN}: usermod command did not succeed. Retrying..." | ||
217 | else | ||
218 | break | ||
219 | fi | ||
220 | count=`expr $count + 1` | ||
221 | if test $count = $retries; then | ||
222 | bbfatal "${PN}: Tried running usermod command $retries times without success, giving up" | ||
223 | fi | ||
224 | sleep $count | ||
225 | done | ||
226 | else | 147 | else |
227 | bbwarn "${PN}: user $username doesn't exist, unable to modify it" | 148 | bbwarn "${PN}: user $username doesn't exist, unable to modify it" |
228 | fi | 149 | fi |