def __init__(self, port, map_filename): self.port = port self.map_filename = map_filename self.logger = logging.getLogger('network-monitor') self.cmap = GlobalMap(map_filename) self.logger.info('Loaded %d countries from "%s"' %(len(self.cmap.map), map_filename)) self.cmap.check_connectivity() self.logger.info('The graph of countries is connected...')
def initMapGrids(self): region = map(float,self.cfgs.get('china_region').strip().split(',')) encode = self.cfgs.get('coordinate_encode','').strip() if encode: func = import_function(encode) region[0],region[1] = func(region[0],region[1]) cfgs = self.cfgs.get('map_grids',[]) for cfg in cfgs: name = cfg.get('name') size = map(float,cfg.get('cell_size').strip().split('x')) l1,l2 = map(int,cfg.get('scale_level').strip().split(',')) mapgrid = GlobalMap(name,size,region) self.map_grids[name] = mapgrid for level in range(l1,l2+1): self.scale_levels[level] = mapgrid
class NetworkMonitor: def __init__(self, port, map_filename): self.port = port self.map_filename = map_filename self.logger = logging.getLogger('network-monitor') self.cmap = GlobalMap(map_filename) self.logger.info('Loaded %d countries from "%s"' %(len(self.cmap.map), map_filename)) self.cmap.check_connectivity() self.logger.info('The graph of countries is connected...') def read_and_close(self, sock, edge_locations): try: data = sock.recv(4096) edge_location = EdgeLocation.from_text(data) if not edge_location in edge_locations: edge_locations.append(edge_location) else: self.logger.info('Edge location %s already part of the snapshot' % (edge_location)) except Exception as e: self.logger.exception(e) addr = str(sock.getpeername()) self.logger.error('Mishandling subscribe from %s: "%s"' %(addr, data)) finally: sock.shutdown(socket.SHUT_RDWR) sock.close() def monitor(self): prev_snapshot = NetworkSnapshot() snapshot = NetworkSnapshot() last_snapshot = time.time() exceptionCount = 0 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('', self.port)) sock.listen(0) self.logger.info('Listening on port %d' %(self.port)) readFds = set([sock]) while True: try: timeout = last_snapshot + snapshot.interval - time.time() rs, ws, xs = select.select(readFds, [], [], timeout) exceptionCount = 0 if not rs: # timeout, so we take a snapshot with what we got if snapshot != prev_snapshot: self.logger.info('Taking snapshot with %s' %(str(snapshot))) self.cmap.assign_edge_locations(snapshot.edge_locations) self.cmap.update_memcache() snapshot.memcache_save() last_snapshot = time.time() prev_snapshot.edge_locations = snapshot.edge_locations snapshot.clear() continue for readFd in rs: if readFd == sock: # incoming connection conn, addr = sock.accept() readFds.add(conn) else: self.read_and_close(readFd, snapshot.edge_locations) readFds.remove(readFd) except KeyboardInterrupt: self.logger.info('Exiting...') sock.close() exit() except select.error as e: self.logger.exception(e) # this might happen if we miss a deadline with other operations if timeout < 0: last_snapshot += snapshot.interval exceptionCount += 1 # if we get more than 3 exceptions in a row, we give up if exceptionCount > 3: sock.close() exit()