From d777f715c7fe0dadd67e1371f725e51a32fd74db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mi=C2=B3osz=20Stocki?= Date: Thu, 17 Mar 2022 09:11:02 +0100 Subject: [PATCH] Initial release --- .gitignore | 3 ++ config.yaml.example | 7 +++ requirements.txt | 2 + tactical_agents_telegraf.py | 99 +++++++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+) create mode 100644 .gitignore create mode 100644 config.yaml.example create mode 100644 requirements.txt create mode 100644 tactical_agents_telegraf.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a02c76 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/config.yaml +/.idea/ +/.venv/ diff --git a/config.yaml.example b/config.yaml.example new file mode 100644 index 0000000..b1299c3 --- /dev/null +++ b/config.yaml.example @@ -0,0 +1,7 @@ +server: + token: TACTICAL_API_TOKEN + url: https://api.tactical.example.com/ + verify_ssl: True # TODO Implement this +telegraf: + host: localhost + port: 8092 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..51443d2 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pytelegraf>=0.3.3 +PyYAML>=6.0 diff --git a/tactical_agents_telegraf.py b/tactical_agents_telegraf.py new file mode 100644 index 0000000..90387f7 --- /dev/null +++ b/tactical_agents_telegraf.py @@ -0,0 +1,99 @@ +import urllib.request as urllib +import json +from telegraf.client import TelegrafClient +import yaml +from logging import log + +with open('config.yaml') as f: + config = yaml.load(f, Loader=yaml.FullLoader) + +URL = config['server']['url'] +TOKEN = config['server']['token'] +VERIFY_SSL = config['server']['verify_ssl'] + + +class Api(object): + """Handle all RMM api Connections""" + + def __init__(self, url, apikey): + self.url = url + self.apikey = apikey + + def get_request(self, url): + """ + Handles adding auth ticket to API request + :param url: url to create request to + :return: request to handle with urlopen + """ + req = urllib.Request(url) + req.add_header('X-API-KEY', self.apikey) + return req + + def get_agent_list(self): + url = self.url + 'agents' + response = json.load(urllib.urlopen(self.get_request(url))) + return response + + +class Agent(object): + + def __init__(self, agent_json, api_object): + self.api = api_object + self.agent_json = agent_json + self.agent_id = agent_json['agent_id'] + self.hostname = agent_json['hostname'] + self.site_name = agent_json['site_name'] + self.client_name = agent_json['client_name'] + self.monitoring_type = agent_json['monitoring_type'] + self.description = agent_json['description'] + self.status = agent_json['status'] + self.details = self.download_agent_details() + self.wmi_details = self.extract_wmi_details() + + def download_agent_details(self): + url = self.api.url + 'agents' + '/' + str(self.agent_id) + response = urllib.urlopen(self.api.get_request(url)) + return json.load(response) + + def extract_wmi_details(self): + try: + wmi_details = self.details['wmi_detail'] + except KeyError: + log(30, "No WMI details in this agent, continuing") + wmi_details = {} + pass + wmi_dict = {} + for k, v in wmi_details.items(): + try: + value = v[0][0] + except IndexError: + value = dict() + wmi_dict[k] = value + return wmi_dict + + def get_agent_metrics(self): + new_values = {'agent_id': self.agent_id, 'hostname': self.hostname, 'site_name': self.site_name, + 'client_name': self.client_name, 'status': self.status} + agent_details = self.wmi_details + agent_details['agent_info'] = new_values + return agent_details + + def send_agent_metrics(self, telegraf_client_object): + for k, v in self.get_agent_metrics().items(): + telegraf_client_object.metric(str(k), v, + tags={ + 'hdn': str(str(self.hostname) + '/' + str(self.client_name) + '/' + str( + self.site_name))}) + + def __str__(self): + params = [self.agent_id, self.hostname, self.site_name, self.client_name, self.status] + return str(params) + + +api = Api(URL, TOKEN) +agent_list = api.get_agent_list() +telegraf_client = TelegrafClient(host=config['telegraf']['host'], port=config['telegraf']['port']) + +for agent in agent_list: + a = Agent(agent, api) + a.send_agent_metrics(telegraf_client)