Ejemplo n.º 1
0
 def __init__(self, filename):
     self.msg_f = MsgFactory(PYMDHT_VERSION, MY_ID)
     self._lock = threading.Lock()
     self._is_done = False
     self._pinged_ips = set()
     self._pinged_addrs = set()
     self._ok_addrs = set()
     self._file = open(filename)
     self.reactor = ThreadedReactor(self._main_loop, PORT,
                                    self._on_datagram_received)
     self.reactor.start()
Ejemplo n.º 2
0
 def __init__(self, filename):
     self.msg_f = MsgFactory(VERSION_LABEL, MY_ID)
     self._lock = threading.Lock()
     self._is_done = False
     self._pinged_ips = set()
     self._pinged_addrs = set()
     self._ok_subnet_addrs = {}
     self._found_nodes = []
     self._file = open(filename)
     self.reactor = ThreadedReactor(self._main_loop, PORT,
                                    self._on_datagram_received)
     self.reactor.start()
Ejemplo n.º 3
0
class BootstrapChecker(object):

    def __init__(self, filename):
        self.msg_f = MsgFactory(PYMDHT_VERSION, MY_ID)
        self._lock = threading.Lock()
        self._is_done = False
        self._pinged_ips = set()
        self._pinged_addrs = set()
        self._ok_addrs = set()
        self._file = open(filename)
        self.reactor = ThreadedReactor(
            self._main_loop,
            PORT, self._on_datagram_received)
        self.reactor.start()


    def _get_ping_datagram(self):
        try:
            line = self._file.next()
        except (StopIteration):
            with self._lock:
                self._is_done = True
                return
        print '>>>>', line
        ip, str_port = line.split()
        if ip in self._pinged_ips:
            #duplicated IP, ignore
            return
        addr = (ip, int(str_port))
        msg = self.msg_f.outgoing_ping_query(Node(addr))
        return Datagram(msg.stamp(TID), addr)
        
    def _main_loop(self):
        datagrams_to_send = []
        datagram = self._get_ping_datagram()
        if datagram:
            self._pinged_ips.add(datagram.addr[0])
            self._pinged_addrs.add(datagram.addr)
            datagrams_to_send.append(datagram)
        return TIMEOUT, datagrams_to_send

    def _on_datagram_received(self, datagram):
        addr = datagram.addr
        if addr in self._pinged_addrs:
            self._pinged_addrs.remove(addr)
            self._ok_addrs.add(addr)
        return TIMEOUT, []
        
            
    def is_done(self):
        with self._lock:
            done = self._is_done
        return done

    def stop_and_get_result(self):
        self.reactor.stop()
        return sorted(list(self._ok_addrs))
Ejemplo n.º 4
0
class BootstrapChecker(object):

    def __init__(self, filename):
        self.msg_f = MsgFactory(PYMDHT_VERSION, MY_ID)
        self._lock = threading.Lock()
        self._is_done = False
        self._pinged_ips = set()
        self._pinged_addrs = set()
        self._ok_addrs = set()
        self._file = open(filename)
        self.reactor = ThreadedReactor(
            self._main_loop,
            PORT, self._on_datagram_received)
        self.reactor.start()


    def _get_ping_datagram(self):
        try:
            line = self._file.next()
        except (StopIteration):
            with self._lock:
                self._is_done = True
                return
        print '>>>>', line
        ip, str_port = line.split()
        if ip in self._pinged_ips:
            #duplicated IP, ignore
            return
        addr = (ip, int(str_port))
        msg = self.msg_f.outgoing_ping_query(Node(addr))
        return Datagram(msg.stamp(TID), addr)
        
    def _main_loop(self):
        datagrams_to_send = []
        datagram = self._get_ping_datagram()
        if datagram:
            self._pinged_ips.add(datagram.addr[0])
            self._pinged_addrs.add(datagram.addr)
            datagrams_to_send.append(datagram)
        return TIMEOUT, datagrams_to_send

    def _on_datagram_received(self, datagram):
        addr = datagram.addr
        if addr in self._pinged_addrs:
            self._pinged_addrs.remove(addr)
            self._ok_addrs.add(addr)
        return TIMEOUT, []
        
            
    def is_done(self):
        with self._lock:
            done = self._is_done
        return done

    def stop_and_get_result(self):
        self.reactor.stop()
        return sorted(list(self._ok_addrs))
Ejemplo n.º 5
0
 def __init__(self, filename):
     self.msg_f = MsgFactory(PYMDHT_VERSION, MY_ID)
     self._lock = threading.Lock()
     self._is_done = False
     self._pinged_ips = set()
     self._pinged_addrs = set()
     self._ok_addrs = set()
     self._file = open(filename)
     self.reactor = ThreadedReactor(self._main_loop, PORT, self._on_datagram_received)
     self.reactor.start()
Ejemplo n.º 6
0
 def __init__(self, filename):
     self.msg_f = MsgFactory(VERSION_LABEL, MY_ID)
     self._lock = threading.Lock()
     self._is_done = False
     self._pinged_ips = set()
     self._pinged_addrs = set()
     self._ok_subnet_addrs = {}
     self._found_nodes = []
     self._file = open(filename)
     self.reactor = ThreadedReactor(
         self._main_loop,
         PORT, self._on_datagram_received)
     self.reactor.start()
Ejemplo n.º 7
0
class NodeCrawler(object):

    def __init__(self, filename):
        self.msg_f = MsgFactory(VERSION_LABEL, MY_ID)
        self._lock = threading.Lock()
        self._is_done = False
        self._pinged_ips = set()
        self._pinged_addrs = set()
        self._ok_subnet_addrs = {}
        self._found_nodes = []
        self._file = open(filename)
        self.reactor = ThreadedReactor(
            self._main_loop,
            PORT, self._on_datagram_received)
        self.reactor.start()

    def _get_node_from_file(self):
        try:
            line = self._file.next()
        except (StopIteration):
            return
        ip, str_port = line.split()
        return Node((ip, int(str_port)))

    def _get_found_node(self):
        if len(self._ok_subnet_addrs) < MAX_NODES and self._found_nodes:
            return self._found_nodes.pop(0)
                        
    def _get_ping_datagram(self):
        datagram = None
        node_ = self._get_node_from_file()
        if not node_:
            node_ = self._get_found_node()
        if node_:
            if node_.ip in self._pinged_ips:
                #duplicated IP, ignore
                return
            print '>>>>', node_, len(self._ok_subnet_addrs), len(self._found_nodes)
            msg = self.msg_f.outgoing_find_node_query(node_,
                                                      RandomId())
            datagram = Datagram(msg.stamp(TID), node_.addr)
        else:
            with self._lock:                                                                        
                self._is_done = True  
        return datagram

    def _main_loop(self):
        datagrams_to_send = []
        datagram = self._get_ping_datagram()
        if datagram:
            self._pinged_ips.add(datagram.addr[0])
            self._pinged_addrs.add(datagram.addr)
            datagrams_to_send.append(datagram)
        return TIMEOUT, datagrams_to_send

    def _on_datagram_received(self, datagram):
        #TODO: do not add to UNSTABLE if node is alredy in STABLE
        addr = datagram.addr
        subnet = utils.get_subnet(addr)
        if addr in self._pinged_addrs:
            self._pinged_addrs.remove(addr)
            self._ok_subnet_addrs[subnet] = addr
        if len(self._found_nodes) < MAX_NODES:
            msg = IncomingMsg(None, datagram)
            for node_ in msg.all_nodes or []:
                if utils.get_subnet(node_.addr) not in self._ok_subnet_addrs:
                    self._found_nodes.append(node_)
        return TIMEOUT, []
        
            
    def is_done(self):
        with self._lock:
            done = self._is_done
        return done

    def stop_and_get_result(self):
        self.reactor.stop()
        return sorted(self._ok_subnet_addrs.values())
Ejemplo n.º 8
0
class NodeCrawler(object):
    def __init__(self, filename):
        self.msg_f = MsgFactory(VERSION_LABEL, MY_ID)
        self._lock = threading.Lock()
        self._is_done = False
        self._pinged_ips = set()
        self._pinged_addrs = set()
        self._ok_subnet_addrs = {}
        self._found_nodes = []
        self._file = open(filename)
        self.reactor = ThreadedReactor(self._main_loop, PORT,
                                       self._on_datagram_received)
        self.reactor.start()

    def _get_node_from_file(self):
        try:
            line = self._file.next()
        except (StopIteration):
            return
        ip, str_port = line.split()
        return Node((ip, int(str_port)))

    def _get_found_node(self):
        if len(self._ok_subnet_addrs) < MAX_NODES and self._found_nodes:
            return self._found_nodes.pop(0)

    def _get_ping_datagram(self):
        datagram = None
        node_ = self._get_node_from_file()
        if not node_:
            node_ = self._get_found_node()
        if node_:
            if node_.ip in self._pinged_ips:
                #duplicated IP, ignore
                return
            print '>>>>', node_, len(self._ok_subnet_addrs), len(
                self._found_nodes)
            msg = self.msg_f.outgoing_find_node_query(node_, RandomId())
            datagram = Datagram(msg.stamp(TID), node_.addr)
        else:
            with self._lock:
                self._is_done = True
        return datagram

    def _main_loop(self):
        datagrams_to_send = []
        datagram = self._get_ping_datagram()
        if datagram:
            self._pinged_ips.add(datagram.addr[0])
            self._pinged_addrs.add(datagram.addr)
            datagrams_to_send.append(datagram)
        return TIMEOUT, datagrams_to_send

    def _on_datagram_received(self, datagram):
        #TODO: do not add to UNSTABLE if node is alredy in STABLE
        addr = datagram.addr
        subnet = utils.get_subnet(addr)
        if addr in self._pinged_addrs:
            self._pinged_addrs.remove(addr)
            self._ok_subnet_addrs[subnet] = addr
        if len(self._found_nodes) < MAX_NODES:
            msg = IncomingMsg(None, datagram)
            for node_ in msg.all_nodes or []:
                if utils.get_subnet(node_.addr) not in self._ok_subnet_addrs:
                    self._found_nodes.append(node_)
        return TIMEOUT, []

    def is_done(self):
        with self._lock:
            done = self._is_done
        return done

    def stop_and_get_result(self):
        self.reactor.stop()
        return sorted(self._ok_subnet_addrs.values())