CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑
1、服务器端目录结构:

1、__init__.py
from django.conf import settings
from repository import models
import importlib
from .server import Server class PluginManger(object): def __init__(self):
self.plugin_items = settings.PLUGIN_ITEMS
self.basic_key = "basic"
self.board_key = "board" def exec(self,server_dict):
""" :param server_dict:
:return: 1,执行完全成功; 2, 局部失败;3,执行失败;4. 服务器不存在
"""
ret = {'code': 1,'msg':None} hostname = server_dict[self.basic_key]['data']['hostname']
server_obj = models.Server.objects.filter(hostname=hostname).first()
if not server_obj:
ret['code'] = 4
return ret obj = Server(server_obj,server_dict[self.basic_key],server_dict[self.board_key])
obj.process() # 对比更新[硬盘,网卡,内存,可插拔的插件]
for k,v in self.plugin_items.items():
try:
module_path,cls_name = v.rsplit('.',maxsplit=1) md = importlib.import_module(module_path)
cls = getattr(md,cls_name)
obj = cls(server_obj,server_dict[k])
obj.process()
except Exception as e:
ret['code'] = 2 return ret
2、disk.py
from repository import models class Disk(object):
def __init__(self,server_obj,info):
self.server_obj = server_obj
self.disk_dict = info def process(self):
# 硬盘、网卡和内存
new_disk_info_dict = self.disk_dict['data']
"""
{
'0': {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'},
'1': {'slot': '1', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5AH'},
'2': {'slot': '2', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1SZNSAFA01085L Samsung SSD 850 PRO 512GB EXM01B6Q'},
'3': {'slot': '3', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF912433K Samsung SSD 840 PRO Series DXM06B0Q'},
'4': {'slot': '4', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAF303909M Samsung SSD 840 PRO Series DXM05B0Q'},
'5': {'slot': '5', 'pd_type': 'SATA', 'capacity': '476.939', 'model': 'S1AXNSAFB00549A Samsung SSD 840 PRO Series
}"""
new_disk_info_list = self.server_obj.disk.all()
"""
[
obj,
obj,
obj,
]
"""
new_disk_slot_set = set(new_disk_info_dict.keys())
old_disk_slot_set = {obj.slot for obj in new_disk_info_list} # add_slot_list = new_disk_slot_set - old_disk_slot_set
add_slot_list = new_disk_slot_set.difference(old_disk_slot_set)
del_slot_list = old_disk_slot_set.difference(new_disk_slot_set)
update_slot_list = old_disk_slot_set.intersection(new_disk_slot_set) add_record_list = []
# 增加 [2,5]
for slot in add_slot_list:
value = new_disk_info_dict[slot]
tmp = "添加硬盘..."
add_record_list.append(tmp)
value['server_obj'] = self.server_obj
models.Disk.objects.create(**value)
# 删除 [4,6]
models.Disk.objects.filter(server_obj=self.server_obj, slot__in=del_slot_list).delete() # 更新 [7,8]
for slot in update_slot_list:
value = new_disk_info_dict[
slot] # {'slot': '0', 'pd_type': 'SAS', 'capacity': '279.396', 'model': 'SEAGATE ST300MM0006 LS08S0K2B5NV'}
obj = models.Disk.objects.filter(server_obj=self.server_obj, slot=slot).first()
for k, new_val in value.items():
old_val = getattr(obj, k)
if old_val != new_val:
setattr(obj, k, new_val)
obj.save() def add_disk(self):
pass def del_disk(self):
pass def update_disk(self):
pass
3、nic.py
class Nic(object):
def __init__(self,server_obj,info):
self.server_obj = server_obj
self.nic_dict = info def process(self):
pass
4、server.py
from repository import models
class Server(object):
def __init__(self,server_obj,basic_dict,board_dict):
self.server_obj = server_obj
self.basic_dict = basic_dict
self.board_dict = board_dict
def process(self,):
# 更新server表
tmp = {}
tmp.update(self.basic_dict['data'])
tmp.update(self.board_dict['data'])
# 服务器数据更新
tmp.pop('hostname')
record_list = []
for k, new_val in tmp.items():
old_val = getattr(self.server_obj, k)
if old_val != new_val:
record = "[%s]的[%s]由[%s]变更为[%s]" % (self.server_obj.hostname, k, old_val, new_val)
record_list.append(record)
setattr(self.server_obj, k, new_val)
self.server_obj.save()
if record_list:
models.ServerRecord.objects.create(server_obj=self.server_obj, content=';'.join(record_list))
5、views.py
import json
from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings
from repository import models
from .plugins import PluginManger def server(request):
# 客户端提交的最新资产数据
server_dict = json.loads(request.body.decode('utf-8')) # 检查server表中是否有当前资产信息【主机名是唯一标识】
if not server_dict['basic']['status']:
return HttpResponse('臣妾做不到') manager = PluginManger()
response = manager.exec(server_dict) return HttpResponse(json.dumps(response))
settings.py在尾部添加如下内容:
PLUGIN_ITEMS = {
"nic": "api.plugins.nic.Nic",
"disk": "api.plugins.disk.Disk",
"memory": "api.plugins.memory.Memory",
}
CMDB服务器管理系统【s5day90】:API构造可插拔式插件逻辑的更多相关文章
- CMDB服务器管理系统【s5day87】:需求讨论-设计思路
自动化运维平台愿景和服务器管理系统背景 服务器管理系统 管理后台示例 需求和设计 为什么开发服务器管理系统? 背景: 原来是用Excel维护服务器资产,samb服务[多个运维人员手动维护] 搭建运维自 ...
- CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)
django中间件工作原理 整体流程: 在接受一个Http请求之前的准备 启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器. ...
- CMDB服务器管理系统【s5day90】:API验证
1.认证思路刨析过程 1.请求头去哪里拿? 1.服务器端代码: def test(request): print(request) return HttpResponse('你得到我了') 2.客户端 ...
- CMDB服务器管理系统【s5day90】:获取今日未采集主机列表
1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...
- CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息
1.创建硬件资产信息 import json from django.shortcuts import render,HttpResponse from django.views.decorators ...
- CMDB服务器管理系统【s5day88】:采集资产之Agent、SSH和Salt模式讲解
在对获取资产信息时,简述有四种方案. 1.Agent (基于shell命令实现) 原理图 Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库 优点: ...
- CMDB服务器管理系统【s5day92】:服务器管理回顾
一.服务器管理回顾 1.requests 发送: requests.post(url='',data=,json=) requests.get() Django接受: request.POST, co ...
- CMDB服务器管理系统【s5day88】:采集资产-文件配置(二)
上节疑问: 1.老师我们已经写到global_settings里了,为什么还要写到__init__.py setting 这的作用是为了:整合起两个的组合global_settings和setting ...
- CMDB服务器管理系统【s5day89】:采集资产之汇报信息
1.服务器端收到的数据和客户端的数据不一样 print(request.post) 少发了,还是少取了,说明根本没有把数据全发过来 print(request.body) 1.只把字典的key给我发过 ...
随机推荐
- oracle 10g函数大全--日期型函数
sysdate [功能]:返回当前日期. [参数]:没有参数,没有括号 [返回]:日期 [示例]select sysdate hz from dual; 返回:2008-11-5 add_months ...
- c/c++ linux 进程间通信系列2,使用UNIX_SOCKET
linux 进程间通信系列2,使用UNIX_SOCKET 1,使用stream,实现进程间通信 2,使用DGRAM,实现进程间通信 关键点:使用一个临时的文件,进行信息的互传. s_un.sun_fa ...
- Selenium自动化测试-unittest单元测试框架使用
一.什么是unittest 这里我们将要用的unittest是python的单元测试框架,它的官网是 https://docs.python.org/2/library/unittest.html,在 ...
- #020PAT 没整明白的题L1-009 N个数求和 (20 分)
后面的测试点过不去,两个错误一个超时. 目前未解决 L1-009 N个数求和 (20 分) 本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和 ...
- Linux-基础学习(六)-Redis的进阶学习
1. redis的进阶操作 1.1 redis的订阅操作 发布订阅的命令 PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE chan ...
- Django-CRM项目学习(一)-admin组件
开始今日份整理 1.admin组件使用 1.1 创建django项目以及开启APP01 略 1.2 创建类 使用django自带的sqlite3的小型文件型的数据库 注:使用sqlite3类型的数据库 ...
- docker 安装 mongodb
1.docker search mongo 2.docker pull mongo 3.//docker run -d --name mymongo -p 27017:27017 -v /home/h ...
- sqlServer:行列转换之多行转一行
1.建表:学生表(姓名,学科,成绩) CREATE TABLE teststudent( stuname varchar(50) NULL, subjects varchar(50) NU ...
- [Alpha阶段]第五次Scrum Meeting
Scrum Meeting博客目录 [Alpha阶段]第五次Scrum Meeting 基本信息 名称 时间 地点 时长 第五次Scrum Meeting 19/04/09 教1_2楼教室 65min ...
- app.use和app.get,app.post区别
express中,express的实例app: app.use(path,callback)中的callback既可以是router对象又可以是函数 app.get(path,callback)中的c ...