|
Lines 40-45
Link Here
|
| 40 |
import re |
40 |
import re |
| 41 |
import dns.resolver |
41 |
import dns.resolver |
| 42 |
import dns.exception |
42 |
import dns.exception |
|
|
43 |
import fcntl |
| 44 |
import errno |
| 43 |
|
45 |
|
| 44 |
import notifier.threads |
46 |
import notifier.threads |
| 45 |
import apt_pkg |
47 |
import apt_pkg |
|
Lines 197-209
def run(cmd, stepsPerScript, info_handler = _dummyFunc, error_handler = _dummyFu
Link Here
|
| 197 |
process = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
199 |
process = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
| 198 |
|
200 |
|
| 199 |
failedJoinScripts = [] |
201 |
failedJoinScripts = [] |
| 200 |
while True: |
202 |
def parse(line): |
| 201 |
# get the next line |
203 |
MODULE.process(repr(line.strip()).strip('"\'')) |
| 202 |
line = process.stdout.readline() |
|
|
| 203 |
if not line: |
| 204 |
# no more text from stdout |
| 205 |
break |
| 206 |
MODULE.process(line.strip()) |
| 207 |
|
204 |
|
| 208 |
# parse output... first check for errors |
205 |
# parse output... first check for errors |
| 209 |
m = regError.match(line) |
206 |
m = regError.match(line) |
|
Lines 214-221
def run(cmd, stepsPerScript, info_handler = _dummyFunc, error_handler = _dummyFu
Link Here
|
| 214 |
# invalid credentials or non existent user |
211 |
# invalid credentials or non existent user |
| 215 |
# do a critical error, the script will stop here |
212 |
# do a critical error, the script will stop here |
| 216 |
critical_handler(True) |
213 |
critical_handler(True) |
| 217 |
|
214 |
return |
| 218 |
continue |
|
|
| 219 |
|
215 |
|
| 220 |
# check for currently called join script |
216 |
# check for currently called join script |
| 221 |
m = regJoinScript.match(line) |
217 |
m = regJoinScript.match(line) |
|
Lines 225-238
def run(cmd, stepsPerScript, info_handler = _dummyFunc, error_handler = _dummyFu
Link Here
|
| 225 |
step_handler(stepsPerScript) |
221 |
step_handler(stepsPerScript) |
| 226 |
if 'failed' in line: |
222 |
if 'failed' in line: |
| 227 |
failedJoinScripts.append(m.groupdict().get('script')) |
223 |
failedJoinScripts.append(m.groupdict().get('script')) |
| 228 |
continue |
224 |
return |
| 229 |
|
225 |
|
| 230 |
# check for other information |
226 |
# check for other information |
| 231 |
m = regInfo.match(line) |
227 |
m = regInfo.match(line) |
| 232 |
if m: |
228 |
if m: |
| 233 |
info_handler(m.groupdict().get('message')) |
229 |
info_handler(m.groupdict().get('message')) |
| 234 |
step_handler(stepsPerScript/10) |
230 |
step_handler(stepsPerScript/10) |
| 235 |
continue |
231 |
return |
|
|
232 |
|
| 233 |
# make stdout file descriptor of the process non-blocking |
| 234 |
fd = process.stdout.fileno() |
| 235 |
fl = fcntl.fcntl(fd, fcntl.F_GETFL) |
| 236 |
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK) |
| 237 |
|
| 238 |
unfinished_line = '' |
| 239 |
while True: |
| 240 |
# get the next line |
| 241 |
try: |
| 242 |
line = process.stdout.read() |
| 243 |
except IOError as exc: |
| 244 |
if exc.errno == errno.EAGAIN: |
| 245 |
continue |
| 246 |
raise |
| 247 |
|
| 248 |
if not line: |
| 249 |
break # no more text from stdout |
| 250 |
|
| 251 |
unfinished_line = '' if line.endswith('\n') else '%s%s' % (unfinished_line, line.rsplit('\n', 1)[-1]) |
| 252 |
for line in line.splitlines(): |
| 253 |
parse(line) |
| 254 |
if unfinished_line: |
| 255 |
parse(unfinished_line) |
| 236 |
|
256 |
|
| 237 |
# get all remaining output |
257 |
# get all remaining output |
| 238 |
stdout, stderr = process.communicate() |
258 |
stdout, stderr = process.communicate() |