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))
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))