backup (3155B)
1 #!/bin/sh 2 3 set -eu 4 5 # --- Configurações XDG --- 6 XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}" 7 XDG_DOCUMENTS_DIR="${XDG_DOCUMENTS_DIR:-$HOME/documents}" 8 XDG_MUSIC_DIR="${XDG_MUSIC_DIR:-$HOME/music}" 9 XDG_PICTURES_DIR="${XDG_PICTURES_DIR:-$HOME/pictures}" 10 XDG_VIDEOS_DIR="${XDG_VIDEOS_DIR:-$HOME/videos}" 11 12 REMOTE="disroot" 13 RCLONE_BASE_URL="https://cloud.disroot.org/remote.php/dav/files" 14 ACTION="${1:-}" 15 16 # --- 1. Verificação de dependências --- 17 MISSING="" 18 command -v rclone >/dev/null 2>&1 || MISSING="$MISSING rclone" 19 command -v rsync >/dev/null 2>&1 || MISSING="$MISSING rsync" 20 21 if [ -n "$MISSING" ]; then 22 echo "Instalando ferramentas de sincronização:$MISSING..." 23 doas apk add $MISSING || { echo "Erro ao instalar dependências." >&2; exit 1; } 24 fi 25 26 # --- 2. Validação do comando --- 27 case "$ACTION" in 28 login|push|pull) ;; 29 *) 30 echo "Uso: $(basename "$0") [login|push|pull]" 31 exit 1 32 ;; 33 esac 34 35 # --- 3. Comando: LOGIN --- 36 if [ "$ACTION" = "login" ]; then 37 echo "Configurando acesso ao $REMOTE..." 38 printf "Usuário Disroot: " && read -r R_USER 39 printf "Senha Disroot: " 40 stty -echo && read -r R_PASS && stty echo && echo "" 41 42 OBSCURED=$(rclone obscure "$R_PASS") || exit 1 43 44 rclone config create "$REMOTE" webdav \ 45 url="$RCLONE_BASE_URL/$R_USER" \ 46 vendor="nextcloud" \ 47 user="$R_USER" \ 48 pass="$OBSCURED" \ 49 --non-interactive 50 51 echo "Configurado com sucesso!" 52 exit 0 53 fi 54 55 # --- 4. Verificação de segurança --- 56 if ! rclone listremotes | grep -q "^${REMOTE}:$"; then 57 echo "Erro: Controle remoto '$REMOTE' não encontrado. Rode: $(basename "$0") login" >&2 58 exit 1 59 fi 60 61 echo "Iniciando: $ACTION..." 62 63 # --- 5. Sincronização dos diretórios --- 64 set -- \ 65 "documents:$XDG_DOCUMENTS_DIR" \ 66 "music:$XDG_MUSIC_DIR" \ 67 "pictures:$XDG_PICTURES_DIR" \ 68 "videos:$XDG_VIDEOS_DIR" \ 69 "abook:$XDG_DATA_HOME/abook" 70 71 for entry; do 72 rem="${entry%%:*}" 73 loc="${entry#*:}" 74 75 if [ "$ACTION" = "push" ]; then 76 # Ignora e pula a pasta se ela não existir localmente 77 if [ ! -d "$loc" ]; then 78 echo "Aviso: Diretório local '$loc' não existe. Ignorando push..." 79 continue 80 fi 81 82 rclone sync "$loc" "$REMOTE:$rem" \ 83 --delete-excluded \ 84 --backup-dir="$REMOTE:trash/$(date +%Y-%m-%d)/$rem" \ 85 -P 86 else 87 # No pull, cria o diretório local se não existir para receber os arquivos 88 mkdir -p "$loc" 89 rclone sync "$REMOTE:$rem" "$loc" -P 90 fi 91 done 92 93 # --- 6. Sincronização do 'bookmarks' --- 94 BOOKMARKS_LOC="$XDG_DATA_HOME/bookmarks" 95 96 if [ "$ACTION" = "push" ]; then 97 # Só faz o rclone copyto se o arquivo de bookmarks realmente existir localmente 98 if [ -f "$BOOKMARKS_LOC" ]; then 99 rclone copyto "$BOOKMARKS_LOC" "$REMOTE:bookmarks" -P 100 else 101 echo "Aviso: Arquivo de bookmarks '$BOOKMARKS_LOC' não encontrado. Ignorando push..." 102 fi 103 else 104 mkdir -p "$(dirname "$BOOKMARKS_LOC")" 105 rclone copyto "$REMOTE:bookmarks" "$BOOKMARKS_LOC" -P 106 fi 107 108 echo "Sincronização ($ACTION) concluída!"