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



# client.py
# ————————01CMDB获取服务器基本信息————————
from src import plugins #__init__.py
from lib.serialize import Json #转成字符串或者模式 # ————————02CMDB将服务器基本信息提交到API接口————————
import requests #伪造页面访问
from config import settings #文件配置
# ————————02CMDB将服务器基本信息提交到API接口———————— # ————————03CMDB信息安全API接口交互认证————————
import hashlib
import time
# ————————03CMDB信息安全API接口交互认证———————— # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
import os #操作系统层面执行
import shutil #高级的 文件、文件夹、压缩包 处理模块
# ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
class AutoBase(object): # ————————02CMDB将服务器基本信息提交到API接口————————
def __init__(self):
self.asset_api = settings.ASSET_API #ASSET_API = "http://127.0.0.1:8000/api/asset" # ————————03CMDB信息安全API接口交互认证————————
self.key = settings.KEY # 用于API认证的KEY#KEY = '299095cc-1330-11e5-b06a-a45e60bec08b'
self.key_name = settings.AUTH_KEY_NAME # 'auth-key' API认证的请求头
# ————————03CMDB信息安全API接口交互认证———————— # ————————03CMDB信息安全API接口交互认证————————
def auth_key(self):#API接口认证
ha = hashlib.md5(self.key.encode('utf-8'))#认证的密码
time_span = time.time() #现在的时间戳 #1529819687.8867188
ha.update(bytes("%s|%f" % (self.key, time_span), encoding='utf-8'))#更新认证密码#密码+时间戳
encryption = ha.hexdigest() # 对‘时间密码’进行哈希
result = "%s|%f" % (encryption, time_span) #把‘时间密码’和 时间戳(解密用) 作为 API认证的请求头
print('‘时间密码’和 时间戳:',result)
return {self.key_name: result} # 'auth-key' API认证的请求头
# ————————03CMDB信息安全API接口交互认证———————— def post_asset(self, msg):#post方式向API接口提交资产信息
status = True#是否获取到信息
try:
# ————————03CMDB信息安全API接口交互认证————————
headers = {}
headers.update(self.auth_key())##认证的密码
# ————————03CMDB信息安全API接口交互认证————————
response = requests.post(
url=self.asset_api,
# ————————03CMDB信息安全API接口交互认证————————
headers=headers,
# ————————03CMDB信息安全API接口交互认证————————
json=msg
)
except Exception as e:
response = e
status = False #获取信息时出现错误
print(response.json())
# ————————02CMDB将服务器基本信息提交到API接口———————— def process(self):#派生类需要继承此方法,用于处理请求的入口
raise NotImplementedError('您必须实现过程的方法') class AutoAgent(AutoBase): # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
def __init__(self):
self.cert_file_path = settings.CERT_FILE_PATH# Agent模式保存服务器唯一ID的文件
super(AutoAgent, self).__init__()
"""
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,
但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
"""
def load_local_cert(self):# 获取本地唯一标识
if not os.path.exists(self.cert_file_path):#使用os.path.exists()方法可以直接判断文件(或者文件夹)是否存在
return None #如果文件(或者文件夹)不存在 #返回空
if os.path.isfile(self.cert_file_path): #判断是不是文件
with open(self.cert_file_path, mode='r') as f: #如果文件存在 #打开读取文件
data = f.read()#获取唯一ID的文件#read() 方法用于从文件读取指定的字节数,如果未给定或为负则读取所有。
if not data: # 如果文件没有内容 #返回空
return None
cert = data.strip() # strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
return cert # 返回 本地唯一标识
else: #防止有文件夹叫cert,导致无法创建cert文件
shutil.rmtree(self.cert_file_path)#就 递归的去删除文件夹 #这个目录以及子文件全部删除
return None #返回空 #去创建文件 def write_local_cert(self, cert):#写入本地唯一标识
with open(self.cert_file_path, mode='w') as f: #循环打开文件 #没有就创建 然后打开
f.write(cert) #写入本地唯一标识
# ————————04CMDB本地(Agent)模式客户端唯一标识(ID)———————— def process(self):
server_info = plugins.get_server_info()#获取本地基本信息 # ————————04CMDB本地(Agent)模式客户端唯一标识(ID)————————
if not server_info.status: #获取的基本信息是否出错
return
local_cert = self.load_local_cert() # 去获取本地唯一标识
if local_cert: #如果 获取本地唯一标识 后 #不是 return None
if local_cert == server_info.data['hostname']: #判断本地文件的唯一标识 是不是等于 获取的基本信息里主机名
pass #一样就什么都不干
else: #不一样就把 获取的基本信息里主机名 替换成 本地文件的唯一标识
#防止 恶意篡改 主机名 ,上报API时 错认为是 新资产
server_info.data['hostname'] = local_cert # 更新字典的主机名
else: # 获取本地唯一标识为None时 #把获取到的主机名写入本地做为唯一标识
self.write_local_cert(server_info.data['hostname'])
# ————————04CMDB本地(Agent)模式客户端唯一标识(ID)———————— server_json = Json.dumps(server_info.data)#json.dumps将 Python 对象编码成 JSON 字符串
print('提交资产信息:',server_json)
# ————————01CMDB获取服务器基本信息———————— # ————————02CMDB将服务器基本信息提交到API接口————————
self.post_asset(server_json)# post方式向接口提交资产信息
# ————————02CMDB将服务器基本信息提交到API接口————————
# client.py


Django项目:CMDB(服务器硬件资产自动采集系统)--04--04CMDB本地(Agent)模式客户端唯一标识(ID)的更多相关文章
- Django项目:CMDB(服务器硬件资产自动采集系统)--12--08CMDB采集硬件数据日志记录
#settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--11--07CMDB文件模式测试采集硬件数据
#settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.path.dirname(o ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--06--06CMDB测试Linux系统采集硬件数据的命令01
#base.py # ————————01CMDB获取服务器基本信息———————— from config import settings #配置文件 class BasePlugin(object ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--05--05CMDB采集硬件数据的插件
#__init__.py # ————————05CMDB采集硬件数据的插件———————— from config import settings import importlib # —————— ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--01--01CMDB获取服务器基本信息
AutoClient #settings.py # ————————01CMDB获取服务器基本信息———————— import os BASEDIR = os.path.dirname(os.pat ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--09--06CMDB测试Linux系统采集硬件数据的命令04
root 123456 ip addr init 0 root 123456 ip addr root 123456 python3 yum -y install zlib-devel bzip2-d ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--03--03CMDB信息安全API接口交互认证
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--02--02CMDB将服务器基本信息提交到API接口
AutoCmdb # urls.py """AutoCmdb URL Configuration The `urlpatterns` list routes URLs t ...
- Django项目:CMDB(服务器硬件资产自动采集系统)--07--06CMDB测试Linux系统采集硬件数据的命令02
#settings.py """ Django settings for AutoCmdb project. Generated by 'django-admin sta ...
随机推荐
- MYSQL - 外键、约束、多表查询、子查询、视图、事务
MYSQL - 外键.约束.多表查询.子查询.视图.事务 关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生 ...
- Android Butterknife使用方法总结
原文链接:http://blog.csdn.net/donkor_/article/details/77879630 前言: ButterKnife是一个专注于Android系统的View注入框架,以 ...
- Eclipse_断点设置不起作用
在使用Ecplise进行代码调试的时候,发现打了断点,却一直不进入断点,也不会进取断点调试模式,找了很久答案,之前就发现断点的样子有些奇怪,现在看来,还真是这个原因造成的. 只要不跳过断点快捷键(Ct ...
- R:ggplot2数据可视化——进阶(2)
Part 2: Customizing the Look and Feel, 更高级的自定义化,比如说操作图例.注记.多图布局等 # Setup options(scipen=999) librar ...
- Java核心-03 谈谈final、finally、 finalize有什么不同?
今天,我要问你的是一个经典的 Java 基础题目,谈谈 final.finally. finalize 有什么不同? 典型回答 final 可以用来修饰类.方法.变量,分别有不同地意义,final修饰 ...
- Android开发 Html工具类详解
前言 在一些需求富文本显示或者编辑的开发情况下,数据都是用html的格式来保存文本信息的.而google是有提供解析html的工具类那就是Html.有了Html可以让TextView也支持富文本(其实 ...
- bootstrap table 实现固定悬浮table 表头并可以水平滚动
在开发项目中,需要将表格头部固定,而且表格大多数情况下是会水平滚动的.项目的css框架是bootstrap 3,故也可以叫做bootstrap table. 需要实现的是:表格头部固定,并且支持水平滚 ...
- Mysql的数据列类型效率
1. 能短就不要长.(磁盘I/O少一些) 比如固定 长度的CHAR数据列,定义 CHAR(40),而不是 CHAR(255); 比如MEDIUMINT代替BIGINT,数据表就小一些, 值的处理 ...
- 使用应用程序(Java/Python)访问MaxCompute Lightning进行数据开发
MaxCompute Lightning是MaxCompute产品的交互式查询服务,支持以PostgreSQL协议及语法连接访问Maxcompute项目,让您使用熟悉的工具以标准 SQL查询分析Max ...
- sulin Python3.6爬虫+Djiago2.0+Mysql --实例demo
1.切换到项目目录下,启动测试服务器 manage.py runserver 192.168.0.108:8888 2.设置相关配置 项目目录展示如下: beauty=>settings.py ...