You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
4.9 KiB

#
# Copyright 2024 Splunk Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from splunklib import binding
from . import splunk_rest_client as rest_client
from .utils import retry
__all__ = ["HECConfig"]
class HECConfig:
"""HTTP Event Collector configuration."""
input_type = "http"
def __init__(
self,
session_key: str,
scheme: str = None,
host: str = None,
port: int = None,
**context: dict
):
"""Initializes HECConfig.
Arguments:
session_key: Splunk access token.
scheme: (optional) The access scheme, default is None.
host: (optional) The host name, default is None.
port: (optional) The port number, default is None.
context: Other configurations for Splunk rest client.
"""
self._rest_client = rest_client.SplunkRestClient(
session_key,
"splunk_httpinput",
scheme=scheme,
host=host,
port=port,
**context
)
@retry(exceptions=[binding.HTTPError])
def get_settings(self) -> dict:
"""Get http data input global settings.
Returns:
HTTP global settings, for example:
{
'enableSSL': 1,
'disabled': 0,
'useDeploymentServer': 0,
'port': 8088
}
"""
return self._do_get_input(self.input_type).content
@retry(exceptions=[binding.HTTPError])
def update_settings(self, settings: dict):
"""Update http data input global settings.
Arguments:
settings: HTTP global settings.
"""
res = self._do_get_input(self.input_type)
res.update(**settings)
@retry(exceptions=[binding.HTTPError])
def create_input(self, name: str, stanza: dict) -> dict:
"""Create http data input.
Arguments:
name: HTTP data input name.
stanza: Data input stanza content.
Returns:
Created input.
Examples:
>>> from solnlib.hec_config import HECConfig
>>> hec = HECConfig(session_key)
>>> hec.create_input('my_hec_data_input',
{'index': 'main', 'sourcetype': 'hec'})
"""
res = self._rest_client.inputs.create(name, self.input_type, **stanza)
return res.content
@retry(exceptions=[binding.HTTPError])
def update_input(self, name: str, stanza: dict):
"""Update http data input.
It will create if the data input doesn't exist.
Arguments:
name: HTTP data input name.
stanza: Data input stanza.
Examples:
>>> from solnlib import HEConfig
>>> hec = HECConfig(session_key)
>>> hec.update_input('my_hec_data_input',
{'index': 'main', 'sourcetype': 'hec2'})
"""
res = self._do_get_input(name)
if res is None:
return self.create_input(name, stanza)
res.update(**stanza)
@retry(exceptions=[binding.HTTPError])
def delete_input(self, name: str):
"""Delete http data input.
Arguments:
name: HTTP data input name.
"""
try:
self._rest_client.inputs.delete(name, self.input_type)
except KeyError:
pass
@retry(exceptions=[binding.HTTPError])
def get_input(self, name: str) -> dict:
"""Get http data input.
Arguments:
name: HTTP event collector data input name.
Returns:
HTTP event collector data input config dict.
"""
res = self._do_get_input(name)
if res:
return res.content
else:
return None
def _do_get_input(self, name):
try:
return self._rest_client.inputs[(name, self.input_type)]
except KeyError:
return None
@retry(exceptions=[binding.HTTPError])
def get_limits(self) -> dict:
"""Get HTTP input limits.
Returns:
HTTP input limits.
"""
return self._rest_client.confs["limits"]["http_input"].content
@retry(exceptions=[binding.HTTPError])
def set_limits(self, limits: dict):
"""Set HTTP input limits.
Arguments:
limits: HTTP input limits.
"""
res = self._rest_client.confs["limits"]["http_input"]
res.submit(limits)