2022怡然:后端全部代码
来自CloudWiki
代码
from flask import Flask, render_template, redirect, url_for, request, abort, jsonify from test_ansible2 import do_ansible from dingtalkchatbot.chatbot import DingtalkChatbot from datetime import datetime import pymysql import json app = Flask("EmailDemo", static_folder="static", template_folder="templates") app.config["JSON_AS_ASCII"] = False conn1 = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='rooms') conn2 = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='Receive_mail') ####### 远程开机关机 ###### #查看全部机房列表 @app.route('/rooms', methods=['GET', 'POST']) def get_rooms_list(): conn1.ping(reconnect=True) cur = conn1.cursor() sql = "SELECT * from tb_rooms LIMIT 4" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['id'] = row[0] result['title']="机房"+str(row[0]) result['total_num'] = row[1] result['running_num'] = row[2] result['close_num'] = int(row[3])-int(row[2]) jsondata.append(result) return jsonify(jsondata) abort(404) # 机房详细的机器列表 @app.route('/room/<int:id>', methods=['GET', 'POST']) def get_room(id): conn1.ping(reconnect=True) cur = conn1.cursor() sql = f"SELECT * from tb_rooms where room_id={id}" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['pc_id'] = row[1] result['status'] = row[2] jsondata.append(result) return jsonify(jsondata) abort(404) #一键关闭某机房所有机器 close all machines of one room,GET操作 @app.route('/ansible/api/v1/machine_close/all/<string:host>', methods=['GET']) def shutdown_machine(host): host_list=[host] tasks_close=[ dict(action=dict(module='shell', args='shutdown -h now'), register='shell_out'), ] #do_ansible(host_list,tasks_close) return jsonify({'status': host+"shutdown order is sent"}) abort(404) #关闭某机房内某台机器 close one machines of one room,GET操作 @app.route('/ansible/machine_close/single/<string:host>/<string:pc_id>', methods=['GET']) def shutdown_one_machine(host,pc_id): host_list=[host] tasks_close=[ dict(action=dict(module='shell', args='shutdown -h now'), register='shell_out'), ] #do_ansible(host_list,tasks_close) return jsonify({'status': host+"_pc_"+pc_id+"shutdown order is sent"}) abort(404) #一键重启机房所有机器restart all machines of one room ,GET操作 @app.route('/ansible/api/v1/machine_restart/all/<string:host>', methods=['GET']) def restart_machine(host): host_list=[host] tasks=[ dict(action=dict(module='shell', args='reboot'), register='shell_out'), ] #do_ansible(host_list,tasks_close) return jsonify({'status': host+"restart order is sent"}) abort(404) #重启某机房内某台机器 restart one machine of one room ,GET操作 @app.route('/ansible/machine_restart/single/<string:host>/<string:pc_id>', methods=['GET']) def restart_one_machine(host,pc_id): host_list=[host] tasks=[ dict(action=dict(module='shell', args='reboot'), register='shell_out'), ] #do_ansible(host_list,tasks_close) return jsonify({'status': host+"_pc_"+pc_id+"restart order is sent"}) abort(404) ###### 机器健康监测 ####### #机房健康监测 机房房间故障统计 @app.route('/room/unhealthy_machines/all', methods=['GET','POST']) def get_room_unhealthy_data( ): jsondata =[ {'id':'311','total':45,'bad':2},{'id':'810','total':45,'bad':3}, \ {'id':'810','total':45,'bad':5},{'id':'804','total':45,'bad':2},{'id':'805','total':45,'bad':3}, \ {'id':'704','total':45,'bad':1}] return jsonify(jsondata) abort(404) # 机器健康检测:查看某机房所有故障机器列表,id 代表机房id号 @app.route('/room/unhealthy_machines/<int:room_id>', methods=['GET', 'POST']) def get_room_unhealthy_pc(room_id): conn1.ping(reconnect=True) cur = conn1.cursor() sql = f"SELECT * from machine_status where room_na ={room_id} " cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['pc_id'] = row[0] result['room'] = row[1] result['room_id'] = row[2] result['status'] = row[3] result['bad_reason'] = row[4] result['bad_time'] = row[5] # 增加健康状态字段:0代表健康,1代表不健康 jsondata.append(result) return jsonify(jsondata) abort(404) ###### 无人安装软件 ###### #单软件安装 @app.route("/software/single/install/<string:room_id>/<int:soft_id>", methods=['GET', 'POST']) def install_single(room_id,soft_id): print(room_id,soft_id) #host_list=[host] #tasks_close=[ # dict(action=dict(module='shell', args='shutdown -h now'), register='shell_out'), #] #do_ansible(host_list,tasks_close) return jsonify({'status': '0'}) abort(404) #多软件安装 @app.route("/software/all/install/<string:room_id>", methods=['GET', 'POST']) def install_multi(room_id): print(room_id) soft_list = request.args.getlist("soft_list") #id_list = json.loads(soft_list) print(soft_list) for i in soft_list[0]: print(i) return jsonify({'status': '0'}) abort(404) ###### 报警信息列表 ###### # 智能自动报警:智能报警列表 @app.route("/warning_list", methods=['GET', 'POST']) def get_warning_list(): conn2.ping(reconnect=True) cur = conn2.cursor() sql = "SELECT * from mail" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['消息id'] = row[0] result['机器id'] = row[1] result['机房名称'] = row[2] result['故障时间'] = row[3] result['故障等级'] = row[4] result['故障主题'] = row[5] result['故障详情'] = row[6] result['故障是否解决'] = row[7] # 增加健康状态字段:0代表健康,1代表不健康 jsondata.append(result) return jsonify(jsondata) abort(404) # 24小时异常 读取数据库 @app.route('/warning_list/24h/', methods=['GET', 'POST']) def get_warning_list_24h(): conn2.ping(reconnect=True) cur = conn2.cursor() sql = "SELECT count(mes_id) from mail " cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['num'] = row[0] -4 #result['id'] = row[1] #result['故障原因'] = row[2] # result['故障解决时间'] = row[3] # 增加健康状态字段:0代表健康,1代表不健康 jsondata.append(result) return jsonify(jsondata) abort(404) # 七天内异常 读取数据库 @app.route('/warning_list/7days/', methods=['GET', 'POST']) def get_warning_list_7days(): conn2.ping(reconnect=True) cur = conn2.cursor() sql = "SELECT count(mes_id) from mail" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['num'] = row[0] - 1 # 增加健康状态字段:0代表健康,1代表不健康 jsondata.append(result) return jsonify(jsondata) abort(404) # 根据消息id 去查某条报警信息 @app.route('/warning_list/<int:msg_id>', methods=['GET', 'POST']) def get_warning_by_msg(msg_id): conn2.ping(reconnect=True) cur = conn2.cursor() sql = f"SELECT * from mail where mes_id={msg_id}" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['消息id'] = row[0] result['机器id'] = row[1] result['机房名称'] = row[2] result['故障时间'] = row[3] result['故障等级'] = row[4] result['故障主题'] = row[5] result['故障详情'] = row[6] result['故障是否解决'] = row[7] # 增加健康状态字段:0代表健康,1代表不健康 jsondata.append(result) return jsonify(jsondata) abort(404) # 根据机器id 去查某条报警信息 @app.route('/warning_list/pc/<int:pc_id>', methods=['GET', 'POST']) def get_warning_by_machines(pc_id): conn2.ping(reconnect=True) cur = conn2.cursor() sql = f"SELECT * from mail where pc_id={pc_id}" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['消息id'] = row[0] result['机器id'] = row[1] result['机房名称'] = row[2] result['故障时间'] = row[3] result['故障等级'] = row[4] result['故障主题'] = row[5] result['故障详情'] = row[6] result['故障是否解决'] = row[7] # 增加健康状态字段:0代表健康,1代表不健康 jsondata.append(result) return jsonify(jsondata) abort(404) #机房运维主页面 @app.route('/data_machines/<int:room_id>', methods=['GET','POST']) def data_machines(room_id): conn1.ping(reconnect=True) conn2.ping(reconnect=True) cur1 = conn1.cursor() cur2 = conn2.cursor() sql1 = f"SELECT num_pc from pc_num where room_id = {room_id}" sql2 = f"select count(mes_title) from mail where room_na = {room_id} and mes_title = '警报'" cur1.execute(sql1) u = cur1.fetchall() cur2.execute(sql2) w = cur2.fetchall() for row in u: result1 = {} result1['normal'] = row[0] for row in w: result2 = {} result2['machines'] = row[0] return jsonify(result2,result1) abort(4004) @app.route('/up_shuju', methods=['post'], strict_slashes=False) def api_upload(): user_info = request.values.to_dict() room_id = user_info.get("room_id") #上传机房名称的变量名 reason = user_info.get("reason") #上传原因的变量名 time = user_info.get("time") #上传时间的变量名 # cursor = conn.cursor() file_dir = os.path.join(basedir, app.config['upload_folder']) if not os.path.exists(file_dir): os.makedirs(file_dir) f = request.files['photo'] #上传图片的变量名 if f and allowed_file(f.filename): fname = secure_filename(f.filename) cursor = conn1.cursor() sql_insert = """insert into jieshou(room_id,reason,time) values(%s,%s,%s)""" cursor.execute(sql_insert, (str(room_id),str(reason),str(time))) # content的内容是content=(movie,star,time),content的数据要与sql语句中的占位>符数量相等 conn.commit() f.save(os.path.join(file_dir, fname)) def dingtalk_robot(webhook, secret): dogBOSS = DingtalkChatbot(webhook, secret) now_time = datetime.now().strftime('%Y.%m.%d %H:%M:%S') dogBOSS.send_markdown( title=f'来自梦无矶小仔的提醒', text= f'**机房id{room_id}**\n\n' f'**故障原因{reason}**\n\n' f'**发送时间:** {now_time}\n\n', is_at_all=True) webhook = 'https://oapi.dingtalk.com/robot/send?access_token=47ec6dbe51f73e311e6dc4d2752d482d6a252c52690e7e5c46b67a026f2cd963' secrets = 'SEC4537ca10868ea4e0d5524499aac4dae0f3ea2aa0a9fe0b7185cfc1b51c3a50de' dingtalk_robot(webhook=webhook, secret=secrets) return jsonify({"success": 0, "msg": "上传成功"}) else: return jsonify({"error": "未上传图片", "msg": "上传失败"}) ##############客户端########### def dingtalk_robot(webhook, secret,room_id,pc_id,reason): dogBOSS = DingtalkChatbot(webhook, secret) now_time = datetime.now().strftime('%Y.%m.%d %H:%M:%S') dogBOSS.send_markdown( title=f'来自梦无矶小仔的提醒', text= f'**机房id{room_id}**\n\n' f'**PC_id{pc_id}**\n\n' f'**故障原因{reason}**\n\n' f'**发送时间:** {now_time}\n\n', is_at_all=True) @app.route('/user_upload', methods=['get','post']) def user_upload(): user_info = request.json room_id = user_info.get("room_id") #上传机房名称的变量名 pc_id = user_info.get("pc_id") reason = user_info.get("reason") #上传原因的变量名 time = user_info.get("time") #上传时间的变量名 cursor = conn1.cursor() sql_insert = """insert into jieshou(room_id,reason,time) values(%s,%s,%s)""" cursor.execute(sql_insert, (str(room_id),str(reason),str(time))) # content的内容是content=(movie,star,time)>,content的数据要与sql语句中的占位>符数量相等 conn1.commit() webhook = 'https://oapi.dingtalk.com/robot/send?access_token=47ec6dbe51f73e311e6dc4d2752d482d6a252c52690e7e5c46b67a026f2cd963' secrets = 'SEC4537ca10868ea4e0d5524499aac4dae0f3ea2aa0a9fe0b7185cfc1b51c3a50de' dingtalk_robot(webhook,secrets,room_id,pc_id,reason) return jsonify({"success": 0, "msg": "报告成功"}) @app.route('/fanhuiqianduan', methods=['GET', 'POST']) def fanhuiqianduan(): cur = conn1.cursor() sql = "SELECT * from jieshou limit1" cur.execute(sql) u = cur.fetchall() jsondata = [] for row in u: result = {} result['room_id'] = row[0] result['reason'] = row[1] result['time'] = row[2] jsondata.append(result) return jsonify(jsondata) abort(404) ###########远程实时监控########## def return_img_stream(img_local_path): """ 工具函数: 获取本地图片流 :param img_local_path:文件单张图片的本地绝对路径 :return: 图片流 """ import base64 img_stream = '' with open(img_local_path, 'rb') as img_f: img_stream = img_f.read() img_stream = base64.b64encode(img_stream).decode() return img_stream @app.route('/yuanchengjiankong') def yuanchengjiankong(): img_path = f'/home/esu/ansible/tu/fullscreen1.png' img_stream = return_img_stream(img_path) return img_stream from paramiko.ssh_exception import NoValidConnectionsError from paramiko.ssh_exception import AuthenticationException def connect(cmd,hostname,port=22,username='root',passwd='000000'): import paramiko ##1.创建一个ssh对象 client = paramiko.SSHClient() result = "" #2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作, ##自动选择yes client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #3.连接服务器 try: client.connect(hostname=hostname, port=port, username=username, password=passwd) print('正在连接主机%s......'%(hostname)) print('正在完成任务.......') except NoValidConnectionsError as e: ###用户不存在时的报错 s = "连接失败" result = s except AuthenticationException as t: ##密码错误的报错 s = '密码错误' result = s else: #4.执行操作 stdin,stdout, stderr = client.exec_command(cmd) #5.获取命令执行的结果 result=stdout.read().decode('utf-8') #6.关闭连接 finally: client.close() return result @app.route('/sendOrder/', methods=['get','post']) def sendOrder(): user_info = request.json msg = user_info.get("message") #上传机房名称的变量名 print(msg) with open('ip.txt') as f: #ip.txt为本地局域网内的一些用户信息 for line in f: line = line.strip() ##去掉换行符 hostname,port,username,passwd= line.split(':') result = connect(msg, hostname, port,username,passwd) print(result) return result if __name__ == '__main__': app.run(host='0.0.0.0',debug=True,port="5000") conn1.close() conn2.close()