def chart_center_internet(): try: reload(MyForm) form = MyForm.MyForm_chart_center() DOMAIN_DATA = None RT_DATA = None PV = RC.get('baihe_pv') or 'None' UV = len(RC.smembers('baihe_uv')) or 'None' if form.submit.data: Domain = form.select_internet.data Key = 'internet_access_%s' %Domain web_rt_key = 'internet_rt_%s' % Domain if RC.exists(Key): #获取响应时间 DATA = [eval(v) for v in RC.lrange(web_rt_key, 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 3)] RT_DATA = [{'data': DATA, 'name': str(Domain)}] #获取并发量 DATA = [eval(v) for v in RC.lrange(Key, 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 3)] DOMAIN_DATA = [{'data': DATA, 'name': str(Domain)}] else: flash('暂时还没%s的相关数据!' %Domain) DATA = [eval(v) for v in Redis.lrange('lvs_internet', 0, -1)] LVS_DATA = [{'data': DATA, 'name': 'INTERNET_LVS'}] return render_template('chart_center_internet.html',form = form,LVS_DATA=LVS_DATA,DOMAIN_DATA=DOMAIN_DATA,RT_DATA=RT_DATA,PV=PV,UV=UV) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def dns_conf(): form = MyForm.MyForm_dns_conf() if form.submit.data: try: domain = form.select_domain.data.strip() Type = form.select_type.data.strip() action = form.select_action.data.strip() field = form.field.data.strip() system = form.select_sys.data.strip() ip = form.ip.data.strip() db = db_op.dns_innr if field: if '.baihe.com' in field or '.ibaihe.com' in field or '.service.baihe' in field: raise flash("二级域名格式错误!") value = db.query.with_entities(db.ip).filter(and_(db.domain == domain, db.Type == Type, db.field == field,db.system == system)).all() if action == 'add': if system == 'cw' and domain != 'baihe.com': raise flash('测外只可以操作baihe.com域名!') if value: raise flash('%s IN %s %s 该DNS记录已存在' % (field, Type,str(value[0][0]))) if ip: if Type == 'CNAME' and not ip.endswith('.'): raise flash('CNAME 主机名格式错误!') if Type == 'A' and not re.search('\.\d{1,3}$',ip): raise flash('A IP地址格式错误!') c = db(domain=domain, field=field, Type=Type, ip=ip,stats='1',system=system) db_op.DB.session.add(c) db_op.DB.session.commit() flash(' %s IN %s %s 添加完成!' % (field, Type, ip)) else: flash('IP地址/主机名不能为空!') elif value: if action == 'modify': if ip: if Type == 'CNAME' and not ip.endswith('.'): raise flash('CNAME 主机名格式错误!') if Type == 'A' and not re.search('\.\d{1,3}$',ip): raise flash('A IP地址格式错误!') db.query.filter(and_(db.domain == domain,db.Type == Type,db.field == field,db.system == system)).update({db.ip:ip,db.stats:'1'}) db_op.DB.session.commit() flash(' %s IN %s %s 修改完成!' %(field, Type,ip)) else: flash('IP地址/主机名不能为空!') if action == 'query': ip = str(value[0][0]) flash('查询结果: {0} IN {1} {2}'.format(field,Type,ip)) if action == 'del': v = db.query.filter(and_(db.domain == domain, db.Type == Type, db.field == field,db.system == system)).all() for c in v: db_op.DB.session.delete(c) db_op.DB.session.commit() flash('%s记录已删除!' %(field)) else: flash('没有找到相关数据!') else: flash('二级域名不能为空!') except Exception as e: if 'old-style' not in str(e): flash(e) return render_template('dns_conf.html',form=form)
def init_system(): form = MyForm.MyForm_input() try: if form.submit.data: ips = form.text.data.strip().splitlines() ips = set(ips) if len(ips) >10: raise flash('一次初始化服务器数量不能超过10个!') for ip in ips: ip_list = ip.split('.') hostname = 'S%s-%s.server.baihe' %(ip_list[2],ip_list[3]) for i in ('45','46'): Redis.lpush('clear%s_salt-minon' %i,hostname) def remote_run(ip): def ssh2(ip, username, passwd,cmd): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, 22, username, passwd, timeout=30) loging.write('%s %s'%(ip,cmd)) ssh.exec_command(cmd) ssh.close() except Exception as e: loging.write(e) cmds = ['/sbin/service iptables stop && /sbin/chkconfig iptables off','rm -f /tmp/mod_host.sh','/usr/bin/yum -y install wget','/usr/bin/wget -P /tmp/ http://172.16.16.160/dw/shell/mod_host.sh','/bin/bash /tmp/mod_host.sh'] for cmd in cmds: ssh2(ip,username,passwd,cmd) tm = datetime.datetime.now()+datetime.timedelta(minutes=1) tm = tm.strftime('%Y-%m-%d %H:%M:%S') flash('初始化 %s完成,后台需要运行60分钟......' % ip) scheduler.add_job(remote_run, 'date', run_date=tm,args=[ip],id=ip) scheduler.start() except Exception as e: loging.write(e) return render_template('init_system.html',form=form)
def chart_center_traffic(): tt = int(time.strftime('%Y%m%d', time.localtime())) try: reload(MyForm) form = MyForm.MyForm_chart_center() Traffic_ser_DATA = Traffic_cli_DATA = None if form.submit.data: Domain = form.select_internet.data Cli_Key = 'Topic.traffic.client_%s_%s' % (tt, Domain) Ser_Key = 'Topic.traffic.server_%s_%s' % (tt, Domain) if RC.exists(Cli_Key): # 获取请求流量 DATA = [eval(v) for v in RC.lrange(Cli_Key, 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 10)] Traffic_cli_DATA = [{'data': DATA, 'name': str(Domain)}] if RC.exists(Ser_Key): # 获取响应流量 DATA = [eval(v) for v in RC.lrange(Ser_Key, 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 10)] Traffic_ser_DATA = [{'data': DATA, 'name': str(Domain)}] if not Traffic_ser_DATA and not Traffic_cli_DATA: flash('%s的相关数据为空!' % Domain.strip()) return render_template('chart_center_traffic.html', form=form, Traffic_cli_DATA=Traffic_cli_DATA, Traffic_ser_DATA=Traffic_ser_DATA) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def sql_kill(): user = app.config.get('MYSQL_USER') password = app.config.get('MYSQL_PASSWORD') form = MyForm.MyForm_sql_kill() if form.submit.data: try: if form.ip.data and form.port.data: # 获取页面相关信息 ip = form.ip.data.strip() port = form.port.data.strip() keyword = form.select_action.data MYSQL = Mysql.MYSQL(user, password, ip, port) cmd = 'show processlist;' i = 0 for pid in MYSQL.Run(cmd): if keyword in pid: pid = pid[0] cmd = 'kill %s;' % pid MYSQL.Run(cmd) i = i + 1 MYSQL.Close() flash('清理完毕,共清除%i个sql连接......' % i) except Exception as e: flash(e) finally: return render_template('Message_static.html') return render_template('mysql_kill.html', form=form)
def chart_center_intranet(): try: reload(MyForm) tt = int(time.strftime('%Y%m%d', time.localtime())) form = MyForm.MyForm_chart_center() DOMAIN_DATA = None RT_DATA = None if form.submit.data: Domain = form.select_intranet.data Key = 'intranet_access_%s_%s' % (tt, Domain) web_rt_key = 'intranet_rt_%s_%s' % (tt, Domain) if RC.exists(Key): # 获取响应时间 DATA = [eval(v) for v in RC.lrange(web_rt_key, 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 3)] # 获取并发量 RT_DATA = [{'data': DATA, 'name': str(Domain)}] DATA = [eval(v) for v in RC.lrange(Key, 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 3)] DOMAIN_DATA = [{'data': DATA, 'name': str(Domain)}] else: flash('%s的相关数据为空!' % Domain.strip()) DATA = [eval(v) for v in Redis.lrange('lvs_intranet', 0, -1)] LVS_DATA = [{'data': DATA, 'name': 'INTRANET_LVS'}] return render_template('chart_center_intranet.html', form=form, LVS_DATA=LVS_DATA, DOMAIN_DATA=DOMAIN_DATA, RT_DATA=RT_DATA) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def app(): form = MyForm.MyForm_app() if form.submit.data: try: ts = form.text.data.strip().splitlines() ts = set(ts) t = ('ip', '账号', '应用部署', '域名') va = [] for vv in ts: if form.select.data == 'ip': val = db_idc.idc_app.query.filter( db_idc.idc_app.ip == vv).all() elif form.select.data == 'app': val = db_idc.idc_app.query.filter( db_idc.idc_app.appName == vv).all() elif form.select.data == 'domain': val = db_idc.idc_app.query.filter( db_idc.idc_app.domainName == vv).all() else: return redirect(url_for('mysql.app')) v = [str(v).encode('UTF-8').split(',') for v in val if v] if v: va.append(v) return render_template('user_show.html', values=va, tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!') return render_template('app.html', form=form)
def servers(): form = MyForm.MyForm_server() if form.submit.data: try: db = db_idc.idc_servers t = ('机柜号', 'SN', '服务器型号', '操作系统', 'CPU核数', '内存', '磁盘大小', 'ip', '公司部门', '使用状态', '部署应用', '备注') ts = form.text.data.strip().splitlines() ts = set(ts) va = [] for vv in ts: if form.select.data == 'ip': val = db.query.filter(db.ip == vv).all() elif form.select.data == 'cid': val = db.query.filter(db.cid == vv).all() elif form.select.data == 'sn': val = db.query.filter(db.sn == vv).all() elif form.select.data == 'deparment': val = db.query.filter(db.department == vv).all() elif form.select.data == 'status': val = db.query.filter(db.status == vv).all() else: return redirect(url_for('mysql.servers')) v = [str(i).encode('UTF-8').split(',') for i in val if i] va.append(v) return render_template('server_show.html', values=va, tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!') return render_template('server.html', form=form)
def slow_redis(): form = MyForm.myform() if form.submit_redis.data: for ip in redis_ips: Redis = redis.StrictRedis(host=ip, port=6379, db=0, socket_timeout=1) Redis.slowlog_reset() Redis.config_set("slowlog-max-len", 100) Redis.config_set("slowlog-log-slower-than", 200000) for ip in redis_ips: try: Redis = redis.StrictRedis(host=ip, port=6379, db=0, socket_timeout=1) results = Redis.slowlog_get(100) except: logging.error('%s Timeout reading from socket!' % ip) continue if results: flash("redis server:%s" % ip) flash("slow log len:%s" % Redis.slowlog_len()) flash(results) return render_template('slow_redis_show.html', Main_Infos=g.main_infos, form=form)
def pw(): form = MyForm.MyForm_pw() if form.submit.data: pw = Md5.Md5_make(form.password.data) pw1 = form.new_password1.data pw2 = form.new_password2.data try: db = db_op.idc_users va = db.query.filter(and_(db.name == g.user, db.passwd == pw)).first() if pw1 == pw2: if va: va.passwd = Md5.Md5_make(pw1) db_op.DB.session.commit() db_op.DB.session.close() flash('密码修改成功,请重新登录!') app_resp = make_response(redirect(url_for('index.index'))) return app_resp else: flash('旧密码错误!') else: flash('新密码不一致!') except Exception as e: flash(e) return render_template('password.html', Main_Infos=g.main_infos, form=form)
def tables(): form = MyForm.MyForm_input() if form.submit.data: try: ts = form.text.data.strip().splitlines() db_name = form.text2.data.strip() if ts and db_name: ts = set(ts) tt=('ip','port','数据库','表名','引擎','表行数','编码','版本') vv=[] Indexs = [] INDEXS = [] db = db_idc.idc_tableinfo for t_name in ts: val = db.query.filter(and_(db.database_name == db_name,db.table_name == t_name)).all() if val: v = [str(v).encode('UTF-8').split(',') for v in val if v] vv.append(v) v = v[0] cmds = ("show create table %s;" %v[3],"show index from %s;" %v[3]) for cmd in cmds: Indexs.append(Mysql.Query_sql(v[0],v[1],v[2],cmd)) else: return render_template_string('没有找到库{0}或者表{1}!'.format(db_name,t_name)) for index in Indexs: INDEX = [] for info in index: info = [str(i).encode('UTF-8') for i in info] INDEX.append(info) INDEXS.append(INDEX) return render_template('tables_show.html',values=vv,tables=tt,INDEXS=INDEXS) except Exception as e: loging.write(e) return render_template_string('获取数据错误!') return render_template('tables.html',form=form)
def curl(): form = MyForm.MyForm_input() if form.submit.data: urls = form.text.data.strip().splitlines() urls = set(urls) for url in urls: Purge = purge.Purged() if not url or url.startswith('#'): continue else: url = url.strip() if not url.startswith('http'): flash('url begin with http(s)://') return render_template('Message.html') #clear ats cache ''' ips = Purge.purge_ats(url) if ips is None: flash(url+' purge ATS success') else: flash(url+' purge ATS fail from %s' %str(ips)) ''' #clear cdn cache url_rep = Purge.purge_cdn(url) flash(url + ' purge CDN ' + url_rep) return render_template('Message.html') return render_template('cdn.html', form=form)
def ingress(context=None): try: form = MyForm.Form_k8s_contexts() valus = [] if context and context != 'moji': config.load_kube_config(config_file, context) else: _, active_contexts = config.list_kube_config_contexts(config_file) context = active_contexts['name'] v1 = client.ExtensionsV1beta1Api() keys = tables = ('name', 'request', 'domain', 'service_name', 'service_port') ret = v1.list_ingress_for_all_namespaces() for i in ret.items: try: for rule in i.spec.rules: valus.append([ i.metadata.name, 'http', rule.host, rule.http.paths[0].backend.service_name, rule.http.paths[0].backend.service_port ]) except Exception as e: logging.error(e) except Exception as e: logging.error(e) return render_template('k8s-resource.html', valus=valus, tables=tables, keys=keys, form=form, context=context, resource='Ingress')
def login(): form = MyForm.MyForm_login() form.name.label = '用户名:' form.password.label = '密码:' user = request.cookies.get('user') if user: Incr = Redis.incr('%s_Incr' % user) else: Incr = 0 if form.submit.data: if form.name.data and form.password.data: user = form.name.data pw = form.password.data Key_Incr = '%s_Incr' % user Key_Lock = '%s_lock' % user try: if Incr >= 30: raise flash('该帐号异常登陆,已被锁定3分钟!') if Incr >= 5: if form.code.data: if str(form.code.data) != str(session['verify_code']): raise flash('输入验证码错误!') else: raise flash('请输入验证码,看不清点击验证码刷新!') va_p = db_op.idc_users.query.filter( and_(db_op.idc_users.name == user, db_op.idc_users.passwd == Md5.Md5_make(pw))).first() produce.Async_log(user, request.url) if va_p: URL = url_for('index.index') if pw == app.config.get('INIT_OP_PASSWORD'): URL = url_for('pw.pw') flash('请修改初始密码!') timestamp = None if form.remember_me.data: timestamp = check.timestamp(7) ID = produce.Produce(length=24, chars=string.hexdigits) app_resp = make_response(redirect(URL)) app_resp.set_cookie('user', user, expires=timestamp) app_resp.set_cookie('ID', ID, expires=timestamp) Redis.set('OP_ID_%s' % user, ID) Redis.delete(Key_Lock) Redis.delete(Key_Incr) return app_resp else: Redis.incr(Key_Incr) if Incr >= 30: Redis.set(Key_Lock, 'True') Redis.expire(Key_Incr, 60) Redis.expire(Key_Lock, 180) flash('用户名或者密码错误!') URL = url_for('login.login') app_resp = make_response(redirect(URL)) app_resp.set_cookie('user', user) return app_resp except Exception as e: if 'old' not in str(e): flash(str(e)) return render_template('login.html', form=form, verify_incr=Incr)
def Scheduler(): form = MyForm.MyForm_Scheduler() cron = form.cron.data host = '127.0.0.1' if form.host.data: host = form.host.data user = form.user.data job = form.job.data return render_template('Scheduler.html',form=form)
def vpn_admin(): form = MyForm.MyForm_vpn() if form.submit.data: users = form.text.data.strip().splitlines() users = set(users) for i, name in enumerate(users): if not re.search('.*@baihe.com$', name): flash('%s格式错误,用户名应为百合个人邮箱账号!' % name) i = -1 if i < 0: return render_template('Message.html') action = form.select_action.data key = 'vpn2_list' sender = "*****@*****.**" if action == 'query': List = [] user_list = Redis.hgetall(key) for user in users: try: if user_list[user]: List.append((user, user_list[user])) except: continue if List: return render_template('vpn_admin_show.html', user_list=List) else: flash('%s 账号不存在!' % user) elif action == 'add': for user in users: pw = produce.Produce(13) val = [K for K in Redis.hgetall(key)] if user in val: flash('%s 账号已存在' % user) continue msg = Message("VPN账号信息", sender=sender, recipients=[user]) msg.html = '<p>用户名:%s</p><p> 密码:%s</p><p><font color="red">账号5分钟后开通,请妥善保管此封邮件,勿邮件回复!</font></p>' % ( user, pw) with app.open_resource("%s/../doc/vpn_conf.docx" % page_vpn_admin.root_path) as f: msg.attach("vpn_conf.docx", "text/docx", f.read()) try: with app.app_context(): mail.send(msg) Redis.hset(key, user, pw) except Exception as e: flash(e) else: flash('%s 账号开通完毕,通知邮件已发送.' % user) elif action == 'del': for user in users: Redis.hdel(key, user) Redis.hdel('vpn_list', user) flash('%s 账号已关闭!' % user) return render_template('Message.html') return render_template('vpn_admin.html', form=form)
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)
def init_system(): form = MyForm.MyForm_input() if form.submit.data: ips = form.text.data.strip().splitlines() ips = set(ips) for ip in ips: Redis.lpush(init_key, ip) flash('已将%s加入初始化处理队列......' % ip) return render_template('init_system.html', Main_Infos=g.main_infos, form=form)
def haproxy_reload(Type=None): form = MyForm.MyForm_Submit() if Type: if Type == 'internet': URL = "http://op.baihe.com/haproxy_conf?type=cw&ip=127.0.0.1:80&domain=test.baihe.com" else: URL = "http://op.baihe.com/haproxy_conf?type=cw&ip=127.0.0.1:80&domain=test.baihe.com&intranet=True" f = requests.get(URL, timeout=10) Info = f.json() if 'result' in f.json(): Info = f.json()['result'] return render_template('qrcode.html', INFO=Info) return render_template('haproxy_reload.html', form=form)
def clear_redis(): form = MyForm.MyForm_clear_redis() if form.submit.data: Keys = form.text.data.strip().splitlines() Keys = set(Keys) port = form.select_port.data action = form.select_action.data if Keys: for key in Keys: flash('获取Key:%s信息......' % key) vv = _RC_Run(key, port, action) flash('存储数据:{0}'.format(vv)) return render_template('Message.html') return render_template('clear_redis.html', form=form)
def platform_token(action=None, id=None, args=None): produce.Async_log(g.user, request.url) db_token = db_op.platform_token tm = time.strftime('%Y-%m-%d', time.localtime()) form = MyForm.Form_platform_token() tables = ['第三方平台', '连接方式', 'Token', '颁发日期', '失效日期', '管理'] if action == 'add': expire_date = "2999-12-30" if id > 0: expire_date = datetime.datetime.now() + datetime.timedelta(days=id) expire_date = expire_date.strftime('%Y-%m-%d') try: c = db_token(platform=args, channel='api', token=Md5.Md5_make(tools.Produce(8, string.digits)), award=tm, expire=expire_date) db_op.DB.session.add(c) db_op.DB.session.commit() return render_template_string('success') except Exception as e: logging.error(e) return render_template_string('fail') if action == 'modify': try: db_token.query.filter(db_token.id == id).update( {db_token.expire: args}) db_op.DB.session.commit() return render_template_string('success') except Exception as e: logging.error(e) return render_template_string('fail') if action == 'drop': try: v = db_token.query.filter(db_token.id == id).all() for c in v: db_op.DB.session.delete(c) db_op.DB.session.commit() return render_template_string('success') except Exception as e: logging.error(e) return render_template_string('fail') vals = db_token.query.with_entities( db_token.id, db_token.platform, db_token.channel, db_token.token, db_token.award, db_token.expire).order_by(desc(db_token.id)).all() return render_template('platform_token.html', form=form, vals=vals, tables=tables, tm=tm)
def deploy_php(): reload(MyForm) form = MyForm.MyForm_deploy_php() try: if form.submit_produce.data: Info = form.select_produce.data.strip() Ver = form.ver_produce.data.strip() Type = '1' elif form.submit_test.data: Info = form.select_test.data.strip() Ver = form.ver_test.data.strip() Type = '2' else: return render_template('deploy_php.html', form=form) assert Info, '服务器选择不能为空!' Info = Info.split(':') user = Info[1] ip = Info[0] db = db_op.php_list val = db.query.filter(and_(db.ip == ip, db.type == Type)).all() if val: flash('{0}的PHP环境已存在!'.format(ip)) else: os.system( '/usr/bin/wget -P /tmp/ http://172.16.16.160/dw/lnmp/lnmp_{0}.tgz' .format(Ver)) Ssh = SSH.ssh(user, ip) Ssh.Scp('/tmp/lnmp_{0}.tgz'.format(Ver), '/home/work/lnmp_{0}.tgz'.format(Ver)) os.system('/bin/rm -f /tmp/lnmp_{0}.tgz'.format(Ver)) cmds = [ '/bin/rm -rf /home/work/local', 'cd /home/work && /bin/tar -zxvf lnmp_{0}.tgz'.format(Ver), '/bin/rm -f /home/work/lnmp_{0}.tgz'.format(Ver), '/usr/bin/pkill -9 {php,nginx}', '/home/work/local/php/sbin/php-fpm', '/home/work/local/nginx/sbin/nginx' ] for cmd in cmds: Ssh.Run(cmd) Ssh.Close() #修改资源池表 db = db_op.server_pool db.query.filter(and_(db.user == user, db.ip == ip)).update({db.status: '1'}) db_op.DB.session.commit() flash('PHP环境在{0}部署成功,NGINX虚拟主机部署后可正常访问!'.format(ip)) except Exception as e: flash(e) return render_template('deploy_php.html', form=form)
def login(): form = MyForm.MyForm_login() form.name.label = '用户名:' form.password.label = '密码:' ym = time.strftime('%Y', time.localtime()) if form.submit.data: if form.name.data and form.password.data: user = form.name.data pw = form.password.data try: Key_Incr = '%s_Incr' % user Key_Lock = 'Lock_login_%s' % user if Redis.exists(Key_Incr): Incr = int(Redis.get(Key_Incr)) else: Incr = 1 if Redis.exists(Key_Lock): raise flash('该帐号异常登陆,已被锁定1分钟!') va_p = db_op.idc_users.query.filter( and_(db_op.idc_users.name == user, db_op.idc_users.passwd == Md5.Md5_make(pw))).first() produce.Async_log(user, request.url) if va_p: URL = url_for('index.index') if pw == app.config.get('INIT_OP_PASSWORD'): URL = url_for('pw.pw') flash('请修改初始密码!') timestamp = None if form.remember_me.data: timestamp = check.timestamp(7) ID = produce.Produce(length=24, chars=string.hexdigits) app_resp = make_response(redirect(URL)) app_resp.set_cookie('user', user, expires=timestamp) app_resp.set_cookie('ID', ID, expires=timestamp) Redis.set('OP_ID_%s' % user, ID) return app_resp else: Redis.set(Key_Incr, Incr + 1) if Incr >= 11: Redis.incr(Key_Lock, 'True') Redis.expire(Key_Lock, 60) flash('用户名或者密码错误,还有%s次机会重试!' % (10 - int(Incr))) URL = url_for('login.login') app_resp = make_response(redirect(URL)) app_resp.set_cookie('user', user) return app_resp except Exception as e: if 'old' not in str(e): flash(str(e)) return render_template('login.html', form=form, ym=ym)
def deployment(context=None): try: form = MyForm.Form_k8s_contexts() valus = defaultdict() if context and context != 'moji': config.load_kube_config(config_file, context) else: _, active_contexts = config.list_kube_config_contexts(config_file) context = active_contexts['name'] v1 = client.AppsV1Api() tables = ('name', 'namespace', 'replicas', 'strategy', 'containers', 'dns_policy', 'service_account', 'available') keys = ('namespace', 'replicas', 'strategy', 'containers', 'dns_policy', 'service_account', 'available') ret = v1.list_deployment_for_all_namespaces() for i in ret.items: try: containers = [] for info in i.spec.template.spec.containers: containers.append(info.name) if not i.status.unavailable_replicas: available = 100 else: available = int((float(i.spec.replicas) - float(i.status.unavailable_replicas)) / float(i.spec.replicas) * 100) valus[i.metadata.name] = { 'namespace': i.metadata.namespace, 'replicas': i.spec.replicas, 'strategy': i.spec.strategy.type, 'containers': containers, 'dns_policy': i.spec.template.spec.dns_policy, 'service_account': i.spec.template.spec.service_account, 'available': available } except Exception as e: logging.error(e) except Exception as e: logging.error(e) return render_template('k8s-resource.html', valus=valus, tables=tables, keys=keys, form=form, context=context, resource='Deployment')
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)
def curl(): form = MyForm.MyForm_input() if form.submit.data: urls = form.text.data.strip().splitlines() urls = set(urls) for url in urls: Purge = purge.Purged() if not url or url.startswith('#'): continue else: url = url.strip() if not url.startswith('http'): flash('url begin with http(s)://') return render_template('Message_static.html',Main_Infos=g.main_infos) url_rep=Purge.purge_cdn(url) flash(url+' purge CDN '+url_rep) return render_template('Message_static.html',Main_Infos=g.main_infos) return render_template('cdn.html',form=form,Main_Infos=g.main_infos)
def service(context=None): try: form = MyForm.Form_k8s_contexts() valus = defaultdict() if context and context != 'moji': config.load_kube_config(config_file, context) else: _, active_contexts = config.list_kube_config_contexts(config_file) context = active_contexts['name'] v1 = client.CoreV1Api() tables = ('name', 'namespace', 'cluster_ip', 'port', 'target_port', 'node_port', 'selector') keys = ('namespace', 'cluster_ip', 'port', 'target_port', 'node_port', 'selector') ret = v1.list_service_for_all_namespaces() for i in ret.items: try: node_port = [] port = [] target_port = [] for info in i.spec.ports: node_port.append(str(info.node_port)) port.append(str(info.port)) target_port.append(str(info.target_port)) valus[i.metadata.name] = { 'namespace': i.metadata.namespace, 'cluster_ip': i.spec.cluster_ip, 'node_port': ','.join(set(node_port)), 'port': ','.join(set(port)), 'target_port': ','.join(set(target_port)), 'selector': i.spec.selector } except Exception as e: logging.error(e) except Exception as e: logging.error(e) return render_template('k8s-resource.html', valus=valus, tables=tables, keys=keys, form=form, context=context, resource='Service')
def daemonset(context=None): try: form = MyForm.Form_k8s_contexts() valus = defaultdict() if context and context != 'moji': config.load_kube_config(config_file, context) else: _, active_contexts = config.list_kube_config_contexts(config_file) context = active_contexts['name'] v1 = client.AppsV1Api() tables = ('name', 'namespace', 'images', 'mount_path', 'dns_policy', 'service_account', 'number_ready') keys = ('namespace', 'images', 'mount_path', 'dns_policy', 'service_account', 'number_ready') ret = v1.list_daemon_set_for_all_namespaces() for i in ret.items: try: mount_path = [] for path in i.spec.template.spec.containers[0].volume_mounts: mount_path.append(path.mount_path) number_ready = i.status.number_ready if number_ready == 0: number_ready = 1 valus[i.metadata.name] = { 'namespace': i.metadata.namespace, 'images': i.spec.template.spec.containers[0].image, 'mount_path': mount_path, 'dns_policy': i.spec.template.spec.dns_policy, 'service_account': i.spec.template.spec.service_account, 'number_ready': number_ready } except Exception as e: logging.error(e) except Exception as e: logging.error(e) return render_template('k8s-resource.html', valus=valus, tables=tables, keys=keys, form=form, context=context, resource='Daemonset')
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)
def slow_redis(): form = MyForm.myform() if form.submit_redis.data: for ip in redis_ips: Redis = redis.StrictRedis(host=ip, port=6379, db=0, socket_timeout=1) Redis.slowlog_reset() Redis.config_set("slowlog-max-len", 100) Redis.config_set("slowlog-log-slower-than", 200000) for ip in redis_ips: try: Redis = redis.StrictRedis(host=ip,port=6379,db=0,socket_timeout=1) results = Redis.slowlog_get(100) except: logging.error('%s Timeout reading from socket!' %ip) continue if results: flash("redis server:%s" %ip) flash("slow log len:%s" %Redis.slowlog_len()) flash(results) return render_template('slow_redis_show.html',Main_Infos=g.main_infos,form = form)
def haproxy_reload(Type=None): form = MyForm.MyForm_Submit() crypto = Md5.crypto(crypto_key) code = choice([x for x in range(100)]) internet = "/haproxy_reload/%s" %crypto.encrypt('internet|%i' %code) intranet = "/haproxy_reload/%s" %crypto.encrypt('intranet|%i' %code) URL = None HA_API = app.config.get('HAPROXY_API') if Type: Type = crypto.decrypt(Type).split('|')[0] if Type == 'internet': URL = "%s?type=cw&ip=127.0.0.1:80&domain=test.baihe.com" %HA_API if Type == 'intranet': URL = "%s?type=cw&ip=127.0.0.1:80&domain=test.baihe.com&intranet=True" %HA_API if URL: f = requests.get(URL,timeout=10,verify=False) Info = f.json() if 'result' in f.json(): Info = f.json()['result'] return render_template('qrcode.html', INFO=Info) return render_template('haproxy_reload.html',Main_Infos=g.main_infos,form=form,internet=internet,intranet=intranet)