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 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 mysqldb(): try: t = ('主库', '端口', '数据库', '从库') db = db_idc.idc_mysqldb master_val = db.query.with_entities( db.ip, db.port, db.db).filter(db_idc.idc_mysqldb.master == '是').all() master_val = [list(v) for v in master_val] slave_val = db.query.with_entities( db.ip, db.port, db.Master_Host, db.Master_Port).filter(db.slave == '是').all() slave_val = [list(v) for v in slave_val] val = [] for i in xrange(len(master_val)): slave = [] for l in xrange(len(slave_val)): M_ip_port = master_val[i][0:2] S_ip_port = slave_val[l][2:] if M_ip_port == S_ip_port: slave_info = ':'.join(slave_val[l][0:2]) slave.append(slave_info) info = master_val[i] info.append(slave) val.append(info) return render_template('mysqldb.html', values=val, tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
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 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 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 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: loging.write('%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', form=form)
def Get_arg(arg): # 解析请求参数 loging.write(request.args) if arg in request.args: return request.args[arg].encode('utf-8') else: return None
def Get_arg(arg): # 解析请求参数 loging.write(request.args) if arg in request.args: return request.args[arg].encode('utf-8') else: return None
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 mongodb_info(): try: def Mongo_cli(ip,port): client = pymongo.MongoClient(ip,port,socketTimeoutMS=3000) return client mongo_client = Mongo_cli(Host,int(Port)) mongo_db = mongo_client.config shards = {} #获取shard信息 for info in mongo_db.shards.find(): host_infos = info['host'].split('/')[1] shard = [host_info.split(':') for host_info in host_infos.split(',')] New_shard = [] for host_info in shard: ip, port = host_info Mclient = Mongo_cli(ip,int(port)) #判断primary状态 if Mclient.is_primary: host_info.append('primary') else: host_info.append('slave') New_shard.append(host_info) shards[info['_id']] = New_shard except Exception as e: loging.write(e) return render_template_string('数据获取错误!') return render_template('mongodb_show.html', shards=shards)
def charts(): try: val_cli = {} val_ser = {} tt = int(time.strftime('%Y%m%d', time.localtime())) traffic_key = 'traffic_Keys_%s' % tt for key in RC.smembers(traffic_key): key = '{0}_old'.format(key) if RC.exists(key): data = eval(str(RC.get(key))) if data and isinstance(data, list): va = int(reduce(lambda x, y: int(x) + int(y), data)) v = va * 8 / 1024 / 1024 key = key.split('_') domain = str(key[-2]) if v > 1: if 'traffic.client' in str(key[0]): val_cli[domain] = v if 'traffic.server' in str(key[0]): val_ser[domain] = v DATA = [eval(v) for v in RC.lrange('internet_access', 0, -1)] DATA = [DATA[i] for i in xrange(0, len(DATA), 3)] INTERNET_ACCESS = [{'data': DATA, 'name': 'WEB_ACCESS'}] return render_template('chart.html', val_cli=val_cli, val_ser=val_ser, INTERNET_ACCESS=INTERNET_ACCESS) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def info(*args, **kwargs): DB = db_op.rota g.main_infos = None date = time.strftime('%Y-%m-%d',time.localtime()) ym = time.strftime('%Y',time.localtime()) new_date = datetime.date.today()+datetime.timedelta(1) user = request.cookies.get('user') db = db_op.idc_users val = db.query.with_entities(db.grade).filter(db.name == user).all() grade = int(val[0][0]) if val else 10 if user and '@' in user: user = user.split('@')[0] data=[user] try: # 生成今日和明日的运维排班 users = [] duty = u'运维值班' pools = [u'李晓辉',u'周福成'] for t in (date,new_date): VAL = DB.query.with_entities(DB.name).filter(and_(DB.date == t,DB.duty == duty)).all() if VAL: user = VAL[0][0] else: user = random.choice(pools) c = DB(name = user,duty = duty,date = t) db_op.DB.session.add(c) db_op.DB.session.commit() pools.remove(user) users.append(user) data.extend(users) ip=request.headers.get('X-Forwarded-For') if not ip : ip = request.remote_addr if ',' in ip: ip = ip.split(',')[0] #获取页面菜单 DB = db_op.op_menu nav_val = {} sub_val = {} Menu_val = DB.query.with_entities(DB.Menu_name, DB.id_name, DB.module_name, DB.action_name).filter(DB.grade >= grade).all() navMenu = DB.query.with_entities(distinct(DB.Menu_name)).filter(and_(DB.Menu == 'navMenu',DB.grade >= grade)).order_by(DB.Menu_id).all() navMenu = [Menu[0] for Menu in navMenu] for Menu in navMenu: val = [val[1:] for val in Menu_val if Menu in val] if val: nav_val[Menu] = val submenu = DB.query.with_entities(distinct(DB.Menu_name)).filter(and_(DB.Menu == 'submenu',DB.grade >= grade)).order_by(DB.Menu_id).all() submenu = [menu[0] for menu in submenu] for menu in submenu: val = [val[2:] for val in Menu_val if menu in val] if val: sub_val[menu] = val g.main_infos = {'datas':data,'navMenu':navMenu,'nav_val':nav_val,'submenu':submenu,'sub_val':sub_val,'ip':ip,'ym':ym} return func(*args, **kwargs) except Exception as e: loging.write(e) return func(*args, **kwargs) finally: db_op.DB.session.remove()
def store(): try: t = ('机柜', '型号', 'IP', '公司部门', '使用状态', '备注') val = db_idc.idc_store.query.all() v = [str(v).encode('UTF-8').split(',') for v in val if v] return render_template('mysql.html', values=v, tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def rack(): try: t=('机柜','服务器数量') db = db_idc.idc_servers val = db.query.with_entities(db.cid,func.count(db.cid)).group_by(db.cid).order_by(func.count(db.cid)).all() return render_template('mysql.html',values=val,tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def twemproxy(): try: t=('代理TYPE','代理GROUP','后端IP','后端PORT','DB','KEYS','备注') val = db_idc.idc_twemproxy.query.order_by(db_idc.idc_twemproxy.serviceGroup).all() v = [str(v).encode('UTF-8').split(',') for v in val if v] return render_template('twemproxy.html',values=v,tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def Run(self): if HOST in TASK_BACKGROUD: self.scheduler.add_job(Task.count_es_logs, 'cron', second='0', minute='*', id=Task.count_es_logs.__name__, replace_existing=True) self.scheduler.start() loging.write("Scheduler backgroud start on %s ......" % HOST)
def kestrel(): try: db = db_idc.idc_kestrel t = ('IP', 'PORT', 'KEY', 'ITEMS') val = db.query.order_by(desc(db.kestrel_num)).all() v = [str(v).encode('UTF-8').split(',') for v in val] return render_template('kestrel.html', values=v, tables=t) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
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)
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 ssh2(ip, username, passwd, cmds): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip, 22, username, passwd, timeout=30) for cmd in cmds: stdin, stdout, stderr = ssh.exec_command(cmd) if stderr.read(): flash(stderr.read()) ssh.close() except Exception as e: loging.write(e) flash('初始化失败!')
def chart_center_area(): try: AREA_DATA = {} area_key = 'Area_Keys' for area in RC.smembers(area_key): Count = int(RC.get(area)) if Count == 0: continue AREA_DATA[str(area.split('_')[2])] = Count AREA_DATA = json.dumps(AREA_DATA, encoding='utf-8',indent=4) return render_template('chart_center_area.html',AREA_DATA=AREA_DATA) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def Query(db, *ts): #生成用户列表 user_list = [] for name in ts[0]: try: val = db.query.with_entities( db.user, db.password).filter(db.user == name).all() if val: val = [v for v in val[0]] for group in Redis.hgetall(Key): Groups = eval(Redis.hget(Key, group)) if name in Groups: val.append(group) user_list.append(val) except Exception as e: loging.write(e) return render_template_string('获取数据错误!') return user_list
def chart_center_domain(): try: INTERNET_DOMAIN = {} INTRANET_DOMAIN = {} for domain in RC.smembers('haproxy_topic'): Count = int(RC.get('haproxy_logs_%s' %domain)) if Count == 0: continue INTERNET_DOMAIN[str(domain)] = Count for domain in RC.smembers('haproxy2_topic'): Count = int(RC.get('haproxy2_logs_%s' %domain)) if Count == 0: continue INTRANET_DOMAIN[str(domain)] = Count return render_template('chart_center_domain.html',INTERNET_DOMAIN=INTERNET_DOMAIN,INTRANET_DOMAIN=INTRANET_DOMAIN) except Exception as e: loging.write(e) return render_template_string('获取数据错误!')
def kafka_info(topic_info=None): try: kafka = KafkaClient('%s:%s' % (host, port)) Brokers = kafka.brokers Brokers = [(str(Brokers[k]).split(',')[1].split("'")[1]) for k in Brokers] if topic_info: partitions = kafka.topic_partitions partitions = eval(json.dumps(partitions)) partitions = partitions[topic_info] return render_template('kafka_partition_show.html', topic_info=topic_info, partition_info=partitions) else: return render_template('kafka_show.html', topics=kafka.topics, brokes=Brokers) except Exception as e: loging.write(e) return render_template_string('数据获取错误!')
def Query(db, *ts): #生成用户列表 user_list = [] for name in ts[0]: try: val = db.query.with_entities( db.user, db.password).filter(db.user == name).all() if val: val = [v for v in val[0]] groups = [ group[0] for group in db_groups.query.with_entities( distinct(db_groups.groups)).filter( db_groups.users == name).all() ] for group in groups: val.append(group) user_list.append(val) except Exception as e: loging.write(e) return render_template_string('获取数据错误!') return user_list
def API_get(method, DATAS): # 调用zabbix的API接口 url = "http://" header = {"Content-Type": "application/json"} data = json.dumps({ "jsonrpc": "2.0", "method": method, "params": DATAS, "id": 0, "auth": "" }) request = urllib2.Request(url, data) for key in header: request.add_header(key, header[key]) try: result = urllib2.urlopen(request) except Exception as e: loging.write(e) else: response = json.loads(result.read()) result.close() return response['result']
def Zookeeper_Info(): def Get_arg(arg): #解析请求参数 if arg in request.args: return request.args[arg] else: return None try: URL = None if 'info' in request.path: URL = Get_arg('path') zk.start() if URL: #匹配多级访问 if '_' in URL: PATH = URL.replace(':', '/') URLS = PATH.split('/') else: #匹配一级访问 URLS = (URL, ) PATH = URL #匹配根访问 else: URLS = () PATH = '' DATAS = zk.get_children('/%s' % PATH) INFOS = None if not DATAS: INFOS = zk.get('/%s' % PATH) return render_template('zk_show.html', DATAS=DATAS, URLS=URLS, URL=URL, INFOS=INFOS) except Exception as e: loging.write(e) return render_template_string(str(e))
def API_get(method, DATAS): # 调用zabbix的API接口 url = "http://" header = {"Content-Type": "application/json"} data = json.dumps( { "jsonrpc": "2.0", "method": method, "params": DATAS, "id": 0, "auth": "" }) request = urllib2.Request(url, data) for key in header: request.add_header(key, header[key]) try: result = urllib2.urlopen(request) except Exception as e: loging.write(e) else: response = json.loads(result.read()) result.close() return response['result']
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)
val = str(val).replace("'", '') else: val = 'None' cmd = "update sql_scheduler set status = '已执行' ,results = '%s' where id = '%s';" % ( val, id) Query_sql(user, password, host, port, db, cmd) if __name__ == "__main__": t = time.strftime('%Y-%m-%d', time.localtime()) Path = '/home/work/webroot/conf' conf = ConfigParser.ConfigParser() path = "%s/script_sql.conf" % Path conf.read(path) host = conf.get('MYSQLDB', 'HOST') port = conf.getint('MYSQLDB', 'PORT') user = conf.get('MYSQLDB', 'USER') password = conf.get('MYSQLDB', 'PASSWORD') db = conf.get('MYSQLDB', 'DB') cmd = "select * from sql_scheduler where status = '未执行' and time = '%s';" % t values = Query_sql(user, password, host, port, db, cmd) try: if values: # 并发执行 POOLS = Third_pool(10) POOLS.map_async(Run_sql, values) POOLS.close() POOLS.join() except Exception as e: loging.write(e)
def info(*args, **kwargs): DB = db_op.rota g.main_infos = None date = time.strftime('%Y-%m-%d', time.localtime()) ym = time.strftime('%Y', time.localtime()) new_date = datetime.date.today() + datetime.timedelta(1) user = request.cookies.get('user') db = db_op.idc_users val = db.query.with_entities(db.grade).filter(db.name == user).all() grade = int(val[0][0]) if val else 10 if user and '@' in user: user = user.split('@')[0] data = [user] try: # 生成今日和明日的运维排班 users = [] duty = u'运维值班' pools = [u'李晓辉', u'周福成'] for t in (date, new_date): VAL = DB.query.with_entities(DB.name).filter( and_(DB.date == t, DB.duty == duty)).all() if VAL: user = VAL[0][0] else: user = random.choice(pools) c = DB(name=user, duty=duty, date=t) db_op.DB.session.add(c) db_op.DB.session.commit() pools.remove(user) users.append(user) data.extend(users) ip = request.headers.get('X-Forwarded-For') if not ip: ip = request.remote_addr if ',' in ip: ip = ip.split(',')[0] #获取页面菜单 DB = db_op.op_menu nav_val = {} sub_val = {} Menu_val = DB.query.with_entities( DB.Menu_name, DB.id_name, DB.module_name, DB.action_name).filter(DB.grade >= grade).all() navMenu = DB.query.with_entities(distinct(DB.Menu_name)).filter( and_(DB.Menu == 'navMenu', DB.grade >= grade)).order_by(DB.Menu_id).all() navMenu = [Menu[0] for Menu in navMenu] for Menu in navMenu: val = [val[1:] for val in Menu_val if Menu in val] if val: nav_val[Menu] = val submenu = DB.query.with_entities(distinct(DB.Menu_name)).filter( and_(DB.Menu == 'submenu', DB.grade >= grade)).order_by(DB.Menu_id).all() submenu = [menu[0] for menu in submenu] for menu in submenu: val = [val[2:] for val in Menu_val if menu in val] if val: sub_val[menu] = val g.main_infos = { 'datas': data, 'navMenu': navMenu, 'nav_val': nav_val, 'submenu': submenu, 'sub_val': sub_val, 'ip': ip, 'ym': ym } return func(*args, **kwargs) except Exception as e: loging.write(e) return func(*args, **kwargs) finally: db_op.DB.session.remove()
def GET_value(host,method): # 构造zabbix需要的json数据 DATAS = {"output": "extend","filter": {"host": [host]}} value = API_get(method, DATAS) loging.write(value[0]) return value[0]
def project_apply_show(ID=None): crypto_key = app.config.get('CRYPTO_KEY') crypto = Md5.crypto(crypto_key) db = db_op.project_apply if ID: if '&' in ID: id = crypto.decrypt(ID.split('&')[0]) action = ID.split('&')[1].split('=')[-1] if action == 'fail': Infos = db.query.with_entities(db.project, db.describe, db.content, db.sender).filter(db.id == id).all() if Infos: Infos = Infos[0] Receiver = Infos[-1] if '@' not in Receiver: Receiver = '*****@*****.**' %Receiver Content = Infos[2].split(';') msg = Message("提测项目%s被退回" % Infos[0], sender=sender, recipients=[Receiver], cc=[sender]) msg.html = '<p>1、项目描述:</p>' \ '<p><strong>%s</strong></p>' \ '<p>2、提测版本:</p>' \ '<p><strong>%s</strong></p>' \ '<p><strong>%s</strong></p>' % (Infos[1],Content[0],Content[1]) with app.app_context(): try: mail.send(msg) except Exception as e: loging.write(e) else: db.query.filter(db.id == int(id)).update({db.status:'2'}) db_op.DB.session.commit() else: ID = crypto.decrypt(ID) Infos = db.query.with_entities(db.project, db.describe, db.content, db.Rollback).filter(db.id == ID).all() if Infos: Infos = Infos[0] Content = Infos[2].split(';') Rollback = Infos[-1].split(';') msg = Message("%s项目申请上线" % Infos[0], sender=sender, recipients=[sender], cc=[mails['leader']]) msg.html = '<p>1、项目描述:</p>' \ '<p><strong>%s</strong></p>' \ '<p>2、上线版本:</p>' \ '<p><strong>%s</strong></p>' \ '<p><strong>%s</strong></p>' \ '<p>3、回滚版本:</p>' \ '<p><strong>%s</strong></p>' \ '<p><strong>%s</strong></p>' % (Infos[1], Content[0], Content[1],Rollback[0],Rollback[1]) with app.app_context(): try: mail.send(msg) except Exception as e: loging.write(e) else: db.query.filter(db.id == int(ID)).update({db.status: '1'}) db_op.DB.session.commit() tables = ('提测项目', '类别', '项目描述', '提测版本', '发起人', '后续操作') Vals = db.query.with_entities(db.id,db.project,db.types,db.describe,db.content,db.sender).filter(db.status == '0').order_by(db.id).all() projects =[] for info in [list(info) for info in Vals]: info[0]= (crypto.encrypt(info[0]),'%s&result=fail'%crypto.encrypt(info[0])) projects.append(info) return render_template('project_apply_show.html',Main_Infos=g.main_infos,projects = projects,tables=tables)
def sql_scheduler(): form = MyForm.MyForm_sql_scheduler() #查询前20个计划任务 tables = ('服务器', '端口', '库名', '执行时间', '执行命令', '执行状态', '执行结果') db = db_op.sql_scheduler val_scheduler = db.query.with_entities( db.master_ip, db.master_port, db.db, db.time, db.sql_cmd, db.status, db.results).order_by(desc(db.id)).limit(20).all() or None if form.submit.data: #获取页面相关信息 if form.sql_text.data: db_name = form.db_name.data.strip() Year = time.strftime('%Y-%m-%d', time.localtime()) cmds = form.sql_text.data.strip() if cmds: try: if cmds.endswith(';'): cmds = cmds.split(';') #获取库表对应的主库服务器信息 db = db_idc.idc_mysqldb db_table = db_idc.idc_tableinfo for sql_cmd in cmds: if sql_cmd: sql_cmd = sql_cmd.strip() sql_cmd = '%s;' % sql_cmd if 'update' in sql_cmd.lower( ) or 'delete' in sql_cmd.lower( ) or 'alter' in sql_cmd.lower(): if sql_cmd.lower().startswith('update'): table_name = sql_cmd.split()[1] else: table_name = sql_cmd.split()[2] table_name = table_name.replace('`', '') val_ips = db.query.with_entities( db_table.ip).filter( and_( db_table.database_name == db_name, db_table.table_name == table_name)).all() if val_ips: val_ips = set( [ip[0] for ip in val_ips]) else: raise flash('没有找到%s表相关数据库信息!' % table_name) val = db.query.with_entities( db.ip, db.port, db.db).filter( and_(db.master == '是', db.ip.in_(val_ips))).all() if val: for info in val: #将sql计划任务相关信息写入数据库 master_ip, master_port, master_db = info if db_name in master_db.split('|'): c = db_op.sql_scheduler( master_ip=master_ip, master_port=master_port, db=db_name, time=Year, sql_cmd=sql_cmd, status='未执行', results='None') db_op.DB.session.add(c) db_op.DB.session.commit() else: raise flash('没有找到%s数据库的相关服务器信息!' % db_name) else: raise flash("%s 不符合执行规则!" % sql_cmd) else: raise flash("每条sql语句需要以分号结尾!") except Exception as e: #loging.write(e) return render_template('Message_static.html') return redirect(url_for("sql_scheduler.sql_scheduler")) try: produce.Scheduler_sql_run() except Exception as e: loging.write(e) return render_template('mysql_scheduler.html', form=form, val_scheduler=val_scheduler, tables=tables)