Beispiel #1
0
 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
Beispiel #2
0
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()
Beispiel #3
0
 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()
Beispiel #4
0
 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()
Beispiel #5
0
 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()
Beispiel #6
0
 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))
Beispiel #7
0
 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))
Beispiel #8
0
 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()
Beispiel #9
0
 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))
Beispiel #10
0
 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
Beispiel #13
0
 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
Beispiel #16
0
    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
Beispiel #17
0
 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()
Beispiel #18
0
 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()
Beispiel #19
0
    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))
Beispiel #20
0
    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)
Beispiel #22
0
 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
Beispiel #23
0
 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