#!/bin/bash

# =================================================================
# OversellKVM - 母鸡端全能管理脚本
# 包含：KVM环境 + 超售优化 + API接口 + Web管理后台
# =================================================================

# --- 基础配置 (请根据实际修改) ---
API_TOKEN="admin888"       # 财务对接及后台访问令牌
API_PORT=8888              # 服务监听端口
BASE_DIR="/var/lib/libvirt/images"
ETH_NAME=$(ip route get 8.8.8.8 | awk '{print $5}')

# --- 1. 环境初始化 ---
install_env() {
    echo "正在安装基础环境..."
    yum install -y epel-release
    yum install -y qemu-kvm libvirt virt-install bridge-utils socat qemu-img jq wget
    systemctl enable libvirtd && systemctl start libvirtd
    
    # 开启内存超售核心 KSM
    echo 1 > /sys/kernel/mm/ksm/run
    echo 100 > /sys/kernel/mm/ksm/sleep_millisecs
    
    # 准备基础镜像 (CentOS 7)
    if [ ! -f "$BASE_DIR/base_centos7.qcow2" ]; then
        echo "正在下载基础镜像 (此过程较慢)..."
        wget -O $BASE_DIR/base_centos7.qcow2 http://download.bt.cn/kvm/centos7.qcow2
    fi
    echo "环境安装完成。"
}

# --- 2. 网桥配置 (简易版) ---
setup_network() {
    echo "正在配置网桥 br0..."
    # 注意：此操作在远程环境中可能导致断网，请确保有IPMI
    IP=$(ip addr show $ETH_NAME | grep "inet " | awk '{print $2}')
    GW=$(ip route | grep default | awk '{print $3}')
    nmcli con add type bridge con-name br0 ifname br0
    nmcli con modify br0 ipv4.addresses $IP ipv4.gateway $GW ipv4.method manual
    nmcli con add type bridge-slave con-name $ETH_NAME ifname $ETH_NAME master br0
    echo "网桥配置已写入，建议重启服务器生效。"
}

# --- 3. 后端处理逻辑 (由 socat 调用) ---
handle_request() {
    read request
    # 提取参数
    token=$(echo $request | grep -oP 'token=\K[^& ]*')
    action=$(echo $request | grep -oP 'action=\K[^& ]*')
    name=$(echo $request | grep -oP 'name=\K[^& ]*')
    
    # 安全验证
    if [ "$token" != "$API_TOKEN" ]; then
        echo -e "HTTP/1.1 403 Forbidden\r\n\r\nAccess Denied"
        exit
    fi

    # 路由判断
    if [[ "$request" == *"GET / "* ]]; then
        # 渲染管理后台 HTML
        render_admin_html
    else
        # 处理 API 指令
        process_api "$action" "$name" "$request"
    fi
}

# --- 4. Web管理后台 HTML ---
render_admin_html() {
    load=$(uptime | awk -F'load average:' '{print $2}')
    ksm_saved=$(echo "scale=2; $(cat /sys/kernel/mm/ksm/pages_sharing) * 4 / 1024" | bc)
    vm_list=$(virsh list --all | grep "vps_")

    cat << EOF
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>OversellKVM 母鸡管理后台</title>
    <link rel="stylesheet" href="https://cdn.lwcat.cn/layui/css/layui.css">
    <style>
        body { background: #f4f7f9; padding: 20px; }
        .card { background: #fff; padding: 20px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.05); }
        .stat-val { font-size: 22px; color: #1e9fff; font-weight: bold; }
    </style>
</head>
<body>
    <div class="layui-container">
        <div class="layui-row layui-col-space15">
            <div class="layui-col-md12">
                <div class="card">
                    <h2>母鸡运行状态 <span class="layui-badge layui-bg-green">超售中</span></h2>
                    <hr>
                    <div class="layui-row text-center">
                        <div class="layui-col-md4">负载: <span class="stat-val">$load</span></div>
                        <div class="layui-col-md4">KSM 节省: <span class="stat-val">${ksm_saved} MB</span></div>
                        <div class="layui-col-md4">小鸡总数: <span class="stat-val">$(echo "$vm_list" | grep -c "vps_")</span></div>
                    </div>
                </div>
            </div>
            <div class="layui-col-md12">
                <div class="card">
                    <table class="layui-table">
                        <thead><tr><th>名称</th><th>状态</th><th>操作</th></tr></thead>
                        <tbody>
                            $(echo "$vm_list" | while read l; do
                                n=$(echo $l | awk '{print $2}'); s=$(echo $l | awk '{print $3}')
                                echo "<tr><td>$n</td><td>$s</td><td><button class='layui-btn layui-btn-xs layui-btn-danger' onclick=\"doAct('$n','delete')\">销毁</button></td></tr>"
                            done)
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
    <script>function doAct(n, a){ if(confirm('确定?')) location.href='/?token=$API_TOKEN&action='+a+'&name='+n; }</script>
</body>
</html>
EOF
}

# --- 5. API 核心逻辑 ---
process_api() {
    local act=$1 name=$2 req=$3
    case $act in
        create)
            cpu=$(echo $req | grep -oP 'cpu=\K[^& ]*')
            mem=$(echo $req | grep -oP 'mem=\K[^& ]*')
            disk=$(echo $req | grep -oP 'disk=\K[^& ]*')
            qemu-img create -f qcow2 -b $BASE_DIR/base_centos7.qcow2 $BASE_DIR/${name}.qcow2 ${disk}G
            virt-install --name ${name} --vcpus ${cpu} --memory ${mem} --disk $BASE_DIR/${name}.qcow2 --network bridge=br0 --import --noautoconsole --os-variant centos7.0
            echo -e "HTTP/1.1 200 OK\r\n\r\nsuccess" ;;
        delete)
            virsh destroy $name; virsh undefine $name; rm -f $BASE_DIR/${name}.qcow2
            echo -e "HTTP/1.1 200 OK\r\n\r\nsuccess" ;;
        status)
            echo -e "HTTP/1.1 200 OK\r\n\r\n$(virsh domstate $name)" ;;
        *)
            virsh $act $name
            echo -e "HTTP/1.1 200 OK\r\n\r\nsuccess" ;;
    esac
}

# --- 6. 服务启动逻辑 ---
if [ "$1" == "server" ]; then
    handle_request
else
    install_env
    echo "正在启动 API 服务..."
    nohup socat TCP-LISTEN:$API_PORT,reuseaddr,fork SYSTEM:"bash $0 server" > /dev/null 2>&1 &
    echo "服务已在 $API_PORT 端口运行。Token: $API_TOKEN"
fi