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)
|
33 |
52 |
|
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('Error occured: %s' % result.get('reason'))
|
59 |
|
|
60 |
|
send_end.send(result)
|
|
53 |
if result.get('stderr'):
|
|
54 |
logger.warning(result['stderr'])
|
|
55 |
if result.get('error'):
|
|
56 |
logger.error('Error occured: %s' % result.get('reason'))
|
61 |
57 |
|
|
58 |
send_end.send(result)
|
|
59 |
send_end.close()
|
|
60 |
|
|
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()
|
|
66 |
result = recv_end.recv()
|
|
67 |
recv_end.close()
|
65 |
68 |
process.join(settings.PHANTOM_JS_TIMEOUT)
|
66 |
69 |
|
67 |
70 |
if process.is_alive():
|
... | ... | |
70 |
73 |
context = {k: v for k, v in data.items() if k != 'locators'}
|
71 |
74 |
logger.error("PhantomJS process timeout, context: %s" % context)
|
72 |
75 |
result = {'result': 'timeout'}
|
73 |
|
else:
|
74 |
|
result = recv_end.recv()
|
75 |
76 |
|
76 |
77 |
return result
|
77 |
78 |
|
78 |
|
-
|