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. Python 日志模块logging

    logging模块: logging是一个日志记录模块,可以记录我们日常的操作. logging日志文件写入默认是gbk编码格式的,所以在查看时需要使用gbk的解码方式打开. logging日志等级: ...

  2. Python爬虫之正则表达式(2)

    # 最常规的匹配 import re content = 'Hello 123 4567 World_This is a Regex Demo' print(len(content)) result ...

  3. 面向对象_new,__eq__,__hash__

    老师博客:http://www.cnblogs.com/Eva-J/articles/7351812.html __new__ __init__是一种初始化的方法 __new__是构建方法,创建一个对 ...

  4. 0109 ubuntu nginx ssl

    1. sudo apt-get install openssl libssl-dev # ./configure --with-http_stub_status_module --with-http_ ...

  5. adb常用命令(golang版)及输入中文

    package main import ( "crypto/md5" "fmt" "image/png" "io/ioutil&q ...

  6. js获取浏览器窗体最大化事件

    <mce:script language="javascript"><!--function ReSet() {document.getElementById(& ...

  7. Nginx(三)------nginx 反向代理

    Nginx 服务器的反向代理服务是其最常用的重要功能,由反向代理服务也可以衍生出很多与此相关的 Nginx 服务器重要功能,比如后面会介绍的负载均衡.本篇博客我们会先介绍 Nginx 的反向代理,当然 ...

  8. 将arguments转换成数组的方法

    将函数里的arguments,转换成一个真正的数组的方法,arguments是个类数组,除了有实参所组成的类似数组以外,还有自己的属性,如callee,arguments.callee就是当前正在执行 ...

  9. Java实现动态修改Jar包内文件内容

    import java.io.*; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; ...

  10. SqlServer2008_r2安装功能选择

    勾上数据引擎服务.客户端工具链接.sdk.管理工具.客户连接SDK.最后一个 sql2008安装时,怎么选择服务账户NT Authority\System ,系统内置账号,对本地系统拥有完全控制权限: ...