Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.10 KB | None | 0 0
  1. import mysql.connector as ipam_connector
  2. import requests
  3. import json
  4. import os.path
  5.  
  6. from query_strings import QUERY_DEVICES
  7. from RequestModel import RequestModel
  8. from ZabbixAnswerModel import ZabbixAnswerModel
  9. from ErrorModel import ErrorModel
  10.  
  11.  
  12. class IpamUtility:
  13.     cursor = None
  14.     ipam_connection = None
  15.  
  16.     def __init__(self):
  17.         self.connect()
  18.  
  19.     def connect(self):
  20.         self.ipam_connection = ipam_connector.connect(user='ipam_audit',
  21.                                                       password='Dp5EudkQe5X7Xp5A',
  22.                                                       database='phpipam',
  23.                                                       host='10.20.48.98')
  24.         self.cursor = self.ipam_connection.cursor()
  25.  
  26.     def query_ipam_db(self, query_string):
  27.         if self.cursor:
  28.             self.cursor.execute(query_string)
  29.             return self.cursor
  30.  
  31.  
  32. class ZabbixApiClient:
  33.     base_url = ""
  34.  
  35.     def __init__(self, base_url):
  36.         self.base_url = base_url
  37.  
  38.     def login(self, user_login, password):
  39.  
  40.         login_model = RequestModel()
  41.         login_model.jsonrpc = "2.0"
  42.         login_model.method = "user.login"
  43.         login_model.params = {
  44.             "user": user_login,
  45.             "password": password
  46.         }
  47.         login_model.id = 1
  48.         login_model.auth = None
  49.  
  50.         dump = json.dumps(login_model.__dict__)
  51.  
  52.         r = requests.post(self.base_url,
  53.                           data=dump,
  54.                           headers={'Content-Type': 'application/json'}
  55.                           )
  56.  
  57.         if r.status_code == 200:
  58.             json_result = r.content
  59.             print("ZabbixClient: Logged in successfully.")
  60.  
  61.             if json_result:
  62.                 payload = ZabbixAnswerModel(json_result)
  63.                 print("Zabbix Client: Token acquired.")
  64.                 return payload.result
  65.  
  66.         else:
  67.             print("Error: %d" % r.status_code)
  68.  
  69.     def get_hosts(self, token):
  70.         request_model = RequestModel()
  71.         request_model.jsonrpc = "2.0"
  72.         request_model.method = "host.get"
  73.         request_model.params = {
  74.             "output": [
  75.                 "host"
  76.             ],
  77.             "selectInterfaces": [
  78.                 "ip"
  79.             ]
  80.         }
  81.         request_model.id = 2
  82.         request_model.auth = token
  83.  
  84.         dump = json.dumps(request_model.__dict__)
  85.  
  86.         r = requests.post(self.base_url,
  87.                           headers={
  88.                               'Content-Type': "application/json"
  89.                           },
  90.                           data=dump
  91.                           )
  92.  
  93.         if r.status_code == 200:
  94.             payload = ZabbixAnswerModel(r.content)
  95.             return payload
  96.         else:
  97.             print("Error: Server responded with: %d" % r.status_code)
  98.  
  99.  
  100. def compare_data_sets(ipam_data_set, zabbix_data_set):
  101.     out_entries = []
  102.     if zabbix_data_set and ipam_data_set:
  103.         try:
  104.             for ipam_entry in ipam_data_set:
  105.                 if ipam_entry not in zabbix_data_set:
  106.                     out_entries.append(ipam_entry)
  107.  
  108.         except TypeError as e:
  109.             print(e)
  110.  
  111.         return out_entries
  112.     else:
  113.         print("Not enough data sets retrieved.")
  114.  
  115.  
  116. def prepare(data_set):
  117.     result = []
  118.     for host in data_set:
  119.         result.append((host['host'], host['interfaces'][0]['ip']))
  120.  
  121.     return result
  122.  
  123.  
  124. def write_to_file(file, diff_list):
  125.     for entry in diff_list:
  126.         out_string = ""
  127.         for index in entry:
  128.             out_string += str(index) + ","
  129.         file.write(out_string.strip(',') + "\n")
  130.  
  131.  
  132. def write_unique_ipam(diff_list,
  133.                       diff_uniq_ipam_path
  134.                       ):
  135.     file = open(diff_uniq_ipam_path, "w")
  136.  
  137.     write_to_file(file, diff_list)
  138.  
  139.  
  140. def write_unique_zabbix(diff_list,
  141.                         diff_uniq_zabbix_path):
  142.     file = open(diff_uniq_zabbix_path, "w")
  143.  
  144.     write_to_file(file, diff_list)
  145.  
  146.  
  147. def write_diff_hosts(ipam_data_set, zabbix_data_set, path):
  148.     out_result = []
  149.     for ipam_tuple in ipam_data_set:
  150.         for zabbix_tuple in zabbix_data_set:
  151.             if ipam_tuple[1] == zabbix_tuple[1] and ipam_tuple[0] != zabbix_tuple[0]:
  152.                 out_result.append((ipam_tuple[1], zabbix_tuple[0], ipam_tuple[0]))
  153.  
  154.     out_file = open(path, "w")
  155.     write_to_file(out_file, out_result)
  156.  
  157.  
  158. def write_diff_ips(ipam_data_set, zabbix_data_set, path):
  159.     out_result = []
  160.     for ipam_tuple in ipam_data_set:
  161.         for zabbix_tuple in zabbix_data_set:
  162.             if ipam_tuple[1] != zabbix_tuple[1] and ipam_tuple[0] == zabbix_tuple[0]:
  163.                 out_result.append((ipam_tuple[0], zabbix_tuple[1], ipam_tuple[1]))
  164.  
  165.     out_file = open(path, "w")
  166.     write_to_file(out_file, out_result)
  167.  
  168.  
  169. def load_ommit_list(ommit_path):
  170.     ommit_ipam_list = []
  171.  
  172.     if os.path.isfile(ommit_path):
  173.         ommit_file = open(ommit_path, "r")
  174.         lines = ommit_file.readlines()
  175.         for line in lines:
  176.             ommit_ipam_list.append(tuple(line.strip().split(",")))
  177.  
  178.         print("Ommit file(%s) found, records read: %d" % (ommit_path, len(ommit_ipam_list)))
  179.     else:
  180.         print("No such file: %s." % ommit_path)
  181.  
  182.     return ommit_ipam_list
  183.  
  184.  
  185. def apply_ommit(diff_list, ommit_list):
  186.     ommited_counter = 0
  187.     for entry in ommit_list:
  188.         if entry in diff_list:
  189.             diff_list.remove(entry)
  190.             ommited_counter += 1
  191.  
  192.     print("Ommission applied, ommited files count %d" % ommited_counter)
  193.  
  194.  
  195. def main():
  196.     home_dir = "/opt/ipam/"
  197.     config_dir = home_dir+"config/"
  198.     out_dir = home_dir+"out/"
  199.     ommit_ipam_list = load_ommit_list("%suniq_ipam_ommit.conf" % config_dir)
  200.     ommit_zabbix_list = load_ommit_list("%suniq_zabbix_ommit.conf" % config_dir)
  201.  
  202.     main_obj = IpamUtility()
  203.     cursor = main_obj.query_ipam_db(QUERY_DEVICES)
  204.     ipam_data_set = cursor.fetchall()
  205.     zabbix_api_client = ZabbixApiClient("http://192.168.17.200/zabbix/api_jsonrpc.php")
  206.     token = zabbix_api_client.login("zabbix_audit", "42TDvW6meBt6stKF")
  207.     payload = zabbix_api_client.get_hosts(token)
  208.     zabbix_data_set = payload.result
  209.  
  210.     if payload:
  211.         if zabbix_data_set and ipam_data_set:
  212.             zabbix_data_set = prepare(zabbix_data_set)
  213.             diff_ipam = compare_data_sets(ipam_data_set, zabbix_data_set)
  214.             print("IPAM knows: %d hosts." % len(ipam_data_set))
  215.             diff_zabbix = compare_data_sets(zabbix_data_set, ipam_data_set)
  216.             print("Zabbix knows: %d hosts." % len(zabbix_data_set))
  217.             apply_ommit(diff_zabbix, ommit_zabbix_list)
  218.             apply_ommit(diff_ipam, ommit_ipam_list)
  219.             write_unique_ipam(diff_ipam, "%sdiff_uniq_ipam.log" % out_dir)
  220.             write_unique_zabbix(diff_zabbix, "%sdiff_uniq_zabbix.log" % out_dir)
  221.  
  222.             write_diff_hosts(ipam_data_set, zabbix_data_set, "%sdiff_hosts.log" % out_dir)
  223.             write_diff_ips(ipam_data_set, zabbix_data_set, "%sdiff_ips.log" % out_dir)
  224.  
  225.     else:
  226.         if payload is ErrorModel:
  227.             print(payload.error)
  228.  
  229.  
  230. if __name__ == "__main__":
  231.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement