Backup para CD-R/RW e DVD+/- R/RW

Publicado por Rui Costa 12/04/2006

[ Hits: 6.924 ]

Download back_cd_dvd.sh




Este é um script que elaborei para a criação de backups em CD's e DVD's, iniciado pelo utilizador.

Detecta automaticamente o tipo de disco inserido no gravador, se já tem dados gravados ou não e permite fazer cópias com ou sem compressão de dados.

  



Esconder código-fonte

#!/bin/sh

#Script de Backup para CD's e DVD's - Versao Novembro 2005

#Variáveis a adaptar 
   #origens -> Lista de directorias para fazer backup, separadas por espaços
   #backups -> Correspondencia entre as directorias de backup e as directorias no CD/DVD

   #device="/dev/sr0" -> Link para o dispositivo de gravação
   #deviceid="0,0,0"  -> ID SCSI do dispositivo de gravação
   #cdr_speed=8      -> Velocidade de gravação em CD-R
   #cdrw_speed=4      -> Velocidade de gravação em CD-RW
   #dvdr_speed=2      -> Velocidade de gravação em DVD-R e DVD+R
   #dvdrw_speed=2      -> Velocidade de gravação em DVD-R e DVD+RW
   #Nestas últimas 4 variáveis é ecessário ver as especifica?es do hardware

   #formato -> Formato das cópias ("normal" ou "targz")

clear

#_________________________________________________________
#Vari?eis que devemos definir para que tudo funcione bem
#---------------------------------------------------------
      #Relativas ao hardware
      device="/dev/dvd"
      deviceid="/dev/dvd"
      cdr_speed=16
      cdrw_speed=8
      dvdr_speed=4
      dvdrw_speed=2
      
      data=`date +%Y-%m-%d`
      
      #Relatórios
      dirrelat="/copias/relatorios"
      fichlog="$dirrelat"/backup_cd_dvd_"$data".txt
      
      #Imagem que vai ser gravada para CD/DVD
      fich_imagem="/tmp/backges$data.img"
      
      #Definição do formato da cópia - Alterar para "normal" caso não se queira cópias comprimidas
      formato="targz"
      
      if [ "$formato" = "normal" ]; then
         backups="basedados=/basedados definicoes=/var/defs samba=/etc/samba apache=/etc/apache2 sysconfig=/etc/sysconfig hosts=/etc/hosts"
      
      else
         backups="backup=/tmp/backups"
      fi


      #Para o caso de cópias comprimidas
      origens="/basedados /var/defs /etc/samba /etc/apache2 /etc/sysconfig /etc/hosts"
      fichbase="backup_diario"
      fichtar="/tmp/backups/$fichbase"_"$data.tar.gz"
      
      

echo " " >>$fichlog
echo " " >>$fichlog
echo "Início de Backup em $(date +%A", "%d"/"%m"/"%Y" ? "%H":"%M)" >>$fichlog

if [ "$formato" = "normal" ]; then
   echo "Backup de $backups no formato $formato"
   echo "Backup de $backups no formato $formato" >>$fichlog
else
   echo "Backup de $origens no formato tar.gz"
   echo "Backup de $origens no formato tar.gz" >>$fichlog
fi


if [ -d /tmp/backups ]; then
   rm -rf /tmp/backups/* >/dev/null 2>&1
fi
if [ -f /tmp/atipcd.txt ]; then
   rm -rf /tmp/atipcd.txt
fi
if [ -f /tmp/toccd.txt ]; then
   rm -rf /tmp/toccd.txt
fi
if [ -f /tmp/dvdrelat ]; then
   rm -rf /tmp/dvdrelat
fi
if [ -f /tmp/dvderros ]; then
   rm -rf /tmp/dvderros
fi



#Vamos ver o tipo de disco inserido no gravador e o tipo de unidade
      echo
      echo "A verificar o tipo de disco inserido"
      echo " " >>$fichlog
      echo "A verificar o tipo de disco inserido" >>$fichlog

      #cdrecord -debug=0 -s -eject dev=$deviceid >/dev/null 2>&1
      cdrecord -debug=0 -s -eject dev=$deviceid #>/dev/null 2>&1
      cdrecord -debug=0 -s -load dev=$deviceid >/dev/null 2>&1
      dvd+rw-mediainfo $device >/tmp/dvdrelat 2>/tmp/dvderros

      #Vamos ver se temos um gravador de CD's ou DVD's
      grep "not a DVD unit" /tmp/dvderros >/dev/null 2>&1
      dvdunit=$?
      
      if [ $dvdunit -eq 0 ]; then       #É um gravador de CD's
         tipodisco="CD"
      else
         #teste=`more /tmp/dvderros|fgrep -i "mounted"|cut -d "[" -f 2|cut -d " " -f 1,2`
         grep -i "no media" /tmp/dvderros >/dev/null 2>&1
         naotemdisco=$?
         grep -i "non-DVD" /tmp/dvderros >/dev/null 2>&1
         temcd=$?
         tipodvd=`grep -i "Mounted Media" /tmp/dvdrelat|cut -d "," -f 2|cut -d " " -f 2` >/dev/null 2>&1

         if [ $naotemdisco -eq 0 ]; then                #Não tem nada la dentro
            echo "   -> Por favor, insira um CD ou DVD no gravador"
            echo "   -> Não encontrei nenhum disco no gravador" >>$fichlog
            cdrecord dev=$deviceid -eject >/dev/null 2>&1
            exit
         elif [ $temcd -eq 0 ]; then             #Tem um CD inserido
            tipodisco="CD"
            echo "   -> Inseriu um $tipodisco"
         elif [ "$tipodvd" = "DVD-R" -o "$tipodvd" = "DVD-RW" -o "$tipodvd" = "DVD+R" -o "$tipodvd" = "DVD+RW" ]; then
            tipodisco="$tipodvd"
            echo "   -> Inseriu um DVD do tipo $tipodisco"
            echo "   -> Inseriu um DVD do tipo $tipodisco" >>$fichlog
         else
            echo "   -> Não foi possível fazer a detecção do tipo de disco"
            echo "   -> Mensagem de erro: $teste"
            echo "   -> Não foi possível fazer a detecção do tipo de disco" >>$fichlog
            echo "   -> Mensagem de erro: $teste" >>$fichlog
            cdrecord dev=$deviceid -eject >/dev/null 2>&1
            exit
         fi
      fi


#Se for um CD vamos verificar o tipo de CD
      if [ "$tipodisco" = "CD" ]; then   #Ou ?um CD ou não tem nada l?dentro
         cdrecord -s debug=0 dev=$deviceid -atip >/tmp/atipcd.txt 2>/dev/null
         atipcd=`more /tmp/atipcd.txt|fgrep -i "erasable"|tr -d " "|tr '[:upper:]' '[:lower:]'`
      
         if [ -z "$atipcd" ]; then    #CD não grav?el
            echo "  -> O CD inserido não é válido para gravação" >>$fichlog
            echo "  -> O CD inserido não é válido para gravação"
            echo "  -> Insira um CD ou DVD v?ido para gravação"
            cdrecord dev=$deviceid -eject >/dev/null 2>&1
            exit
         elif [ "$atipcd" = "iserasable" ]; then  #?um CD-RW
            tipodisco="CD-RW"
            echo "  -> Foi encontrado um CD do tipo $tipodisco"
            echo "  -> Foi encontrado um CD do tipo $tipodisco" >>$fichlog
         else
            tipodisco="CD-R"
            cdrecord -s debug=0 dev=$deviceid -toc >/tmp/toccd.txt 2>/dev/null
            toccd=`more /tmp/toccd.txt|fgrep -i "first:"|tr '[:upper:]' '[:lower:]'|cut -d " " -f 1`
      
            if [ -z "$toccd" ]; then  #?um CD-R Limpo)
               echo "  -> Foi encontrado um CD virgem do tipo $tipodisco"
               echo "  -> Foi encontrado um CD virgem do tipo $tipodisco" >>$fichlog
            else    #?um CD-R multisess? ou j?fechado
               mscd=`cdrecord -s debug=0 dev=$deviceid -msinfo|fgrep -i "0," 2>/dev/null`
               if [ -z $mscd ]; then  #J?fechado
                  echo "  -> Foi encontrado um disco do tipo $tipodisco já fechado" >>$fichlog
                  echo "  -> Não é possível gravar neste CD" >>$fichlog
                  echo "  -> Foi encontrado um disco do tipo $tipodisco já fechado"
                  echo "  -> Não e possível gravar neste CD"
                  echo "  -> Insira um CD-R virgem, um CD-RW ou um DVD"
                  cdrecord dev=$deviceid -eject >/dev/null 2>&1
                  exit
               else    #CD-R Multisess? ainda aberto
                  echo "  -> Foi encontrado um CD do tipo $tipodisco em multisessão" >>$fichlog
                  echo "  -> Não é aconselhável efectuar backups em CD-R's multisessão" >>$fichlog
                  echo "  -> Foi encontrado um CD do tipo $tipodisco em multisessão"
                  echo "  -> Não é aconselhável efectuar backups em CD-R's multisessão"
                  echo "  -> Insira um CD-R virgem, um CD-RW ou um DVD"
                  cdrecord dev=$deviceid -eject >/dev/null 2>&1
                  exit
               fi
            fi
         fi
      fi

echo "Suporte seleccionado: $tipodisco" >>$fichlog

#Verificar o espaçoem disco
      echo " "  >>$fichlog
      echo "A verificar espaço necessário em disco" >>$fichlog
      echo
      echo "A verificar espaço necessário em disco"
      freespace=`df -l --sync -BM /|fgrep -i "/dev"|tr -s " "|cut -d " " -f 4|tr -d "M"`
      tamanho=`mkisofs -quiet -print-size -D -U -J -r -graft-points $origens 2>/dev/null|tr -d " "`
      tamanhotargz=`echo "scale=0; $tamanho*2.048/1024*0.3"|bc -l`
      tamanho=`echo "scale=0; $tamanho*2.048/1024"|bc -l`
      
      echo "  -> Espaço disponível em disco: $freespace MB"
      echo "  -> Dimensão em formato normal: $tamanho MB"
      echo "  -> Dimensão estimada em formato targz: $tamanhotargz MB"

      echo "  -> Espaço disponível em disco: $freespace MB" >>$fichlog
      echo "  -> Dimensão em formato normal: $tamanho MB" >>$fichlog
      echo "  -> Dimensão estimada em formato targz: $tamanhotargz MB" >>$fichlog
      
      if [ "$formato" = "targz" ]; then
         if [ $(echo "$freespace<$tamanhotargz"|bc -l) -eq 1 ]; then
            echo "  -> O espaço disponível pode ser insuficiente para criar os ficheiros targz"
            echo "  -> O espaço disponível pode ser insuficiente para criar os ficheiros targz" >>$fichlog
         fi
      fi
      if [ "$formato" = "normal" ]; then
         if [ $(echo "$freespace<300"|bc -l) -eq 1 ]; then
            echo "  -> O espaço disponível pode ser insuficiente para criar ficheiros temporários"
            echo "  -> O espaço disponível pode ser insuficiente para criar ficheiros temporários" >>$fichlog
         fi
      fi


#Caso se escolha cópias comprimidas
if [ $formato = "targz" ]; then
   echo
   echo " "  >>$fichlog
   if [ ! -d "/tmp/backups" ]; then
      echo "A directoria /tmp/backups não existe. Vou criar."
      echo "A directoria /tmp/backups não existe. Vou criar." >>$fichlog
      mkdir /tmp/backups
      chmod 777 /tmp/backups
   fi
   if [ ! -d "/tmp/backups" ]; then
      echo "  -> Não foi possível criar a directoria /tmp/backups"
      echo "  -> Tente criar a directoria manualmente e dar-lhe permissões"
      echo "  -> Não foi possível criar a directoria /tmp/backups. A Sair" >>$fichlog
      exit
   else
      echo "Foi encontrada a directoria /tmp/backups."
      echo "Foi encontrada a directoria /tmp/backups." >>$fichlog
   fi


   #Vamos criar os ficheiros comprimidos
   echo
   echo " "  >>$fichlog
   echo "A criar o backup comprimido em /tmp/backups/" >>$fichlog
   echo "A criar o backup comprimido em /tmp/backups/"
   echo "A criação do ficheiro poderá demorar alguns minutos"
   echo "  -> Aguarde um pouco, por favor"

   tar cvzf $fichtar $origens >> $fichlog
   #if [ $? -ne 0 ]; then
   if [ ! -f "$fichtar" ]; then
      echo "   Não foi possível criar o ficheiro comprimido!"
      echo "   Houve um erro ao criar o ficheiro!"
      echo "   Não foi possível criar o ficheiro comprimido!" >> $fichlog
      echo "   Houve um erro ao criar o ficheiro!" >> $fichlog
      exit
   fi

   echo "  -> Aguarde um momento, por favor"
   sleep 10
   sync
   sleep 5
fi

#Vamos verificar o espaço necessário
echo
echo " "  >>$fichlog
echo "A calcular o espaço necessário no $tipodisco"
echo "A calcular o espaço necessário no $tipodisco" >> $fichlog
tamanho=`mkisofs -quiet -print-size -D -U -J -r -graft-points $backups 2>/dev/null`
tamanho=`echo "scale=0; $tamanho*2.048/1024"|bc -l`
echo "  -> Espaço necessário: $tamanho"
echo "  -> Espaço necessário: $tamanho" >> $fichlog
if [ "$tipodisco" = "CD-R" -o "$tipodisco" = "CD-RW" ]; then
   if [ $(echo "$tamanho>640"|bc -l) -eq 1 ]; then
      echo "  -> O conteúdo poderá não caber num CD"
      echo "  ->Demasiado grande para um $tipodisco em formato $formato" >>$fichlog
      echo "A sair"
      if [ "$formato" = "normal" ]; then
         echo "  -> Opte por fazer cópias comprimidas ou utilizar DVD's"
         exit
      else
         if [ -f /tmp/backups/*.tar.gz ]; then
            echo "  -> Opte por utilizar DVD's"
            echo "  -> A remover os ficheiros tar.gz"
            rm -rf /tmp/backups/*.tar.gz
            exit
         fi
      fi
   fi
fi
if [ "$tipodisco" = "DVD-R" -o "$tipodisco" = "DVD-RW" -o "$tipodisco" = "DVD+R" -o "$tipodisco" = "DVD+RW" ]; then
   if [ $(echo "$tamanho>=4450"|bc -l) -eq 1 ]; then
      echo "  -> O conteúdo poderá não caber num DVD"
      echo "  ->Demasiado grande para um $tipodisco em formato $formato" >>$fichlog
      echo "A sair" >>$fichlog
      if [ "$formato" = "normal" ]; then
         echo "  -> Opte por fazer cópias comprimidas"
         exit
      else
         if [ -f /tmp/backups/*.tar.gz ]; then
            echo "  -> A remover os ficheiros tar.gz"
            rm -rf /tmp/backups/*.tar.gz
            exit
         fi
      fi
   fi
fi


#GRAVACAO EM CD
if [ "$tipodisco" = "CD-R" -o "$tipodisco" = "CD-RW" ]; then

   echo
   echo " "  >>$fichlog
   if [ "$tipodisco" = "CD-R" ]; then
      echo "A efectuar a gravação"
      echo "A efectuar a gravação em $tipodisco" >>$fichlog
      nice --5 mkisofs -V "backges$data" -D -U -J -r -graft-points $backups | cdrecord dev=$deviceid speed=$cdr_speed -fs=8m -driveropts=burnfree -
      if [ $? -eq 0 ]; then
         echo "  -> Gravação terminada com sucesso"
         echo "Gravação terminada com sucesso" >>$fichlog
      else
         echo "  -> Podem ter ocorrido erros na gravação"
         echo "Podem ter ocorrido erros na gravação" >>$fichlog
      fi
   elif [ "$tipodisco" = "CD-RW" ]; then
      echo "A limpar o CD"
      echo "A limpar o CD" >>$fichlog
      cdrecord dev=$deviceid speed=$cdrw_speed blank=fast
      echo "A efectuar a gravação"
      echo "A efectuar a gravação em $tipodisco" >>$fichlog
      nice --5 mkisofs -V "backges$data" -D -U -J -r -graft-points $backups | cdrecord dev=$deviceid speed=$cdrw_speed -fs=8m -driveropts=burnfree -
      if [ $? -eq 0 ]; then
         echo "  -> Gravação terminada com sucesso"
         echo "  -> Gravação terminada com sucesso" >>$fichlog
      else
         echo "  -> Podem ter ocorrido erros na gravação"
         echo "  -> Podem ter ocorrido erros na gravação" >>$fichlog
      fi
   fi
fi #Fim da sec?o CD


#GRAVACAO EM DVD-R/-RW
if [ "$tipodisco" = "DVD-RW" -o "$tipodisco" = "DVD-R" ]; then
   echo
   echo " "  >>$fichlog
   if [ "$tipodisco" = "DVD-R" ]; then
      echo "A efectuar a gravação em DVD-R"
      echo "A efectuar a gravação em DVD-R" >>$fichlog
      echo "  -> Não utilize o servidor enquanto estiver em gravação"
      nice --5 growisofs -dvd-compat -speed=$dvdr_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
      if [ $? -eq 0 ]; then
         echo "  -> Gravação terminada com sucesso"
         echo "  -> Gravação terminada com sucesso" >>$fichlog
      else
         echo "  -> Podem ter ocorrido erros na gravação"
         echo "  -> Podem ter ocorrido erros na gravação" >>$fichlog
      fi
   elif [ "$tipodisco" = "DVD-RW" ]; then
      formdvd=`dvd+rw-mediainfo $device|fgrep -i "Mounted Media"|cut -d "W" -f 2|tr -d " "|tr '[:upper:]' '[:lower:]'`
      if [ ! "$formdvd" = "restrictedoverwrite" ]; then
         echo "  -> Primeira utiliza?o do DVD-RW, a formatar"
         echo "  -> Primeira utiliza?o do DVD-RW, a formatar" >>$fichlog
         echo "  -> Este processo demorar?entre 30 a 60 minutos"
         dvd+rw-format -force=full $device
      fi
      formdvd=`dvd+rw-mediainfo $device|fgrep -i "Mounted Media"|cut -d "W" -f 2|tr -d " "|tr '[:upper:]' '[:lower:]'`
      if [ "$formdvd" = "restrictedoverwrite" ]; then
         echo "  -> A efectuar a gravação do DVD-RW"
         echo "  -> A efectuar a gravação do DVD-RW" >>$fichlog
         echo "  -> Não utilize o servidor enquanto estiver em gravação"
         nice --5 growisofs -dvd-compat -speed=$dvdrw_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
         if [ $? -eq 0 ]; then
            echo "  -> Gravação terminada com sucesso"
            echo "  -> Gravação terminada com sucesso" >>$fichlog
         else
            echo "  -> Podem ter ocorrido erros na gravação"
            echo "  -> Podem ter ocorrido erros na gravação" >>$fichlog
         fi
      else
         echo "  -> Não foi possível formatar devidamente o $tipodisco"
         echo "  -> Utilize outro DVD"
         echo "  -> A formatação do $tipodisco correu mal" >>$fichlog
         exit
      fi
   fi

fi #Fim da sec?o DVD-


#GRAVACAO EM DVD+R/+RW
if [ "$tipodisco" = "DVD+RW" -o "$tipodisco" = "DVD+R" ]; then
   echo
   echo " "  >>$fichlog
   echo "A efectuar a gravação"
   echo "A efectuar a gravação em $tipodisco" >>$fichlog
   echo "  -> Não utilize o servidor enquanto estiver em gravação"

   if [ "$tipodisco" = "DVD+R" ]; then
      nice --5 growisofs -dvd-compat -speed=$dvdr_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
   elif [ "$tipodisco" = "DVD+RW" ]; then
      nice --5 growisofs -dvd-compat -speed=$dvdrw_speed -Z $device -DUJrT -graft-points $backups 2>/dev/null
   fi

   if [ $? -eq 0 ]; then
      echo "  -> Gravação terminada com sucesso"
      echo "  -> Gravação terminada com sucesso" >>$fichlog
   else
      echo "  -> Podem ter ocorrido erros na gravação"
      echo "  -> Podem ter ocorrido erros na gravação" >>$fichlog
   fi
fi #Fim da sec?o DVD+



#ELIMINAR FICHEIROS DESNECESSÁRIOS
echo
echo " "  >>$fichlog
if [ "$formato" = "targz" ]; then
   if [ -d /tmp/backups ]; then
      echo "  -> A remover os ficheiros tar.gz"
      echo "  -> A remover os ficheiros tar.gz" >>$fichlog
      rm -rf /tmp/backups/*.tar.gz >/dev/null 2>&1
   fi
fi

if [ -f /tmp/atipcd.txt ]; then
   rm -rf /tmp/atipcd.txt
fi
if [ -f /tmp/toccd.txt ]; then
   rm -rf /tmp/toccd.txt
fi

echo "Fim de Backup em $(date +%A", "%d"/"%m"/"%Y" ? "%H":"%M)" >>$fichlog

Scripts recomendados

Verifica quais ports necessitam de atualização

Gerenciamento de logs em servidores de aplicação

Backup Incremental

Redundância de dois links de internet

Execução temporizada de programas


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts