示例#1
0
def deployment_update():
    db_token = db_op.platform_token
    params = request.json
    new_replicas = None
    msg = "image build fail!"
    try:
        if params:
            if 'project' in params and 'version' in params and 'access_token' in params:
                token = params['access_token']
                project = params['project']
                version = params['version']
                new_image = "%s/%s:%s" %(docke_registry,project.split('.')[0],version)
                if 'replicas' in params:
                    new_replicas = params['replicas']
                # 验证token是否有效
                vals = db_token.query.filter(and_(db_token.token == token, db_token.expire > time.strftime('%Y-%m-%d', time.localtime()))).all()
                if vals:
                    redis_key = 'op_k8s_update_%s' %time.strftime('%Y%m%d%H%M%S', time.localtime())
                    Scheduler = produce.Scheduler_publish()
                    Scheduler = Scheduler.Scheduler_mem(k8s_resource.object_update, [new_image, new_replicas,version,redis_key])
                    Scheduler.start()
                    msg = "http://op.moji.com/deploy_query/%s" %redis_key
                else:
                    msg = 'token deny!'
            else:
                msg = 'url params error!'
        else:
            msg = 'url params null!'
    except Exception as e:
        msg = e
    finally:
        return jsonify({'result': msg})
示例#2
0
def update_java():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' %(g.user,g.secret_key)
    messageKey = '%s_update_java' % K
    taskKey = 'update_java'
    form = MyForm.MyForm_updateJboss()
    if form.submit.data:
        try:
            if form.text.data:
                tags = form.text.data.strip().splitlines()
                assert len(tags)==1,'Can only execute a project at a time!'
                project = form.text.data.strip()
                warname = project.split('-')[0]
                Action = form.selectAction.data
                Gray = form.Gray.data
                Type = 1
                dbTable = db_op.java_list
                #灰度发布
                if Gray:
                    ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type,dbTable.Gray == '1')).limit(1).all()
                    if not ServerList:
                        ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type)).limit(1).all()
                        loging.write(ServerList[:])
                        if ServerList:
                            for ip, username in ServerList:
                                dbTable.query.filter(db_op.DB.and_(dbTable.ip == ip, dbTable.user == username)).update({dbTable.Gray:'1'})
                        else:
                            flash('%s Not found' % warname)
                            return render_template('Message.html')
                else:
                    ServerList = dbTable.query.with_entities(dbTable.ip,dbTable.user).filter(db_op.DB.and_(dbTable.project == warname,dbTable.type == Type)).all()
                if ServerList:
                    information = {}
                    information['warname'] = warname
                    information['project'] = project
                    information['ServerList'] = ServerList
                    information['Action'] = Action
                    information['key'] = messageKey
                    information['Gray'] = Gray
                    myRedis.delete(messageKey)
                    myRedis.lpush(taskKey,information)
                    mysql_operation = Mysql.mysql_op(g.user,Action,Type,project,Gray)
                    mysql_operation.op_operation()
                    Scheduler = produce.Scheduler_publish()
                    Scheduler = Scheduler.Scheduler_mem(Scheduler.job_update_java)
                    Scheduler.start()
                else:
                    flash('%s Not found' % warname)
                    return render_template('Message.html')
        except Exception as e:
                flash(e)
                return render_template('Message.html')
        return render_template('java_update_show.html')
    return render_template('java_update.html',form=form)
示例#3
0
def publish():
    produce.Async_log(g.user, request.url)
    importlib.reload(MyForm)
    secret_key= tools.Produce(length=8, chars=string.digits)
    session['secret_key'] = secret_key
    K = '%s_%s' %(g.user,secret_key)
    Msg_Key = '%s_publish_msg' %K
    form = MyForm.MyForm_publish()
    if form.submit.data:
        try:
            if Redis.exists(Msg_Key):
                raise flash('上线操作过于频繁,请稍等%s秒......' %Redis.ttl(Msg_Key))
            package_url = form.package_url.data
            describe = form.describe.data
            package_md5 = form.package_md5.data
            package_type = form.package_type.data
            publish_type = form.publish_type.data
            check_url = form.check_url.data
            restart = form.restart.data
            execute = form.execute.data
            rb_project = form.project.data
            rb_version = form.version.data
            gray = form.gray.data
            if execute == 'rollback':
                if not rb_project and not rb_version:
                    raise logging.error("choice can not be empty!")
            if execute == 'publish':
                if not package_url or not package_md5 or not check_url or not describe:
                    raise logging.error("input can not be empty!")
                Package_name = package_url.split('/')[-1]
                package_name = Package_name.replace('.zip', '')
                rb_project = '-'.join(package_name.split('-')[:-1])
            INFOS = {'package_url': package_url, 'package_md5': package_md5, 'package_type': package_type,
                     'publish_type': publish_type,'user':g.user,'describe':describe.replace('"','').replace("'",''),'gray':int(gray),
                     'restart': restart, 'execute': execute, 'check_url': check_url.replace('https','http'), 'project': rb_project,
                     'version': rb_version,'channel':'web','callback_url':'None','token':'None','timestamp' :int(time.time())}
            #启动代码分发控制中心
            Scheduler = produce.Scheduler_publish()
            Scheduler = Scheduler.Scheduler_mem(task_publish.Publish_center,[INFOS,Msg_Key,K])
            Scheduler.start()
            return render_template('publish_show.html')
        except Exception as e:
            if 'old-style' not in str(e):
                logging.error(e)
    return render_template('publish.html',form=form)
示例#4
0
def update_php():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' % (g.user, g.secret_key)
    Key = '%s_update_php' % K
    publish_key = '%s_update_key' % K
    form = MyForm.MyForm_php()
    if form.submit.data:
        try:
            if Redis.exists(Key):
                raise flash('项目上线操作正在执行,不能并行上线操作.请稍候......')
            Redis.lpush(Key, 'check env......')
            tm = time.strftime('%Y%m%d%H%M%S', time.localtime())
            Key_file_list = 'file_list_%s' % tm
            if form.text.data:
                List = form.text.data.strip().splitlines()
                Action = form.selectaction.data
                Gray = form.Gray.data
            else:
                return redirect(url_for('update_php.update_php'))
            lines = [line.strip() for line in List]
            lines = str(lines)
            Redis.set(Key_file_list, lines)
            Redis.expire(Key_file_list, 1800)
            Info = {}
            Type = 1
            Info['arg'] = Type
            Info['action'] = Action
            Info['Key_file_lis'] = Key_file_list
            Info['gray'] = Gray
            Redis.rpush(publish_key, str(Info))
            Redis.lpush(Key, '    --->check env pass!')
            Redis.lpush(Key, '-' * 80 + '\n')
            mysql_operation = Mysql.mysql_op(g.user, Action, Type, lines, Gray)
            mysql_operation.op_operation()
            Scheduler = produce.Scheduler_publish()
            Scheduler = Scheduler.Scheduler_mem(php_update.php_update,
                                                publish_key, Key)
            Scheduler.start()
        except Exception as e:
            Redis.lpush(Key, e)
        return render_template('php_update_show.html')
    return render_template('php_update.html', form=form)
示例#5
0
def image_update():
    try:
        produce.Async_log(g.user, request.url)
        reload(MyForm)
        form = MyForm.Form_k8s_update()
        if form.submit.data:
            deployment = form.deployment.data
            version = form.version.data
            if version:
                new_image = "%s/%s:%s" % (docker_registry, deployment, version)
                new_replicas = form.replicas.data
                redis_key = 'op_k8s_update_%s' % time.strftime(
                    '%Y%m%d%H%M%S', time.localtime())
                session['redis_key'] = redis_key
                Scheduler = produce.Scheduler_publish()
                Scheduler = Scheduler.Scheduler_mem(
                    k8s_resource.object_update,
                    [new_image, new_replicas, version, redis_key])
                Scheduler.start()
                return render_template('deploy_show.html')
    except Exception as e:
        logging.error(e)
    return render_template('k8s_update.html', form=form)
示例#6
0
def publish_code():
    try:
        timestamp = None
        db_token = db_op.platform_token
        params = request.json
        GRAY = {'Flase': 0, 'True': 1}
        # 检查时间戳是否存在
        if 'timestamp' in params['data']:
            timestamp = params['data']['timestamp']
        else:
            return jsonify({'status': 'timestamp is null', 'timestamp': None})
        #md5对比验证数据
        new_md5 = Md5.Md5_make(params['data'])
        if new_md5 == params['data_md5']:
            params = params['data']
            token = params['access_token']
            #验证token是否有效
            vals = db_token.query.filter(
                and_(
                    db_token.token == token, db_token.expire > time.strftime(
                        '%Y-%m-%d', time.localtime()))).all()
            if vals:
                user = params['proposer']
                package_url = params['package_url']
                #检查压缩包下载地址格式
                if not package_url.endswith(
                        '.zip') and not package_url.endswith('.war'):
                    return jsonify({
                        'status': 'the package must be zip or war',
                        'timestamp': timestamp
                    })
                #获取详细参数
                describe = params['describe']
                package_md5 = params['package_md5']
                package_type = params['package_type']
                publish_type = params['publish_type']
                restart = params['restart']
                execute = params['execute']
                check_url = params['check_url']
                rb_project = params['project_name']
                rb_version = params['project_version']
                callback_url = params['callback_url']
                gray = GRAY[params['gray']]
                #生成随机key种子
                K = '%s_%s' % (token,
                               tools.Produce(length=8, chars=string.digits))
                Msg_Key = '%s_publish_msg' % K
                INFOS = {
                    'package_url': package_url,
                    'package_md5': package_md5,
                    'package_type': package_type,
                    'publish_type': publish_type,
                    'user': user,
                    'describe': describe.replace('"', '').replace("'", ''),
                    'gray': gray,
                    'restart': restart,
                    'execute': execute,
                    'check_url': check_url.replace('https', 'http'),
                    'project': rb_project,
                    'version': rb_version,
                    'channel': 'api',
                    'callback_url': callback_url,
                    'token': token,
                    'timestamp': timestamp
                }
                #启动代码分发控制中心
                Scheduler = produce.Scheduler_publish()
                Scheduler = Scheduler.Scheduler_mem(
                    task_publish.Publish_center, [INFOS, Msg_Key, K])
                Scheduler.start()
                return jsonify({'status': 'ok', 'timestamp': timestamp})
            else:
                return jsonify({
                    'status': 'token deny',
                    'timestamp': timestamp
                })
        else:
            return jsonify({
                'status': 'data_md5 error',
                'timestamp': timestamp
            })
    except Exception as e:
        logging.error(e)
        return jsonify({'status': str(e), 'timestamp': timestamp})
    finally:
        db_op.DB.session.remove()
示例#7
0
def deployment_create():
    produce.Async_log(g.user, request.url)
    reload(MyForm)
    form = MyForm.Form_k8s_deploy()
    if form.submit.data:
        project = form.projects.data
        version = form.version.data
        object = form.object.data
        container_port = form.container_port.data
        ingress_port = form.ingress_port.data
        replicas = form.replicas.data
        request_cpu = form.request_cpu.data
        limit_cpu = form.limit_cpu.data
        request_mem = form.request_mem.data
        limit_mem = form.limit_mem.data
        domain = form.domain.data
        re_requests = {}
        re_limits = {}
        try:
            if object and version and container_port and replicas:
                if object.endswith('.war') or object.endswith('.jar'):
                    dm_name = object.split('.')[0]
                    image = "%s/%s:%s" % (docker_registry, dm_name, version)
                    docker_file = "%s/%s" % (dockerfile_path, dm_name)
                    if os.path.exists(docker_file):
                        container_port = [
                            int(port) for port in container_port.split(',')
                        ]
                        if request_cpu and limit_cpu and request_mem and limit_mem:
                            if float(request_cpu) > float(limit_cpu) or float(
                                    request_mem) > float(limit_mem):
                                raise flash('限制资源不能小于请求资源!')
                            else:
                                re_requests = {
                                    'cpu': request_cpu,
                                    'memory': '%sG' % request_mem
                                }
                                re_limits = {
                                    'cpu': limit_cpu,
                                    'memory': '%sG' % limit_mem
                                }
                        if ingress_port:
                            if int(ingress_port) not in [
                                    int(port) for port in container_port
                            ]:
                                raise flash('对外服务端口必须是服务端口其中之一!')
                        redis_key = 'op_k8s_create_%s' % time.strftime(
                            '%Y%m%d%H%M%S', time.localtime())
                        session['redis_key'] = redis_key
                        Scheduler = produce.Scheduler_publish()
                        Scheduler = Scheduler.Scheduler_mem(
                            k8s_resource.object_deploy, [
                                project, dm_name, version, image,
                                container_port, ingress_port, replicas, domain,
                                re_requests, re_limits, redis_key
                            ])
                        Scheduler.start()
                        return render_template('deploy_show.html')
                    else:
                        flash("%s文件路径不存在!" % docker_file)
                else:
                    flash("%s包名应以.war或者.jar结尾!" % object)
            else:
                flash('必填项参数不完整!')
            return render_template('Message.html')
        except Exception as e:
            logging.error(e)
    return render_template('k8s_deploy.html', form=form)
示例#8
0
def publish_php():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' %(g.user,g.secret_key)
    Key = '%s_publish_php' %K
    form = MyForm.MyForm_php()
    qrcode_url = "https://xxx.baihe.com/xxx/{0}/{1}".format(g.user,g.grade)
    if form.submit.data:
        try:
            Redis.lpush(Key, 'check env......')
            if form.text.data and form.changelog.data:
                action = form.selectaction.data
                Type = int(form.selecttype.data)
                Way = form.selectWay.data
                if Type == 1:
                    platfrom = '线上'
                if Type == 2:
                    platfrom = '测外'
                Tags = form.text.data.strip().splitlines()
                Gray = form.Gray.data
                code = form.code.data
                work = form.selectwork.data
                grade = form.selectgrade.data
                changelog = form.changelog.data
                if Way == 'SVN':
                    if len(Tags) > 1:
                        raise flash('错误:只能同时上线一个项目!')
                    else:
                        for line in Tags:
                            if line.startswith('#') or not line.split():
                                continue
                            m = re.match(r'[0-9]', line)
                            if m:
                                raise flash('错误:不能以数字开头!')
                            if not line.startswith('/'):
                                raise flash('错误:' + line + '路径必须以"/"开头!')
                            path = line.strip()
                            path = path.replace('\\', '/')
                            App = path.split('/')
                            if len(App)<4:
                                raise flash('错误:路径错误,无法获取项目名!')
                            App = App[3]
                            if len(path.split('-')) >= 2:
                                version = path.split('-')[-1]
                            else:
                                raise flash('错误:项目名称格式错误!')
                            if version.endswith('.zip'):
                                version = version.replace('.zip', '')
                elif Way == 'GIT':
                    if len(Tags) != 2:
                        raise flash('错误:GIT上线格式不对!')
                    elif not Tags[0].strip().startswith('http://'):
                        raise flash('错误:' + Tags[0] + '路径需以"http://"开头!')
                    elif not Tags[0].strip().endswith('.git'):
                        raise flash('错误:' + Tags[0] + '应该以".git"结尾!')
                    elif 'tag' not in Tags[1]:
                        raise flash('错误:没有tag版本号!')
                    path = ';'.join(Tags)
                    path = path.replace('http://git.baihe.com/', '/')
                    App = Tags[0].strip().split('/')[-1]
                    App = App.split('.')[0]
                    version = Tags[1].split('-')[-1]
            else:
                raise flash('错误:文本框内容不能为空!')
        except Exception as e:
                pass
        else:
            try:
                #用户权限判断
                if g.grade == 2:
                    if code:
                        verify_key = "{0}_{1}".format(g.user,g.grade)
                        verify_code = Redis.get(verify_key)
                        if verify_code == str(code):
                            Redis.lpush(Key, '    --->verify code pass!')
                            Redis.delete(verify_key)
                            code_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                            db = db_op.publish_code
                            db_op.DB.session.add(db(project=App, code=str(code), platfrom=platfrom, user=g.user, Time=code_time))
                            db_op.DB.session.commit()
                        else:
                            flash('上线码验证错误!')
                            return redirect(url_for('publish_php.publish_php'))
                    else:
                        flash('上线码不能为空!')
                        return redirect(url_for('publish_php.publish_php'))
                Redis.lpush(Key,'    --->check env pass!')
                Redis.lpush(Key,'-'*80+'\n')
                db = db_op.php_list
                if Gray:
                    if App == 'baihePhpGlobalLibrary_publish':
                        val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'baihe')).limit(1).all()
                        if not val:
                            val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'baihe')).limit(1).all()
                    elif App == 'Baihe':
                        val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'hunli')).limit(1).all()
                        if not val:
                            val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'hunli')).limit(1).all()
                    else:
                        val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.project == '%s' % App)).limit(1).all()
                        if not val:
                            val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' % App, db.type == '%i' % Type)).limit(1).all()
                    if val:
                        sip = [v[0].encode('UTF-8') for v in val if v]
                        db.query.filter(and_(db.project == App, db.ip == sip[0])).update({db.Gray: '1'})
                    else:
                        raise flash('%s 没有在上线列表中找到!' % App)
                else:
                    if App == 'baihePhpGlobalLibrary_publish':
                        val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'baihe')).all()
                    elif App == 'Baihe':
                        val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'hunli')).all()
                    else:
                        val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' %App,db.type == '%i' %Type)).all()
                    if val:
                        val = set(val)
                        sip = [v[0].encode('UTF-8') for v in val if v]
                    else:
                        raise flash('%s 没有在上线列表中找到!' %App)
                Redis.delete(Key)
                Info = {}
                Info['action'] = action
                Info['key'] = Key
                Info['path'] = path
                Info['app'] = App
                Info['sip'] = sip
                Info['gray'] = Gray
                Info['Type'] = Type
                Info['Way'] = Way
                Redis.lpush('publish_php',str(Info))
                mysql_operation = Mysql.mysql_op(g.user,action,Type,App,version,Gray,work,grade,changelog)
                mysql_operation.op_operation()
                Scheduler = produce.Scheduler_publish()
                Scheduler = Scheduler.Scheduler_mem(Scheduler.job_publish_php)
                Scheduler.start()
            except Exception as e:
                if 'old' not in str(e):
                    flash(e)
                Redis.lpush(Key,'End')
                return render_template('Message.html')
            return render_template('php_publish_show.html')
    return render_template('php_publish.html',form=form,qrcode_url = qrcode_url )
示例#9
0
def publish_java():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' %(g.user,g.secret_key)
    messageKey = '%s_publish_java' % K
    publish_key = '%s_publish_key' % K
    qrcode_url = None
    form = MyForm.MyForm_publishJboss()
    if form.submit.data:
        Action = form.selectAction.data
        Type = int(form.selectType.data)
        Gray = form.Gray.data
        Way = form.selectWay.data
        code = form.code.data
        work = form.selectwork.data
        changelog = form.changelog.data
        tags = form.text.data.strip().splitlines()
        if tags and changelog:
            try:
                if myRedis.exists(messageKey):
                    raise flash('上线操作过于频繁,请稍等%s秒......' %myRedis.ttl(messageKey))
                assert len(tags) == 1, '错误:只能同时上线一个项目!'
                warTagName = tags[0]
                version = '0.0.0'
                if Action == 'restart':
                    warname = warTagName
                elif Way == 'SVN':
                    assert '.war.zip' in warTagName, '错误:格式错误!格式应为: baihe-xxxx-x.x.x.war.zip'
                    warname = warTagName.split('-')[:-1]
                    version = warTagName.split('-')[-1].replace('.war.zip','')
                    warname = '-'.join(warname) + '.war'
                elif Way == 'GIT':
                    warname = "{0}.war".format(warTagName.split('/')[-1])
            except Exception as e:
                flash(e)
            else:
                try:
                    project_db = db_op.project_level
                    project_level = project_db.query.with_entities(project_db.level).filter(project_db.project == warname).all()
                    # 测外不强制项目等级
                    if Type == 2:
                        if project_level:
                            project_level = int(project_level[0][0])
                        else:
                            project_level = 1
                    else:
                        if project_level:
                            project_level = int(project_level[0][0])
                            crypto = Md5.crypto(crypto_key)
                            qrcode_url = "https://op.baihe.com/qrcode_java/{0}/{1}/{2}/{3}".format(crypto.encrypt(g.user),g.grade,crypto.encrypt(warname),project_level)
                        else:
                            raise flash('没有找到该项目的对应项目等级!')
                    publish_time = time.strftime("%H", time.localtime())
                    if code:
                        verify_key = "{0}_{1}".format(g.user,warname)
                        verify_code = myRedis.get(verify_key)
                        if verify_code == str(code):
                            myRedis.lpush(messageKey, '    --->verify code pass!')
                            myRedis.expire(messageKey,30)
                            myRedis.delete(verify_key)
                        else:
                            raise flash('%s 该上线码验证不通过!' %str(code))
                    else:
                        # 用户权限及行为判断
                        tw = int(time.strftime('%w', time.localtime(time.time())))
                        if g.grade >= 2 and Type == 1 and Action == 'publish':
                            if project_level >= 5:
                                raise flash('该项目等级为%s级,需申请上线码!' % project_level)
                            if tw in (2, 4):
                                if project_level <= 4 and (int(publish_time) >= 17 or int(publish_time) <= 9):
                                    raise flash('仅允许在10-17点时间段进行上线操作,需申请上线码!')
                            else:
                                raise flash('4级及以下常规项目只限在周二和周四上线,修复BUG需申请上线码!')
                        if g.grade >= 2 and Action == 'rollback':
                            raise flash('没有权限进行回滚操作!')
                    dbTable = db_op.java_list
                    #灰度发布
                    if Gray:
                        ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type,dbTable.Gray == '1')).limit(1).all()
                        if not ServerList:
                            ServerList = dbTable.query.with_entities(dbTable.ip, dbTable.user).filter(db_op.DB.and_(dbTable.project == warname, dbTable.type == Type)).limit(1).all()
                            if ServerList:
                                for ip, username in ServerList:
                                    dbTable.query.filter(db_op.DB.and_(dbTable.ip == ip, dbTable.user == username)).update({dbTable.Gray:'1'})
                            else:
                                raise flash('%s 没有在上线列表中找到!' % warname)
                    else:
                        ServerList = dbTable.query.with_entities(dbTable.ip,dbTable.user).filter(db_op.DB.and_(dbTable.project == warname,dbTable.type == Type)).all()
                        if Type == 1:
                            ServerList.append(('172.16.4.188','java'))
                    if ServerList:
                        myRedis.lpush(messageKey, 'check security policy......')
                        myRedis.expire(messageKey, 30)
                        information = {}
                        information['warname'] = warname
                        information['warTagName'] = warTagName
                        information['ServerList'] = ServerList
                        information['Action'] = Action
                        information['Gray'] = Gray
                        information['Type'] = Type
                        information['Way']  = Way
                        myRedis.lpush(publish_key,information)
                        mysql_operation = Mysql.mysql_op(g.user,Action,Type,warname,version,Gray,work,project_level,changelog)
                        mysql_operation.op_operation()
                        Scheduler = produce.Scheduler_publish()
                        Scheduler = Scheduler.Scheduler_mem(java_publish.java_publish,publish_key,messageKey)
                        Scheduler.start()
                        myRedis.lpush(messageKey, '    --->check pass!')
                        myRedis.lpush(messageKey, '-' * 80 + '\n')
                    else:
                        raise flash('%s 没有在上线列表中找到!' % warname)
                except Exception as e:
                    if 'old' not in str(e):
                        flash(e)
                    if qrcode_url:
                        return render_template('java_publish.html',Main_Infos=g.main_infos, form=form, qrcode_url=qrcode_url)
                else:
                    return render_template('java_publish_show.html',Main_Infos=g.main_infos)
        else:
            flash("错误:文本框内容不能为空!")
    return render_template('java_publish.html',Main_Infos=g.main_infos,form=form,qrcode_url=qrcode_url)
示例#10
0
def update_java():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' % (g.user, g.secret_key)
    messageKey = '%s_update_java' % K
    publish_key = '%s_update_key' % K
    form = MyForm.MyForm_updateJboss()
    if form.submit.data:
        try:
            if form.text.data:
                if myRedis.exists(messageKey):
                    raise flash('上线操作过于频繁,请稍等%s秒......' %
                                myRedis.ttl(messageKey))
                myRedis.lpush(messageKey, 'check env......')
                tags = form.text.data.strip().splitlines()
                assert len(tags) == 1, 'Can only execute a project at a time!'
                project = form.text.data.strip()
                warname = project.split('-')[0]
                Action = form.selectAction.data
                Gray = form.Gray.data
                Type = 1
                dbTable = db_op.java_list
                #灰度发布
                if Gray:
                    ServerList = dbTable.query.with_entities(
                        dbTable.ip, dbTable.user).filter(
                            db_op.DB.and_(dbTable.project == warname,
                                          dbTable.type == Type,
                                          dbTable.Gray == '1')).limit(1).all()
                    if not ServerList:
                        ServerList = dbTable.query.with_entities(
                            dbTable.ip, dbTable.user).filter(
                                db_op.DB.and_(
                                    dbTable.project == warname,
                                    dbTable.type == Type)).limit(1).all()
                        if ServerList:
                            for ip, username in ServerList:
                                dbTable.query.filter(
                                    db_op.DB.and_(
                                        dbTable.ip == ip,
                                        dbTable.user == username)).update(
                                            {dbTable.Gray: '1'})
                        else:
                            flash('%s Not found' % warname)
                            return render_template('Message_static.html',
                                                   Main_Infos=g.main_infos)
                else:
                    ServerList = dbTable.query.with_entities(
                        dbTable.ip, dbTable.user).filter(
                            db_op.DB.and_(dbTable.project == warname,
                                          dbTable.type == Type)).all()
                if ServerList:
                    myRedis.lpush(messageKey, '    --->check env pass!')
                    myRedis.lpush(messageKey, '-' * 80 + '\n')
                    information = {}
                    information['warname'] = warname
                    information['project'] = project
                    information['ServerList'] = ServerList
                    information['Action'] = Action
                    information['Gray'] = Gray
                    myRedis.lpush(publish_key, information)
                    mysql_operation = Mysql.mysql_op(g.user, Action, Type,
                                                     project, Gray)
                    mysql_operation.op_operation()
                    Scheduler = produce.Scheduler_publish()
                    Scheduler = Scheduler.Scheduler_mem(
                        java_update.java_update, publish_key, messageKey)
                    Scheduler.start()
                else:
                    flash('%s Not found' % warname)
                    return render_template('Message_static.html',
                                           Main_Infos=g.main_infos)
        except Exception as e:
            flash(e)
            return render_template('Message_static.html',
                                   Main_Infos=g.main_infos)
        return render_template('java_update_show.html',
                               Main_Infos=g.main_infos)
    return render_template('java_update.html',
                           Main_Infos=g.main_infos,
                           form=form)
示例#11
0
def project_apply():
    form = MyForm.MyForm_project_apply()
    types = {'new': u'新增需求', 'bug': u'bug修复'}
    if form.submit.data:
        Project_types = form.Project_types.data
        Project_describe = form.Project_describe.data.strip()
        Project_content = form.Project_content.data.strip()
        Publish_conf = form.Publish_conf.data
        Front = form.Front.data
        Rollback_version = form.Rollback_version.data.strip()
        proposer = g.user
        if Project_describe and Project_content and Rollback_version:
            try:
                if Publish_conf == 'no':
                    raise flash('请确认资源配置是否正确?')
                if Project_content == Rollback_version:
                    raise flash('上线版本和回滚版本内容不能相同!')
                Projects = Project_content.splitlines()
                Rollback_version = Rollback_version.splitlines()
                if len(Projects) == 2 and len(Rollback_version) == 2:
                    Project = Projects[0].strip()
                    tag = Projects[1].strip()
                    if Project.endswith('git') or tag.startswith('tag'):
                        project = Project.split('/')[-1]
                        project = project.split('.')[0]
                    else:
                        raise flash('无效的路径格式!')
                else:
                    raise flash('无效的内容格式!')
                db_project_apply = db_op.project_apply
                VALS = db_project_apply.query.filter(
                    and_(
                        db_project_apply.content.like('{0};%'.format(Project)),
                        db_project_apply.status <> '2')).all()
                if VALS:
                    raise flash('该项目已经提测,请勿重复提交!')
                db_project = db_op.project_level
                project_val = db_project.query.with_entities(
                    db_project.level).filter(
                        db_project.project == project).all()
                if project_val:
                    Project_level = int(project_val[0][0])
                else:
                    raise flash('没有找到%s项目的等级记录!' % project_val[0][0])
                Receiver = mails['test']
                msg = Message("%s项目提测申请" % project,
                              sender=sender,
                              recipients=[Receiver],
                              cc=[sender])
                msg.html = '<p>1、项目等级:<strong>%s</strong></p>' \
                           '<p>2、项目类型:<strong>%s</strong></p>' \
                           '<p>3、项目描述:</p>'\
                           '<p><strong>%s</strong></p>' \
                           '<p>4、提测版本:</p>' \
                           '<p><strong>%s</strong></p>' \
                           '<p><strong>%s</strong></p>' \
                           '<p>5、前端相关项目是否上线?:<strong>%s</strong></p>' \
                           '<p>6、线上资源配置是否正确?:<strong>%s</strong></p>' \
                           '<p>7、回滚版本:</p>'\
                           '<p><strong>%s</strong></p>' \
                           '<p><strong>%s</strong></p>' \
                           '<p>8、申请人:<strong>%s</strong></p>' % (Project_level,types[Project_types],Project_describe,Projects[0].strip(),Projects[1].strip(),Front,Publish_conf,Rollback_version[0].strip(),Rollback_version[1].strip(),proposer)
                with app.app_context():
                    try:
                        mail.send(msg)
                    except Exception as e:
                        flash(e)
                        raise flash('提测申请邮件发送失败!')
                #执行预发布上线
                K = '%s_%s' % (g.user, g.secret_key)
                Key = '%s_publish_php' % K
                publish_key = '%s_publish_key' % K
                action = 'publish'
                Redis.lpush(Key, 'check security policy......')
                Redis.expire(Key, 30)
                Path = ';'.join(Projects).replace('http://', '')
                sip = [
                    '172.16.1.246',
                ]
                Gray = '0'
                Info = {}
                Info['action'] = action
                Info['path'] = Path
                Info['app'] = project
                Info['sip'] = sip
                Info['gray'] = Gray
                Redis.lpush(publish_key, Info)
                #记入数据库
                db = db_op.project_apply
                db_op.DB.session.add(
                    db(project=project,
                       types=types[Project_types],
                       describe=Project_describe,
                       content='%s;%s' %
                       (Projects[0].strip(), Projects[1].strip()),
                       Rollback='%s;%s' % (Rollback_version[0].strip(),
                                           Rollback_version[1].strip()),
                       sender=proposer,
                       status='0'))
                db_op.DB.session.commit()
                # 项目提测记录上线时间
                db_project = db_op.project_show
                tm = time.strftime('%Y%m%d', time.localtime())
                db_project.query.filter(db_project.project == project).update(
                    {db_project.test_time: tm})
                db_op.DB.session.commit()
                # 后台执行
                Scheduler = produce.Scheduler_publish()
                Scheduler = Scheduler.Scheduler_mem(php_publish.php_publish,
                                                    publish_key, Key)
                Scheduler.start()
                Redis.lpush(Key, '    --->check pass!')
                Redis.lpush(Key, '-' * 80 + '\n')
                return render_template('php_publish_show.html',
                                       Main_Infos=g.main_infos)
            except Exception as e:
                loging.write(e)
                if 'old' not in str(e):
                    flash(e)
            return render_template('Message_static.html',
                                   Main_Infos=g.main_infos)
    return render_template('project_apply.html',
                           Main_Infos=g.main_infos,
                           form=form)
示例#12
0
def publish_java():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' % (g.user, g.secret_key)
    messageKey = '%s_publish_java' % K
    publish_key = '%s_publish_key' % K
    qrcode_url = "https://op.baihe.com/qrcode_java/{0}/{1}".format(
        g.user, g.grade)
    form = MyForm.MyForm_publishJboss()
    if form.submit.data:
        Action = form.selectAction.data
        Type = int(form.selectType.data)
        Gray = form.Gray.data
        Way = form.selectWay.data
        code = form.code.data
        work = form.selectwork.data
        grade = form.selectgrade.data
        changelog = form.changelog.data
        tags = form.text.data.strip().splitlines()
        if tags and changelog:
            try:
                if myRedis.exists(messageKey):
                    raise flash('项目上线操作正在执行,不能并行上线操作.请稍候......')
                myRedis.lpush(messageKey, 'check env......')
                assert len(tags) == 1, '错误:只能同时上线一个项目!'
                warTagName = tags[0]
                version = '0.0.0'
                if Action == 'restart':
                    warname = warTagName
                elif Way == 'SVN':
                    assert '.war.zip' in warTagName, '错误:格式错误!格式应为: baihe-xxxx-x.x.x.war.zip'
                    warname = warTagName.split('-')[:-1]
                    version = warTagName.split('-')[-1].replace('.war.zip', '')
                    warname = '-'.join(warname) + '.war'
                elif Way == 'GIT':
                    warname = "{0}.war".format(warTagName.split('/')[-1])
            except Exception as e:
                flash(e)
            else:
                try:
                    publish_time = time.strftime("%H", time.localtime())
                    if code:
                        verify_key = "{0}_{1}".format(g.user, g.grade)
                        verify_code = myRedis.get(verify_key)
                        if verify_code == str(code):
                            myRedis.lpush(messageKey,
                                          '    --->verify code pass!')
                            myRedis.delete(verify_key)
                        else:
                            raise flash('上线码验证错误!')
                    else:
                        # 用户权限判断
                        if g.grade >= 2 and Type == 1 and int(grade) >= 5:
                            raise flash('需申请验证码!')
                        if g.grade >= 2 and int(grade) <= 4 and Type == 1 and (
                                int(publish_time) >= 17
                                or int(publish_time) <= 9):
                            raise flash('仅允许在10-17点时间段进行自助操作,需申请验证码!')
                    dbTable = db_op.java_list
                    #灰度发布
                    if Gray:
                        ServerList = dbTable.query.with_entities(
                            dbTable.ip, dbTable.user).filter(
                                db_op.DB.and_(
                                    dbTable.project == warname,
                                    dbTable.type == Type,
                                    dbTable.Gray == '1')).limit(1).all()
                        if not ServerList:
                            ServerList = dbTable.query.with_entities(
                                dbTable.ip, dbTable.user).filter(
                                    db_op.DB.and_(
                                        dbTable.project == warname,
                                        dbTable.type == Type)).limit(1).all()
                            loging.write(ServerList[:])
                            if ServerList:
                                for ip, username in ServerList:
                                    dbTable.query.filter(
                                        db_op.DB.and_(
                                            dbTable.ip == ip,
                                            dbTable.user == username)).update(
                                                {dbTable.Gray: '1'})
                            else:
                                raise flash('%s 没有在上线列表中找到!' % warname)
                    else:
                        ServerList = dbTable.query.with_entities(
                            dbTable.ip, dbTable.user).filter(
                                db_op.DB.and_(dbTable.project == warname,
                                              dbTable.type == Type)).all()
                        if Type == 1:
                            ServerList.append(('172.16.4.188', 'java'))
                    if ServerList:
                        myRedis.lpush(messageKey, '    --->check env pass!')
                        myRedis.lpush(messageKey, '-' * 80 + '\n')
                        information = {}
                        information['warname'] = warname
                        information['warTagName'] = warTagName
                        information['ServerList'] = ServerList
                        information['Action'] = Action
                        information['Gray'] = Gray
                        information['Type'] = Type
                        information['Way'] = Way
                        myRedis.lpush(publish_key, information)
                        mysql_operation = Mysql.mysql_op(
                            g.user, Action, Type, warname, version, Gray, work,
                            grade, changelog)
                        mysql_operation.op_operation()
                        Scheduler = produce.Scheduler_publish()
                        Scheduler = Scheduler.Scheduler_mem(
                            java_publish.java_publish, publish_key, messageKey)
                        Scheduler.start()
                    else:
                        raise flash('%s 没有在上线列表中找到!' % warname)
                except Exception as e:
                    if 'old' not in str(e):
                        flash(e)
                else:
                    return render_template('java_publish_show.html')
        else:
            flash("错误:文本框内容不能为空!")
    return render_template('java_publish.html',
                           form=form,
                           qrcode_url=qrcode_url)
示例#13
0
def publish_php():
    produce.Async_log(g.user, request.url)
    K = '%s_%s' %(g.user,g.secret_key)
    Key = '%s_publish_php' %K
    publish_key = '%s_publish_key' %K
    qrcode_url = None
    form = MyForm.MyForm_php()
    if form.submit.data:
        try:
            if Redis.exists(Key):
                raise flash('上线操作过于频繁,请稍等%s秒......' %Redis.ttl(Key))
            if form.text.data and form.changelog.data:
                action = form.selectaction.data
                Type = int(form.selecttype.data)
                Way = form.selectWay.data
                if Type == 1:
                    platfrom = '线上'
                if Type == 2:
                    platfrom = '测外'
                Tags = form.text.data.strip().splitlines()
                Gray = form.Gray.data
                code = form.code.data
                work = form.selectwork.data
                changelog = form.changelog.data
                if Way == 'SVN':
                    if len(Tags) > 1:
                        raise flash('错误:只能同时上线一个项目!')
                    else:
                        for line in Tags:
                            if line.startswith('#') or not line.split():
                                continue
                            m = re.match(r'[0-9]', line)
                            if m:
                                raise flash('错误:不能以数字开头!')
                            if not line.startswith('/'):
                                raise flash('错误:' + line + '路径必须以"/"开头!')
                            path = line.strip()
                            path = path.replace('\\', '/')
                            App = path.split('/')
                            if len(App)<4:
                                raise flash('错误:路径错误,无法获取项目名!')
                            App = App[3]
                            if len(path.split('-')) >= 2:
                                version = path.split('-')[-1]
                            else:
                                raise flash('错误:项目名称格式错误!')
                            if version.endswith('.zip'):
                                version = version.replace('.zip', '')
                elif Way == 'GIT':
                    if len(Tags) != 2:
                        raise flash('错误:GIT上线格式不对!')
                    elif not Tags[0].strip().startswith('http://'):
                        raise flash('错误:' + Tags[0] + '路径需以"http://"开头!')
                    elif not Tags[0].strip().endswith('.git'):
                        raise flash('错误:' + Tags[0] + '应该以".git"结尾!')
                    elif not Tags[1].strip().startswith('tag-'):
                        raise flash('错误:输入的tag版本号格式错误!')
                    path = ';'.join(Tags)
                    path = path.replace('http://git.baihe.com/', '/')
                    App = Tags[0].strip().split('/')[-1]
                    App = App.split('.')[0]
                    version = Tags[1].split('-')[-1]
            else:
                raise flash('错误:文本框内容不能为空!')
        except Exception as e:
            if 'old' not in str(e):
                flash(e)
        else:
            try:
                project_db = db_op.project_level
                project_level = project_db.query.with_entities(project_db.level).filter(project_db.project == App).all()
                #测外不强制项目等级
                if Type == 2:
                    if project_level:
                        project_level = int(project_level[0][0])
                    else:
                        project_level = 1
                else:
                    if project_level:
                        project_level = int(project_level[0][0])
                        crypto = Md5.crypto(crypto_key)
                        qrcode_url = "https://op.baihe.com/qrcode_php/{0}/{1}/{2}/{3}".format(crypto.encrypt(g.user),g.grade,crypto.encrypt(App),project_level)
                    else:
                        raise flash('没有找到该项目的对应项目等级!')
                publish_time = time.strftime("%H", time.localtime())
                if code:
                    verify_key = "{0}_{1}".format(g.user,App)
                    verify_code = Redis.get(verify_key)
                    if verify_code == str(code):
                        Redis.lpush(Key, '    --->verify code pass!')
                        Redis.expire(Key, 30)
                        Redis.delete(verify_key)
                        code_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        db = db_op.publish_code
                        db_op.DB.session.add(
                            db(project=App, code=str(code), platfrom=platfrom, user=g.user, Time=code_time))
                        db_op.DB.session.commit()
                    else:
                        raise flash('%s 该上线码验证不通过!' %str(code))
                else:
                    # 用户权限及行为判断
                    tw = int(time.strftime('%w',time.localtime(time.time())))
                    if g.grade >= 2 and Type == 1 and action == 'publish':
                        if project_level >= 5:
                            raise flash('该项目等级为%s级,需申请上线码!' % project_level)
                        if tw in (2,4):
                            if project_level <= 4 and (int(publish_time) >= 17 or int(publish_time) <= 9):
                                raise flash('仅允许在10-17点时间段进行上线操作,需申请上线码!')
                        else:
                            raise flash('4级及以下常规项目只限在周二和周四上线,修复BUG需申请上线码!')
                    if g.grade >= 2 and action == 'rollback':
                        raise flash('没有权限进行回滚操作!')
                db = db_op.php_list
                if Gray:
                    if App == 'baihePhpGlobalLibrary_publish':
                        val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'baihe')).limit(1).all()
                        if not val:
                            val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'baihe')).limit(1).all()
                    elif App == 'Baihe':
                        val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.operation == 'hunli')).limit(1).all()
                        if not val:
                            val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' % Type,db.operation == 'hunli')).limit(1).all()
                    else:
                        val = db.query.with_entities(db.ip).filter(and_(db.Gray == '1',db.project == '%s' % App)).limit(1).all()
                        if not val:
                            val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' % App, db.type == '%i' % Type)).limit(1).all()
                    if val:
                        sip = [v[0].encode('UTF-8') for v in val if v]
                        db.query.filter(and_(db.project == App, db.ip == sip[0])).update({db.Gray: '1'})
                    else:
                        raise flash('%s 没有在上线列表中找到!' % App)
                else:
                    if App == 'baihePhpGlobalLibrary_publish':
                        val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'baihe')).all()
                    elif App == 'Baihe':
                        val = db.query.with_entities(db.ip).filter(and_(db.type == '%i' %Type,db.operation == 'hunli')).all()
                    else:
                        val = db.query.with_entities(db.ip).filter(and_(db.project == '%s' %App,db.type == '%i' %Type)).all()
                    if val:
                        val = set(val)
                        sip = [v[0].encode('UTF-8') for v in val if v]
                        if Type == 1:
                            sip.append('172.16.4.188')
                    else:
                        raise flash('%s 没有在上线列表中找到!' %App)
                Redis.lpush(Key, 'check security policy......')
                Redis.expire(Key, 30)
                Info = {}
                Info['action'] = action
                Info['path'] = path
                Info['app'] = App
                Info['sip'] = sip
                Info['gray'] = Gray
                Info['Type'] = Type
                Info['Way'] = Way
                Redis.lpush(publish_key,Info)
                mysql_operation = Mysql.mysql_op(g.user,action,Type,App,version,Gray,work,project_level,changelog)
                mysql_operation.op_operation()
                Scheduler = produce.Scheduler_publish()
                Scheduler = Scheduler.Scheduler_mem(php_publish.php_publish,publish_key,Key)
                Scheduler.start()
                Redis.lpush(Key,'    --->check pass!')
                Redis.lpush(Key,'-'*80+'\n')
            except Exception as e:
                if 'old' not in str(e):
                    flash(e)
                if qrcode_url:
                    return render_template('php_publish.html',Main_Infos=g.main_infos, form=form, qrcode_url=qrcode_url)
            else:
                return render_template('php_publish_show.html',Main_Infos=g.main_infos)
    return render_template('php_publish.html',Main_Infos=g.main_infos,form=form,qrcode_url = qrcode_url)