class PortChecker(object): def __init__(self, port_dic, ip="localhost", check_interval=TIMEOUT_INTERVAL): self.ip = str(ip) self.port_dic = port_dic self.check_interval = check_interval self.checks = [] self.timing_out = False self.last_connect_dic = {} self.init_checks() self.job = None def _get_checker(self, protocol): if protocol == "tcp": return TcpCommonChecker(self.ip, self.port_dic[protocol]) elif protocol == "http": return HttpCustomChecker(self.ip, self.port_dic[protocol]) elif protocol == "https": return HttpsCustomChecker(self.ip, self.port_dic[protocol]) return None def init_checks(self): for protocol, port in self.port_dic.items(): checker = self._get_checker(protocol) if not checker: logger.warn( "PortChecker::init_checks protocol:%s, port:%s not checker!!!" % (protocol, port)) continue self.checks.append(checker) self.last_connect_dic.setdefault(checker.port, time.time()) def is_timeing_out(self): return self.timing_out def start(self): self.job = Jobs().add_interval_job(self.check_interval, self.check) def stop(self): self.job.stop() def _on_disconnected(self, checker, since_connected): logger.error('Unable to connect to my port:%s for %s: killing myself' % (checker.port, since_connected)) os.kill(os.getpid(), 9) def _on_connected(self): pass def __on_ping_success(self, checker): self.last_connect_dic[checker.port] = time.time() self.timing_out = False self._on_connected() def __on_ping_timeout(self, checker): self.timing_out = True since_connected = int(time.time() - self.last_connect_dic[checker.port]) if since_connected > 2 * TIMEOUT_GRACE: logger.error('Unable to connect to my port:%s for %s' % (checker.port, since_connected)) self._on_disconnected(checker, since_connected) elif since_connected > TIMEOUT_GRACE: logger.error('Unable to connect to my port:%s for %s' % (checker.port, since_connected)) else: logger.warn( 'Unable to connect to my port:%s. Checking again later' % checker.port) def check(self): for checker in self.checks: try: assert checker.ping() == PING_RESPONSE except: self.__on_ping_timeout(checker) continue self.__on_ping_success(checker)
class PortChecker(object): def __init__(self, port_info, ip="localhost", check_interval=TIMEOUT_INTERVAL): """ :param port_ino: 支持以下两个数据格式 1. [{"type":"http/https/tcp/...", "port":"1111"}] 2. {"http/https/tcp/...":1111,,,,,} :param ip: :param check_interval: :return: """ self.ip = str(ip) self.port_ls = port_info if isinstance(port_info, list) else [{"type": k, "port": v} for k, v in port_info.items()] self.check_interval = check_interval self.checks = [] self.timing_out = False self.last_connect_dic = {} self.init_checks() self.job = None def _get_checker(self, type, port): if type == "tcp": return TcpCommonChecker(self.ip, port) elif type == "http": return HttpCustomChecker(self.ip, port) elif type == "https": return HttpsCustomChecker(self.ip, port) return None def init_checks(self): for port_dic in self.port_ls: checker = self._get_checker(port_dic['type'], port_dic['port']) if not checker: logger.warn("PortChecker::init_checks protocol:%s, port:%s not checker!!!" % (port_dic['type'], port_dic['port'])) continue self.checks.append(checker) self.last_connect_dic.setdefault(checker.port, time.time()) def is_timeing_out(self): return self.timing_out def start(self): self.job = Jobs().add_interval_job(self.check_interval, self.check) def stop(self): self.job.stop() def _on_disconnected(self, checker, since_connected): logger.error('Unable to connect to my port:%s for %s: killing myself' % (checker.port, since_connected)) os.kill(os.getpid(), 9) def _on_connected(self): pass def __on_ping_success(self, checker): self.last_connect_dic[checker.port] = time.time() self.timing_out = False self._on_connected() def __on_ping_timeout(self, checker): self.timing_out = True since_connected = int(time.time() - self.last_connect_dic[checker.port]) if since_connected > 2*TIMEOUT_GRACE: logger.error('Unable to connect to my port:%s for %s' % (checker.port, since_connected)) self._on_disconnected(checker, since_connected) elif since_connected > TIMEOUT_GRACE: logger.error('Unable to connect to my port:%s for %s' % (checker.port, since_connected)) else: logger.warn('Unable to connect to my port:%s. Checking again later'% checker.port ) def check(self): for checker in self.checks: try: assert checker.ping() == PING_RESPONSE except: self.__on_ping_timeout(checker) continue self.__on_ping_success(checker)
class PortChecker(object): def __init__(self, port_info, ip="localhost", check_interval=TIMEOUT_INTERVAL): """ :param port_ino: 支持以下两个数据格式 1. [{"type":"http/https/tcp/...", "port":"1111"}] 2. {"http/https/tcp/...":1111,,,,,} :param ip: :param check_interval: :return: """ self.ip = str(ip) self.port_ls = port_info if isinstance(port_info, list) else [{ "type": k, "port": v } for k, v in port_info.items()] self.check_interval = check_interval self.checks = [] self.timing_out = False self.last_connect_dic = {} self.init_checks() self.job = None def _get_checker(self, type, port): if type == "tcp": return TcpCommonChecker(self.ip, port) elif type == "http": return HttpCustomChecker(self.ip, port) elif type == "https": return HttpsCustomChecker(self.ip, port) return None def init_checks(self): for port_dic in self.port_ls: checker = self._get_checker(port_dic['type'], port_dic['port']) if not checker: logger.warn( "PortChecker::init_checks protocol:%s, port:%s not checker!!!" % (port_dic['type'], port_dic['port'])) continue self.checks.append(checker) self.last_connect_dic.setdefault(checker.port, time.time()) def is_timeing_out(self): return self.timing_out def start(self): self.job = Jobs().add_interval_job(self.check_interval, self.check) def stop(self): self.job.stop() def _on_disconnected(self, checker, since_connected): logger.error('Unable to connect to my port:%s for %s: killing myself' % (checker.port, since_connected)) os.kill(os.getpid(), 9) def _on_connected(self): pass def __on_ping_success(self, checker): self.last_connect_dic[checker.port] = time.time() self.timing_out = False self._on_connected() def __on_ping_timeout(self, checker): self.timing_out = True since_connected = int(time.time() - self.last_connect_dic[checker.port]) if since_connected > 2 * TIMEOUT_GRACE: logger.error('Unable to connect to my port:%s for %s' % (checker.port, since_connected)) self._on_disconnected(checker, since_connected) elif since_connected > TIMEOUT_GRACE: logger.error('Unable to connect to my port:%s for %s' % (checker.port, since_connected)) else: logger.warn( 'Unable to connect to my port:%s. Checking again later' % checker.port) def check(self): for checker in self.checks: try: assert checker.ping() == PING_RESPONSE except: self.__on_ping_timeout(checker) continue self.__on_ping_success(checker)