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

Publicado por Rui Costa 12/04/2006

[ Hits: 7.546 ]

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

Firewall com proxy transparente completo

Converter arquivos .tif para .pdf

Configurando a raiz do seu servidor apache facilmente.

Plugin BACULA

Identificar,matar e Iniciar novo Processo


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts