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)
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)