Source code for idoit
import json
import requests
[docs]class API(object):
def __init__(self, url=None, key=None, username=None, password=None):
"""
Low-Level object to access the i-doit JSON-RPC API.
:param str url: URL to access the JSON-RPC API
:param str key: API-Key
:param str username: Username
:param str password: Password
"""
self._session_id = None
self.key = key
self.username = username
self.password = password
self.url = url
[docs] def login(self, username=None, password=None):
"""
Perform login
:param str username: Overrides the current username value
:param str password: Overrides the current password value
"""
if username:
self.username = username
if password:
self.password = password
headers = {
"X-RPC-Auth-Username": self.username,
"X-RPC-Auth-Password": self.password
}
result = self.request(
"idoit.login",
headers=headers
)
self._session_id = result["session-id"]
def logout(self):
self.request("idoit.logout")
self._session_id = None
[docs] def request(self, method, params=None, headers=None):
"""
:param str method:
:param dict params:
:param dict headers:
:return:
"""
req_headers = {'content-type': 'application/json'}
if self._session_id is not None:
req_headers["X-RPC-Auth-Session"] = self._session_id
if isinstance(headers, dict):
req_headers.update(headers)
req_params = {
"apikey": self.key
}
if isinstance(params, dict):
req_params.update(params)
# Example echo method
payload = {
"method": method,
"params": req_params,
"jsonrpc": "2.0",
"id": 0,
}
response = requests.post(
self.url,
data=json.dumps(payload),
headers=req_headers
).json()
from pprint import pprint
#pprint(response)
if "error" in response:
error = response["error"]
error_code = error["code"]
from idoit.exception import InvalidParams, InternalError, MethodNotFound, UnknownError
for exception_class in [InvalidParams, InternalError, MethodNotFound]:
if exception_class.code == error_code:
raise exception_class(
data=error["data"],
raw_code=error_code
)
raise UnknownError(
data=error["data"],
raw_code=error_code
)
return response['result']
class BaseRequest(object):
def __init__(self, api=None, api_params=None):
if api is None:
if api_params is None:
api_params = {}
api = API(**api_params)
self._api = api
[docs]class Idoit(BaseRequest):
@property
def version(self):
data = self.get_version()
return data["version"]
@property
def version_type(self):
data = self.get_version()
return data["type"]
def get_constants(self):
return self._api.request("idoit.constants")
def get_version(self):
return self._api.request("idoit.version")
def search(self, query):
return self._api.request(
"idoit.search",
{"q": query}
)
[docs]class CMDBCategory(BaseRequest):
[docs] def read(self, object_id, category=None, catg_id=None, cats_id=None):
"""
Read one or more category entries for an object.
Use only one of the optional parameters category, catg_id or cats_id.
:param int object_id: Object identifier
:param str category: Category constant
:param int catg_id: Global category identifier
:param int cats_id: Specific category identifier
:return: List of result objects
:rtype: dict[]
"""
params = {
"objID": object_id
}
if category:
params["category"] = category
elif catg_id:
params["catgID"] = catg_id
elif cats_id:
params["catsID"] = cats_id
else:
# ToDo: Improve exception
raise Exception("Missing parameter")
return self._api.request(
method="cmdb.category",
params=params
)
[docs]class CMDBObjects(BaseRequest):
def read(self, filter_params=None):
params = {}
if isinstance(filter_params, dict):
params["filter"] = filter_params
return self._api.request(
method="cmdb.objects.read",
params=params
)