-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
154 lines (133 loc) · 6.71 KB
/
install.sh
File metadata and controls
154 lines (133 loc) · 6.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/bash
# ==============================================================================
# UPS Power Manager - 一键安装脚本
# 在 Ubuntu Server 22.04 LTS 上运行
# ==============================================================================
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_ok() { echo -e "${GREEN}[✓]${NC} $*"; }
log_warn() { echo -e "${YELLOW}[!]${NC} $*"; }
log_err() { echo -e "${RED}[✗]${NC} $*"; }
log_info() { echo -e " $*"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo "============================================================"
echo " UPS Power Manager - 安装脚本"
echo " 目标系统: Ubuntu Server 22.04 LTS"
echo "============================================================"
echo ""
# ---- 检查 root 权限 ----
if [[ $EUID -ne 0 ]]; then
log_err "请使用 root 权限运行此脚本: sudo $0"
exit 1
fi
# ---- 步骤 1: 安装依赖 ----
echo ""
echo ">>> 步骤 1/4: 安装依赖包..."
apt-get update -qq
apt-get install -y -qq ipmitool openssh-client sshpass > /dev/null 2>&1
log_ok "依赖包已安装 (ipmitool, openssh-client, sshpass)"
# 检查是否已安装 pwrstat
if command -v pwrstat >/dev/null 2>&1; then
log_ok "检测到官方 UPS 管理软件 (PowerPanel / pwrstat) 已安装。"
else
log_err "未检测到 pwrstat 命令。请确保您已预先安装 CyberPower PowerPanel for Linux。"
exit 1
fi
# ---- 步骤 2: 部署脚本 ----
echo ""
echo ">>> 步骤 2/5: 部署关机与检查脚本..."
mkdir -p /opt/ups-power-manager
cp "$SCRIPT_DIR/scripts/shutdown.sh" /opt/ups-power-manager/
cp "$SCRIPT_DIR/scripts/healthcheck.sh" /opt/ups-power-manager/
cp "$SCRIPT_DIR/scripts/power-event-logger.sh" /opt/ups-power-manager/
cp "$SCRIPT_DIR/scripts/laptop-setup.sh" /opt/ups-power-manager/
chmod +x /opt/ups-power-manager/*.sh
log_ok "脚本已部署到 /opt/ups-power-manager/"
# ---- 步骤 3: 部署配置 ----
echo ""
echo ">>> 步骤 3/5: 部署配置文件..."
mkdir -p /etc/ups-power-manager
if [[ -f /etc/ups-power-manager/config.env ]]; then
log_warn "配置文件已存在,跳过覆盖(请手动编辑检查: /etc/ups-power-manager/config.env)"
else
cp "$SCRIPT_DIR/config/config.env" /etc/ups-power-manager/
chmod 600 /etc/ups-power-manager/config.env
log_ok "配置文件已部署到 /etc/ups-power-manager/config.env"
fi
# ---- 步骤 4: 配置 NUT ----
echo ""
echo ">>> 步骤 4/5: 将关机脚本与 pwrstat 挂钩并配置健康检查..."
# 创建 pwrfail 包装脚本(同时触发关机和日志记录)
cat > /opt/ups-power-manager/on-pwrfail.sh << 'WRAPPER_EOF'
#!/bin/bash
# pwrstat pwrfail 事件包装脚本 - 同时触发日志记录和关机流程
/opt/ups-power-manager/power-event-logger.sh pwrfail &
exec /opt/ups-power-manager/shutdown.sh "$@"
WRAPPER_EOF
chmod +x /opt/ups-power-manager/on-pwrfail.sh
# 创建 active (市电恢复) 事件脚本
cat > /opt/ups-power-manager/on-active.sh << 'WRAPPER_EOF'
#!/bin/bash
# pwrstat active 事件包装脚本 - 市电恢复日志记录
/opt/ups-power-manager/power-event-logger.sh active
WRAPPER_EOF
chmod +x /opt/ups-power-manager/on-active.sh
# 配置 pwrstat 在断电 (pwrfail) 和低电量 (lowbatt) 时执行包装脚本
pwrstat -pwrfail -cmd /opt/ups-power-manager/on-pwrfail.sh > /dev/null 2>&1 || log_warn "pwrstat: pwrfail 事件配置失败,请稍后手动通过 'pwrstat -pwrfail -cmd' 指定。"
pwrstat -lowbatt -cmd /opt/ups-power-manager/shutdown.sh > /dev/null 2>&1 || log_warn "pwrstat: lowbatt 事件配置失败,请稍后手动指定。"
pwrstat -active -cmd /opt/ups-power-manager/on-active.sh > /dev/null 2>&1 || log_warn "pwrstat: active 事件配置失败(市电恢复日志记录将不可用)。"
log_ok "已将事件脚本绑定至 pwrstat 的 pwrfail/lowbatt/active 事件"
# 重启 pwrstatd 以应用更改
systemctl restart pwrstatd > /dev/null 2>&1 || log_warn "无法重启 pwrstatd 服务。您可能需要手动干预以使得绑定指令生效。"
# 清理旧的 systemd 服务(如果之前部署过)
systemctl stop ups-power-manager.service 2>/dev/null || true
systemctl disable ups-power-manager.service 2>/dev/null || true
rm -f /etc/systemd/system/ups-power-manager.service
log_info "💡 本方案已移除依赖于 systemd 持续运行的守护进程,转为原生触发机制。"
# ---- 步骤 5/5: 笔记本配置提示 ----
echo ""
echo ">>> 步骤 5/5: 监控笔记本配置..."
log_info "如果这是首次在 T450 笔记本上部署,请运行以下命令进行初始化配置:"
log_info " sudo /opt/ups-power-manager/laptop-setup.sh"
log_info "该脚本将禁用自动休眠/挂起并提供 BIOS 上电自启配置指引。"
# ---- 步骤 6: 验证 ----
echo ""
# 检查 UPS 通信 (基于 Pwrstat)
if pwrstat -status 2>/dev/null | grep -q "State.*Normal"; then
log_ok "PowerPanel ↔ UPS: 通信正常 (在线)"
else
log_warn "PowerPanel ↔ UPS: 无法获取正确的状态信息(请检查 'pwrstat -status' 的输出)"
fi
# 检查 iDRAC IPMI
if ipmitool -I lanplus -H "$IDRAC_HOST" -U "$IDRAC_USER" -P "$IDRAC_PASS" chassis power status >/dev/null 2>&1; then
log_ok "IPMI → iDRAC: 通信正常"
else
log_warn "IPMI → iDRAC: 通信失败(请检查网络或 IPMI over LAN 设置)"
fi
# 检查 ESXi SSH
ssh_opts="-o StrictHostKeyChecking=no -o ConnectTimeout=5 -o LogLevel=ERROR -p ${ESXI_SSH_PORT:-22}"
if [[ -n "${ESXI_SSH_KEY:-}" && -f "${ESXI_SSH_KEY}" ]]; then
ssh $ssh_opts -i "$ESXI_SSH_KEY" "${ESXI_SSH_USER}@${ESXI_HOST}" 'hostname' 2>/dev/null && log_ok "SSH → ESXi: 通信正常" || log_warn "SSH → ESXi: 通信失败(请检查网络和 SSH 服务)"
else
sshpass -p "$ESXI_SSH_PASS" ssh $ssh_opts "${ESXI_SSH_USER}@${ESXI_HOST}" 'hostname' 2>/dev/null && log_ok "SSH → ESXi: 通信正常" || log_warn "SSH → ESXi: 通信失败(请检查网络和 SSH 服务)"
fi
echo ""
echo "============================================================"
echo " 安装完成!"
echo "============================================================"
echo ""
echo " 常用命令:"
echo " 查看 UPS 状态: sudo pwrstat -status"
echo " 查看关机日志: tail -f /var/log/ups-shutdown.log"
echo " 查看电力事件日志: tail -f /var/log/ups-power-events.log"
echo " 手动健康检查: /opt/ups-power-manager/healthcheck.sh"
echo " 手动 UPS 快照: /opt/ups-power-manager/power-event-logger.sh snapshot"
echo " 测试关机流程: /opt/ups-power-manager/shutdown.sh --dry-run"
echo " 模拟断电测试: sudo pwrstat -test"
echo " 笔记本初始化配置: sudo /opt/ups-power-manager/laptop-setup.sh"
echo ""
echo " ⚠️ 重要: 请执行 --dry-run 测试后再进行真实断电测试!"
echo ""