lisa 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/usr/bin/env bash
  2. #<SHELL STANDARD>
  3. #------------HEADER-----------------------------------------------------------|
  4. #AUTOR
  5. # Jefferson Rocha <lrcjefferson@gmail.com>
  6. #
  7. #PROGRAMA
  8. # Lisa
  9. #
  10. #VERSÃO
  11. # 1.0
  12. #
  13. #LICENÇA
  14. # MIT
  15. #
  16. #DESCRIÇÃO
  17. # Lisa é um sistema de backup que utiliza o rsync como principal forma de
  18. # backup e sincronismo 'Origem/Destino'.
  19. # Criada especialmente para fazer backups 'localmente' em dispositivos
  20. # removiveis ou não, Pendrives, HD, HD Externo.
  21. #
  22. #NOTA
  23. # A Lisa não utiliza os nomes de dispositivos, exemplo (/dev/sdb) (/dev/sdc)
  24. # ao invés disto é utilizado o UUID do dispositivo.
  25. # Com a informação do UUID do dispositivo fica menos sucessivel a falhas
  26. # existem vários problemas relacionados principalmente com HD's Externo,
  27. # as vezes montamos como /dev/sdb por exemplo, e ao desmontar é trocado para
  28. # /dev/sdc, com isto é gerado uma falha no backup, prefira indiciar o UUID.
  29. #
  30. # Para conseguir o UUID do dispositivo rode o comando 'lsblk -l' para
  31. # saber qual é o seu dispositivo. Em seguida rode o comando
  32. # 'blkid', para conseguir o UUID.
  33. # Copie o UUID do dispositivo e adicione em /etc/fstab
  34. # o ponto de montagem, exemplo de um HD externo em fstab:
  35. #
  36. # UUID=d4569c6f-2750-4128-a049-f225985aa812 /media/hd_externo ext4 auto 0 0
  37. #
  38. # Salve, desmonte todos dispositivos do fstab em seguida monte novamente:
  39. # umount -a
  40. # mount -a
  41. #
  42. #CHANGELOG:
  43. #
  44. #-----------------------------------------------------------------------------|
  45. #------VARS--------------------------------------#
  46. # ADICIONE A UUID DO SEU DISPOSITIVO AQUI!
  47. # Rode o comando 'lsblk -l' para identificar qual
  48. # o seu dispositivo em seguida rode 'blkid' e
  49. # pegue a UUID referente e adicione nesta
  50. # váriavel!
  51. UUID="d4569c6f-2750-4128-a049-f225985aa812"
  52. dispositivo_base="$(blkid -U $UUID)" # NÃO MEXER
  53. diretorio_de_montagem="/mnt/backup-lisa" # Qual diretorio será montado o Dispositivo?
  54. diretorio_para_envio="/home/slackjeff" # Qual diretorio enviar?
  55. log="/tmp/backup-lisa.log" # Especifique qual diretorio de login
  56. # Ative as opções que desejar, estas opções
  57. # podem ser ativas em linha caso você não
  58. # queira ficar mexendo no fonte do programa.
  59. verbose="" ; [[ "${VERBOSE:-sim}" = "sim" ]] && verbose="--verbose" # Modo Verboso
  60. update="" ; [[ "${UPDATE:-sim}" = "sim" ]] && update="--update" # Pula arquivos se são iguais c/data posterior origem/destino
  61. delete="" ; [[ "${DELETE:-sim}" = "sim" ]] && delete="--delete" # Não tem na origem? destino é excluido tambem!
  62. human="" ; [[ "${HUMAN:-sim}" = "sim" ]] && human="--human-readable" # Leitura para humanos Kbytes,Mega, Giga etc...
  63. archive="" ; [[ "${ARCHIVE:-sim}" = "sim" ]] && archive="--archive" # Modo de arquivamento, Copias de forma recursiva com preservação
  64. recursive="" ; [[ "${RECURSIVE:-nao}" = "sim" ]] && recursive="--recursive" # Cópia de forma recursiva, não preserva timestamp, permissão
  65. compress="" ; [[ "${COMPRESS:-sim}" = "sim" ]] && compress="--compress" # Compressão no envio, arquivos mais leves.
  66. progress="" ; [[ "${PROGRESS:-sim}" = "sim" ]] && progress="--progress" # Ativar progresso no envio
  67. linksymbols="" ; [[ "${LINKSYMBOLS:-nao}" = "sim" ]] && linksymbols="--safe-links" # Ignorar Links Symbolicos do envio
  68. perms="" ; [[ "${PERMS:-nao}" = "sim" ]] && perms="--perms" # Preservar Permissões dos arquivos/diretorios
  69. quiet="" ; [[ "${QUIET:-nao}" = "sim" ]] && quiet="--quiet" # Modo silencioso
  70. # Vamos fazer algumas verificações
  71. # para não dar conflito!
  72. #--------------------------------------------#
  73. # Verificando se DELETE/UPDATE está ativo.
  74. # Se caso o update está ativo e a opção
  75. # delete for ativada, não dará muito certo
  76. #--------------------------------------------#
  77. [[ "$delete" = "--delete" ]] && update="" # Desabilitando update
  78. [[ "$update" = "--update" ]] && delete="" # Desabilitando delete
  79. #--------------------------------------------#
  80. # Verificando se VERBOSE/QUIET está ativo.
  81. # Se caso a verbose está ativa e a opção
  82. # quiet for ativada, não dará muito certo,
  83. # precisamos desabilitar algum, para não
  84. # entrar em conflieto.
  85. #--------------------------------------------#
  86. [[ "$verbose" = "--verbose" ]] && quiet="" # Desabilitando quiet
  87. [[ "$quiet" = "--quiet" ]] && verbose="" # Desabilitando verbose
  88. #-------------------------------------------------#
  89. # Caso deseje Excluir Diretorios ou arquivos
  90. # que NÃO são necessários, como diretorios
  91. # de caches e arquivs etc... da sua sincronização
  92. # desmarque os exclude necessáros e adicione
  93. # o diretorio ou arquivo...
  94. # Há um padrão a seguir, siga o padrão para não
  95. # ter erros, template de exemplo:
  96. # exclude0="--exclude="*.mp3""
  97. #-------------------------------------------------#
  98. exclude1="--exclude=".*""
  99. exclude2="--exclude="Downloads""
  100. exclude3="--exclude="Desktop/ZeroBundle""
  101. #exclude4=""
  102. #exclude5=""
  103. #exclude6=""
  104. #exclude7=""
  105. #exclude8=""
  106. #exclude9=""
  107. #exclude10=""
  108. #--------------FIM VAR------------------------------#
  109. #--------------TESTES---------------------------#
  110. [[ $(id -u) -ne "0" ]] && exit 1 # É Root?
  111. [[ $(which rsync) ]] || { echo "Necessita do rsync..." ; exit 1 ;} # Rsync ta no sistema?
  112. #------------------------------#
  113. # Montando dispositivo,
  114. # vamos fazer 10 tentativas...
  115. #------------------------------#
  116. if ! df -h | grep -o "$dispositivo_base"; then
  117. dispositivo="off" # Iniciando váriavel
  118. contadora="1" # Iniciando váriavel com 1
  119. while [[ "$dispositivo" = "off" ]]; do
  120. if mount "$dispositivo_base" "$diretorio_de_montagem"; then
  121. dispositivo="on"
  122. else
  123. echo "###################################oooooooooooooi"
  124. fi
  125. [[ "$contadora" -eq "10" ]] && exit 1 || let contadora++
  126. done
  127. fi
  128. #-------------FIM TESTES-------------------------------#
  129. set -e # Deu erro parou.
  130. inicio="$(date +%H:%M:%S--%d/%m/%Y)" # Pegando Hora de Inicio
  131. if rsync \
  132. "$verbose" \
  133. "$update" \
  134. "$delete" \
  135. "$human" \
  136. "$archive" \
  137. "$recursive" \
  138. "$compress" \
  139. "$progress" \
  140. "$linksymbols" \
  141. "$perms" \
  142. "$quiet" \
  143. "$exclude1" \
  144. "$exclude2" \
  145. "$exclude3" \
  146. "$exclude4" \
  147. "$exclude5" \
  148. "$exclude6" \
  149. "$exclude7" \
  150. "$exclude8" \
  151. "$exclude9" \
  152. "$exclude10" \
  153. "$diretorio_para_envio" \
  154. "$diretorio_de_montagem"; then
  155. # Enviando Log caso o rsync NÃO falhe
  156. fim="$(date +%H:%M:%S--%d/%m/%Y)" # Pegando Hora de Fim
  157. echo "" >> "$log"
  158. echo "#-------------------------------------------#" >> "$log"
  159. echo -e "Iniciado em: $inicio \nFinalizado em: $fim" >> "$log"
  160. echo ">>BACKUP REALIZADO COM SUCESSO." >> "$log"
  161. echo "Gravado em $dispositivo_base" >> "$log"
  162. echo "#-------------------------------------------#" >> "$log"
  163. fi