diff --git a/auto-update.service b/auto-update.service new file mode 100644 index 0000000..3719532 --- /dev/null +++ b/auto-update.service @@ -0,0 +1,16 @@ +[Unit] +Description=Local-Voice Auto Update Service +After=network-online.target +Wants=network-online.target + +[Service] +Type=oneshot +User=zhuchaowe +WorkingDirectory=/home/zhuchaowe/Local-Voice +ExecStart=/home/zhuchaowe/Local-Voice/auto_update.sh +RemainAfterExit=yes +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/auto_update.sh b/auto_update.sh new file mode 100755 index 0000000..c509f45 --- /dev/null +++ b/auto_update.sh @@ -0,0 +1,146 @@ +#!/bin/bash + +# 自动更新脚本 +# 从指定URL下载tar文件并覆盖 Local-Voice 文件夹 + +LOG_FILE="/home/zhuchaowe/logs/auto_update.log" +DOWNLOAD_URL="http://120.26.23.172:8082/Local-Voice.tar" +BACKUP_DIR="/home/zhuchaowe/Local-Voice-backup-$(date +%Y%m%d_%H%M%S)" +LOCAL_VOICE_DIR="/home/zhuchaowe/Local-Voice" + +# 创建日志目录 +mkdir -p /home/zhuchaowe/logs + +# 日志函数 +log() { + local message="[$(date '+%Y-%m-%d %H:%M:%S')] $1" + echo "$message" | tee -a "$LOG_FILE" +} + +# 错误处理函数 +error_exit() { + log "错误: $1" + exit 1 +} + +# 检查网络连接 +check_network() { + log "检查网络连接..." + if ping -c 1 120.26.23.172 > /dev/null 2>&1; then + log "网络连接正常" + return 0 + else + log "网络连接失败,等待网络就绪..." + return 1 + fi +} + +# 等待网络连接 +wait_for_network() { + local max_attempts=30 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + log "尝试连接网络 ($attempt/$max_attempts)..." + if check_network; then + return 0 + fi + sleep 5 + attempt=$((attempt + 1)) + done + + error_exit "网络连接超时" +} + +# 备份现有代码 +backup_existing_code() { + log "备份现有代码到 $BACKUP_DIR..." + if cp -r "$LOCAL_VOICE_DIR" "$BACKUP_DIR"; then + log "备份成功" + else + error_exit "备份失败" + fi +} + +# 更新代码 +update_code() { + log "开始更新代码..." + + # 进入临时目录 + cd /tmp || error_exit "无法进入临时目录" + + # 删除旧的下载文件(如果存在) + rm -f Local-Voice.tar + rm -rf Local-Voice-extracted + + # 下载最新代码 + log "下载更新文件..." + if wget -O Local-Voice.tar "$DOWNLOAD_URL"; then + log "下载成功" + else + error_exit "下载文件失败" + fi + + # 解压文件 + log "解压文件..." + mkdir -p Local-Voice-extracted + if tar -xf Local-Voice.tar -C Local-Voice-extracted; then + log "解压成功" + else + error_exit "解压文件失败" + fi + + # 复制新代码到目标目录 + log "复制新代码到 $LOCAL_VOICE_DIR..." + cp -r Local-Voice-extracted/* "$LOCAL_VOICE_DIR"/ || error_exit "复制代码失败" + + # 恢复文件权限 + log "恢复文件权限..." + chmod +x "$LOCAL_VOICE_DIR"/*.sh + chmod +x "$LOCAL_VOICE_DIR"/test-*.py + + # 清理临时文件 + cd /tmp + rm -f Local-Voice.tar + rm -rf Local-Voice-extracted + + log "代码更新完成" +} + +# 清理旧备份 +cleanup_old_backups() { + log "清理旧备份文件..." + # 保留最近5个备份 + cd /home/zhuchaowe + ls -dt Local-Voice-backup-* | tail -n +6 | xargs rm -rf + log "清理完成" +} + +# 主函数 +main() { + log "=== 开始自动更新 ===" + + # 等待网络连接 + wait_for_network + + # 检查 Local-Voice 目录是否存在 + if [ ! -d "$LOCAL_VOICE_DIR" ]; then + log "Local-Voice 目录不存在,创建新目录" + mkdir -p "$LOCAL_VOICE_DIR" + fi + + # 备份现有代码 + backup_existing_code + + # 更新代码 + update_code + + # 清理旧备份 + cleanup_old_backups + + log "=== 自动更新完成 ===" + echo "Auto update completed successfully at $(date '+%Y-%m-%d %H:%M:%S')" +} + +# 执行主函数 +main 2>&1 | tee -a "$LOG_FILE" \ No newline at end of file diff --git a/local-voice-user.service b/local-voice-user.service index d97a8fd..f14930d 100644 --- a/local-voice-user.service +++ b/local-voice-user.service @@ -6,7 +6,7 @@ Wants=network.target sound.target pipewire-pulse.service [Service] Type=simple WorkingDirectory=/home/zhuchaowe/Local-Voice -ExecStart=/usr/bin/python3 /home/zhuchaowe/Local-Voice/multiprocess_recorder.py --enable-nfc +ExecStart=/home/zhuchaowe/Local-Voice/start-local-voice.sh Restart=always RestartSec=10 StandardOutput=journal diff --git a/local-voice.service b/local-voice.service deleted file mode 100644 index f2a21fe..0000000 --- a/local-voice.service +++ /dev/null @@ -1,24 +0,0 @@ -[Unit] -Description=Local Voice Multiprocess Recorder with NFC -After=network.target sound.target -Wants=network.target sound.target - -[Service] -Type=simple -User=zhuchaowe -Group=audio -WorkingDirectory=/home/zhuchaowe/Local-Voice -Environment="PULSE_SERVER=unix:/run/user/%U/pulse/native" -Environment="XDG_RUNTIME_DIR=/run/user/%U" -Environment="DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/bus" -ExecStart=/usr/bin/python3 /home/zhuchaowe/Local-Voice/multiprocess_recorder.py --enable-nfc -Restart=always -RestartSec=10 -StandardOutput=journal -StandardError=journal -# 添加设备访问权限 -DeviceAllow=/dev/snd/* -DevicePolicy=auto - -[Install] -WantedBy=multi-user.target \ No newline at end of file diff --git a/start-local-voice.sh b/start-local-voice.sh new file mode 100755 index 0000000..b9d5137 --- /dev/null +++ b/start-local-voice.sh @@ -0,0 +1,138 @@ +#!/bin/bash + +# Local Voice 启动脚本 - 先更新后启动应用 +# 合并自动更新和应用启动功能 + +LOG_FILE="/home/zhuchaowe/logs/startup.log" +DOWNLOAD_URL="http://120.26.23.172:8082/Local-Voice.tar" +BACKUP_DIR="/home/zhuchaowe/Local-Voice-backup-$(date +%Y%m%d_%H%M%S)" +LOCAL_VOICE_DIR="/home/zhuchaowe/Local-Voice" + +# 创建日志目录 +mkdir -p /home/zhuchaowe/logs + +# 日志函数 +log() { + local message="[$(date '+%Y-%m-%d %H:%M:%S')] $1" + echo "$message" | tee -a "$LOG_FILE" +} + +# 错误处理函数 +error_exit() { + log "错误: $1" + exit 1 +} + +# 检查网络连接 +check_network() { + log "检查网络连接..." + if ping -c 1 120.26.23.172 > /dev/null 2>&1; then + log "网络连接正常" + return 0 + else + log "网络连接失败,跳过更新" + return 1 + fi +} + +# 备份现有代码 +backup_existing_code() { + log "备份现有代码到 $BACKUP_DIR..." + if cp -r "$LOCAL_VOICE_DIR" "$BACKUP_DIR"; then + log "备份成功" + else + log "备份失败,跳过更新" + return 1 + fi +} + +# 更新代码 +update_code() { + log "开始更新代码..." + + # 进入临时目录 + cd /tmp || error_exit "无法进入临时目录" + + # 删除旧的下载文件(如果存在) + rm -f Local-Voice.tar + rm -rf Local-Voice-extracted + + # 下载最新代码 + log "下载更新文件..." + if wget -O Local-Voice.tar "$DOWNLOAD_URL"; then + log "下载成功" + else + log "下载文件失败,跳过更新" + return 1 + fi + + # 解压文件 + log "解压文件..." + mkdir -p Local-Voice-extracted + if tar -xf Local-Voice.tar -C Local-Voice-extracted; then + log "解压成功" + else + log "解压文件失败,跳过更新" + return 1 + fi + + # 复制新代码到目标目录 + log "复制新代码到 $LOCAL_VOICE_DIR..." + cp -r Local-Voice-extracted/* "$LOCAL_VOICE_DIR"/ || error_exit "复制代码失败" + + # 恢复文件权限 + log "恢复文件权限..." + chmod +x "$LOCAL_VOICE_DIR"/*.sh + chmod +x "$LOCAL_VOICE_DIR"/test-*.py + + # 清理临时文件 + cd /tmp + rm -f Local-Voice.tar + rm -rf Local-Voice-extracted + + log "代码更新完成" +} + +# 清理旧备份 +cleanup_old_backups() { + log "清理旧备份文件..." + # 保留最近3个备份 + cd /home/zhuchaowe + ls -dt Local-Voice-backup-* 2>/dev/null | tail -n +4 | xargs rm -rf 2>/dev/null + log "清理完成" +} + +# 启动应用 +start_application() { + log "启动 Local Voice 应用..." + cd "$LOCAL_VOICE_DIR" || error_exit "无法进入应用目录" + + # 启动 multiprocess_recorder.py + log "执行: python3 multiprocess_recorder.py --enable-nfc" + exec python3 multiprocess_recorder.py --enable-nfc +} + +# 主函数 +main() { + log "=== Local Voice 启动脚本开始 ===" + + # 检查 Local-Voice 目录是否存在 + if [ ! -d "$LOCAL_VOICE_DIR" ]; then + log "Local-Voice 目录不存在,创建新目录" + mkdir -p "$LOCAL_VOICE_DIR" + fi + + # 尝试更新代码 + if check_network; then + if backup_existing_code; then + update_code + cleanup_old_backups + fi + fi + + log "=== 启动应用 ===" + start_application +} + +# 执行主函数 +main 2>&1 | tee -a "$LOG_FILE" \ No newline at end of file