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构造可插拔式插件逻辑的更多相关文章

  1. CMDB服务器管理系统【s5day87】:需求讨论-设计思路

    自动化运维平台愿景和服务器管理系统背景 服务器管理系统 管理后台示例 需求和设计 为什么开发服务器管理系统? 背景: 原来是用Excel维护服务器资产,samb服务[多个运维人员手动维护] 搭建运维自 ...

  2. CMDB服务器管理系统【s5day88】:采集资产-文件配置(一)

    django中间件工作原理 整体流程: 在接受一个Http请求之前的准备 启动一个支持WSGI网关协议的服务器监听端口等待外界的Http请求,比如Django自带的开发者服务器或者uWSGI服务器. ...

  3. CMDB服务器管理系统【s5day90】:API验证

    1.认证思路刨析过程 1.请求头去哪里拿? 1.服务器端代码: def test(request): print(request) return HttpResponse('你得到我了') 2.客户端 ...

  4. CMDB服务器管理系统【s5day90】:获取今日未采集主机列表

    1.目录结构 1.服务器端 2.客户端 2.具体代码如下 1.数据库增加两个字段 class Server(models.Model): """ 服务器信息 " ...

  5. CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息

    1.创建硬件资产信息 import json from django.shortcuts import render,HttpResponse from django.views.decorators ...

  6. CMDB服务器管理系统【s5day88】:采集资产之Agent、SSH和Salt模式讲解

    在对获取资产信息时,简述有四种方案. 1.Agent  (基于shell命令实现) 原理图 Agent方式,可以将服务器上面的Agent程序作定时任务,定时将资产信息提交到指定API录入数据库 优点: ...

  7. CMDB服务器管理系统【s5day92】:服务器管理回顾

    一.服务器管理回顾 1.requests 发送: requests.post(url='',data=,json=) requests.get() Django接受: request.POST, co ...

  8. CMDB服务器管理系统【s5day88】:采集资产-文件配置(二)

    上节疑问: 1.老师我们已经写到global_settings里了,为什么还要写到__init__.py setting 这的作用是为了:整合起两个的组合global_settings和setting ...

  9. CMDB服务器管理系统【s5day89】:采集资产之汇报信息

    1.服务器端收到的数据和客户端的数据不一样 print(request.post) 少发了,还是少取了,说明根本没有把数据全发过来 print(request.body) 1.只把字典的key给我发过 ...

随机推荐

  1. CentOS7中利用Xshell6向虚拟机本地上传文件

    环境交代 Linux系统:CentOS7, Xshell版本:6 操作步骤 下面我们以一个文件上传来演示用法 第一步 建立连接,这里不多说 在Xshell中点击如下图标,或者直接按 Alt+Ctrl+ ...

  2. LV 指定或修改逻辑卷的major, minor号[RHEL6]

    在创建逻辑卷时,可以指定逻辑卷的major和minor设备号. [-M|--persistent {y|n}] //Set to y to make the minor number specifie ...

  3. SQLServer之修改DEFAULT约束

    使用SSMS数据库管理工具修改DEFAULT约束 1.连接数据库.选择数据表->右键点击->选择设计. 2.在表设计器窗口->选中要修改的数据列->在列属性中找到默认值绑定-& ...

  4. Linux Collection:网络配置

    PAS 缺少ifconfig 安装相应软件[不推荐],尽量使用 ip 命令 sudo apt install gnome-nettool 补充,显示IP地址: ip show address PAS ...

  5. 英语口语练习系列-C06-购物

    <水调歌头>·苏轼 明月几时有,把酒问青天. 不知天上宫阙,今夕是何年? 我欲乘风归去,又恐琼楼玉宇, 高处不胜寒. 起舞弄清影,何似在人间! 转朱阁,低绮户,照无眠. 不应有恨,何事长向 ...

  6. bibli直播弹幕实时爬取

    1 分析数据来源  在不知道弹幕信息在哪里的时候,只能去all里面查看每一个相应的信息,看信息是否含有弹幕信息 在知道弹幕信息文件的时候,我们可以直接用全局文件搜索,定位到弹幕数据文件.操作如下图 2 ...

  7. Extending the Yahoo! Streaming Benchmark

    could accomplish with Flink back at Twitter. I had an application in mind that I knew I could make m ...

  8. PHP命令执行与防范

    命令执行漏洞是指攻击者可以随意执行系统命令,是高危漏洞之一. 命令连接符:&  &&   ||     | 如:ping www.baidu.com && ne ...

  9. Redis入门---字符串类型

    阅读目录 1.keys * 命令 2.判断一个键是否存在(exists key) 3.删除键 4.获取键值的数据类型 5 递增数字(incr) 6.增加指定的整数 (INCRBY) 7.减少指定的整数 ...

  10. 【原创】微服务为什么一定要用docker

    引言 早在2013年的时候,docker就已经发行,然而那会还是很少人了解docker.一直到2014年,Martin Fowler提出了微服务的概念,两个不相干的技术终于走在了一起,创造了今天的辉煌 ...