574 lines
18 KiB
Bash
574 lines
18 KiB
Bash
#!/bin/bash
|
||
#
|
||
# 一键配置:定时备份目录到 Google Drive
|
||
# 运行方式:sudo bash setup-backup-gdrive.sh
|
||
#
|
||
|
||
set -euo pipefail
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
BOLD='\033[1m'
|
||
NC='\033[0m'
|
||
|
||
# 默认配置
|
||
DEFAULT_BACKUP_DIR="/var/backups/gdrive-backups"
|
||
DEFAULT_RCLONE_REMOTE="gdrive"
|
||
DEFAULT_REMOTE_DIR="Backups"
|
||
DEFAULT_BACKUP_PREFIX="backup"
|
||
DEFAULT_LOCAL_RETENTION=7
|
||
DEFAULT_REMOTE_RETENTION=30
|
||
|
||
SCRIPT_PATH="/usr/local/bin/backup-to-gdrive.sh"
|
||
SERVICE_PATH="/etc/systemd/system/backup-to-gdrive.service"
|
||
TIMER_PATH="/etc/systemd/system/backup-to-gdrive.timer"
|
||
LOG_FILE="/var/log/backup-gdrive.log"
|
||
|
||
# 存储多个备份目录
|
||
declare -a SOURCE_DIRS=()
|
||
|
||
# 打印函数
|
||
print_header() {
|
||
echo ""
|
||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||
echo -e "${BLUE} $1${NC}"
|
||
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
|
||
echo ""
|
||
}
|
||
|
||
print_success() { echo -e "${GREEN}✓${NC} $1"; }
|
||
print_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
|
||
print_error() { echo -e "${RED}✗${NC} $1"; }
|
||
print_info() { echo -e "${CYAN}→${NC} $1"; }
|
||
print_input() { echo -e "${BOLD}$1${NC}"; }
|
||
|
||
# 检查 root 权限
|
||
check_root() {
|
||
if [[ $EUID -ne 0 ]]; then
|
||
print_error "请使用 root 权限运行此脚本"
|
||
echo " sudo bash $0"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 检查并安装 rclone
|
||
install_rclone() {
|
||
print_header "检查 rclone"
|
||
|
||
if command -v rclone &>/dev/null; then
|
||
print_success "rclone 已安装: $(rclone version | head -1)"
|
||
else
|
||
print_warning "rclone 未安装,正在安装..."
|
||
curl -fsSL https://rclone.org/install.sh | bash
|
||
print_success "rclone 安装完成"
|
||
fi
|
||
}
|
||
|
||
# 交互式输入备份目录
|
||
input_source_dirs() {
|
||
print_header "配置备份目录"
|
||
|
||
echo -e "${CYAN}请输入要备份的目录路径${NC}"
|
||
echo -e " • 支持添加多个目录"
|
||
echo -e " • 输入目录路径后按 Enter 确认"
|
||
echo -e " • 输入完所有目录后,直接按 Enter(留空)结束"
|
||
echo -e " • 支持使用 Tab 键自动补全路径"
|
||
echo ""
|
||
|
||
local count=1
|
||
while true; do
|
||
# 启用 readline 以支持 Tab 补全
|
||
read -e -p "$(echo -e "${BOLD}目录 ${count}:${NC} ")" dir_input
|
||
|
||
# 空输入表示结束
|
||
if [[ -z "$dir_input" ]]; then
|
||
if [[ ${#SOURCE_DIRS[@]} -eq 0 ]]; then
|
||
print_error "至少需要输入一个目录!"
|
||
continue
|
||
fi
|
||
break
|
||
fi
|
||
|
||
# 展开 ~ 为 home 目录
|
||
dir_input="${dir_input/#\~/$HOME}"
|
||
|
||
# 去除末尾的 /
|
||
dir_input="${dir_input%/}"
|
||
|
||
# 验证目录存在
|
||
if [[ ! -d "$dir_input" ]]; then
|
||
print_error "目录不存在: $dir_input"
|
||
echo -e " 请检查路径是否正确"
|
||
continue
|
||
fi
|
||
|
||
# 检查是否重复
|
||
local is_duplicate=false
|
||
for existing_dir in "${SOURCE_DIRS[@]:-}"; do
|
||
if [[ "$existing_dir" == "$dir_input" ]]; then
|
||
is_duplicate=true
|
||
break
|
||
fi
|
||
done
|
||
|
||
if $is_duplicate; then
|
||
print_warning "目录已添加,请勿重复"
|
||
continue
|
||
fi
|
||
|
||
# 显示目录信息
|
||
local dir_size=$(du -sh "$dir_input" 2>/dev/null | cut -f1 || echo "未知")
|
||
SOURCE_DIRS+=("$dir_input")
|
||
print_success "已添加: $dir_input (大小: $dir_size)"
|
||
|
||
((count++))
|
||
done
|
||
|
||
# 显示汇总
|
||
echo ""
|
||
echo -e "${CYAN}已选择 ${#SOURCE_DIRS[@]} 个目录:${NC}"
|
||
for i in "${!SOURCE_DIRS[@]}"; do
|
||
echo -e " $((i+1)). ${SOURCE_DIRS[$i]}"
|
||
done
|
||
echo ""
|
||
|
||
read -p "确认以上目录?[Y/n]: " confirm
|
||
if [[ "$confirm" =~ ^[Nn]$ ]]; then
|
||
SOURCE_DIRS=()
|
||
input_source_dirs
|
||
fi
|
||
}
|
||
|
||
# 配置其他参数
|
||
get_config() {
|
||
print_header "配置备份参数"
|
||
|
||
# 本地备份目录
|
||
print_input "本地备份存放目录"
|
||
read -e -p " [${DEFAULT_BACKUP_DIR}]: " BACKUP_DIR
|
||
BACKUP_DIR="${BACKUP_DIR:-$DEFAULT_BACKUP_DIR}"
|
||
|
||
# rclone remote 名称
|
||
echo ""
|
||
print_input "rclone remote 名称"
|
||
echo -e " (稍后会引导你配置 Google Drive 连接)"
|
||
read -p " [${DEFAULT_RCLONE_REMOTE}]: " RCLONE_REMOTE
|
||
RCLONE_REMOTE="${RCLONE_REMOTE:-$DEFAULT_RCLONE_REMOTE}"
|
||
|
||
# 远程目录
|
||
echo ""
|
||
print_input "Google Drive 上的目标文件夹"
|
||
read -p " [${DEFAULT_REMOTE_DIR}]: " REMOTE_DIR
|
||
REMOTE_DIR="${REMOTE_DIR:-$DEFAULT_REMOTE_DIR}"
|
||
|
||
# 备份前缀
|
||
echo ""
|
||
print_input "备份文件名前缀"
|
||
echo -e " (生成的文件名格式: 前缀_日期时间.tar.gz)"
|
||
read -p " [${DEFAULT_BACKUP_PREFIX}]: " BACKUP_PREFIX
|
||
BACKUP_PREFIX="${BACKUP_PREFIX:-$DEFAULT_BACKUP_PREFIX}"
|
||
|
||
# 保留天数
|
||
echo ""
|
||
print_input "本地备份保留天数"
|
||
read -p " [${DEFAULT_LOCAL_RETENTION}]: " LOCAL_RETENTION
|
||
LOCAL_RETENTION="${LOCAL_RETENTION:-$DEFAULT_LOCAL_RETENTION}"
|
||
|
||
echo ""
|
||
print_input "远程备份保留天数"
|
||
read -p " [${DEFAULT_REMOTE_RETENTION}]: " REMOTE_RETENTION
|
||
REMOTE_RETENTION="${REMOTE_RETENTION:-$DEFAULT_REMOTE_RETENTION}"
|
||
|
||
# 执行时间
|
||
echo ""
|
||
print_input "定时执行时间"
|
||
echo " 1) 每天凌晨 2:00(推荐)"
|
||
echo " 2) 每天凌晨 4:00"
|
||
echo " 3) 每天中午 12:00"
|
||
echo " 4) 每12小时(0:00 和 12:00)"
|
||
echo " 5) 每6小时"
|
||
echo " 6) 每小时"
|
||
echo " 7) 自定义时间"
|
||
read -p " 选择 [1]: " schedule_choice
|
||
|
||
case "${schedule_choice:-1}" in
|
||
1) SCHEDULE="*-*-* 02:00:00" ;;
|
||
2) SCHEDULE="*-*-* 04:00:00" ;;
|
||
3) SCHEDULE="*-*-* 12:00:00" ;;
|
||
4) SCHEDULE="*-*-* 00,12:00:00" ;;
|
||
5) SCHEDULE="*-*-* 00,06,12,18:00:00" ;;
|
||
6) SCHEDULE="hourly" ;;
|
||
7)
|
||
echo ""
|
||
echo " OnCalendar 格式示例:"
|
||
echo " 每天 3:30 → *-*-* 03:30:00"
|
||
echo " 每周一 5:00 → Mon *-*-* 05:00:00"
|
||
echo " 每月1号 4:00 → *-*-01 04:00:00"
|
||
read -p " 输入: " SCHEDULE
|
||
;;
|
||
*) SCHEDULE="*-*-* 02:00:00" ;;
|
||
esac
|
||
}
|
||
|
||
# 显示配置确认
|
||
confirm_config() {
|
||
print_header "配置确认"
|
||
|
||
echo -e "${BOLD}备份目录:${NC}"
|
||
for dir in "${SOURCE_DIRS[@]}"; do
|
||
echo " • $dir"
|
||
done
|
||
echo ""
|
||
echo -e "${BOLD}本地备份目录:${NC} $BACKUP_DIR"
|
||
echo -e "${BOLD}rclone remote:${NC} $RCLONE_REMOTE"
|
||
echo -e "${BOLD}远程目录:${NC} $REMOTE_DIR"
|
||
echo -e "${BOLD}文件名前缀:${NC} $BACKUP_PREFIX"
|
||
echo -e "${BOLD}本地保留:${NC} $LOCAL_RETENTION 天"
|
||
echo -e "${BOLD}远程保留:${NC} $REMOTE_RETENTION 天"
|
||
echo -e "${BOLD}执行计划:${NC} $SCHEDULE"
|
||
echo ""
|
||
|
||
read -p "确认以上配置?[Y/n]: " confirm
|
||
if [[ "$confirm" =~ ^[Nn]$ ]]; then
|
||
SOURCE_DIRS=()
|
||
input_source_dirs
|
||
get_config
|
||
confirm_config
|
||
fi
|
||
}
|
||
|
||
# 配置 rclone
|
||
configure_rclone() {
|
||
print_header "配置 rclone 连接 Google Drive"
|
||
|
||
# 检查是否已有配置
|
||
if rclone listremotes 2>/dev/null | grep -q "^${RCLONE_REMOTE}:$"; then
|
||
print_success "已存在 remote: ${RCLONE_REMOTE}"
|
||
|
||
# 测试连接
|
||
print_info "测试连接..."
|
||
if rclone lsd "${RCLONE_REMOTE}:" &>/dev/null; then
|
||
print_success "Google Drive 连接正常"
|
||
read -p "是否重新配置?[y/N]: " reconfigure
|
||
[[ ! "$reconfigure" =~ ^[Yy]$ ]] && return 0
|
||
else
|
||
print_warning "连接测试失败,需要重新配置"
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
print_info "即将打开 rclone 配置向导"
|
||
echo ""
|
||
echo " 请按以下步骤操作:"
|
||
echo " ─────────────────────────────────────"
|
||
echo " 1. 输入 ${BOLD}n${NC} 创建新 remote"
|
||
echo " 2. 名称输入: ${BOLD}${RCLONE_REMOTE}${NC}"
|
||
echo " 3. 选择 ${BOLD}Google Drive${NC} (输入对应数字)"
|
||
echo " 4. client_id: 直接按 ${BOLD}Enter${NC}"
|
||
echo " 5. client_secret: 直接按 ${BOLD}Enter${NC}"
|
||
echo " 6. scope: 选择 ${BOLD}1${NC} (完全访问)"
|
||
echo " 7. service_account_file: 直接按 ${BOLD}Enter${NC}"
|
||
echo " 8. Edit advanced config: 输入 ${BOLD}n${NC}"
|
||
echo " 9. Use web browser: 输入 ${BOLD}y${NC}"
|
||
echo " 10. 在浏览器中登录 Google 账号并授权"
|
||
echo " 11. Configure as Shared Drive: 输入 ${BOLD}n${NC}"
|
||
echo " 12. 确认配置: 输入 ${BOLD}y${NC}"
|
||
echo " 13. 退出配置: 输入 ${BOLD}q${NC}"
|
||
echo " ─────────────────────────────────────"
|
||
echo ""
|
||
read -p "按 Enter 开始配置..."
|
||
|
||
rclone config
|
||
|
||
# 验证配置
|
||
echo ""
|
||
if rclone listremotes | grep -q "^${RCLONE_REMOTE}:$"; then
|
||
print_success "rclone 配置成功"
|
||
print_info "测试连接..."
|
||
if rclone lsd "${RCLONE_REMOTE}:" &>/dev/null; then
|
||
print_success "Google Drive 连接正常"
|
||
else
|
||
print_error "连接测试失败"
|
||
read -p "是否重试配置?[Y/n]: " retry
|
||
[[ ! "$retry" =~ ^[Nn]$ ]] && configure_rclone
|
||
fi
|
||
else
|
||
print_error "未找到 remote: ${RCLONE_REMOTE}"
|
||
read -p "是否重试配置?[Y/n]: " retry
|
||
[[ ! "$retry" =~ ^[Nn]$ ]] && configure_rclone
|
||
fi
|
||
}
|
||
|
||
# 创建备份脚本
|
||
create_backup_script() {
|
||
print_header "创建备份脚本"
|
||
|
||
mkdir -p "$(dirname "$SCRIPT_PATH")"
|
||
mkdir -p "$BACKUP_DIR"
|
||
|
||
# 将目录数组转换为脚本中的格式
|
||
local dirs_array=""
|
||
for dir in "${SOURCE_DIRS[@]}"; do
|
||
dirs_array+=" \"$dir\"\n"
|
||
done
|
||
|
||
cat > "$SCRIPT_PATH" << 'SCRIPT_EOF'
|
||
#!/bin/bash
|
||
set -euo pipefail
|
||
|
||
# ==================== 配置 ====================
|
||
SOURCE_DIRS=(
|
||
__SOURCE_DIRS__
|
||
)
|
||
BACKUP_DIR="__BACKUP_DIR__"
|
||
RCLONE_REMOTE="__RCLONE_REMOTE__"
|
||
REMOTE_DIR="__REMOTE_DIR__"
|
||
BACKUP_PREFIX="__BACKUP_PREFIX__"
|
||
LOCAL_RETENTION_DAYS=__LOCAL_RETENTION__
|
||
REMOTE_RETENTION_DAYS=__REMOTE_RETENTION__
|
||
LOG_FILE="__LOG_FILE__"
|
||
# ==============================================
|
||
|
||
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"; }
|
||
error_exit() { log "错误: $1"; exit 1; }
|
||
|
||
main() {
|
||
log "========== 备份任务开始 =========="
|
||
|
||
# 检查依赖
|
||
command -v rclone >/dev/null 2>&1 || error_exit "rclone 未安装"
|
||
command -v tar >/dev/null 2>&1 || error_exit "tar 未安装"
|
||
|
||
# 创建目录
|
||
mkdir -p "$BACKUP_DIR"
|
||
touch "$LOG_FILE" 2>/dev/null || LOG_FILE="/tmp/backup-gdrive.log"
|
||
|
||
local timestamp=$(date +%Y%m%d_%H%M%S)
|
||
local backup_name="${BACKUP_PREFIX}_${timestamp}.tar.gz"
|
||
local backup_path="${BACKUP_DIR}/${backup_name}"
|
||
|
||
# 检查所有源目录
|
||
local valid_dirs=()
|
||
for dir in "${SOURCE_DIRS[@]}"; do
|
||
if [[ -d "$dir" ]]; then
|
||
valid_dirs+=("$dir")
|
||
log "备份目录: $dir"
|
||
else
|
||
log "警告: 目录不存在,跳过: $dir"
|
||
fi
|
||
done
|
||
|
||
[[ ${#valid_dirs[@]} -eq 0 ]] && error_exit "没有有效的备份目录"
|
||
|
||
# 创建备份(多目录打包)
|
||
log "创建备份: $backup_path"
|
||
tar -czf "$backup_path" "${valid_dirs[@]}" 2>/dev/null \
|
||
|| error_exit "创建备份失败"
|
||
|
||
local size=$(du -h "$backup_path" | cut -f1)
|
||
log "备份完成,大小: ${size}"
|
||
|
||
# 上传
|
||
log "上传到 ${RCLONE_REMOTE}:${REMOTE_DIR}/"
|
||
rclone copy "$backup_path" "${RCLONE_REMOTE}:${REMOTE_DIR}/" \
|
||
--progress --log-file="$LOG_FILE" --log-level INFO \
|
||
|| error_exit "上传失败"
|
||
log "上传完成"
|
||
|
||
# 清理本地
|
||
log "清理 ${LOCAL_RETENTION_DAYS} 天前的本地备份..."
|
||
find "$BACKUP_DIR" -name "${BACKUP_PREFIX}_*.tar.gz" -type f -mtime +${LOCAL_RETENTION_DAYS} -delete 2>/dev/null || true
|
||
|
||
# 清理远程
|
||
log "清理 ${REMOTE_RETENTION_DAYS} 天前的远程备份..."
|
||
rclone delete "${RCLONE_REMOTE}:${REMOTE_DIR}/" \
|
||
--min-age "${REMOTE_RETENTION_DAYS}d" \
|
||
--include "${BACKUP_PREFIX}_*.tar.gz" 2>/dev/null || true
|
||
|
||
log "========== 备份任务完成 =========="
|
||
}
|
||
|
||
main "$@"
|
||
SCRIPT_EOF
|
||
|
||
# 替换配置值
|
||
sed -i "s|__SOURCE_DIRS__|${dirs_array}|g" "$SCRIPT_PATH"
|
||
sed -i "s|__BACKUP_DIR__|$BACKUP_DIR|g" "$SCRIPT_PATH"
|
||
sed -i "s|__RCLONE_REMOTE__|$RCLONE_REMOTE|g" "$SCRIPT_PATH"
|
||
sed -i "s|__REMOTE_DIR__|$REMOTE_DIR|g" "$SCRIPT_PATH"
|
||
sed -i "s|__BACKUP_PREFIX__|$BACKUP_PREFIX|g" "$SCRIPT_PATH"
|
||
sed -i "s|__LOCAL_RETENTION__|$LOCAL_RETENTION|g" "$SCRIPT_PATH"
|
||
sed -i "s|__REMOTE_RETENTION__|$REMOTE_RETENTION|g" "$SCRIPT_PATH"
|
||
sed -i "s|__LOG_FILE__|$LOG_FILE|g" "$SCRIPT_PATH"
|
||
|
||
chmod +x "$SCRIPT_PATH"
|
||
print_success "备份脚本已创建: $SCRIPT_PATH"
|
||
}
|
||
|
||
# 创建 systemd 服务
|
||
create_systemd_service() {
|
||
print_header "创建 systemd 服务"
|
||
|
||
# Service 文件
|
||
cat > "$SERVICE_PATH" << EOF
|
||
[Unit]
|
||
Description=备份目录到 Google Drive
|
||
After=network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=oneshot
|
||
ExecStart=$SCRIPT_PATH
|
||
User=root
|
||
TimeoutStartSec=3600
|
||
StandardOutput=journal
|
||
StandardError=journal
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
print_success "Service 文件: $SERVICE_PATH"
|
||
|
||
# Timer 文件
|
||
cat > "$TIMER_PATH" << EOF
|
||
[Unit]
|
||
Description=定时备份到 Google Drive
|
||
|
||
[Timer]
|
||
OnCalendar=$SCHEDULE
|
||
Persistent=true
|
||
RandomizedDelaySec=300
|
||
|
||
[Install]
|
||
WantedBy=timers.target
|
||
EOF
|
||
print_success "Timer 文件: $TIMER_PATH"
|
||
|
||
# 重载并启用
|
||
systemctl daemon-reload
|
||
systemctl enable backup-to-gdrive.timer
|
||
systemctl start backup-to-gdrive.timer
|
||
|
||
print_success "定时任务已启用"
|
||
}
|
||
|
||
# 显示完成信息
|
||
show_completion() {
|
||
print_header "🎉 安装完成!"
|
||
|
||
echo -e "${BOLD}常用命令:${NC}"
|
||
echo ""
|
||
echo " # 查看定时器状态"
|
||
echo -e " ${CYAN}systemctl status backup-to-gdrive.timer${NC}"
|
||
echo ""
|
||
echo " # 查看下次执行时间"
|
||
echo -e " ${CYAN}systemctl list-timers backup-to-gdrive.timer${NC}"
|
||
echo ""
|
||
echo " # 手动立即执行备份"
|
||
echo -e " ${CYAN}systemctl start backup-to-gdrive.service${NC}"
|
||
echo ""
|
||
echo " # 查看备份日志"
|
||
echo -e " ${CYAN}tail -f $LOG_FILE${NC}"
|
||
echo -e " ${CYAN}journalctl -u backup-to-gdrive.service -f${NC}"
|
||
echo ""
|
||
echo " # 停止定时任务"
|
||
echo -e " ${CYAN}systemctl stop backup-to-gdrive.timer${NC}"
|
||
echo ""
|
||
echo " # 编辑备份配置"
|
||
echo -e " ${CYAN}nano $SCRIPT_PATH${NC}"
|
||
echo ""
|
||
|
||
echo -e "${BOLD}定时器状态:${NC}"
|
||
systemctl list-timers backup-to-gdrive.timer --no-pager 2>/dev/null || true
|
||
|
||
echo ""
|
||
read -p "是否立即执行一次备份测试?[y/N]: " run_now
|
||
if [[ "$run_now" =~ ^[Yy]$ ]]; then
|
||
echo ""
|
||
print_info "开始执行备份..."
|
||
systemctl start backup-to-gdrive.service
|
||
echo ""
|
||
print_success "备份测试完成!查看日志: tail $LOG_FILE"
|
||
fi
|
||
}
|
||
|
||
# 卸载函数
|
||
uninstall() {
|
||
print_header "卸载备份服务"
|
||
|
||
read -p "确认卸载?[y/N]: " confirm
|
||
[[ ! "$confirm" =~ ^[Yy]$ ]] && exit 0
|
||
|
||
systemctl stop backup-to-gdrive.timer 2>/dev/null || true
|
||
systemctl disable backup-to-gdrive.timer 2>/dev/null || true
|
||
rm -f "$SCRIPT_PATH" "$SERVICE_PATH" "$TIMER_PATH"
|
||
systemctl daemon-reload
|
||
|
||
print_success "卸载完成"
|
||
echo ""
|
||
echo "以下文件未删除(如需清理请手动删除):"
|
||
echo " • 本地备份: /var/backups/gdrive-backups/"
|
||
echo " • 日志文件: $LOG_FILE"
|
||
echo " • rclone 配置: ~/.config/rclone/rclone.conf"
|
||
}
|
||
|
||
# 显示帮助
|
||
show_help() {
|
||
echo "用法: sudo bash $0 [选项]"
|
||
echo ""
|
||
echo "选项:"
|
||
echo " (无参数) 交互式安装配置"
|
||
echo " uninstall 卸载备份服务"
|
||
echo " status 查看服务状态"
|
||
echo " run 立即执行一次备份"
|
||
echo " log 查看备份日志"
|
||
echo " help 显示此帮助"
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
case "${1:-}" in
|
||
uninstall|--uninstall)
|
||
check_root
|
||
uninstall
|
||
;;
|
||
status|--status)
|
||
systemctl status backup-to-gdrive.timer
|
||
echo ""
|
||
systemctl list-timers backup-to-gdrive.timer
|
||
;;
|
||
run|--run)
|
||
check_root
|
||
systemctl start backup-to-gdrive.service
|
||
journalctl -u backup-to-gdrive.service -n 50 --no-pager
|
||
;;
|
||
log|--log)
|
||
tail -f "$LOG_FILE"
|
||
;;
|
||
help|--help|-h)
|
||
show_help
|
||
;;
|
||
*)
|
||
echo ""
|
||
echo -e "${BOLD}╔════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${BOLD}║ 📦 定时备份到 Google Drive 一键配置脚本 ║${NC}"
|
||
echo -e "${BOLD}╚════════════════════════════════════════════════╝${NC}"
|
||
|
||
check_root
|
||
install_rclone
|
||
input_source_dirs
|
||
get_config
|
||
confirm_config
|
||
configure_rclone
|
||
create_backup_script
|
||
create_systemd_service
|
||
show_completion
|
||
;;
|
||
esac
|
||
}
|
||
|
||
main "$@" |