Пример #1
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)
Пример #2
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)
Пример #3
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('上线操作过于频繁,请稍等%s秒......' %Redis.ttl(Key))
            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',Main_Infos=g.main_infos)
    return render_template('php_update.html',Main_Infos=g.main_infos,form=form)
Пример #4
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 )
Пример #5
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)
Пример #6
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)
Пример #7
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)
Пример #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
    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)