def __init__(self, data, logs): from apps_1.API_2 import HttpNetRobot self.data = data self.logs = logs self.Http = HttpNetRobot( 'http://%s:%s/' % (conf.Url_ip, conf.Url_post), self.logs) pass
def __init__(self,data,logs): from apps_1.API_2 import HttpNetRobot self.logs = logs self.Http = HttpNetRobot('http://%s:%s/'%(conf.Url_ip, conf.Url_post),self.logs) self.data = self.__get_info(data) pass
class APPS_DAL(): def __init__(self,data,logs): from apps_1.API_2 import HttpNetRobot self.logs = logs self.Http = HttpNetRobot('http://%s:%s/'%(conf.Url_ip, conf.Url_post),self.logs) self.data = self.__get_info(data) pass def onlinegray(self): """ 上线灰度 :param msg: :return: """ if self.__up_rsync(): self.__restart() Task = self.__http_get('api/Task/%s'%(self.data['id'])) Task['status'] = 'success' self.__http_Put(Task,logs='info') data={'mode':True,'data':{'message':'更新信息成功,并发布强制重启命令'}} return data else: data={'mode':False,'data':{'message':'更新失败'}} return data def __up_rsync(self): """ rsync 更新 git库 :param data: :return: """ #self.__check_name(data['name']) self.logs.info("对 项目包 %s 进行拉取代码"%self.data['package']['caption']) try: Pull_server = """ -e \'ssh -p %s\' %s@%s:%s"""%(self.data['package']['Pull_port'],self.data['package']['Pull_user'],self.data['package']['Pull_server'],self.data['package']['Pull_path']) except: return False cmdStr = '%s %s %s >%s'%(conf.rasync,Pull_server, conf.gitpath_dep, conf.tempfile) #self.__cmd(cmdStr) self.__cmd('ls -l') #更改包状态 data = True if data : Package = self.__http_get('api/Package/%s'%(self.data['package']['id'])) Package['code'] = 'success' self.__http_Put(Package,logs='info') self.logs.info("对 项目包 %s 进行拉取代码 成功 "%self.data['package']['caption']) return True else: self.logs.info("对 项目包 %s 进行拉取代码 失败 "%self.data['package']['caption']) return False pass def __restart(self): """ 重启程序 :param data: :return: """ self.__stop() #time.sleep(5) self.__start() return False def __stop(self): """ 停止程序 :param data: :return: """ self.logs.info("对项目%s 进行关闭 开始"%self.data['Duct']['info']['name']) cmdStr = """. ~/.bashrc && sudo su - appuser -c \"/bin/base %s/%s/%s stop\" """%(self.data['Duct']['info']['path'],self.data['Duct']['info']['name'],self.data['Duct']['info']['shell']) self.logs.info("对项目%s 进行关闭 成功"%self.data['Duct']['info']['name']) return True def __start(self): """ 启动程序 :param data: :return: """ self.logs.info("对项目%s 进行启动 开始"%self.data['Duct']['info']['name']) cmdStr = '. ~/.bashrc && sudo su - appuser -c \"/bin/base %s/%s/%s start\" '%(self.data['Duct']['info']['path'],self.data['Duct']['info']['name'],self.data['Duct']['info']['shell']) self.logs.info("对项目%s 进行启动 成功"%self.data['Duct']['info']['name']) return True def __http_log(self,cmdStr,host_id=0,result='unknown',Duct_Group='Duct_One_Group'): try: post_data = { "task": self.data['id'], "Duct_group": Duct_Group, "result": result, "log": cmdStr, "host_id": host_id } self.logs.info("命令结果:%s"%post_data) self.Http.send('api/TaskLog/',post_data=post_data) except Exception as e : print e pass def __http_get(self,url,logs='debug'): try: Project = self.Http.get(url) getattr(self.logs,logs)("%s%s%s"%('='*25,url,'='*25)) for i,v in Project.items(): getattr(self.logs,logs)("%s:%s"%(i,v)) getattr(self.logs,logs)("%s%s%s"%('*'*25,url,'*'*25)) return Project except Exception as e: self.logs.error('获取 Project 信息失败 %s'%e.message) return False def __get_info(self,msg): #查询相关信息 try: return self.__http_get('api/inquire/test_apps/uuid/%s/'%(msg['Project']['uuid']),logs='info') except Exception as e: self.logs.error('获取基础信息失败 \n%s'%e.message) return False def __http_Put(self,data,logs='debug'): #修改线上信息 try: http,data = self.Http.PUT(data['url'],data,logs) assert http return (True,data) except Exception as e : return (False,'修改信息失败 \n%s'%e.message) def __ssh_Client(self): address, port=host,prot self.logs.debug('初始化ssh客户端') s = paramiko.SSHClient() s.load_system_host_keys() s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if username == 'syspub': privatekeyfile = "%sssh_key/syspub_id_rsa"%(BASE_DIR) elif username == 'appuser': privatekeyfile = "%sssh_key/appuser_id_rsa"%(BASE_DIR) #privatekeyfile = './ssh_key/syspub_id_rsa' mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile) try: s.connect(address,port,username,pkey=mykey,timeout=5) except: self.logs.info('%s连接初始化失败'%address) try: #此处需要修改源代码来实现超时机制 stdin,stdout,stderr = s.exec_command(cmd,timeout=10) read = ["======groups:%s==host:%s=====name:%s==========="%(groups,host,name),stdout.read(),"======groups:%s==host:%s=====name:%s==========="%(groups,host,name)] print "\n".join(read) self.logs.debug("\n".join(read)) s.close() return True except: self.logs.info('执行命令失败') return False pass def __ssh_cmd(self): pass def __check(self,host,prot): timeout = 2 socket.setdefaulttimeout(timeout) address, port=host,prot s = socket.socket() self.logs.debug("开始检测 %s 端口 %s" %(address, port)) try: s.connect((address, port)) self.logs.debug("检测 %s 端口 %s 成功" % (address, port)) return True except socket.error, e: self.logs.info("检测 %s 端口 %s 失败 %s" % (address, port, e)) return False
class ZMQ_DAL(): def __init__(self, data, logs): from apps_1.API_2 import HttpNetRobot self.data = data self.logs = logs self.Http = HttpNetRobot( 'http://%s:%s/' % (conf.Url_ip, conf.Url_post), self.logs) pass def Inquire(self, msg): """ 开始执行查询 :param msg: :return: """ self.logs.info('开始执行查询') try: #Package = self.Http.get('api/inquire/Package/uuid/%s/'%(msg['Package']['uuid'])) Project = self.Http.get('api/inquire/Project/uuid/%s/' % (msg['Project']['uuid'])) #assert Package assert Project self.logs.info("Package:") #for i,v in Package.items(): # self.logs.info("%s:%s"%(i,v)) self.logs.info("Project:") for i, v in Project.items(): self.logs.info("%s:%s" % (i, v)) except Exception as e: data = {'mode': False, 'data': {'message': '查询失败\n%s' % e.message}} return data data = { 'mode': True, 'data': { 'message': '参数执行成功,返回查询结果', 'msg': { 'Project': { "status": Project['status'] } } } } return data def __http_package(self, msg): try: post_data = { "caption": msg['caption'], "Pull_user": msg['Pull_user'], "Pull_port": msg['Pull_port'], "Pull_server": msg['Pull_server'], "Pull_path": msg['Pull_path'], "code": 'unknown', } except Exception as e: return (False, '获取Package信息失败!请重试\n%s' % e.message) http, data = self.Http.send('api/Package/', post_data=post_data) if http: return (True, data) else: return (False, data) def __val_OPTIONS(self, data, val): for i in data: if val == i['display_name']: return i['value'] return False def __http_Project(self, msg): try: http, OPTIONS = self.Http.OPTIONS('api/Task/') assert http OPTIONS = OPTIONS['actions']['POST'] except Exception as e: return (False, '获取OPTIONS失败.%s' % e.message) try: msg['Project']['Duct'] = self.__val_OPTIONS( data=OPTIONS['Duct']['choices'], val=msg['Project']['Duct']) assert msg['Project']['Duct'] except Exception as e: return (False, '获取Duct失败.%s' % e.message) try: task_type = msg['Project']['task_type'] except: task_type = 1 try: execute_type = self.__val_OPTIONS( data=OPTIONS['execute_type']['choices'], val=msg['mode']) assert execute_type except: execute_type = 0 try: post_data = { "task_type": task_type, "execute_type": execute_type, "name": msg['Project']['name'], "content": msg['Project']['message'], "is_template": False, "description": msg['Project']['message'], "status": 'unknown', "package": int(msg['Package']['id']), "Duct": int(msg['Project']['Duct']), "created_by": 2 } except Exception as e: return (False, '获取package信息失败!请重试\n%s' % e.message) self.logs.info("post_data:\n") for i, v in post_data.items(): self.logs.info("%s:%s" % (i, v)) http, data = self.Http.send('api/Task/', post_data=post_data) if http: return (True, data) else: return (False, data) def onlinegray(self, msg): """ 上线灰度 :param msg: :return: """ self.logs.info('上线灰度') #录入包信息 Package = self.__http_package(msg['Package']) self.logs.info(json.dumps(Package)) if not Package[0]: data = { 'mode': False, 'data': { 'message': '录入包信息失败\n%s' % Package[1] } } return data else: Package = Package[1] del msg['Package'] msg['Package'] = { 'uuid': Package['uuid'], 'id': Package['url'].split('/')[-2] } self.logs.info(json.dumps(msg['Package'])) #录入线上信息 Project = self.__http_Project(msg) self.logs.info(json.dumps(Project)) if not Project[0]: data = { 'mode': False, 'data': { 'message': '录入上线息失败\n%s' % Project[1] } } self.Http.DELETE(Package['url']) return data else: del msg['Project'] Project = Project[1] msg['Project'] = { 'uuid': Project['uuid'], 'id': Project['url'].split('/')[-2] } self.Forcibly_Project(msg) data = { 'mode': True, 'data': { 'message': '更新信息成功,并发布强制重启命令', 'msg': msg } } return data def __http_Put(self, msg, Package): #获取线上详细信息 try: OPTIONS = self.Http.get('api/inquire/Project/uuid/%s/' % (msg['Project']['uuid'])) assert OPTIONS self.logs.info("OPTIONS:\n") for i, v in OPTIONS.items(): self.logs.info("%s:%s" % (i, v)) except Exception as e: return (False, '获取信息失败\n%s' % e.message) #修改线上信息 try: post_data = { "task_type": OPTIONS['task_type'], "execute_type": OPTIONS['execute_type'], "name": OPTIONS['name'], "content": OPTIONS['content'], "is_template": OPTIONS['is_template'], "description": OPTIONS['description'], "status": OPTIONS['status'], "package": int(Package['url'].split('/')[-2]), "Duct": int(OPTIONS['Duct_id']), "created_by": OPTIONS['created_by_id'] } http, data = self.Http.PUT('api/Task/%s/' % (OPTIONS['id']), post_data) assert http self.logs.info("PUT:\n") for i, v in OPTIONS.items(): self.logs.info("%s:%s" % (i, v)) return (True, OPTIONS) except Exception as e: return (False, '修改信息失败 \n%s' % e.message) def Forcibly_Project(self, msg): self.logs.info('开始强制重启') self.data.put(msg) data = {'mode': True, 'data': {'message': '参数执行成功'}} return data
class ZMQ_DAL(): def __init__(self,data,logs): from apps_1.API_2 import HttpNetRobot self.data = data self.logs = logs self.Http = HttpNetRobot('http://%s:%s/'%(conf.Url_ip, conf.Url_post),self.logs) pass def Inquire(self,msg): """ 开始执行查询 :param msg: :return: """ self.logs.info('开始执行查询') try: #Package = self.Http.get('api/inquire/Package/uuid/%s/'%(msg['Package']['uuid'])) Project = self.Http.get('api/inquire/Project/uuid/%s/'%(msg['Project']['uuid'])) #assert Package assert Project self.logs.info("Package:") #for i,v in Package.items(): # self.logs.info("%s:%s"%(i,v)) self.logs.info("Project:") for i,v in Project.items(): self.logs.info("%s:%s"%(i,v)) except Exception as e : data={'mode':False,'data':{'message':'查询失败\n%s'%e.message}} return data data={'mode':True,'data':{'message':'参数执行成功,返回查询结果','msg':{'Project':{"status":Project['status']}}}} return data def __http_package(self,msg): try: post_data = { "caption": msg['caption'], "Pull_user": msg['Pull_user'], "Pull_port": msg['Pull_port'], "Pull_server": msg['Pull_server'], "Pull_path": msg['Pull_path'], "code": 'unknown', } except Exception as e : return (False,'获取Package信息失败!请重试\n%s'%e.message) http,data = self.Http.send('api/Package/',post_data=post_data) if http: return (True,data) else: return (False,data) def __val_OPTIONS(self,data,val): for i in data: if val == i['display_name']: return i['value'] return False def __http_Project(self,msg): try: http , OPTIONS = self.Http.OPTIONS('api/Task/') assert http OPTIONS = OPTIONS['actions']['POST'] except Exception as e : return (False,'获取OPTIONS失败.%s'%e.message) try: msg['Project']['Duct'] = self.__val_OPTIONS(data=OPTIONS['Duct']['choices'],val=msg['Project']['Duct']) assert msg['Project']['Duct'] except Exception as e : return (False,'获取Duct失败.%s'%e.message) try: task_type = msg['Project']['task_type'] except : task_type = 1 try: execute_type = self.__val_OPTIONS(data=OPTIONS['execute_type']['choices'],val=msg['mode']) assert execute_type except : execute_type = 0 try: post_data = { "task_type": task_type, "execute_type": execute_type, "name": msg['Project']['name'], "content": msg['Project']['message'], "is_template": False, "description": msg['Project']['message'], "status": 'unknown', "package": int(msg['Package']['id']), "Duct": int(msg['Project']['Duct']), "created_by": 2 } except Exception as e : return (False,'获取package信息失败!请重试\n%s'%e.message) self.logs.info("post_data:\n") for i,v in post_data.items(): self.logs.info("%s:%s"%(i,v)) http,data = self.Http.send('api/Task/',post_data=post_data) if http: return (True,data) else: return (False,data) def onlinegray(self,msg): """ 上线灰度 :param msg: :return: """ self.logs.info('上线灰度') #录入包信息 Package = self.__http_package(msg['Package']) self.logs.info(json.dumps(Package)) if not Package[0]: data={'mode':False,'data':{'message':'录入包信息失败\n%s'%Package[1]}} return data else: Package = Package[1] del msg['Package'] msg['Package'] = {'uuid':Package['uuid'],'id':Package['url'].split('/')[-2]} self.logs.info(json.dumps(msg['Package'])) #录入线上信息 Project = self.__http_Project(msg) self.logs.info(json.dumps(Project)) if not Project[0]: data={'mode':False,'data':{'message':'录入上线息失败\n%s'%Project[1]}} self.Http.DELETE(Package['url']) return data else: del msg['Project'] Project = Project[1] msg['Project'] = {'uuid':Project['uuid'],'id':Project['url'].split('/')[-2]} self.Forcibly_Project(msg) data={'mode':True,'data':{'message':'更新信息成功,并发布强制重启命令','msg':msg}} return data def __http_Put(self,msg,Package): #获取线上详细信息 try: OPTIONS = self.Http.get('api/inquire/Project/uuid/%s/'%(msg['Project']['uuid'])) assert OPTIONS self.logs.info("OPTIONS:\n") for i,v in OPTIONS.items(): self.logs.info("%s:%s"%(i,v)) except Exception as e : return (False,'获取信息失败\n%s'%e.message) #修改线上信息 try: post_data = { "task_type": OPTIONS['task_type'], "execute_type": OPTIONS['execute_type'], "name": OPTIONS['name'], "content": OPTIONS['content'], "is_template": OPTIONS['is_template'], "description": OPTIONS['description'], "status": OPTIONS['status'], "package": int(Package['url'].split('/')[-2]), "Duct": int(OPTIONS['Duct_id']), "created_by": OPTIONS['created_by_id'] } http,data = self.Http.PUT('api/Task/%s/'%(OPTIONS['id']),post_data) assert http self.logs.info("PUT:\n") for i,v in OPTIONS.items(): self.logs.info("%s:%s"%(i,v)) return (True,OPTIONS) except Exception as e : return (False,'修改信息失败 \n%s'%e.message) def Forcibly_Project(self,msg): self.logs.info('开始强制重启') self.data.put(msg) data={'mode':True,'data':{'message':'参数执行成功'}} return data