Phase 1: 守护程序、TUI配置工具、安装脚本

核心变更:
- padsleep.py: 完整重写,实现守护进程主循环
  - ConfigManager: JSON配置加载/保存/变更检测
  - TimeChecker: 亮屏时间段判断(支持跨天)
  - AdbManager: ADB操作封装,自动检测设备,命令后验证
  - AuditLogger: 审计日志,超50MB自动裁剪保留后10%
  - IpcServer: Unix Socket JSON协议IPC服务端
  - 自动恢复: 亮屏时段内检测到屏幕熄灭立即点亮
  - 外部状态检测: 记录用户手动开关屏事件
- padsleep_tui.py: curses TUI配置工具
  - 亮屏时间段增删改查
  - ADB设备列表查看/选择
  - 守护进程状态监控
  - 审计日志查看
- padsleep.service: systemd服务单元(路径自适应)
- install.sh: 安装到 /opt/apps/padsleep,自动设置权限

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
kushidou
2026-07-09 23:42:09 +08:00
co-authored by Claude Fable 5
parent 4d0db4c390
commit 458b67213f
4 changed files with 427 additions and 50 deletions
Executable
+128
View File
@@ -0,0 +1,128 @@
#!/bin/bash
# padsleep_adb 安装脚本
# 用法: sudo ./install.sh
#
# 将程序安装到 /opt/apps/padsleep,创建命令行软链接。
# 代码中 SCRIPT_DIR 使用 Path(__file__).resolve().parent
# 会自动适配安装路径,无需修改代码。
set -e
INSTALL_DIR="/opt/apps/padsleep"
BIN_DIR="/usr/local/bin"
SERVICE_DIR="/etc/systemd/system"
# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
# ── 检查 root ──
if [ "$EUID" -ne 0 ]; then
error "请使用 sudo 运行此安装脚本"
echo " sudo $0"
exit 1
fi
# ── 确定源目录(脚本所在目录)──
SRC_DIR="$(cd "$(dirname "$0")" && pwd)"
if [ ! -f "$SRC_DIR/padsleep.py" ]; then
error "$SRC_DIR 中未找到 padsleep.py"
echo "请在 padsleep_adb 项目目录中运行此脚本"
exit 1
fi
# ── 确定运行用户(sudo 的原用户)──
RUN_USER="${SUDO_USER:-}"
if [ -z "$RUN_USER" ]; then
# fallback: 从服务文件提取 User= 字段
if [ -f "$SRC_DIR/padsleep.service" ]; then
RUN_USER=$(grep '^User=' "$SRC_DIR/padsleep.service" | head -1 | cut -d= -f2)
fi
fi
if [ -z "$RUN_USER" ]; then
RUN_USER="$(whoami)"
fi
RUN_USER_HOME=$(eval echo "~$RUN_USER" 2>/dev/null || echo "/home/$RUN_USER")
info "源目录: $SRC_DIR"
info "安装目标: $INSTALL_DIR"
info "运行用户: $RUN_USER"
# ── 创建目标目录 ──
mkdir -p "$INSTALL_DIR"
info "已创建目录 $INSTALL_DIR"
# ── 复制文件 ──
cp "$SRC_DIR/padsleep.py" "$INSTALL_DIR/"
cp "$SRC_DIR/padsleep_tui.py" "$INSTALL_DIR/"
cp "$SRC_DIR/requirements.txt" "$INSTALL_DIR/" 2>/dev/null || true
# 配置文件:目标不存在则复制,存在则保留
if [ ! -f "$INSTALL_DIR/config.json" ]; then
cp "$SRC_DIR/config.json" "$INSTALL_DIR/"
info "已创建默认配置文件 $INSTALL_DIR/config.json"
else
warn "配置文件已存在,保留现有配置: $INSTALL_DIR/config.json"
fi
# 日志文件:创建空文件
touch "$INSTALL_DIR/padsleep.log"
chmod 644 "$INSTALL_DIR/padsleep.log"
# 设置执行权限
chmod 755 "$INSTALL_DIR/padsleep.py"
chmod 755 "$INSTALL_DIR/padsleep_tui.py"
# 修正所有权和权限:确保运行用户有权读写配置和日志
chown -R "$RUN_USER:$RUN_USER" "$INSTALL_DIR" 2>/dev/null || chown -R "$RUN_USER" "$INSTALL_DIR" 2>/dev/null
chmod 755 "$INSTALL_DIR"
chmod 644 "$INSTALL_DIR/padsleep.log" 2>/dev/null
info "文件所有权已设置为 $RUN_USER"
# ── 创建软链接 ──
ln -sf "$INSTALL_DIR/padsleep.py" "$BIN_DIR/padsleep"
ln -sf "$INSTALL_DIR/padsleep_tui.py" "$BIN_DIR/padsleep-config"
info "已创建命令软链接:"
info " $BIN_DIR/padsleep → 启动守护进程"
info " $BIN_DIR/padsleep-config → 启动 TUI 配置工具"
# ── 可选:复制 systemd 服务 ──
if [ -f "$SRC_DIR/padsleep.service" ]; then
# 复制并更新服务文件中的路径和用户
cp "$SRC_DIR/padsleep.service" "$SERVICE_DIR/padsleep.service"
sed -i "s|WorkingDirectory=.*|WorkingDirectory=$INSTALL_DIR|" "$SERVICE_DIR/padsleep.service"
sed -i "s|ExecStart=.*|ExecStart=/usr/bin/python3 $INSTALL_DIR/padsleep.py|" "$SERVICE_DIR/padsleep.service"
sed -i "s|^User=.*|User=$RUN_USER|" "$SERVICE_DIR/padsleep.service"
systemctl daemon-reload
info "已复制 systemd 服务文件: $SERVICE_DIR/padsleep.service"
info "服务用户已设为: $RUN_USER"
info "可执行以下命令启用:"
info " sudo systemctl enable --now padsleep"
fi
# ── 检查 ADB ──
if command -v adb &>/dev/null; then
info "ADB 已安装: $(adb --version 2>&1 | head -1)"
else
warn "ADB 未安装,请执行: sudo apt install adb"
fi
# ── 完成 ──
echo ""
echo -e "${GREEN}═══════════════════════════════════════${NC}"
info "安装完成!"
echo ""
info "使用方法:"
echo " 1. 启动守护进程: padsleep"
echo " 2. 打开配置界面: padsleep-config"
echo " 3. 注册系统服务: sudo systemctl enable --now padsleep"
echo ""
info "配置文件: $INSTALL_DIR/config.json"
info "日志文件: $INSTALL_DIR/padsleep.log"
echo -e "${GREEN}═══════════════════════════════════════${NC}"