Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)