Guest User

hamacker

a guest
Aug 17th, 2009
1,547
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 12.57 KB | None | 0 0
  1. #!/bin/bash
  2. # Script desenvolvido por : hamacker <sirhamacker[em]gmail.com>
  3. # Data : 14/Ago/2009
  4. # Objetivo : Turbinar o backup e acabar com a necessidade de compactar
  5. #            pastas inteiras, compactando apenas os arquivos que h�
  6. #            na pasta e mantendo a estrutura original de pastas da
  7. #            unidade de origem.
  8. # Uso : Faz backup de arquivos/pastas selecionadas para discos usb
  9. #       O importante neste script � a funcao do_copy que faz
  10. #       a c�pia de pastas selecionadas para a unidade de destino
  11. #       compactando-os com gzip apenas quando a extens�o do arquivo
  12. #       j� n�o for um arquivo compactado, por exemplo, n�o faz sentido
  13. #       compactar um arquivo jpeg, avi ou mp3, pois todos eles j� s�o
  14. #       arquivos compactados. O script tambem possui linhas de restri��o,
  15. #       isto �, a variavel LISTA_NAO_SALVAR contem extensoes de arquivos
  16. #       temporarios que n�o devem ser copiados.
  17. #       Al�m disso, o arquivo mant�m a mesma estrutura do que era na origem, ex:
  18. #       Original :
  19. #       /home/fulano/planilhas/compras.xls
  20. #       /home/fulano/textos/poesias/minha-esposa.doc
  21. #       /home/fulano/musicas/mp3/testando-minha-voz.mp3
  22. #       Ficar� assim na unidade de destino do backup (supondo que fosse em /media/usbdisk) :
  23. #       /media/usbdisk/home/fulano/planilhas/compras.xls.gz
  24. #       /media/usbdisk/home/fulano/textos/poesias/minha-esposa.doc.gz
  25. #       /media/usbdisk/home/fulano/musicas/mp3/testando-minha-voz.mp3
  26. #       Agora voce deve ter entendido o objetivo do script, fazer o backup de forma mais veloz
  27. #       e sem a necessidade de arquivos de logs que digam o que h� dentro de cada .zip ou .tar.gz
  28. #       como seria necessario se fosse compactar as pastas inteiras
  29. # Modo de restaurar o backup :
  30. #      Os arquivos sao compactados com o gzip, assim basta usar um gunzip para descompacta-lo.
  31. #      Se voce quiser transformar os arquivos compactados em arquivos descompactaados
  32. #      de uma pasta/subpasta recursivamente, � s� executar:
  33. #      gunzip -r /local/da/pasta/onde/esta/o/backup
  34. #      e todos os arquivos que estiverem sido compactados com o gzip serao transformados em descompactados.
  35. #      Voce deve certificar-se antes de que o local onde estarao sendo transformados/descompactados tenha
  36. #      espa�o suficiente.
  37. #
  38. ############
  39. # funcoes  #
  40. ############
  41. function log() {
  42.   if [ -z "$1" ] ; then
  43.     echo "Parametro para log esta vazio"
  44.     return
  45.   fi
  46.   if [ -z "$backup_title" ] || [ "$backup_title" = "" ] ; then
  47.     backup_title="backup-`date +%Y-%m-%d`"
  48.   fi
  49.   if [ -z "$backup_file_log" ] || [ "$backup_file_log" = "" ] ; then
  50.     backup_file_log="/var/log/$backup_title.log"
  51.   fi  
  52.   if ! [ -f "$backup_file_log" ] ; then
  53.     echo "Arquivo para registrar log [$backup_file_log]  n�o existe !"
  54.     echo -ne "Criando um arquivo vazio..."
  55.     touch "$backup_file_log"
  56.   fi
  57.   echo "$1"
  58.   echo "$1" >>$backup_file_log
  59. }
  60.  
  61. function do_remover_acentuacao {
  62.   RETURN_STRING=""
  63.   ORIGINAL_STRING="$1"
  64.   NEW_STRING=""
  65.   SUBST_CHAR="_"
  66.   ACCEPT_CHARS="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!-_=+(){}[]\\,./"
  67.   if [ -f "/usr/bin/unaccent" ] ; then
  68.       NEW_STRING=`/usr/bin/unaccent UTF-8 "$ORIGINAL_STRING"`
  69.       if [ -z "$NEW_STRING" ] || [ "$NEW_STRING" = "" ] ; then
  70.         NEW_STRING="$ORIGINAL_STRING"
  71.       fi
  72.   fi
  73.   LEN=${#NEW_STRING}
  74.   POS=0
  75.   while [ $POS -le $LEN ] ; do
  76.    CHAR="${NEW_STRING:$POS:1}"
  77.    if [[ "$ACCEPT_CHARS" =~ "$CHAR" ]] ; then
  78.      RETURN_STRING="$RETURN_STRING$CHAR"
  79.    else
  80.      RETURN_STRING="$RETURN_STRING$SUBST_CHAR"
  81.    fi
  82.    POS=$((POS+1))
  83.   done
  84.   NEW_LEN=${#RETURN_STRING}
  85.  
  86.   if [ $LEN != $NEW_LEN ] ; then
  87.     RETURN_STRING="$ORIGINAL_STRING"
  88.   fi
  89. }
  90.  
  91. function do_copy() {
  92.   # copia uma pasta de um local de origem
  93.   # para um local de destino
  94.   # Porem faz a compactacao para o destino
  95.   copiar_de_origem="$1"
  96.   copiar_para_destino="$2"
  97.   RESULT_VALUE="OK"
  98.   LISTA_NAO_COMPACTAR=".7z .ace .ain .alz .apz .ar .arc .ari .arj .ark .axx .b64 .ba .bh .boo .bz .bz2 .bzip \
  99.  .bzip2 .c00 .c01 .c02 .car .cbr .cbz .cp9 .cpgz .cpt .dar .dd .deb .dgc .dist .ecs .efw \
  100.  .fdp .gca .gz .gzi .gzip .ha .hbc .hbc2 .hbe .hki .hki1 .hki2 .hki3 .hpk .hyp .ice .ipg \
  101.  .ipk .ish .j .jgz .jic .kgb .lbr .lemon .lha .lnx .lqr .lzh .lzm .lzma .lzo .lzx .md .mint \
  102.  .mpkg .mzp .p7m .package .pae .pak .paq6 .paq7 .paq8 .par .par2 .pbi .pcv .pea .pf .pim .pit \
  103.  .piz .pkg .pup .pup .puz .pwa .qda .r00 .r01 .r02 .r03 .rar .rev .rk .rnc .rpm .rte .rz .rzs \
  104.  .s00 .s01 .s02 .s7z .sar .sdc .sdn .sea .sen .sfs .sfx .sh .shar .shk .shr .sit .sitx .spt \
  105.  .sqx .sqz .tar .taz .tbz .tbz2 .tg .tgz .tlz .tz .uc2 .uha .vsi .wad .war .wot .xef .xez \
  106.  .xpi .xx .y .yz .z .z01 .z02 .z03 .z04 .zap .zip .zipx .zix .zoo .zz .jpg .png .gif .cab .exe .avi .mpg .mp3 .mp2 .aac"
  107.  
  108.   LISTA_NAO_SALVAR=".\$\$\$ .tmp .swp .lnk"
  109.  
  110.   if [ "$copiar_de_origem" = "" ] ; then
  111.      log "Erro na copia de arquivos : O endereco de origem n�o foi informado."
  112.      return
  113.   fi  
  114.   if [ "$copiar_para_destino" = "" ] ; then
  115.      log "Erro na copia de arquivos : O endereco de destino n�o foi informado."
  116.      return
  117.   fi
  118.   if ! [ -d  "$copiar_para_destino" ] ; then
  119.     mkdir -p "$copiar_para_destino"
  120.   fi
  121.  
  122.   # lendo todos os arquivos na pasta de origem e jogando para dentro de um arquivo temporario
  123.   temp=`mktemp`
  124.   find "$copiar_de_origem/" -type f >$temp
  125.   while read ARQ_ATUAL ; do
  126.     ARQ_ATUAL_PASTA=`dirname "$ARQ_ATUAL"`
  127.     NOME_ARQUIVO=`basename "$ARQ_ATUAL"`
  128.  
  129.     # entao remover a acentuacao que houver no nome de arquivo
  130.     do_remover_acentuacao "$NOME_ARQUIVO"
  131.     NOME_ARQUIVO="$RETURN_STRING"
  132.  
  133.     # Apenas nomes/extensoes de arquivos compactados em minusculo
  134.     NOME_ARQUIVO=`echo "$NOME_ARQUIVO" | tr [:upper:] [:lower:]`
  135.     NOME_ARQUIVO_EXT=${NOME_ARQUIVO#*.}
  136.     NOME_ARQUIVO_EXT=`echo "$NOME_ARQUIVO_EXT" | tr [:upper:] [:lower:]`
  137.  
  138.     # remover a acentuacao que houver no nome da pasta
  139.     do_remover_acentuacao "$copiar_para_destino/$ARQ_ATUAL_PASTA"
  140.     NOVA_PASTA="$RETURN_STRING"
  141.     # trocando //mnt por /
  142.     NOVA_PASTA=${NOVA_PASTA//\/\/mnt/\/}
  143.     # trocando //media/ por /
  144.     NOVA_PASTA=${NOVA_PASTA//\/\/media/\/}
  145.    
  146.     # As linhas a seguir vao determinar se havera compactacao ou se realmente
  147.     # � necessario fazer o backup de tal arquivo
  148.     COMPACTAR_ARQUIVO="S"
  149.     SALVAR_ARQUIVO="S"
  150.    
  151.     # tratando arquivos que n�o devem ser salvos no backup
  152.     [[ "$LISTA_NAO_SALVAR" =~ "$NOME_ARQUIVO_EXT" ]] && SALVAR_ARQUIVO="N"
  153.     [[ "$ARQ_ATUAL" =~ "RECYCLER" ]] && SALVAR_ARQUIVO="N"
  154.     [ "$NOME_ARQUIVO" = "thumbs.db" ] && SALVAR_ARQUIVO="N"  
  155.    
  156.     # tratando de nomes de arquivos que n�o devem ser compactados
  157.     [ "$NOME_ARQUIVO" = "setup.exe" ] && COMPACTAR_ARQUIVO="N"
  158.     [ "$NOME_ARQUIVO" = "install.exe" ] && COMPACTAR_ARQUIVO="N"
  159.     [ "$NOME_ARQUIVO" = "instalar.exe" ] && COMPACTAR_ARQUIVO="N"      
  160.    
  161.     if [ "$SALVAR_ARQUIVO" = "S" ] ; then
  162.       ! [ -d "$NOVA_PASTA" ] && mkdir -p "$NOVA_PASTA"
  163.       [[ "$LISTA_NAO_COMPACTAR" =~ "$NOME_ARQUIVO_EXT" ]] && COMPACTAR_ARQUIVO="N"
  164.       if [  "$COMPACTAR_ARQUIVO" = "S" ] ; then
  165.         echo "[$NOME_ARQUIVO_EXT] transferindo [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO.gz]"
  166.         gzip -c "$ARQ_ATUAL" >"$NOVA_PASTA/$NOME_ARQUIVO.gz"
  167.         if [ $? -ne 0 ] ; then
  168.            log "[backup-falhou] : erro ao copiar [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO.gz]"
  169.            RESULT_VALUE="FALHOU"
  170.         fi
  171.       else
  172.         echo "[$NOME_ARQUIVO_EXT] transferindo [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO]"
  173.         cp  "$ARQ_ATUAL" "$NOVA_PASTA/$NOME_ARQUIVO"
  174.         if [ $? -ne 0 ] ; then
  175.            log "[backup-falhou] : erro ao copiar [$ARQ_ATUAL] para [$NOVA_PASTA/$NOME_ARQUIVO]"
  176.            RESULT_VALUE="FALHOU"
  177.         fi
  178.       fi
  179.     fi
  180.   done < $temp
  181.   [ -f "$temp" ] && rm -f "$temp"
  182. }
  183.  
  184. function do_copy_7z() {
  185.   # copia uma pasta de um local de origem
  186.   # para um local de destino
  187.   # Porem faz a compactacao para o destino
  188.   copiar_de_origem="$1"
  189.   copiar_para_destino="$2"
  190.   if [ -z "$backup_title" ] || [ "$backup_title" = "" ] ; then
  191.     backup_title="backup-`date +%Y-%m-%d`"
  192.   fi
  193.   if [ -z "$backup_file_log" ] || [ "$backup_file_log" = "" ] ; then
  194.     backup_file_log="/var/log/$backup_title.log"
  195.   fi  
  196.   RESULT_VALUE="FALHOU"
  197.  
  198.   #### USANDO 7ZIP ####
  199.   COMPACTAR="/usr/bin/7z a -y -t7z -l -m0=lzma -mx=3 -mfb=64 -md=32m -ms=on -v100m "
  200.   COMPACTAR_EXT="7z"
  201.   COMPACTAR_CATALOGAR="/usr/bin/7z l "
  202.  
  203.   if [ "$copiar_de_origem" = "" ] ; then
  204.      log "Erro na copia de arquivos : O endehttp://pastebin.com/f73e5457creco de origem n�o foi informado."
  205.      return
  206.   fi  
  207.   if [ "$copiar_para_destino" = "" ] ; then
  208.      log "Erro na copia de arquivos : O endereco de destino n�o foi informado."
  209.      return
  210.   fi
  211.   if ! [ -d  "$copiar_para_destino" ] ; then
  212.     mkdir -p "$copiar_para_destino"
  213.   fi  
  214.  
  215.   unset backup_lista_subpasta
  216.   TEMP_FILE=`mktemp`
  217.   find $copiar_de_origem/* -maxdepth 0 -type d >$TEMP_FILE
  218.   while read PASTA_ATUAL ; do
  219.     backup_lista_subpasta=( "${backup_lista_subpasta[@]}" "$PASTA_ATUAL" )
  220.   done < $TEMP_FILE
  221.  
  222.   for copiar_de_origem in "${backup_lista_subpasta[@]}" ; do
  223.     # se tiver instalado o programa /usr/bin/unaccent entao removo o acento
  224.     # no nome do arquivo compactado
  225.     if [ -f "/usr/bin/unaccent" ] ; then
  226.       backup_file=`/usr/bin/unaccent UTF-8 "$copiar_de_origem"`
  227.     else
  228.       backup_file="$copiar_de_origem"
  229.     fi
  230.  
  231.     # Apenas nomes compactados em minusculo
  232.     backup_file=`echo "$backup_file" | tr [:upper:] [:lower:]`
  233.    
  234.     # trocando // por servidor_ (caso de a origem for um endereco smb //server/compartilhamento)
  235.     if [ "${backup_file:0:2}" = "//" ] ; then
  236.       backup_file=${copiar_de_origem//\/\//servidor_}
  237.     else
  238.       # removendo o primeiro "/" do endereco para compor o nome nome
  239.       if [ "${backup_file:0:1}" = "/" ] ; then
  240.         backup_file=${backup_file:1}
  241.       fi
  242.     fi
  243.     # trocando / por :
  244.     backup_file=${backup_file//\//:}
  245.     # trocando :mnt: por nada
  246.     backup_file=${backup_file//:mnt:/}
  247.     # trocando :media: por nada
  248.     backup_file=${backup_file//:media:/}
  249.     # trocando : por _
  250.     backup_file=${backup_file//:/_}
  251.     # acrescentando o caminho completo
  252.     backup_file="$copiar_para_destino/$backup_title-$backup_file.$COMPACTAR_EXT"
  253.     # instrucao para realizacao do backup, o algarismo "2" no final da linha
  254.     # ira redirecionar mensagens de erro (stderr) para o arquivo de log, aten��o que
  255.     # nem todos os compactadores enviam mensagens de erro para strerr, � o caso
  256.     # do programa zip
  257.     $COMPACTAR "$backup_file" "$copiar_de_origem" 2>>$backup_file_log
  258.     # verificando se ouve erro
  259.     if [ $? -ne 0 ] ; then
  260.        RESULT_VALUE="FALHOU"
  261.        log "Backup de [$copiar_de_origem] completado por�m com alguns erros, verifique o log para saber quais s�o."
  262.     else
  263.        log "Backup de [$copiar_de_origem] completado com sucesso."
  264.        RESULT_VALUE="OK"
  265.     fi
  266.     if [ -f "$backup_file" ] || [ -f "$backup_file.001" ] ; then
  267.        # Catalogando o arquivo de backup recem-criado
  268.        [ -f "$backup_file" ] && $COMPACTAR_CATALOGAR "$backup_file" >"$backup_file.txt"
  269.        [ -f "$backup_file.001" ] && $COMPACTAR_CATALOGAR "$backup_file.001" >"$backup_file.txt"
  270.     fi
  271.   done
  272. }
  273.  
  274. ############################
  275. # Inicio do Programa       #
  276. ############################
  277. backup_title="backup-`date +%Y-%m-%d`"
  278. backup_file_log="/var/log/$backup_title.log"
  279. if ! [ -d "`dirname $backup_file_log`" ] ; then
  280.   mkdir -p "`dirname $backup_file_log`"
  281. fi
  282.  
  283. # local de destino do backup
  284. # se for uma unidade usb, nao esque�a de monta-la primeiro
  285. destino="/media/disk"
  286.  
  287. # lista de pastas a serem backupeadas
  288. # basta duplicar uma linha para acrescentar novas pastas
  289. # para serem backupeadas
  290. unset backup_lista
  291. backup_lista=( "${backup_lista[@]}" "/home/fulano" )
  292. backup_lista=( "${backup_lista[@]}" "/home/fulano/.ecryptfs" )
  293. backup_lista=( "${backup_lista[@]}" "/home/fulano/.mozilla" )
  294. backup_lista=( "${backup_lista[@]}" "/home/dados" )
  295. backup_lista=( "${backup_lista[@]}" "/var/cache/apt/archives" )
  296. # realizando o backup dos volumes alistados acima
  297. # use do_copy para fazer o backup com compactacao individual de arquivos,
  298. # ou use do_copy_7z para fazer o backup com compactacao por pastas
  299. for origem in "${backup_lista[@]}" ; do
  300.   do_copy_7z "$origem" "$destino"
  301.   if [ "$RESULT_VALUE" != "OK" ] ; then
  302.     echo "Backup feito, por�m com falhas !"
  303.   else
  304.     echo "Backup feito com sucesso !"
  305.   fi
  306. done
  307. log "Se precisar consultar mensagens de erro, veja [$backup_file_log]."
  308. exit 0;
Advertisement
Add Comment
Please, Sign In to add comment