Source code for obci.control.launcher.obci_script_utils
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
import time
import errno
import socket
import subprocess
import zmq
import obci.control.common.net_tools as net
import obci.control.common.obci_control_settings as settings
import obci.control.launcher.obci_client as obci_client
import obci.control.launcher.view as view
from obci.control.common.config_helpers import OBCISystemError
disp = view.OBCIViewText()
[docs]def launch_obci_server(args=[]):
# assume 'obci_server' command is available
try:
srv = subprocess.Popen(['obci_server'] + list(args))
except Exception as e:
print('Server launch error:', str(e))
return None
return srv
[docs]def argv():
return sys.argv[2:]
[docs]def server_process_running(expected_dead=False):
"""
Return true if there is an obci_server process running
"""
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
running = False
for i in range(5):
try:
sock.connect((socket.gethostname(), int(net.server_rep_port())))
except socket.error as e:
if e.errno == errno.ECONNREFUSED:
running = False
if expected_dead:
break
elif e.errno == errno.EISCONN:
running = True
break
else:
print(e)
else:
running = True
break
time.sleep(0.3)
sock.close()
return running
[docs]def connect_client(addresses, client=None, client_class=obci_client.OBCIClient, zmq_ctx=None):
if client is None:
ctx = zmq_ctx or zmq.Context()
try:
client = client_class(addresses, ctx)
except Exception as e:
print("client creation error: ", str(e))
return None, None
result = client.ping_server(timeout=9000)
return result, client
[docs]def client_server_prep(cmdargs=None, client_class=obci_client.OBCIClient, server_ip=None, start_srv=True, zmq_ctx=None):
directory = os.path.abspath(settings.DEFAULT_SANDBOX_DIR)
if not os.path.exists(directory):
print("obci directory not found: {0}".format(directory))
raise OBCISystemError()
client = None
srv = None
os.chdir(directory)
srv_rep_port = net.server_rep_port()
srv_pub_port = net.server_pub_port()
if server_ip:
rep_addrs = ['tcp://' + server_ip + ':' + srv_rep_port]
pub_addrs = ['tcp://' + server_ip + ':' + srv_pub_port]
else:
rep_addrs = ['tcp://*:' + srv_rep_port]
pub_addrs = ['tcp://*:' + srv_pub_port]
if not server_process_running() and not start_srv:
disp.view("Start obci_server (command: obci srv) before performing other tasks")
return None
if not server_process_running() and\
(not server_ip or server_ip == net.lo_ip())\
and start_srv:
print("will launch server")
args = argv() if cmdargs else []
if rep_addrs and pub_addrs:
args += ['--rep-addresses'] + rep_addrs + ['--pub-addresses'] + pub_addrs
srv = launch_obci_server(args)
if not srv:
disp.view("Could not launch OBCI Server")
return None
disp.view("OBCI server launched. PID: {0}".format(srv.pid))
if not server_ip:
rep_addrs = ['tcp://localhost:' + srv_rep_port]
res, client = connect_client(rep_addrs, client_class=client_class, zmq_ctx=zmq_ctx)
if res is None:
disp.view("Could not connect to OBCI Server")
client = None
return client