Beispiel #1
0
 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
Beispiel #2
0
 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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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