• Django项目:CMDB(服务器硬件资产自动采集系统)--04--04CMDB本地(Agent)模式客户端唯一标识(ID)


      1 # client.py
      2 # ————————01CMDB获取服务器基本信息————————
      3 from src import plugins  #__init__.py
      4 from lib.serialize import Json #转成字符串或者模式
      5 
      6 # ————————02CMDB将服务器基本信息提交到API接口————————
      7 import requests  #伪造页面访问
      8 from config import settings #文件配置
      9 # ————————02CMDB将服务器基本信息提交到API接口————————
     10 
     11 # ————————03CMDB信息安全API接口交互认证————————
     12 import hashlib
     13 import time
     14 # ————————03CMDB信息安全API接口交互认证————————
     15 
     16 # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
     17 import os         #操作系统层面执行
     18 import shutil     #高级的 文件、文件夹、压缩包 处理模块
     19 # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
     20 class AutoBase(object):
     21 
     22     # ————————02CMDB将服务器基本信息提交到API接口————————
     23     def __init__(self):
     24         self.asset_api = settings.ASSET_API  #ASSET_API = "http://127.0.0.1:8000/api/asset"
     25 
     26         # ————————03CMDB信息安全API接口交互认证————————
     27         self.key = settings.KEY  # 用于API认证的KEY#KEY = '299095cc-1330-11e5-b06a-a45e60bec08b'
     28         self.key_name = settings.AUTH_KEY_NAME  # 'auth-key'  API认证的请求头
     29         # ————————03CMDB信息安全API接口交互认证————————
     30 
     31     # ————————03CMDB信息安全API接口交互认证————————
     32     def auth_key(self):#API接口认证
     33         ha = hashlib.md5(self.key.encode('utf-8'))#认证的密码
     34         time_span = time.time() #现在的时间戳 #1529819687.8867188
     35         ha.update(bytes("%s|%f" % (self.key, time_span), encoding='utf-8'))#更新认证密码#密码+时间戳
     36         encryption = ha.hexdigest()  # 对‘时间密码’进行哈希
     37         result = "%s|%f" % (encryption, time_span) #把‘时间密码’和 时间戳(解密用)  作为 API认证的请求头
     38         print('‘时间密码’和 时间戳:',result)
     39         return {self.key_name: result}  # 'auth-key' API认证的请求头
     40     # ————————03CMDB信息安全API接口交互认证————————
     41 
     42     def post_asset(self, msg):#post方式向API接口提交资产信息
     43         status = True#是否获取到信息
     44         try:
     45             # ————————03CMDB信息安全API接口交互认证————————
     46             headers = {}
     47             headers.update(self.auth_key())##认证的密码
     48             # ————————03CMDB信息安全API接口交互认证————————
     49             response = requests.post(
     50                 url=self.asset_api,
     51                 # ————————03CMDB信息安全API接口交互认证————————
     52                 headers=headers,
     53                 # ————————03CMDB信息安全API接口交互认证————————
     54                 json=msg
     55             )
     56         except Exception as e:
     57             response = e
     58             status = False  #获取信息时出现错误
     59         print(response.json())
     60     # ————————02CMDB将服务器基本信息提交到API接口————————
     61 
     62     def process(self):#派生类需要继承此方法,用于处理请求的入口
     63         raise NotImplementedError('您必须实现过程的方法')
     64 
     65 class AutoAgent(AutoBase):
     66 
     67     # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
     68     def __init__(self):
     69         self.cert_file_path = settings.CERT_FILE_PATH# Agent模式保存服务器唯一ID的文件
     70         super(AutoAgent, self).__init__()
     71         """
     72         super() 函数是用于调用父类(超类)的一个方法。
     73         super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,
     74                 但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
     75         MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
     76         """
     77     def load_local_cert(self):# 获取本地唯一标识
     78         if not os.path.exists(self.cert_file_path):#使用os.path.exists()方法可以直接判断文件(或者文件夹)是否存在
     79             return None #如果文件(或者文件夹)不存在 #返回空
     80         if os.path.isfile(self.cert_file_path): #判断是不是文件
     81             with open(self.cert_file_path, mode='r') as f: #如果文件存在 #打开读取文件
     82                 data = f.read()#获取唯一ID的文件#read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
     83             if not data:  # 如果文件没有内容 #返回空
     84                 return None
     85             cert = data.strip()  # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
     86             return cert  # 返回 本地唯一标识
     87         else: #防止有文件夹叫cert,导致无法创建cert文件
     88             shutil.rmtree(self.cert_file_path)#就 递归的去删除文件夹 #这个目录以及子文件全部删除
     89             return None #返回空 #去创建文件
     90 
     91     def write_local_cert(self, cert):#写入本地唯一标识
     92         with open(self.cert_file_path, mode='w') as f: #循环打开文件 #没有就创建 然后打开
     93             f.write(cert) #写入本地唯一标识
     94     # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
     95 
     96     def process(self):
     97         server_info = plugins.get_server_info()#获取本地基本信息
     98 
     99         # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
    100         if not server_info.status: #获取的基本信息是否出错
    101             return
    102         local_cert = self.load_local_cert()  # 去获取本地唯一标识
    103         if local_cert: #如果 获取本地唯一标识 后 #不是  return None
    104             if local_cert == server_info.data['hostname']: #判断本地文件的唯一标识 是不是等于 获取的基本信息里主机名
    105                 pass  #一样就什么都不干
    106             else:   #不一样就把  获取的基本信息里主机名 替换成 本地文件的唯一标识
    107                 #防止 恶意篡改 主机名 ,上报API时 错认为是 新资产
    108                 server_info.data['hostname'] = local_cert  # 更新字典的主机名
    109         else:  # 获取本地唯一标识为None时 #把获取到的主机名写入本地做为唯一标识
    110             self.write_local_cert(server_info.data['hostname'])
    111         # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
    112 
    113         server_json = Json.dumps(server_info.data)#json.dumps将 Python 对象编码成 JSON 字符串
    114         print('提交资产信息:',server_json)
    115 # ————————01CMDB获取服务器基本信息————————
    116 
    117         # ————————02CMDB将服务器基本信息提交到API接口————————
    118         self.post_asset(server_json)# post方式向接口提交资产信息
    119         # ————————02CMDB将服务器基本信息提交到API接口————————
    # client.py

  • 相关阅读:
    CentOS7安装node环境
    【异常】update更新java.sql.SQLException: Duplicate entry '2019-07-30 00:00:00-110100' for key
    MySQL查询多行重复数据SQL
    Phoenix批量提交优化,官网的demo
    (转) 读懂IL
    Docker
    Docker
    Rest之路
    (转)Docker
    Docker
  • 原文地址:https://www.cnblogs.com/ujq3/p/9227011.html
Copyright © 2020-2023  润新知