Ejemplo n.º 1
0
    def getProxyInfo(self, splunkdMgmtUri, sessionKey, user, app):
        """
        Get Proxy Information on given REST endpoint.
        It should be in form (if not, override the this method):
            {
               'proxy_url': '<proxy_url>',
               'proxy_port': '<proxy_port>',
               'proxy_username': '******',
               'proxy_password': '******',
               'proxy_enabled': '<proxy_enabled>',
               'proxy_rdns': '<proxy_rdns>',
               'proxy_type': '<proxy_type>'
            }
        :return:
        """
        if not self.proxyInfoEndpoint:
            RH_Err.ctl(1104, msgx="Empty endpoint for proxy is being used")
        url = "{splunkdMgmtUri}servicesNS/{user}/{app}/{proxyInfoEndpoint}".format(
            splunkdMgmtUri=splunkdMgmtUri,
            user=user,
            app=app,
            proxyInfoEndpoint=self.proxyInfoEndpoint,
        )
        data = {"output_mode": "json", "--get-clear-credential--": "1"}
        resp, cont = splunkd_request(url, sessionKey, data=data, retry=3)
        if resp is None or resp.status != 200:
            RH_Err.ctl(
                1104,
                msgx="failed to load proxy info. {err}".format(
                    err=code_to_msg(resp, cont) if resp else cont
                ),
            )

        try:
            proxy_info = json.loads(cont)["entry"][0]["content"]
        except IndexError | KeyError:
            proxy_info = {}

        return {
            "proxy_enabled": is_true(proxy_info.get("proxy_enabled", "false")),
            "proxy_url": proxy_info.get("proxy_url", ""),
            "proxy_port": proxy_info.get("proxy_port", ""),
            "proxy_username": proxy_info.get("proxy_username", ""),
            "proxy_password": proxy_info.get("proxy_password", ""),
            "proxy_rdns": proxy_info.get("proxy_rdns", "false"),
            "proxy_type": proxy_info.get("proxy_type", "http"),
        }
Ejemplo n.º 2
0
    def load(self):
        """Load Configurations in UCC according to the schema
        It will raise exception if failing to load any endpoint,
        because it make no sense with not complete configuration info.
        """
        log('"load" method in', level=logging.DEBUG)

        ret = {
            meta_field: getattr(self, meta_field)
            for meta_field in Config.META_FIELDS
        }

        for ep_id, ep in self._endpoints.items():
            data = {"output_mode": "json", "--cred--": "1"}

            retries = 4
            waiting_time = [1, 2, 2]
            for retry in range(retries):
                resp, cont = splunkd_request(
                    splunkd_uri=self.make_uri(ep_id),
                    session_key=self.session_key,
                    data=data,
                    retry=3,
                )

                if resp is None or resp.status != 200:
                    msg = 'Fail to load endpoint "{ep_id}" - {err}' "".format(
                        ep_id=ep_id,
                        err=code_to_msg(resp, cont) if resp else cont)
                    log(msg, level=logging.ERROR, need_tb=True)
                    raise ConfigException(msg)

                try:
                    ret[ep_id] = self._parse_content(ep_id, cont)
                except ConfigException as exc:
                    log(exc, level=logging.WARNING, need_tb=True)
                    if retry < retries - 1:
                        time.sleep(waiting_time[retry])
                else:
                    break
            else:
                log(exc, level=logging.ERROR, need_tb=True)
                raise exc

        log('"load" method out', level=logging.DEBUG)
        return ret
Ejemplo n.º 3
0
    def getProxyInfo(self, splunkdMgmtUri, sessionKey, user, app):
        """
        Get Proxy Information on given REST endpoint.
        It should be in form (if not, override the this method):
            {
               'proxy_url': '<proxy_url>',
               'proxy_port': '<proxy_port>',
               'proxy_username': '******',
               'proxy_password': '******',
               'proxy_enabled': '<proxy_enabled>',
               'proxy_rdns': '<proxy_rdns>',
               'proxy_type': '<proxy_type>'
            }
        :return:
        """
        if not self.proxyInfoEndpoint:
            RH_Err.ctl(1104, msgx='Empty endpoint for proxy is being used')
        url = "{splunkdMgmtUri}servicesNS/{user}/{app}/{proxyInfoEndpoint}"\
            .format(splunkdMgmtUri=splunkdMgmtUri,
                    user=user,
                    app=app,
                    proxyInfoEndpoint=self.proxyInfoEndpoint)
        data = {'output_mode': 'json', '--get-clear-credential--': '1'}
        resp, cont = splunkd_request(url, sessionKey, data=data, retry=3)
        if resp is None or resp.status != 200:
            RH_Err.ctl(1104,
                       msgx='failed to load proxy info. {err}'.format(
                           err=code_to_msg(resp, cont) if resp else cont))

        try:
            proxy_info = json.loads(cont)['entry'][0]['content']
        except IndexError | KeyError:
            proxy_info = {}

        return {
            'proxy_enabled': is_true(proxy_info.get('proxy_enabled', 'false')),
            'proxy_url': proxy_info.get('proxy_url', ''),
            'proxy_port': proxy_info.get('proxy_port', ''),
            'proxy_username': proxy_info.get('proxy_username', ''),
            'proxy_password': proxy_info.get('proxy_password', ''),
            'proxy_rdns': proxy_info.get('proxy_rdns', 'false'),
            'proxy_type': proxy_info.get('proxy_type', 'http')
        }
Ejemplo n.º 4
0
    def update_items(self,
                     endpoint_id,
                     item_names,
                     field_names,
                     data,
                     raise_if_failed=False):
        """Update items in specified endpoint with given fields in data
        :param endpoint_id: endpoint id in schema, the key name in schema
        :param item_names: a list of item name
        :param field_names: a list of updated fields
        :param data: a dict of content for items, for example:
            {
                "item_name_1": {
                    "field_name_1": "value_1",
                    "field_name_2": "value_2",
                },
                "item_name_2": {
                    "field_name_1": "value_1x",
                    "field_name_2": "value_2x",
                }
            }
        :raise_if_failed: raise an exception if updating failed.
        :return: a list of endpoint ids, which are failed to be updated.
            If raise_if_failed is True, it will exist with an exception
            on any updating failed.
        """
        log('"update_items" method in',
            msgx='endpoint_id=%s, item_names=%s, field_names=%s' %
            (endpoint_id, item_names, field_names),
            level=logging.DEBUG)

        assert endpoint_id in self._endpoints, \
            'Unexpected endpoint id in given schema - {ep_id}' \
            ''.format(ep_id=endpoint_id)

        item_names_failed = []
        for item_name in item_names:
            item_data = data.get(item_name, {})
            item_data = {
                field_name: self.dump_value(endpoint_id, item_name, field_name,
                                            item_data[field_name])
                for field_name in field_names if field_name in item_data
            }
            if not item_data:
                continue
            item_uri = self.make_uri(endpoint_id, item_name=item_name)

            resp, cont = splunkd_request(splunkd_uri=item_uri,
                                         session_key=self.session_key,
                                         data=item_data,
                                         method="POST",
                                         retry=3)
            if resp is None or resp.status not in (200, 201):
                msg = 'Fail to update item "{item}" in endpoint "{ep_id}"' \
                      ' - {err}'.format(ep_id=endpoint_id,
                                        item=item_name,
                                        err=code_to_msg(resp, cont)
                                        if resp else cont)
                log(msg, level=logging.ERROR)
                if raise_if_failed:
                    raise ConfigException(msg)
                item_names_failed.append(item_name)

        log('"update_items" method out', level=logging.DEBUG)
        return item_names_failed