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给我发过 ...
随机推荐
- ansible学习(二)
什么是YAML? YAML是一种标记语言.适合用来表达层次结构式的数据结构. YAML的基本组件:清单(短杠——空白字符)和散列表(短杠+空白字符分隔key:value对). Playbook的核心元 ...
- window批处理修改计算机名
一.需要重启 @echo offset /p pcnanme=请输入计算机的名字:reg add HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Com ...
- 2016 西普杯丶天津CTF预选赛(3/6)
哆啦A梦(图片隐写) 格式:SimCTF{ } 解:放到kail中binwalk一下(Binwalk是一个固件的分析工具,旨在协助研究人员对固件非分析,提取及逆向工程用处.简单易用,完全自动化脚本,并 ...
- socket接收大数据流
客户端: import socket client = socket.socket() client.connect(("127.0.0.1", 9999)) while True ...
- DEV SIT UAT PET SIM PRD PROD常见环境英文缩写含义
英文缩写 英文 中文 DEV development 开发 SIT System Integrate Test 系统整合测试(内测) UAT User Acceptance Test 用户验收测试 P ...
- 在Unity使文字变色
using UnityEngine;using System.Collections;using UnityEngine.UI; public class ShipIntro : MonoBehavi ...
- SkylineGlobe7.0.1版本 通过鼠标左右平移模型对象
帮同事写了一段测试代码,如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "ht ...
- 全解史上最快的JOSN解析库 - alibaba Fastjson
JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想的数据交换 ...
- 程序员修神之路--🤠分布式高并发下Actor模型如此优秀🤠
写在开始 一般来说有两种策略用来在并发线程中进行通信:共享数据和消息传递.使用共享数据方式的并发编程面临的最大的一个问题就是数据条件竞争.处理各种锁的问题是让人十分头痛的一件事. 传统多数流行的语言并 ...
- JAVA工程师-蚂蚁金服电话面试
今天5点半接到一个杭州的电话,是蚂蚁金服打来的,当时心里一阵发慌,由于还在上班,就和面试官约定6点下班之后再来.挂完电话,心里忐忑的不行,感觉自己这也没准备好,那也没准备好.剩下半个小时完全没有心思再 ...