def __init__(self, nsUri, bchost=None, bcport=None, ipv6=False): self.transportServer = self.TransportServerAdapter(self) self.nsUri = nsUri if bcport is None: bcport = config.NS_BCPORT if bchost is None: bchost = config.NS_BCHOST if ":" in nsUri.host or ipv6: # match nameserver's ip version bchost = bchost or "::" self.sock = socketutil.createBroadcastSocket( (bchost, bcport, 0, 0), reuseaddr=config.SOCK_REUSE, timeout=2.0) else: self.sock = socketutil.createBroadcastSocket( (bchost, bcport), reuseaddr=config.SOCK_REUSE, timeout=2.0) self._sockaddr = self.sock.getsockname() bchost = bchost or self._sockaddr[0] bcport = bcport or self._sockaddr[1] if ":" in bchost: # ipv6 self.locationStr = "[%s]:%d" % (bchost, bcport) else: self.locationStr = "%s:%d" % (bchost, bcport) log.info("ns broadcast server created on %s - %s", self.locationStr, socketutil.family_str(self.sock)) self.running = True
def main(): server = socketutil.createBroadcastSocket(('127.0.0.1', 9005), timeout=1) client1 = socketutil.createBroadcastSocket() client2 = socketutil.createBroadcastSocket() client1.sendto(b'algo', 0, ('0.0.0.0', 9005)) client2.sendto(b'otro algo', 0, ('0.0.0.0', 9005)) try: client1.shutdown(socket.SHUT_RDWR) client2.shutdown(socket.SHUT_RDWR) except: pass client1.close() client2.close() try: data, addr = server.recvfrom(100) print(data) data, addr = server.recvfrom(100) print(data) data, addr = server.recv(100, 16) print(data) except: print('excepcion') try: server.shutdown(socket.SHUT_RDWR) except: pass server.close()
def testBroadcast(self): ss = SU.createBroadcastSocket((None, 0)) port = ss.getsockname()[1] cs = SU.createBroadcastSocket() for bcaddr in config.parseAddressesString(config.BROADCAST_ADDRS): try: cs.sendto(tobytes("monkey"), 0, (bcaddr, port)) except socket.error as x: err = getattr(x, "errno", x.args[0]) # handle some errno that some platforms like to throw if err not in Pyro4.socketutil.ERRNO_EADDRNOTAVAIL and err not in Pyro4.socketutil.ERRNO_EADDRINUSE: raise data, _ = ss.recvfrom(500) self.assertEqual(tobytes("monkey"), data) cs.close() ss.close()
def testBroadcast(self): ss=SU.createBroadcastSocket((None, 0)) port=ss.getsockname()[1] cs=SU.createBroadcastSocket() for bcaddr in Pyro4.config.parseAddressesString(Pyro4.config.BROADCAST_ADDRS): try: cs.sendto(tobytes("monkey"),0,(bcaddr,port)) except socket.error: x=sys.exc_info()[1] err=getattr(x, "errno", x.args[0]) if err not in Pyro4.socketutil.ERRNO_EADDRNOTAVAIL: # yeah, windows likes to throw these... if err not in Pyro4.socketutil.ERRNO_EADDRINUSE: # and jython likes to throw thses... raise data,_=ss.recvfrom(500) self.assertEqual(tobytes("monkey"),data) cs.close() ss.close()
def testCreateBoundSockets(self): s=SU.createSocket(bind=('localhost',0)) bs=SU.createBroadcastSocket(bind=('localhost',0)) self.assertEqual('127.0.0.1',s.getsockname()[0]) self.assertEqual('127.0.0.1',bs.getsockname()[0]) s.close() bs.close() self.assertRaises(ValueError, SU.createSocket, bind=('localhost',12345), connect=('localhost',1234))
def testCreateBoundSockets6(self): s=SU.createSocket(bind=('::1',0)) self.assertEqual(socket.AF_INET6, s.family) bs=SU.createBroadcastSocket(bind=('::1',0)) self.assertTrue(':' in s.getsockname()[0]) self.assertTrue(':' in bs.getsockname()[0]) s.close() bs.close() self.assertRaises(ValueError, SU.createSocket, bind=('::1',12345), connect=('::1',1234))
def testBroadcast(self): ss = SU.createBroadcastSocket((None, 0)) port = ss.getsockname()[1] cs = SU.createBroadcastSocket() for bcaddr in Pyro4.config.parseAddressesString( Pyro4.config.BROADCAST_ADDRS): try: cs.sendto(tobytes("monkey"), 0, (bcaddr, port)) except socket.error: x = sys.exc_info()[1] err = getattr(x, "errno", x.args[0]) if err not in Pyro4.socketutil.ERRNO_EADDRNOTAVAIL: # yeah, windows likes to throw these... if err not in Pyro4.socketutil.ERRNO_EADDRINUSE: # and jython likes to throw thses... raise data, _ = ss.recvfrom(500) self.assertEqual(tobytes("monkey"), data) cs.close() ss.close()
def testCreateBoundSockets(self): s = SU.createSocket(bind=("127.0.0.1", 0)) self.assertEqual(socket.AF_INET, s.family) bs = SU.createBroadcastSocket(bind=("127.0.0.1", 0)) self.assertEqual("127.0.0.1", s.getsockname()[0]) self.assertEqual("127.0.0.1", bs.getsockname()[0]) s.close() bs.close() self.assertRaises(ValueError, SU.createSocket, bind=("localhost", 12345), connect=("localhost", 1234))
def testCreateBoundSockets6(self): s = SU.createSocket(bind=('::1', 0)) self.assertEqual(socket.AF_INET6, s.family) bs = SU.createBroadcastSocket(bind=('::1', 0)) self.assertIn(':', s.getsockname()[0]) self.assertIn(':', bs.getsockname()[0]) s.close() bs.close() self.assertRaises(ValueError, SU.createSocket, bind=('::1', 12345), connect=('::1', 1234))
def __is_disconnected_loop(self): while True: if not self.localhost: try: self.ip = others.get_ip() if self.ip == '127.0.0.1': self.disconnected = True self.up_to_date = False self.queue = queue.Queue() with self.main_server_lock: self.im_main_server = False # aryan if not self.last_time_conected: self.last_time_conected = 5 # aryan end elif self.disconnected: # mandar a todos los otros servers mi uri scanner = socketutil.createBroadcastSocket() scanner.settimeout(self.UPDATE_SERVERS_TIMEOUT) try: s = 'receive_uri {0}'.format(self.server_uri) scanner.sendto(s.encode(), ('255.255.255.255', self.SERVERS_PORT)) except: print('Error al hacer broadcast') self.disconnected = False print('Conectado') # aryan self.last_time_conected = None print("> Eliminando replicas inconclusas") with self.pending_replic_lock: for corrupted_file in self.pending_replic: os.remove(os.path.join(self.DIRECTORY, self.storage.get_address(corrupted_file[1], corrupted_file[0]))) self.storage.update_address(corrupted_file[1], corrupted_file[0]) print("> Todo eliminado") print(self.pending_replic) # aryan end self.__update() elif not self.up_to_date: self.__update() time.sleep(self.IS_DISCONNECTED_TIME_LOOP) except: continue else: self.up_to_date = True time.sleep(self.IS_DISCONNECTED_TIME_LOOP)
def get_all_ns() -> list: """ Method used for get the majority of uris of the names servers. :rtype: list :return: a list containing names server's uris in the local net, incluiding, if exist, the host's name server. """ # revisar tanto el localhost como hacer broadcast remotes_ns = [] # broadcast lookup port = config.NS_BCPORT print("broadcast locate") sock = socketutil.createBroadcastSocket(reuseaddr=config.SOCK_REUSE, timeout=5.0) for _ in range(3): for bcaddr in config.parseAddressesString(config.BROADCAST_ADDRS): try: sock.sendto(b"GET_NSURI", 0, (bcaddr, port)) except socket.error as x: err = getattr(x, "errno", x.args[0]) # handle some errno's that some platforms like to throw: if err not in socketutil.ERRNO_EADDRNOTAVAIL and err not in socketutil.ERRNO_EADDRINUSE: raise try: while True: data, _ = sock.recvfrom(100) if sys.version_info >= (3, 0): data = data.decode("iso-8859-1") print("located NS: %s", data) if data not in remotes_ns: remotes_ns.append(data) except socket.timeout: pass try: sock.shutdown(socket.SHUT_RDWR) except (OSError, socket.error): pass sock.close() return remotes_ns
def testCreateUnboundSockets(self): s=SU.createSocket() bs=SU.createBroadcastSocket() try: host,port=s.getsockname() self.assertEqual(0, port) except socket.error: pass try: if os.name!="java": host,port=bs.getsockname() self.assertEqual(0, port) except socket.error: pass s.close() bs.close()
def response_receive_uri(self): listener = socketutil.createBroadcastSocket(('', self.SERVERS_PORT)) while True: try: data, address = listener.recvfrom(512) with self.main_server_lock: if (data.decode() == 'get_uri_client' and self.im_main_server) or data.decode() == 'get_uri': listener.sendto(self.server_uri.encode(), address) elif self.im_main_server: s = data.decode().split() if s[0] == 'receive_uri': with self.servers_lock: if s[1] is not None and not self.servers.__contains__(s[1]) and self.server_uri != s[1]: self.servers.append(s[1]) except: continue
def check_main_server_is_alive(self): scanner = socketutil.createBroadcastSocket() scanner.settimeout(self.UPDATE_SERVERS_TIMEOUT) main_server = None try: scanner.sendto(b'get_uri_client', ('255.255.255.255', 1212)) except: print('Error al hacer broadcast') while True: try: data, address = scanner.recvfrom(512) if data.decode() != self.server_uri: return True, data.decode() except: break return False, None
def _beep_loop(self): """ Send the worker's URI in order to be detected by clients in the network It broadcasts its URI on the network and to user-specified ip addresses on the 'ips.conf' file. It's intended to run 'forever' on a separated thread. """ while True: # Create a broadcast socket and send through it the worker's URI. beeper = pyrosocket.createBroadcastSocket() try: # Broadcast on local network beeper.sendto(self.uri.encode(), ('255.255.255.255', 5555)) # Beep IP addresses read from ips.conf file if exists if not os.path.exists('config/ips.conf'): os.makedirs('config') with open('config/ips.conf', 'w') as ips: ips.write( "# You can put in this file known clients IP addresses or networks that may use " + "a worker running on this computer.") with open('config/ips.conf') as ips: for line in ips: try: if '/' in line: # Network net = ipaddress.IPv4Network(line) ip = net.broadcast_address else: # Single ip address ip = ipaddress.ip_address(line) except ValueError: # Invalid entry in ips.conf. continue beeper.sendto(self.uri.encode(), (str(ip), 5555)) except OSError: pass finally: beeper.close() time.sleep(Worker.BEEP_INTERVAL) # rest some time before next beep
def testCreateUnboundSockets6(self): s=SU.createSocket(ipv6=True) self.assertEqual(socket.AF_INET6, s.family) bs=SU.createBroadcastSocket(ipv6=True) self.assertEqual(socket.AF_INET6, bs.family) try: host,port,_,_=s.getsockname() # can either fail with socket.error or return (host,0) self.assertEqual(0,port) except socket.error: pass try: host,port,_,_=bs.getsockname() # can either fail with socket.error or return (host,0) self.assertEqual(0,port) except socket.error: pass s.close() bs.close()
def testCreateUnboundSockets6(self): s = SU.createSocket(ipv6=True) self.assertEqual(socket.AF_INET6, s.family) bs = SU.createBroadcastSocket(ipv6=True) self.assertEqual(socket.AF_INET6, bs.family) try: host, port, _, _ = s.getsockname() # can either fail with socket.error or return (host,0) self.assertEqual(0, port) except socket.error: pass try: host, port, _, _ = bs.getsockname() # can either fail with socket.error or return (host,0) self.assertEqual(0, port) except socket.error: pass s.close() bs.close()
def scan_loop(self): scanner = socketutil.createBroadcastSocket() scanner.settimeout(self.UPDATE_SERVERS_TIMEOUT) main_server = None try: scanner.sendto(b'get_uri_client', ('255.255.255.255', 1212)) except: print('Error al hacer broadcast') while True: try: data, address = scanner.recvfrom(512) main_server = data.decode() break except: break self.main_server = main_server print('Servidor Principal:{0}'.format(self.main_server))
def _listen_loop(self): """ Listen to the network waiting for workers URIs. It's intended to run 'forever' on a separated thread. """ with pyrosocket.createBroadcastSocket(('', 5555)) as listener: while True: try: data, address = listener.recvfrom(1024) uri = data.decode() except ConnectionResetError: continue try: winfo = WorkerInfo(uri) if winfo.local_uri == self.worker._local_uri: # Avoid to duplicate local worker. continue with self.workers_lock: # Save or update information about the worker old_winfo = self.workers_map.get(uri, None) if old_winfo: # It's an 'old known' worker, just update its info old_winfo.load = winfo.load heapq.siftup(self.workers, old_winfo.index) else: # New worker we didn't knew about! self.workers_map[uri] = winfo heapq.heappush(self.workers, winfo) self.log.report('Received beep from worker %s.' % winfo.uri) except (TypeError, Pyro4.errors.PyroError): # Invalid uri or TimeoutError, ConnectionClosedError continue
def search_others_servers(self): # while True: scanner = socketutil.createBroadcastSocket() scanner.settimeout(self.UPDATE_SERVERS_TIMEOUT) new_servers = [] try: scanner.sendto(b'get_uri', ('255.255.255.255', self.SERVERS_PORT)) except: print('Error al hacer broadcast') while True: try: data, address = scanner.recvfrom(512) if data.decode() != self.server_uri: new_servers.append(data.decode()) except: break with self.servers_lock: self.servers = new_servers time.sleep(self.UPDATE_SERVERS_TIME)
def create_broadcast_ssl_socket(*args, **kwargs): """Override the Pyro createBroadcastSocket method and wrap with SSL""" socket = socketutil.createBroadcastSocket(*args, **kwargs) ssl_socket = SSLSocket.wrap_socket(socket, *args, **kwargs) return ssl_socket