Source code for obci.control.launcher.server_scanner

#!/usr/bin/python
# -*- coding: utf-8 -*-

import zmq
import time
import socket
import select

from obci.control.common.message import OBCIMessageTool, send_msg
from obci.control.launcher.launcher_messages import message_templates


UPDATE_INTERVAL = 8
_LOOPS = 3

ALLOWED_SILENCE = 45


[docs]def update_nearby_servers(srv_data, bcast_port, ctx=None, update_push_addr=None): mtool = OBCIMessageTool(message_templates) loops_to_update = _LOOPS s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('', bcast_port)) notify_sock = None if update_push_addr is not None: ctx = ctx if ctx else zmq.Context() notify_sock = ctx.socket(zmq.PUSH) notify_sock.connect(update_push_addr) while True: changed = False try: inp, out, exc = select.select([s], [], [], UPDATE_INTERVAL / _LOOPS) except Exception as e: srv_data.logger.critical("nearby_servers_update - exception: %s", str(e)) srv_data.logger.critical("nearby_servers - aborting") return if s in inp: data, wherefrom = s.recvfrom(1500, 0) msg = data[:-1] message = mtool.unpack_msg(msg) changed = srv_data.update(ip=wherefrom[0], hostname=message.sender_ip, uuid=message.sender, rep_port=message.rep_port, pub_port=message.pub_port) else: # print "no data" pass loops_to_update -= 1 if loops_to_update == 0: loops_to_update = _LOOPS changed = srv_data.clean_silent() if changed: send_msg(notify_sock, mtool.fill_msg('nearby_machines', nearby_machines=srv_data.dict_snapshot())) s.close()
[docs]def broadcast_server(server_uuid, rep_port, pub_port, bcast_port): mtool = OBCIMessageTool(message_templates) str_msg = mtool.fill_msg("server_broadcast", sender_ip=socket.gethostname(), sender=server_uuid, rep_port=rep_port, pub_port=pub_port) str_msg += b'\n' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('', 0)) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # introduction for i in range(10): try: s.sendto(str_msg, ('<broadcast>', bcast_port)) except socket.error as e: pass time.sleep(0.3) # updates while True: try: s.sendto(str_msg, ('<broadcast>', bcast_port)) except socket.error as e: print("[obci_server] Cannot broadcast obci_server, will try again in 1min:", str(e)) time.sleep(53) time.sleep(7) s.close()