bin:项目启动文件 conf:配置文件 lib:引入第三方库,库文件 src:业务逻辑
实现的核心代码: 集成全局的配置 for k in dir(global_settings): if k.isupper(): v = getattr(global_settings, k) setattr(self, k, v) 集成自定制的配置 for k in dir(config): if k.isupper(): v = getattr(config, k) setattr(self, k, v)
3.1首先面向过程的问题:
写起来简单容易,可是问题在于:面向过程的编程思想,不利于未来的维护和拓展,而且业务逻辑代码在start.py文件中,不符合高内聚低耦合原则
原则就是:各个模块或者各个类以及函数之间都是独立的html
3.2可插拔式采集解决上述问题,将每一个模块定义一个文件python
硬件,主板,cpu....
代码写起来,start.py文件执行文件里面,一个个导入插件,一个个实例化django
因为查找需求,不要查的文件须要注释掉,这里参考的是django的中间件概念,从路径下导入一个个类,实现可插拔式的采集(经过#注释)编程
PLUGINS_DICT = { 'basic' : 'src.plugins.basic.Basic', 'cpu' : 'src.plugins.cpu.Cpu', 'disk' : 'src.plugins.disk.Disk', 'board' : 'src.plugins.board.Board', 'memory' : 'src.plugins.memory.Memory', }
将plugins变成一个包,定义一个类PluginsManager,设置一个方法,execute ---从配置文件中读取要采集的插件信息, 而且执行。在start.py文件中不按照原先的导入路径,导入这个管理采集插件的类,执行实例化,而且执行下面的execute的方法服务器
for k, v in self.plugins_dict.items(): ret = {"status":None, 'data':None} ''' k: basic v: src.plugins.basic.Basic '''
问题来了,将这个v怎么解决 ,切分ssh
module_path, class_name = v.rsplit('.',1) ### ['src.plugins.basic', 'Basic']
因为切下来的是字符串,不能够from module_path import class_name函数
如何将字符串形式的模块导入进来-----importlib,其中里面有个模块import_module插件
response={} for k,v in self.plugins_dict.items(): module_path,class_name=v.rsplit('.',1) m=importlib.import_module(module_path) cls=getattr(m,class_name) res=cls().process() response[k]=res return response
3.3 代码采集冗余:debug
解决方法1:继承,写一个函数--------缺点每次新加的插件就比较麻烦要继承code
解决方案2:init.py文件中,写入一个command方法。将函数做为一个参数传进去,也就是函数的参数地址
def command(self, cmd): if self.mode == 'agent': import subprocess res = subprocess.getoutput(cmd) return res elif self.mode == 'ssh': import paramiko ssh = paramiko.SSHClient() # 容许链接不在know_hosts文件中的主机 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 链接服务器 ssh.connect(hostname='192.168.200.30', port=22, username='root', password='997997') # 执行命令 stdin, stdout, stderr = ssh.exec_command(cmd) # 获取命令结果 result = stdout.read() # 关闭链接 ssh.close() return result elif self.mode == 'salt': import salt.client local = salt.client.LocalClient() result = local.cmd('c2.salt.com', 'cmd.run', [cmd]) return result else: raise Exception ('只支持agent/ssh/salt模式')
命令采集完了将数据进行分析,每一个插件写一个parse分析函数
4.debug开发模式:
命令执行,将结果拿到放到文件夹files文件里面,读取到项目里面,运行开发模式下代码
5.采集的代码,报错的信息完整提交
import traceback def run(): try: int('asasda') except Exception as e: print(traceback.format_exc()) run() ##能够拿到完整的报错信息