From e8adb1f36710a691905c04f49890cbf61ea27c3c Mon Sep 17 00:00:00 2001 From: onion Date: Tue, 31 Mar 2026 10:32:56 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=9A=E5=AE=89=E8=A3=85=E8=BF=9B=E5=BA=A6=E7=9B=91=E6=8E=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + README.md | 36 ++---- netboot/monitor/dicts/anaconda.dict | 43 +++++++ netboot/monitor/dicts/debian.dict | 43 +++++++ netboot/monitor/dicts/default.dict | 30 +++++ netboot/monitor/hooks.sh.tpl | 41 ++++++ netboot/monitor/monitor.cfg.tpl | 10 ++ netboot/monitor/monitor.sh.tpl | 185 ++++++++++++++++++++++++++++ netboot/web/about.html | 10 ++ netboot/web/clientlist.html | 117 ++++++++++++++++++ netboot/web/manage.html | 14 +-- netboot/web/static/images/4.png | Bin 0 -> 33528 bytes netboot/web/static/init.json | 9 +- scripts/gen_boot_ipxe.sh | 56 ++++++++- scripts/gen_ipxe.sh | 16 +-- services/dhcp.py | 12 +- services/http.py | 79 ++++++++++-- 17 files changed, 649 insertions(+), 55 deletions(-) create mode 100755 netboot/monitor/dicts/anaconda.dict create mode 100755 netboot/monitor/dicts/debian.dict create mode 100755 netboot/monitor/dicts/default.dict create mode 100755 netboot/monitor/hooks.sh.tpl create mode 100755 netboot/monitor/monitor.cfg.tpl create mode 100755 netboot/monitor/monitor.sh.tpl create mode 100755 netboot/web/clientlist.html create mode 100755 netboot/web/static/images/4.png diff --git a/.gitignore b/.gitignore index 56425fb..cc53fe5 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ config/config.json config/isoipxe/ netboot/boot.ipxe netboot/config/ +netboot/monitor/monitor.cfg +netboot/monitor/monitor.sh +netboot/monitor/hooks/ diff --git a/README.md b/README.md index f0e6726..eca1419 100755 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ ![Image3](https://gitee.com/misstar/mpxe/raw/main/netboot/web/static/images/3.png) +![Image4](https://gitee.com/misstar/mpxe/raw/main/netboot/web/static/images/4.png) + ![Image2](https://gitee.com/misstar/mpxe/raw/main/netboot/web/static/images/2.png) ### 能做什么 @@ -119,26 +121,14 @@ ipxe/pypxe/grub/uefi 等开源项目 ### 测试列表 -| 机型 | 架构 | 系统 | 版本 | 手动安装 |自动安装| -| :----: | :--: | :-----------: | :--: | :-------------: |:-------------: | -| VMware | x86 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| VMware | x86 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| KVM | x86 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| KVM | x86 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| KVM | arm64 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| KVM | arm64 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| KVM | arm64|openKylin-Desktop|2.0|:white_check_mark: |未测试 | -| 龙芯中科 | loongarch64 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| 龙芯中科 | loongarch64 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| 联想启天M425-D245 | x86 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| 联想启天M425-D245 | x86 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| 中科W3335HA2 | C86 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| 太极P730P | loongarch64 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| 太极P730P | loongarch64 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| 超越DT3030-L | loongarch64 | Kylin Desktop | V10SP1 | 使用带wol标记网口,兼容模式 |使用带wol标记网口,兼容模式 | -| 超越DT3030-L | loongarch64 | Kylin Server | V10SP3 | 引导失败 |引导失败 | -| 开天M70h-G1t | C86 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| 开天M70h-G1t | C86 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| 开天M70d-G1s | loongarch64 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | -| 开天M70d-G1s | loongarch64 | Kylin Server | V10SP3 | :white_check_mark: |:white_check_mark: | -| 华为擎云W515x | arm64 | Kylin Desktop | V10SP1 | :white_check_mark: |:white_check_mark: | \ No newline at end of file +| 系统 | 版本 | 手动安装 |自动安装| 安装进度|外挂文件| +| :----: | :-----------: | :--: | :-------------: |:-------------: |:----:| +|银河麒麟桌面|V10/V10SP1/V11|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|银河麒麟服务器|V10SP1/SP2/SP3/SP3-2403/V11|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|OpenEuler|22/24|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|Centos|7/8|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|龙蜥|8.9|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|凝思|6_el22|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|deepin|25|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| +|UOS桌面|1060/1070|:white_check_mark:|:white_check_mark:|:x:|:white_check_mark:| +|UOS服务器|1070|:white_check_mark:|:white_check_mark:|:white_check_mark:|:white_check_mark:| \ No newline at end of file diff --git a/netboot/monitor/dicts/anaconda.dict b/netboot/monitor/dicts/anaconda.dict new file mode 100755 index 0000000..d4a78c3 --- /dev/null +++ b/netboot/monitor/dicts/anaconda.dict @@ -0,0 +1,43 @@ +# Anaconda 系统安装监控字典配置文件 +# 文件路径: /etc/install_monitor/anaconda.dict + +# 基础配置 +DICT[default_pkgs]=400 +DICT[log_files]="/tmp/anaconda.log /tmp/packaging.log" +DICT[runcommand_log]="" +DICT[extra_check_file]="" + +# 进度值配置 +DICT[progress_failed]=0 +DICT[progress_finished]=100 +DICT[progress_third_party]=95 +DICT[progress_config]=90 +DICT[progress_install_start]=40 +DICT[progress_install_end]=80 +DICT[progress_download]=40 +DICT[progress_mount]=30 +DICT[progress_partition]=20 + +# 匹配模式配置 +DICT[pattern_failed]="ERROR:" +DICT[pattern_finished]="Installation complete|Rebooting system|Installation successfully finished|installation has finished" +DICT[pattern_third_party]="Installation complete|Rebooting system|Installation successfully finished|installation has finished" +DICT[pattern_config]="Configuring bootloader|Task completed: Install .*bootloader" +DICT[pattern_install]="Starting package installation process" +DICT[pattern_download]="Downloading packages to" +DICT[pattern_mount]="Mounting filesystem|Mount filesystems" +DICT[pattern_partition]="Configuring storage" + +# 安装计算类型:pkg=包数量计算, copy=文件复制计算 +DICT[install_calc_type]="pkg" + +# 消息文本配置 +DICT[msg_wait]="等待安装启动" +DICT[msg_failed]="安装失败" +DICT[msg_finished]="安装完成,即将重启系统" +DICT[msg_third_party]="" +DICT[msg_config]="系统配置中(引导程序/主机名)" +DICT[msg_install]="安装软件包" +DICT[msg_download]="下载软件包" +DICT[msg_mount]="分区完成,挂载文件系统" +DICT[msg_partition]="进入磁盘分区阶段" \ No newline at end of file diff --git a/netboot/monitor/dicts/debian.dict b/netboot/monitor/dicts/debian.dict new file mode 100755 index 0000000..3eaa98f --- /dev/null +++ b/netboot/monitor/dicts/debian.dict @@ -0,0 +1,43 @@ +# Debian/Ubuntu 系统安装监控字典配置文件 +# 文件路径: /etc/install_monitor/debian.dict + +# 基础配置 +DICT[log_files]="/var/log/installer/kylin-os-installer.log /var/log/installer/kylin-os-installer-detail.log /var/log/deepin-installer/deepin-installer.log" +DICT[runcommand_log]="/var/log/installer/runscripcomand.log" +DICT[extra_check_file]="/tmp/z-finished-install" + +# 进度值配置 +DICT[progress_failed]=0 +DICT[progress_finished]=100 +DICT[progress_third_party]=95 +DICT[progress_config]=90 +DICT[progress_install_start]=30 +DICT[progress_install_end]=80 +DICT[progress_download]=0 +DICT[progress_mount]=30 +DICT[progress_partition]=15 + +# 匹配模式配置 +DICT[pattern_failed]="ERROR" +DICT[pattern_failed_exclude]="ERROR:.*(non-critical|warning|skipped|ignored|expected|success)" +DICT[pattern_finished]="finished|Rebooting the system|install finished" +DICT[pattern_third_party]="do_third_party" +DICT[pattern_config]="do_mountfs" +DICT[pattern_install]="rsync.*rofs.*target|hooks manager start|正在拷贝基础文件系统" +DICT[pattern_download]="" +DICT[pattern_mount]="mount-target|mkfs" +DICT[pattern_partition]="debconf: Preseeded values loaded|libDeepinInstallerLanguage" + +# 安装计算类型:pkg=包数量计算, copy=文件复制计算 +DICT[install_calc_type]="copy" + +# 消息文本配置 +DICT[msg_wait]="等待安装启动" +DICT[msg_failed]="安装失败" +DICT[msg_finished]="安装完成,即将重启系统" +DICT[msg_third_party]="安装第三方软件中" +DICT[msg_config]="系统配置中" +DICT[msg_install]="正在部署系统" +DICT[msg_download]="" +DICT[msg_mount]="分区完成,挂载文件系统" +DICT[msg_partition]="环境初始化完成" \ No newline at end of file diff --git a/netboot/monitor/dicts/default.dict b/netboot/monitor/dicts/default.dict new file mode 100755 index 0000000..e861888 --- /dev/null +++ b/netboot/monitor/dicts/default.dict @@ -0,0 +1,30 @@ +# z:\mpxe\netboot\monitor\dicts\default.dict +# 默认字典(当无法识别系统时使用) +CURRENT_DICT[LOG_FILES]="/tmp/install.log /var/log/syslog" + +CURRENT_DICT[STAGE_FAILED]="ERROR|FATAL" +CURRENT_DICT[STAGE_FINISHED]="finished|complete|success" +CURRENT_DICT[STAGE_CONFIG]="configuring|config" +CURRENT_DICT[STAGE_INSTALLING]="installing|install" +CURRENT_DICT[STAGE_DOWNLOAD]="downloading|download" +CURRENT_DICT[STAGE_MOUNT]="mounting|mount" +CURRENT_DICT[STAGE_PARTITION]="partitioning|partition" +CURRENT_DICT[STAGE_INIT]="initializing|init" + +CURRENT_DICT[PROGRESS_FAILED]="0" +CURRENT_DICT[PROGRESS_FINISHED]="100" +CURRENT_DICT[PROGRESS_CONFIG]="90" +CURRENT_DICT[PROGRESS_INSTALLING]="50" +CURRENT_DICT[PROGRESS_DOWNLOAD]="40" +CURRENT_DICT[PROGRESS_MOUNT]="30" +CURRENT_DICT[PROGRESS_PARTITION]="20" +CURRENT_DICT[PROGRESS_INIT]="10" + +CURRENT_DICT[MSG_FAILED]="安装失败" +CURRENT_DICT[MSG_FINISHED]="安装完成,即将重启系统" +CURRENT_DICT[MSG_CONFIG]="系统配置中" +CURRENT_DICT[MSG_INSTALLING]="安装软件包中" +CURRENT_DICT[MSG_DOWNLOAD]="下载软件包" +CURRENT_DICT[MSG_MOUNT]="挂载文件系统" +CURRENT_DICT[MSG_PARTITION]="磁盘分区中" +CURRENT_DICT[MSG_INIT]="环境初始化" diff --git a/netboot/monitor/hooks.sh.tpl b/netboot/monitor/hooks.sh.tpl new file mode 100755 index 0000000..f24f485 --- /dev/null +++ b/netboot/monitor/hooks.sh.tpl @@ -0,0 +1,41 @@ +#!/bin/bash +set -e + +DOWNLOAD_URL="http://SERVER_IP_ADDRESS:HTTP_PORT/monitor/monitor.sh" +DEST_SCRIPT="/tmp/monitor_daemon.sh" +RETRY=3 +while [ ${RETRY} -gt 0 ]; do + if [[ -f "/usr/bin/sudo" ]];then + if sudo curl -4s --connect-timeout 10 "${DOWNLOAD_URL}" -o "${DEST_SCRIPT}"; then + break + fi + else + if curl -4s --connect-timeout 10 "${DOWNLOAD_URL}" -o "${DEST_SCRIPT}"; then + break + fi + fi + RETRY=$((RETRY-1)) + sleep 3 +done +if [ ${RETRY} -eq 0 ]; then + exit 0 +fi +if [[ -f "/usr/bin/sudo" ]];then + sudo chmod +x "${DEST_SCRIPT}" + nohup setsid "${DEST_SCRIPT}" 2>&1 & +else + # bash原生方式启动后台进程 + # 步骤1:用子shell启动脚本,>&- 关闭所有文件描述符,脱离%pre终端 + # 步骤2:disown -h 解除%pre对进程的SIGHUP信号管控 + # 步骤3:将进程PID写入文件,方便后续验证 + chmod +x "${DEST_SCRIPT}" + ANACONDA_PID=$PPID + ( + # 子shell内执行:忽略所有终止信号 + 启动监控脚本 + trap '' HUP INT TERM QUIT KILL + /tmp/monitor_daemon.sh "${ANACONDA_PID}" > /tmp/monitor_out.log 2>&1 + ) >&- 2>&- & # 关闭子shell的stdin/stdout/stderr,彻底脱离终端 + MONITOR_PID=$! + disown -h "${MONITOR_PID}" # 核心:让进程不受%pre退出的SIGHUP信号影响 + +fi diff --git a/netboot/monitor/monitor.cfg.tpl b/netboot/monitor/monitor.cfg.tpl new file mode 100755 index 0000000..0a26226 --- /dev/null +++ b/netboot/monitor/monitor.cfg.tpl @@ -0,0 +1,10 @@ +#ANACONDA %pre 段(嵌入到 ks.cfg 中) +firstboot --enable +lang zh_CN.UTF-8 +timezone Asia/Shanghai + + +%packages +@^kylin-desktop-environment +%end +%pre --log=/tmp/pre_download.log diff --git a/netboot/monitor/monitor.sh.tpl b/netboot/monitor/monitor.sh.tpl new file mode 100755 index 0000000..0b039e2 --- /dev/null +++ b/netboot/monitor/monitor.sh.tpl @@ -0,0 +1,185 @@ +#!/bin/bash +# 核心修复:移除 elif 顺序阻断,改用独立判断 + 进度覆盖,确保进度能持续更新 +# 兼容:CentOS 7/8/9 + Ubuntu 16.04-22.04 + Debian 9-11 + +# ========== 配置项 ========== +MONITOR_LOG="/tmp/install_monitor.log" +MONITOR_INTERVAL=5 +CLIENT_ID=$(ip route get 1 | awk '{print $7;exit}' || hostname || "unknown-$(date +%s)") +ETH=$(ip route get 1 | awk '{print $5;exit}') +MAC=$(ifconfig $ETH | grep ether |awk '{print $2;exit}'| sed 's/://g') +MONITOR_SERVER="http://SERVER_IP_ADDRESS:HTTP_PORT" +total_pkgs=0 +declare -gA DICT + +# ========== 日志函数 ========== +log_info() { + echo "[$(date +'%Y-%m-%d %H:%M:%S')] [${CLIENT_ID}] INFO: $1" >> ${MONITOR_LOG} +} + +log_error() { + echo "[$(date +'%Y-%m-%d %H:%M:%S')] [${CLIENT_ID}] ERROR: $1" >> ${MONITOR_LOG} +} + +# ========== 字典加载函数 ========== +load_dict() { + local dict_file=$1 + if [ ! -f "${dict_file}" ]; then + log_error "字典文件不存在: ${dict_file}" + return 1 + fi + source "${dict_file}" + log_info "已加载字典文件: ${dict_file}" + log_info "DICT[log_files]=${DICT[log_files]}" + return 0 +} + +get_dict_value() { + local key=$1 + local default_value=$2 + [ -n "${DICT[$key]}" ] && echo "${DICT[$key]}" || echo "${default_value}" +} + +# ========== 系统识别 ========== +detect_os() { + if grep -q "anaconda" /proc/cmdline 2>/dev/null || [ -f "/tmp/anaconda.log" ]; then + echo "anaconda" + elif grep -q "boot=casper" /proc/cmdline 2>/dev/null || grep -q "boot=live" /proc/cmdline 2>/dev/null || [ -f "/var/log/syslog" ]; then + echo "debian" + else + echo "unknown" + fi +} + +get_total_pkgs() { + local log_files="${DICT[log_files]:-/tmp/anaconda.log /tmp/packaging.log}" + local pkgs="${DICT[default_pkgs]:-400}" + [ -n "$log_files" ] && pkgs=$(grep "packages selected" $log_files 2>/dev/null | tail -1 | sed -n 's/.*[^0-9]\([0-9]\+\) packages selected.*/\1/p' || echo "${DICT[default_pkgs]:-400}") + [[ "${pkgs}" =~ ^[0-9]+$ ]] && echo "${pkgs}" || echo "${DICT[default_pkgs]:-400}" +} + + +# ========== 通用进度解析函数 ========== +parse_progress() { + local progress=0 + local status="unknown" + local msg="${DICT[msg_wait]:-等待安装启动}" + local log_files="${DICT[log_files]:-}" + local extra_log="${DICT[runcommand_log]:-}" + local extra_file="${DICT[extra_check_file]:-}" + + [ -n "$extra_log" ] && log_files="$log_files $extra_log" + + local failed_pattern="${DICT[pattern_failed]:-ERROR}" + if grep -qE "${failed_pattern}" $log_files 2>/dev/null; then + local exclude_pattern="${DICT[pattern_failed_exclude]:-}" + local real_error="" + if [ -n "$exclude_pattern" ]; then + while IFS= read -r line; do + if ! echo "$line" | grep -qE "${exclude_pattern}"; then + real_error="$line" + break + fi + done < <(grep -E "${failed_pattern}" $log_files 2>/dev/null) + else + real_error=$(grep -E "${failed_pattern}" $log_files 2>/dev/null | tail -1) + fi + + if [ -n "$real_error" ]; then + progress="${DICT[progress_failed]:-0}" + status="failed" + msg="${DICT[msg_failed]:-安装失败}:${real_error}" + echo "$progress $status $msg" + return + fi + fi + + if [ -n "$extra_file" ] && [ -f "$extra_file" ] || grep -qE "${DICT[pattern_finished]:-finished}" $log_files 2>/dev/null; then + progress="${DICT[progress_finished]:-100}" + status="finished" + msg="${DICT[msg_finished]:-安装完成,即将重启系统}" + elif grep -qE "${DICT[pattern_third_party]:-}" $log_files 2>/dev/null; then + progress="${DICT[progress_third_party]:-95}" + status="config" + msg="${DICT[msg_third_party]:-安装第三方软件中}" + elif grep -qE "${DICT[pattern_config]:-}" $log_files 2>/dev/null; then + progress="${DICT[progress_config]:-90}" + status="config" + msg="${DICT[msg_config]:-系统配置中}" + elif grep -qE "${DICT[pattern_install]:-}" $log_files 2>/dev/null; then + local install_start="${DICT[progress_install_start]:-40}" + local install_end="${DICT[progress_install_end]:-80}" + local calc_type="${DICT[install_calc_type]:-pkg}" + if [ "$calc_type" = "pkg" ]; then + local installed_pkgs=$(grep -c ": Installed: " $log_files |awk -F: '{sum+=$NF} END {print sum}' 2>/dev/null) + [[ "$total_pkgs" = 0 ]] && total_pkgs=$(get_total_pkgs) + progress=$(( (installed_pkgs * (install_end - install_start)) / total_pkgs + install_start )) + msg="${DICT[msg_install]:-安装软件包}:${installed_pkgs}/${total_pkgs} 个" + elif [ "$calc_type" = "copy" ] && [ -d "/rofs" ]; then + local rofssize=$(sudo du -sm /rofs | awk '{print $1}' 2>/dev/null) + local target=$(sudo du -sm /target | awk '{print $1}' 2>/dev/null) + progress=$(( (target * (install_end - install_start)) / rofssize + install_start )) + msg="${DICT[msg_install]:-正在部署系统}:${target}/${rofssize} M" + else + progress=$(( (install_end + install_start) / 2 )) + msg="${DICT[msg_install]:-正在部署系统}..." + fi + progress=$(( progress > install_end ? install_end : progress )) + status="installing" + elif grep -qE "${DICT[pattern_download]:-}" $log_files 2>/dev/null; then + progress="${DICT[progress_download]:-40}" + status="Downloading" + msg="${DICT[msg_download]:-下载软件包}" + elif grep -qE "${DICT[pattern_mount]:-}" $log_files 2>/dev/null; then + progress="${DICT[progress_mount]:-30}" + status="partition_done" + msg="${DICT[msg_mount]:-分区完成,挂载文件系统}" + elif grep -qE "${DICT[pattern_partition]:-}" $log_files 2>/dev/null; then + progress="${DICT[progress_partition]:-15}" + status="partitioning" + msg="${DICT[msg_partition]:-环境初始化完成}" + fi + + echo "$progress $status $msg" +} + +# ========== 主监控逻辑 ========== +main() { + # 初始化 + touch ${MONITOR_LOG} && chmod 644 ${MONITOR_LOG} + log_info "===== 安装监控脚本启动(修复进度覆盖逻辑) =====" + log_info "客户端标识:${CLIENT_ID}" + + + local os=$(detect_os) + log_info "识别系统类型:$os" + if [ "$os" = "unknown" ]; then + log_error "无法识别系统类型,退出监控" + curl -X POST -s --connect-timeout 2 -d "progress=100&status=failed&msg=系统类型未识别&mac=$MAC" -o /dev/null $MONITOR_SERVER/monitor/statusreport + exit 1 + fi + + curl -s --connect-timeout 2 -o /tmp/monitor.dict $MONITOR_SERVER/monitor/dicts/$os".dict" + log_info "已下载字典文件" + + local dict_file="/tmp/monitor.dict" + [ -n "$dict_file" ] && load_dict "$dict_file" || log_error "加载字典文件失败,使用默认配置" + + + local last_progress=-1 + while true; do + local result=$(parse_progress) + local progress=$(echo "$result" | awk '{print $1}') + local status=$(echo "$result" | awk '{print $2}') + local msg=$(echo "$result" | awk '{$1="";$2="";print substr($0,3)}') + + [ "$progress" -ne "$last_progress" ] && log_info "进度:${progress}% | 状态:${status} | 信息:${msg}" && last_progress=$progress + curl -X POST -s --connect-timeout 2 -d "progress=$progress&status=$status&msg=$msg&mac=$MAC" -o /dev/null $MONITOR_SERVER/monitor/statusreport + + [ "$status" = "finished" ] || [ "$status" = "failed" ] && log_info "监控脚本正常退出,最终状态:$status" && break + sleep ${MONITOR_INTERVAL} + done +} + +# 启动 +main \ No newline at end of file diff --git a/netboot/web/about.html b/netboot/web/about.html index e07aef8..7278573 100755 --- a/netboot/web/about.html +++ b/netboot/web/about.html @@ -24,6 +24,16 @@
更新日志