Пример #1
0
 def test_request_handler_failure4():
     request_handler = RequestHandler()
     request_handler.req = lambda: 'fake error'
     try:
         RequestHandler().get('https://127.0.0.1:4')
         raise AssertionError(
             'failed to raise exception for RequestHandler.get(https://127.0.0.1:4)'
         )
     except CriticalError:
         pass
Пример #2
0
 def test_request_handler_failure3():
     request_handler = RequestHandler()
     request_handler.req = lambda: {
         'status': 500,
         'content': {
             'message': 'fake message unknown protocol'
         }
     }
     try:
         RequestHandler().get('https://127.0.0.1:3')
         raise AssertionError(
             'failed to raise exception for RequestHandler.get(https://127.0.0.1:3)'
         )
     except CriticalError:
         pass
Пример #3
0
 def test_request_handler_failure2():
     request_handler = RequestHandler()
     request_handler.req = lambda: {
         'status': 500,
         'content': {
             'message': 'fake message BadStatusLine'
         }
     }
     try:
         RequestHandler().get('127.0.0.1:2')
         raise AssertionError(
             'failed to raise exception for RequestHandler.get(127.0.0.1:2)'
         )
     except CriticalError:
         pass
Пример #4
0
class RestNagiosPlugin(NagiosPlugin):

    __version__ = __version__
    # abstract class
    __metaclass__ = ABCMeta

    def __init__(self):
        # Python 2.x
        super(RestNagiosPlugin, self).__init__()
        # Python 3.x
        # super().__init__()
        self.name = None
        self.default_host = 'localhost'
        self.default_port = 80
        self.default_user = None
        self.default_password = None
        self.host = None
        self.port = None
        self.user = None
        self.password = None
        self.protocol = 'http'
        self.msg = 'rest msg not defined yet'
        self.request = RequestHandler()
        self.request_method = 'get'
        self.req = None
        self.json_data = None
        self.path = None
        self.json = False
        self.headers = {}
        self.auth = True
        self.ok()

    def add_options(self):
        self.add_hostoption(name=self.name,
                            default_host=self.default_host,
                            default_port=self.default_port)
        if self.auth:
            self.add_useroption(name=self.name,
                                default_user=self.default_user,
                                default_password=self.default_password)
            self.add_opt('--kerberos', action='store_true',
                         help='Kerberos SpNego authentication, uses TGT cache from $KRB5CCNAME or keytab ' + \
                              'from $KRB5_CLIENT_KEYTAB environment variable if defined ' + \
                              '(overrides --user/--password)')
        self.add_ssl_option()

    def process_options(self):
        self.no_args()
        self.host = self.get_opt('host')
        self.port = self.get_opt('port')
        validate_host(self.host)
        validate_port(self.port)
        if self.auth and self.get_opt('kerberos'):
            self.auth = 'kerberos'
        if self.auth:
            self.user = self.get_opt('user')
            self.password = self.get_opt('password')
            if self.auth == 'optional':
                if self.user and self.password:
                    validate_user(self.user)
                    validate_password(self.password)
            elif self.auth == 'kerberos':
                if os.getenv('KRB5_CLIENT_KTNAME'):
                    log.debug('kerberos enabled, will try to use keytab at %s',
                              os.getenv('KRB5_CLIENT_KTNAME'))
                    # if using KRB5_CLIENT_KTNAME to kinit avoid clobbering the same TGT cache /tmp/krb5cc_{uid}
                    # as that may be used by different programs kinit'd different keytabs
                    os.environ[
                        'KRB5CCNAME'] = '/tmp/krb5cc_{euid}_{basename}'.format(
                            euid=os.geteuid(), basename=prog)
            else:
                validate_user(self.user)
                validate_password(self.password)
        ssl_noverify = self.get_opt('ssl_noverify')
        if ssl_noverify:
            log_option('ssl no verify', 'true')
            ssl = 1
            os.environ['SSL_NO_VERIFY'] = '1'
            # doesn't work, probably too late after instantiation
            #if not os.getenv('PYTHONWARNINGS'):
            #    os.environ['PYTHONWARNINGS'] = 'ignore:Unverified HTTPS request'
            urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        else:
            ssl = self.get_opt('ssl')
            log_option('ssl', ssl)
        if ssl and self.protocol == 'http':
            self.protocol = 'https'
        if self.json:
            # recommended for many systems like CouchDB
            # but breaks Ambari API calls
            #self.headers['Accept'] = 'application/json'
            self.headers['Content-Type'] = 'application/json'

    def run(self):
        start_time = time.time()
        self.req = self.query()
        query_time = time.time() - start_time
        if self.json:
            log.info('parsing json response')
            self.process_json(self.req.content)
        else:
            log.info('parsing response')
            self.parse(self.req)
        if '|' not in self.msg:
            self.msg += ' |'
        if ' query_time=' not in self.msg:
            self.msg += ' query_time={0:.4f}s'.format(query_time)

    def query(self):
        url = '{proto}://{host}:{port}/'.format(proto=self.protocol,
                                                host=self.host,
                                                port=self.port)
        if self.path:
            url += self.path.lstrip('/')
        auth = None
        if self.auth == 'kerberos':
            log.info('authenticating to Rest API with Kerberos')
            auth = HTTPKerberosAuth(mutual_authentication=OPTIONAL)
        elif self.user and self.password:
            log.info('authenticating to Rest API with username and password')
            auth = (self.user, self.password)  # pylint: disable=redefined-variable-type
        kwargs = {}
        if os.getenv('SSL_NO_VERIFY'):
            kwargs['verify'] = False
        req = self.request.req(self.request_method,
                               url,
                               auth=auth,
                               headers=self.headers,
                               **kwargs)
        return req

    #@abstractmethod
    def parse(self, req):
        pass

    #@abstractmethod
    def parse_json(self, json_data):
        pass

    def process_json(self, content):
        try:
            self.json_data = json.loads(content)
            if log.isEnabledFor(logging.DEBUG):
                log.debug('JSON prettified:\n\n%s\n%s', jsonpp(self.json_data),
                          '=' * 80)
            return self.parse_json(self.json_data)
        #except (KeyError, ValueError) as _:
        #raise UnknownError('{0}: {1}. {2}'.format(type(_).__name__, _, support_msg_api()))
        except (KeyError, ValueError):
            raise UnknownError('{0}. {1}'.format(self.exception_msg(),
                                                 support_msg_api()))
Пример #5
0
class RestNagiosPlugin(NagiosPlugin):

    __version__ = __version__
    # abstract class
    __metaclass__ = ABCMeta

    def __init__(self):
        # Python 2.x
        super(RestNagiosPlugin, self).__init__()
        # Python 3.x
        # super().__init__()
        self.name = None
        self.default_host = 'localhost'
        self.default_port = 80
        self.default_user = None
        self.default_password = None
        self.host = None
        self.port = None
        self.user = None
        self.password = None
        self.protocol = 'http'
        self.msg = 'rest msg not defined yet'
        self.request = RequestHandler()
        self.request_method = 'get'
        self.req = None
        self.json_data = None
        self.path = None
        self.json = False
        self.headers = {}
        self.auth = True
        self.ok()

    def add_options(self):
        self.add_hostoption(name=self.name,
                            default_host=self.default_host,
                            default_port=self.default_port)
        if self.auth:
            self.add_useroption(name=self.name,
                                default_user=self.default_user,
                                default_password=self.default_password)
        self.add_ssl_option()

    def process_options(self):
        self.no_args()
        self.host = self.get_opt('host')
        self.port = self.get_opt('port')
        validate_host(self.host)
        validate_port(self.port)
        if self.auth:
            self.user = self.get_opt('user')
            self.password = self.get_opt('password')
            if self.auth == 'optional':
                if self.user and self.password:
                    validate_user(self.user)
                    validate_password(self.password)
            else:
                validate_user(self.user)
                validate_password(self.password)
        ssl = self.get_opt('ssl')
        log_option('ssl', ssl)
        if ssl and self.protocol == 'http':
            self.protocol = 'https'
        if self.json:
            # recommended for many systems like CouchDB
            self.headers['Accept'] = 'application/json'

    def run(self):
        start_time = time.time()
        self.req = self.query()
        query_time = time.time() - start_time
        if self.json:
            log.info('parsing json response')
            self.process_json(self.req.content)
        else:
            log.info('parsing response')
            self.parse(self.req)
        if '|' not in self.msg:
            self.msg += ' |'
        if ' query_time=' not in self.msg:
            self.msg += ' query_time={0:.4f}s'.format(query_time)

    def query(self):
        url = '{proto}://{host}:{port}/'.format(proto=self.protocol,
                                                host=self.host,
                                                port=self.port)
        if self.path:
            url += self.path.lstrip('/')
        auth = None
        if self.user and self.password:
            log.info('authenticating to Rest API')
            auth = (self.user, self.password)
        req = self.request.req(self.request_method, url, auth=auth, headers=self.headers)
        return req

    #@abstractmethod
    def parse(self, req):
        pass

    #@abstractmethod
    def parse_json(self, json_data):
        pass

    def process_json(self, content):
        try:
            self.json_data = json.loads(content)
            if log.isEnabledFor(logging.DEBUG):
                log.debug('JSON prettified:\n\n%s\n%s', jsonpp(self.json_data), '='*80)
            return self.parse_json(self.json_data)
        #except (KeyError, ValueError) as _:
            #raise UnknownError('{0}: {1}. {2}'.format(type(_).__name__, _, support_msg_api()))
        except (KeyError, ValueError):
            raise UnknownError('{0}. {1}'.format(self.exception_msg(), support_msg_api()))