Пример #1
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))
Пример #2
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))