通过宝塔面板开发微信报警插件
通过宝塔面板开发微信报警插件
首先总结一波:
遇到的问题,对公司这个框架不是很熟,好多问题都是问了良哥,然后一步步摸索前进的。碰到好多玄学问题 比如说新建一个字典可以return 但是写入数据的时候返回就不行了,其实想自定义的那种感觉。但是需要造好多轮子,实在脑子转不过来 只能弄成这么固定的方式。 还有碰到一个写日志的方式,python 的自带的写日志的模块在python 编辑器的方式导入的时候就有用, 然后通过url访问的时候就GG 就是不知道问题出在哪里,最后没办法。只能自己low 逼的方式自己写日志,日志的方式是一个大列表的方式,这个地方需要改进一下 改成那种日期格式的方式,最后一个问题就是前段跟后端对接搞的头疼。最后还是抄袭SS的前段代码。没办法啊,谁叫我前端菜的抠脚呢。经过这一个星期的苦想中 终于完成了一个很垃圾的插件,虽然很low 但是至少完成了基本功能。下次有机会改成邮件的方式,让大家都能用上,这样也方便了很多了。毕竟微信的这个需要用 那个企业微信的方式才能发送消息。=。= 应该会在8月份出一个邮件的插件。前端还是需要修炼一番了。
这个需要有一个企业微信公众号才能使用的(稍后发到github中)
花了一个星期的时间写了一个垃圾的代码。emmmmm 具体的实现了如下:
1. 发送日志(已经完成) 2. 配置微信报警的接口 3. 服务停止关闭 4. 测试发送 5. 监控选项
手机接收的如下:
微信的接口如下:
Corpid 是微信企业号的名称ID 如下:
secret ID 是项目ID
实现了内存报警 、 网络过大报警、CPU 之类的基本信息
核心的代码如下:
#coding: utf-8 import sys,public,system,json,os,datetime system_info=system.system() class trigger_main: # 配置文件的存放位置 __config = '/etc/weixincfg.json' __syteminfo='/etc/system.json' __loginfo='/www/server/panel/plugin/trigger/weixin.log' system_type=["network","system"] state=[0,1] time_info = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") retList = [] def __init__(self): ''' 数据初始化, 将 weixin.log里面的数据加载到retList,如果没有数据 将写入一个空List ''' try: log = self.__read_file(self.__loginfo) self.retList = json.loads(log) except ValueError as e: with open(self.__loginfo, 'w') as f: f.write("[]") #Read a string in a file def __read_file(self,filename): # 如果文件不存在就返回Flase if not os.path.exists(filename): return False; # 打开这个文件 f = open(filename,'r') #读取这个文件 fbody = f.read() f.close() #返回这个文件的所有东西 return fbody #Write a string to a file #写这个文件 def __write_file(self,filename,fbody): f = open(filename,'w') f.write(fbody) f.close() def __write_log(self, filename, fbody): f = open(filename, 'w') f.write(fbody) f.close() #Write the configuration file def __set_config(self,sconfig): #序列化到配置文件中 self.__write_file(self.__config, json.dumps(sconfig)) return True; def __set_system(self,sconfig): self.__write_file(self.__syteminfo,json.dumps(sconfig)) return True def __set_log(self, config): self.__write_log(self.__loginfo, json.dumps(config)) return True def __log_write(self,type,status,info): ret = {} ret['time'] = self.time_info ret['type'] = type ret['status'] = status ret['info'] = info self.retList.append(ret) self.__set_log(self.retList) # 硬盘检测 def disk_check(self,input): disk=system_info.GetDiskInfo() if int(disk[0]['size'][-1].strip("%"))>70: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 disk_is_to_50') self.__log_write(type="system",status="OK",info="disk_is_to_50") if result[0] =='ok\n' and len(result[0])==3:return True return False else: return False # 内存检测 def mem_check(self,input): mem_info=system_info.GetMemInfo() mem=int(float(mem_info['memRealUsed'])/float(mem_info['memTotal'])*100) if mem>80: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 mem_is_to_50') self.__log_write(type="system",status="OK",info="mem_is_to_50") if result[0] =='ok\n' and len(result[0])==3:return True return False else: return False # get_cpu_load_network def get_cpu_load_network(self,input): liang=system_info.GetAllInfo(input) if int(liang['cpu'][0])>60: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 CPU_is_to_60') self.__log_write(type="system",status="OK",info="CPU_is_to_60") if result[0] =='ok\n' and len(result[0])==3:return True if int(liang["network"]["down"])>100: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 netowkr_is_to_100') self.__log_write(type="system",status="OK",info="netowkr_is_to_100") if result[0] =='ok\n' and len(result[0])==3:return True return False # CPU def cpu(self,input): liang=system_info.GetAllInfo(input) if int(liang['cpu'][0])>60: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 CPU_is_to_60') self.__log_write(type="system",status="OK",info="CPU_is_to_60") if result[0] =='ok\n' and len(result[0])==3:return liang['cpu'][0] return liang['cpu'][0] #网络 def network(self,input): liang=system_info.GetAllInfo(input) if int(liang["network"]["up"])>100: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 netowkr_is_to_100') self.__log_write(type="network",status="OK",info="netowkr_is_to_100") if result[0] =='ok\n' and len(result[0])==3:return liang["network"]["down"],liang["network"]["up"] return liang["network"]["down"],liang["network"]["up"] #负载 def load(self,input): liang=system_info.GetAllInfo(input) if int(liang["load_average"]["one"])>=1: result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 CPU_is_to_60') self.__log_write(type="system",status="OK",info="CPU_is_to_60") if result[0] =='ok\n' and len(result[0])==3:return liang["load_average"]["one"],liang["load_average"]["five"],liang["load_average"]["fifteen"] return liang["load_average"]["one"],liang["load_average"]["five"],liang["load_average"]["fifteen"] def get_system_info(self,input): name=['Memory','Hard_disk','load_load','network_up','network_down','CPU'] mem_info=system_info.GetMemInfo() disk=system_info.GetDiskInfo() mem=int(float(mem_info['memRealUsed'])/float(mem_info['memTotal'])*100) dist_info=int(disk[0]['size'][-1].strip("%")) cpu=self.cpu(input) network=self.network(input) load=self.load(input) sconfig = self.get_system(None) load_load={'number':load[0],'name':name[2],'system_type':self.system_type[1],'state':self.state[0]} network_up={'number':network[-1],'name':name[3],'system_type':self.system_type[1],'state':self.state[0]} network_down={'number':network[0],'name':name[4],'system_type':self.system_type[1],'state':self.state[0]} CPU={'number':cpu,'name':name[5],'system_type':self.system_type[1],'state':self.state[0]} Memory={'number':mem,'name':name[0],'system_type':self.system_type[1],'state':self.state[0]} Hard_disk={'number':dist_info,'name':name[1],'system_type':self.system_type[1],'state':self.state[0]} sconfig['mem']=mem sconfig['dist_info']=dist_info sconfig['cpu']=cpu sconfig['network']=network sconfig['load']=load self.__set_system(sconfig) return Memory,Hard_disk,CPU,network_up,network_down,load_load def create_user(self,input): #获取一下配置文件 sconfig = self.get_config(None) #添加一个端口 和密码 sconfig['corp']['corpid'] = input.corpid sconfig['corp']['secret'] = input.secret sconfig['corp']['agentid'] = input.agentid self.__set_config(sconfig) return True #Read the configuration file def get_config(self,input): fbody = self.__read_file(self.__config) #通过反序列化转为内存对象 return json.loads(fbody) def get_system(self,input): body=self.__read_file(self.__syteminfo) return json.loads(body) #列出所有用户端口信息 def get_users(self,input): # {u'corp': {u'corpid': u'wxxxxxx', u'secret': u'Vnxxxxx', u'agentid': 1}} sconfig = self.get_config(None); users = [] for port in sconfig['corp']: u_tmp = {} u_tmp['agentid'] = agentid # 返回的应该是一个 [ {u'agentid': 1} ] users.append(u_tmp) #返回的值应该是 return users #获取配置选项 def get_options(self,input): #获取配置文件 sconfig = self.get_config(None) config=sconfig['corp'] #返回的是一个json {u'corp': {u'corpid': u'wxxxxxx', u'secret': u'Vnxxxxx', u'agentid': 1}} return config def get_system_options(self,input): get_system_info_opstion=self.get_system(None) return get_system_info_opstion #修改微信的SDK 文件 def create_user(self,input): #获取一下配置文件 sconfig = self.get_config(None) #添加一个端口 和密码 sconfig['corp']['corpid'] = input.corpid sconfig['corp']['secret'] = input.secret sconfig['corp']['agentid'] = input.agentid self.__set_config(sconfig) return True #发送测试 def get_check(self,input): # 看不懂这个ExecShell 方法 result = public.ExecShell('/www/server/panel/plugin/trigger/weixin 1 test') if result[0] =='ok\n' and len(result[0])==3:return True return False def get_check_info(self,input): liang=self.get_cpu_load_network(input) return liang def weixin(self,input): liang=self.get_check_info(input) if liang:return True check_disk=self.disk_check(None) check_mem=self.mem_check(None) if check_disk:return True if check_mem:return True if check_mem and check_disk:return True return False def get_log(self,input): ret= self.__read_file(self.__loginfo) return json.loads(ret) def get_status(self,input): return True