dotfiles

Repositório dotfiles
git clone git://git.sivaldodavi.com/dotfiles.git
Log | Files | Refs | README

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!"