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
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, e: if e.errno == errno.ECONNREFUSED: running = False if expected_dead: break elif e.errno == errno.EISCONN: running = True break else: print str(e) else: running = True break time.sleep(0.3)
def __init__(self, rep_addresses=None, pub_addresses=None, name='obci_server'): self.experiments = {} self.exp_process_supervisors = {} self._nearby_servers = net.DNS() super(OBCIServer, self).__init__(None, rep_addresses, pub_addresses, name) self.machine = socket.gethostname() self.rep_port = int(net.server_rep_port()) self.pub_port = int(net.server_pub_port()) bcast_port = int(net.server_bcast_port()) self._nearby_servers.logger = self.logger self._bcast_server = threading.Thread(target=broadcast_server, args=[self.uuid, self.rep_port, self.pub_port, bcast_port]) self._bcast_server.daemon = True self._bcast_server.start() self._nearby_updater = threading.Thread(target=update_nearby_servers, args=[self._nearby_servers, bcast_port, self.ctx, self._push_addr]) self._nearby_updater.daemon = True self._nearby_updater.start() self.subprocess_mgr = SubprocessMonitor(self.ctx, self.uuid, logger=self.logger)
def __init__(self, rep_addresses=None, pub_addresses=None, name='obci_server'): self.experiments = {} self.exp_process_supervisors = {} self._nearby_servers = net.DNS() super(OBCIServer, self).__init__(None, rep_addresses, pub_addresses, name) self.machine = socket.gethostname() self.rep_port = int(net.server_rep_port()) self.pub_port = int(net.server_pub_port()) bcast_port = int(net.server_bcast_port()) self._nearby_servers.logger = self.logger self._bcast_server = threading.Thread( target=broadcast_server, args=[self.uuid, self.rep_port, self.pub_port, bcast_port]) self._bcast_server.daemon = True self._bcast_server.start() self._nearby_updater = threading.Thread( target=update_nearby_servers, args=[self._nearby_servers, bcast_port, self.ctx, self._push_addr]) self._nearby_updater.daemon = True self._nearby_updater.start() self.subprocess_mgr = SubprocessMonitor(self.ctx, self.uuid, logger=self.logger)
def _gather_other_server_results(ctx, this_addr, ip_list): exps = [] if not ip_list: return exps mtool = OBCIMessageTool(message_templates) other_exps_pull = ctx.socket(zmq.PULL) port = other_exps_pull.bind_to_random_port('tcp://*', min_port=PORT_RANGE[0], max_port=PORT_RANGE[1], max_tries=500) my_push_addr = this_addr + ':' + str(port) LOGGER.info("my exp_data pull: " + my_push_addr) harvester = zmq.Poller() harvester.register(other_exps_pull) reqs = {} for srv_ip in ip_list: addr = 'tcp://' + srv_ip + ':' + net.server_rep_port() req = ctx.socket(zmq.REQ) req.connect(addr) send_msg( req, mtool.fill_msg('find_eeg_experiments', client_push_address='tcp://' + my_push_addr, checked_srvs=[this_addr])) harvester.register(req, zmq.POLLIN) reqs[req] = addr srv_responses = 0 for i in range(len(reqs) * 50): socks = dict(harvester.poll(timeout=300)) for req in socks: msg = recv_msg(req) msg = mtool.unpack_msg(msg) if msg.type == 'rq_ok': LOGGER.info("waiting for experiments from server: " + str(reqs[req])) harvester.unregister(req) req.close() elif msg.type == 'eeg_experiments': LOGGER.info("GOT EXPERIMENTS from: " + msg.sender_ip) exps += msg.experiment_list srv_responses += 1 else: LOGGER.warning('strange msg: ' + str(msg)) if srv_responses == len(ip_list): print "GOT ALL eeg_experiment RESPONSES :-) [addr list: ", ip_list, "]" break other_exps_pull.close() return exps
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
def _gather_other_server_results(ctx, this_addr, ip_list): exps = [] if not ip_list: return exps mtool = OBCIMessageTool(message_templates) other_exps_pull = ctx.socket(zmq.PULL) port = other_exps_pull.bind_to_random_port('tcp://*', min_port=PORT_RANGE[0], max_port=PORT_RANGE[1], max_tries=500) my_push_addr = this_addr + ':' + str(port) LOGGER.info("my exp_data pull: " + my_push_addr) harvester = zmq.Poller() harvester.register(other_exps_pull) reqs = {} for srv_ip in ip_list: addr = 'tcp://' + srv_ip + ':' + net.server_rep_port() req = ctx.socket(zmq.REQ) req.connect(addr) send_msg(req, mtool.fill_msg('find_eeg_experiments', client_push_address='tcp://' + my_push_addr, checked_srvs=[this_addr])) harvester.register(req, zmq.POLLIN) reqs[req] = addr srv_responses = 0 for i in range(len(reqs) * 50): socks = dict(harvester.poll(timeout=300)) for req in socks: msg = recv_msg(req) msg = mtool.unpack_msg(msg) if msg.type == 'rq_ok': LOGGER.info("waiting for experiments from server: " + str(reqs[req])) harvester.unregister(req) req.close() elif msg.type == 'eeg_experiments': LOGGER.info("GOT EXPERIMENTS from: " + msg.sender_ip) exps += msg.experiment_list srv_responses += 1 else: LOGGER.warning('strange msg: ' + str(msg)) if srv_responses == len(ip_list): print("GOT ALL eeg_experiment RESPONSES :-) [addr list: ", ip_list, "]") break other_exps_pull.close() return exps
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
from obci.control.launcher.launcher_messages import message_templates from obci.control.common.obci_control_settings import PORT_RANGE import obci.control.common.net_tools as net if __name__ == '__main__': mtool = OBCIMessageTool(message_templates) pl = PollingObject() # ifname = net.server_ifname() my_addr = 'tcp://' + 'localhost' ctx = zmq.Context() server_req = ctx.socket(zmq.REQ) server_req.connect(my_addr + ':' + net.server_rep_port()) exp_info_pull = ctx.socket(zmq.PULL) port = exp_info_pull.bind_to_random_port('tcp://*', min_port=PORT_RANGE[0], max_port=PORT_RANGE[1], max_tries=500) client_push_addr = my_addr + ':' + str(port) print(client_push_addr) send_msg(server_req, mtool.fill_msg('find_eeg_experiments', client_push_address=client_push_addr)) msg, details = pl.poll_recv(server_req, 5000) if not msg: print("srv request timeout!")
from obci.control.launcher.launcher_messages import message_templates, error_codes from obci.control.common.obci_control_settings import PORT_RANGE import obci.control.common.net_tools as net if __name__ == '__main__': mtool = OBCIMessageTool(message_templates) pl = PollingObject() # ifname = net.server_ifname() my_addr = 'tcp://' + 'localhost' ctx = zmq.Context() server_req = ctx.socket(zmq.REQ) server_req.connect(my_addr + ':' + net.server_rep_port()) exp_info_pull = ctx.socket(zmq.PULL) port = exp_info_pull.bind_to_random_port('tcp://*', min_port=PORT_RANGE[0], max_port=PORT_RANGE[1], max_tries=500) client_push_addr = my_addr + ':' + str(port) print client_push_addr send_msg( server_req, mtool.fill_msg('find_eeg_experiments', client_push_address=client_push_addr))