#!/bin/bash # ============================================================ # restore-vault.sh — Restaurar backup do Vault Obsidian # Uso: ./restore-vault.sh [YYYYMMDD_HHMMSS] # ./restore-vault.sh list → lista backups disponíveis # ./restore-vault.sh latest → restaura o mais recente # ============================================================ set -e VAULT_DIR="C:/Users/Iris/Vaults/ecommerce-kb" BACKUP_DIR="C:/Users/Iris/backups/vault" LOG_FILE="$BACKUP_DIR/restore.log" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # Mostrar ajuda show_help() { cat << EOF ${GREEN}restore-vault.sh — Restaurar Vault Obsidian${NC} ${YELLOW}Uso:${NC} $0 list Lista backups disponíveis $0 latest Restaura o backup mais recente $0 Restaura backup específico (ex: 20250617_020000) $0 dry-run Simula restauração (sem sobrescrever) ${YELLOW}Exemplos:${NC} $0 list $0 latest $0 20250617_020000 ${YELLOW}Arquivos de backup:${NC} $BACKUP_DIR/vault_YYYYMMDD_HHMMSS.tar.gz EOF } # Listar backups disponíveis list_backups() { log "${BLUE}=== BACKUPS DISPONÍVEIS ===${NC}" echo "" if ls "$BACKUP_DIR"/vault_*.tar.gz 1>/dev/null 2>&1; then echo -e "${GREEN}ID | Timestamp | Tamanho | Data${NC}" echo -e "${GREEN}----|---------------------|---------|----------------${NC}" ID=1 for file in $(ls -t "$BACKUP_DIR"/vault_*.tar.gz); do TIMESTAMP=$(basename "$file" | sed 's/vault_\(.*\)\.tar\.gz/\1/') SIZE=$(du -h "$file" | cut -f1) DATE=$(date -r "$file" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo "unknown") printf "${GREEN}%3d | %s | %6s | %s${NC}\n" "$ID" "$TIMESTAMP" "$SIZE" "$DATE" ID=$((ID + 1)) done echo "" log "Total: $(ls "$BACKUP_DIR"/vault_*.tar.gz | wc -l) backup(s)" else log "${RED}Nenhum backup encontrado em $BACKUP_DIR${NC}" exit 1 fi } # Restaurar backup específico restore_backup() { local TIMESTAMP="$1" local DRY_RUN="${2:-false}" # Encontrar arquivo de backup if [ -n "$TIMESTAMP" ]; then BACKUP_FILE="$BACKUP_DIR/vault_${TIMESTAMP}.tar.gz" else # Pegar o mais recente BACKUP_FILE=$(ls -t "$BACKUP_DIR"/vault_*.tar.gz 2>/dev/null | head -1) TIMESTAMP=$(basename "$BACKUP_FILE" | sed 's/vault_\(.*\)\.tar\.gz/\1/') fi if [ ! -f "$BACKUP_FILE" ]; then log "${RED}ERRO: Backup não encontrado: $(basename "$BACKUP_FILE")${NC}" log "Use '$0 list' para ver backups disponíveis" exit 1 fi log "${YELLOW}=== INICIANDO RESTAURAÇÃO ===${NC}" log "Backup: $(basename "$BACKUP_FILE")" log "Tamanho: $(du -h "$BACKUP_FILE" | cut -f1)" log "MD5: $(md5sum "$BACKUP_FILE" | cut -d' ' -f1)" if [ "$DRY_RUN" = "true" ]; then log "${YELLOW}[DRY-RUN] Simulando extração...${NC}" tar -tzf "$BACKUP_FILE" | head -20 log "${YELLOW}[DRY-RUN] Total de arquivos: $(tar -tzf "$BACKUP_FILE" | wc -l)${NC}" return fi # Perguntar confirmação echo "" read -p "Isso irá substituir o vault atual em $VAULT_DIR. Continuar? (s/N): " CONFIRM if [ "$CONFIRM" != "s" ] && [ "$CONFIRM" != "S" ]; then log "Resturação cancelada pelo usuário" exit 0 fi # Criar backup do estado atual antes de restaurar if [ -d "$VAULT_DIR" ]; then PRE_RESTORE="$BACKUP_DIR/pre_restore_${DATE}_$(date +%Y%m%d_%H%M%S).tar.gz" log "Criando backup do estado atual..." tar -czf "$PRE_RESTORE" -C "$(dirname "$VAULT_DIR")" "$(basename "$VAULT_DIR")" 2>/dev/null || true log "Backup de segurança: $(basename "$PRE_RESTORE")" fi # Extrair backup log "Extraindo backup..." # Backup do vault atual (se existir) if [ -d "$VAULT_DIR" ]; then TEMP_VAULT="${VAULT_DIR}_temp_$$" mv "$VAULT_DIR" "$TEMP_VAULT" fi # Extrair novo backup mkdir -p "$VAULT_DIR" if tar -xzf "$BACKUP_FILE" -C "$(dirname "$VAULT_DIR")"; then # O tar extrai para ecommerce-kb/ dentro do diretório pai EXTRACTED_DIR="$(dirname "$VAULT_DIR")/$(basename "$VAULT_DIR")" if [ -d "$EXTRACTED_DIR" ] && [ "$EXTRACTED_DIR" != "$VAULT_DIR" ]; then # Mover conteúdo extraído para o local correto mv "$EXTRACTED_DIR"/* "$VAULT_DIR/" 2>/dev/null || true rm -rf "$EXTRACTED_DIR" fi # Limpar vault temporário if [ -n "$TEMP_VAULT" ]; then rm -rf "$TEMP_VAULT" fi log "${GREEN}=== RESTAURAÇÃO CONCLUÍDA COM SUCESSO ===${NC}" log "Vault restaurado: $VAULT_DIR" log "Arquivos: $(find "$VAULT_DIR" -type f 2>/dev/null | wc -l)" log "Backup usado: $(basename "$BACKUP_FILE")" # Atualizar status if [ -f "$BACKUP_DIR/latest_status.json" ]; then log "Arquivo de status atualizado." fi else # Restaurar estado anterior em caso de erro if [ -n "$TEMP_VAULT" ]; then mv "$TEMP_VAULT" "$VAULT_DIR" fi log "${RED}ERRO: Falha ao extrair backup${NC}" exit 1 fi } # ==================== MAIN ==================== case "${1:-}" in list|l|ls) list_backups ;; latest) restore_backup "" ;; dry-run) if [ -z "$2" ]; then log "${RED}ERRO: Especifique o timestamp para dry-run${NC}" exit 1 fi restore_backup "$2" "true" ;; help|-h|--help) show_help ;; "") if [ -f "$BACKUP_DIR/latest_status.json" ]; then cat "$BACKUP_DIR/latest_status.json" fi echo "" show_help ;; *) restore_backup "$1" ;; esac