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 |
|
|
58 |
|
send_end.send(result)
|
59 |
61 |
|
|
62 |
def exec_phantom(data, script='do_login.js'):
|
60 |
63 |
recv_end, send_end = multiprocessing.Pipe(False)
|
61 |
|
process = multiprocessing.Process(target=run, args=(send_end,))
|
|
64 |
process = multiprocessing.Process(target=run, args=(send_end, data, script))
|
62 |
65 |
process.start()
|
63 |
|
process.join(settings.PHANTOM_JS_TIMEOUT)
|
64 |
66 |
|
65 |
|
if process.is_alive():
|
|
67 |
if recv_end.poll(settings.PHANTOM_JS_TIMEOUT):
|
|
68 |
result = recv_end.recv()
|
|
69 |
recv_end.close()
|
|
70 |
else:
|
66 |
71 |
process.terminate()
|
|
72 |
send_end.close()
|
67 |
73 |
# Don't log locators, they may contain credentials (passwords)
|
68 |
74 |
context = {k: v for k, v in data.items() if k != 'locators'}
|
69 |
75 |
logger.error("PhantomJS process timeout, context: %s" % context)
|
70 |
76 |
result = {'result': 'timeout'}
|
71 |
|
else:
|
72 |
|
result = recv_end.recv()
|
73 |
77 |
|
74 |
78 |
return result
|
75 |
79 |
|
76 |
|
-
|