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