服务器资产自动收集,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 importhashlib13 importtime14 #————————03CMDB信息安全API接口交互认证————————

15

16 #————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————

17 import os #操作系统层面执行

18 import shutil #高级的 文件、文件夹、压缩包 处理模块

19 #————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————

20 classAutoBase(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=msg55 )56 exceptException as e:57 response =e58 status = False #获取信息时出现错误

59 print(response.json())60 #————————02CMDB将服务器基本信息提交到API接口————————

61

62 def process(self):#派生类需要继承此方法,用于处理请求的入口

63 raise NotImplementedError('您必须实现过程的方法')64

65 classAutoAgent(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 returnNone85 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 defprocess(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接口————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值