Révision ae988f51
Ajouté par Josué Kouka il y a environ 7 ans
mandayejs/mandaye/utils.py | ||
---|---|---|
29 | 29 |
logger = logging.getLogger(__name__) |
30 | 30 |
|
31 | 31 |
|
32 |
def exec_phantom(data, script='do_login.js'): |
|
32 |
def run(send_end, data, script): |
|
33 |
phantom = subprocess.Popen([ |
|
34 |
settings.PHANTOM_JS_BINARY, |
|
35 |
'--ignore-ssl-errors=yes', '--ssl-protocol=any', |
|
36 |
os.path.join(settings.BASE_DIR, 'mandayejs', script)], |
|
37 |
close_fds=True, |
|
38 |
stdin=subprocess.PIPE, |
|
39 |
stdout=subprocess.PIPE |
|
40 |
) |
|
41 |
stdout, stderr = phantom.communicate(json.dumps(data)) |
|
42 |
|
|
43 |
try: |
|
44 |
output = re.search('<mandayejs>(.*?)</mandayejs>', stdout, re.DOTALL) |
|
45 |
if not output: |
|
46 |
raise ValueError |
|
47 |
stdout = output.group(1) |
|
48 |
result = json.loads(stdout) |
|
49 |
except (ValueError,): |
|
50 |
result = {"result": "json_error"} |
|
51 |
logger.error("invalid json: %s" % stdout) |
|
52 |
|
|
53 |
if result.get('stderr'): |
|
54 |
logger.warning(result['stderr']) |
|
55 |
if result.get('error'): |
|
56 |
logger.error('Error occured: %s' % result.get('reason')) |
|
57 |
|
|
58 |
send_end.send(result) |
|
59 |
send_end.close() |
|
33 | 60 |
|
34 |
def run(send_end): |
|
35 |
phantom = subprocess.Popen([ |
|
36 |
settings.PHANTOM_JS_BINARY, |
|
37 |
'--ignore-ssl-errors=yes', '--ssl-protocol=any', |
|
38 |
os.path.join(settings.BASE_DIR, 'mandayejs', script)], |
|
39 |
close_fds=True, |
|
40 |
stdin=subprocess.PIPE, |
|
41 |
stdout=subprocess.PIPE |
|
42 |
) |
|
43 |
stdout, stderr = phantom.communicate(json.dumps(data)) |
|
44 |
|
|
45 |
try: |
|
46 |
output = re.search('<mandayejs>(.*?)</mandayejs>', stdout, re.DOTALL) |
|
47 |
if not output: |
|
48 |
raise ValueError |
|
49 |
stdout = output.group(1) |
|
50 |
result = json.loads(stdout) |
|
51 |
except (ValueError,): |
|
52 |
result = {"result": "json_error"} |
|
53 |
logger.error("invalid json: %s" % stdout) |
|
54 |
|
|
55 |
if result.get('stderr'): |
|
56 |
logger.warning(result['stderr']) |
|
57 |
if result.get('error'): |
|
58 |
logger.error(result.get('reason')) |
|
59 |
|
|
60 |
send_end.send(result) |
|
61 | 61 |
|
62 |
def exec_phantom(data, script='do_login.js'): |
|
62 | 63 |
recv_end, send_end = multiprocessing.Pipe(False) |
63 |
process = multiprocessing.Process(target=run, args=(send_end,)) |
|
64 |
process = multiprocessing.Process(target=run, args=(send_end, data, script))
|
|
64 | 65 |
process.start() |
65 |
process.join(settings.PHANTOM_JS_TIMEOUT) |
|
66 | 66 |
|
67 |
if process.is_alive(): |
|
67 |
if recv_end.poll(settings.PHANTOM_JS_TIMEOUT): |
|
68 |
result = recv_end.recv() |
|
69 |
recv_end.close() |
|
70 |
else: |
|
68 | 71 |
process.terminate() |
72 |
send_end.close() |
|
69 | 73 |
# Don't log locators, they may contain credentials (passwords) |
70 | 74 |
context = {k: v for k, v in data.items() if k != 'locators'} |
71 | 75 |
logger.error("PhantomJS process timeout, context: %s" % context) |
72 | 76 |
result = {'result': 'timeout'} |
73 |
else: |
|
74 |
result = recv_end.recv() |
|
75 | 77 |
|
76 | 78 |
return result |
77 | 79 |
|
Formats disponibles : Unified diff
improve generic timeout handling (#14913)