#!/bin/sh # Este script saca todas las copias de seguridad a CD-RW # # Autor: Luis Angel Cofiño # webmaster algarroba lacofi.org # Algunos colores para las salidas: azul="\033[0;34m" azul_claro="\033[1;34m" verde="\033[0;32m" verde_claro="\033[1;32m" oro="\033[0;33m" oro_claro="\033[1;33m" cian="\033[0;36m" cian_claro="\033[1;36m" rojo="\033[0;31m" rojo_claro="\033[1;31m" blanco="\033[1;37m" nocolor="\033[0m" # Algunas variables que necesitaremos numero=1 grupo=`cat /var/log/volcado_duro.dir` equipo="dev=1,0,0" opciones="speed=16 driveropts=burnproof" multisesion="-R -J -r -T" temporal="/datos/seguridad/cd/diario.iso" estado="/var/log/estado.log" carga="-eject" registro=`cat /var/log/volcado_cd.dir` diario="/datos/seguridad/diario" declare -i megas if [ "$UID" = "0" ]; then # Pero solo si eres root #------------------------------------------------- if [ "$registro" = "Pendiente" ]; then # Si hay copia completa por grabar... valido="si" else valido="no" fi # Copias de seguridad incrementales if [ "$registro" = "Actualizando" ]; then # Si ya hay una sesión en el CD incremental... echo -e " " >> $estado echo -e "----------------------------------------------" >> $estado echo -e "Actualizando las copias incrementales" >> $estado if [ "$TERM" = "dumb" ] || [ "$TERM" = "xterm" ]; then # Zenity, si arrancamos desde icono de escritorio o terminal X zenity --info --text="Introduce el CD-RW 4 Multisesión" else echo -e "Grabando CD-RW 4 Multisesión. Añadiendo Multisesión" echo -e " " echo -e "-----------------------------" echo -e "Introduce el "$verde"CD-RW 4 Multisesión"$nocolor" para " echo -e "Copias Incrementales y pulsa la tecla "$verde"Intro"$nocolor read seleccion fi # Este bucle me parece elegante. Habrá varios comandos que desembocan en dos tipos de salida: if [ "$TERM" = "dumb" ] || [ "$TERM" = "xterm" ]; then # Zenity, si arrancamos desde icono de escritorio o terminal X COMANDO='zenity --progress --pulsate --title="Grabación incremental" --auto-close --text="Grabando CD-RW" --percentage=5' else # o la salida standard, si estamos en cualquier otra terminal COMANDO='cat' # El comando cat simplemente lo saca todo por pantalla, ¿recuerdas?. fi ( # Empiezan varios bloques de cosas, para la barra de progreso de Zenity echo "# Preparando la copia de archivos" ; # Siguen comandos agrupados en un paréntesis (mkisofs $multisesion -C `cdrecord -msinfo $equipo` -N \ -M /dev/scd0 -o /datos/seguridad/cd/diario.iso $diario > /dev/null 2>&1 status=$? if [ "$status" -eq 0 ]; then # Notificamos que se ha creado una ISO... o no echo -e "Preparada copia incremental con salida $status" >> $estado fi) echo "# Grabando nuevos archivos en CD-RW" ; # Paréntesis porque Zenity necesita un solo comando (nice -20 cdrecord $opciones -multi $carga $equipo $temporal > /dev/null 2>&1 status=$? if [ "$status" -eq 0 ]; then # ¿Todo bien?. Pues notificamos y borramos la imagen ISO echo -e $rojo"Añadida copia incremental con salida $status."$nocolor >> $estado rm -Rf $diario/*.tar.bz2 rm -Rf /datos/seguridad/cd/diario.iso fi) echo "100" ; sleep 1 # Terminado. Sin esta cláusula no funciona el auto-close de Zenity echo "# Terminado" ; sleep 1 ) | # Ahora se lo pasamos todo a Zenity o a consola para que organice la salida $COMANDO fi # Iniciando el disco de copias incrementales if [ "$registro" = "Salvado" ]; then # Si la ultima vez fue copia completa, iniciar incremental echo -e " " >> $estado echo -e "--------------------------------------" >> $estado echo -e "Empezando a hacer copias incrementales" >> $estado if [ "$TERM" = "dumb" ] || [ "$TERM" = "xterm" ]; then # Zenity, si arrancamos desde icono de escritorio o terminal X zenity --info --text="Introduce el CD-RW 4 Multisesión" else echo -e "Grabando CD-RW 4 Multisesión. Iniciando Multisesión" echo -e " " echo -e "-----------------------------" echo -e "Introduce el "$verde"CD-RW 4 Multisesión"$nocolor" para " echo -e "Copias Incrementales y pulsa la tecla "$verde"Intro"$nocolor read seleccion fi if [ "$TERM" = "dumb" ] || [ "$TERM" = "xterm" ]; then # Zenity, si arrancamos desde icono de escritorio o terminal X COMANDO='zenity --progress --pulsate --title="Grabación" --auto-close --text="Grabando CD-RW" --percentage=5' else COMANDO='cat' fi ( # Como siempre, varios bloques para la barra de progreso de Zenity echo "# Preparando la copia de archivos" ; (mkisofs -V "Incremental" $multisesion -o $temporal $diario > /dev/null 2>&1 status=$? if [ "$status" -eq 0 ]; then # Si todo bien, notificamos echo -e $verde"Preparada "$nocolor"copia incremental con salida $status" >> $estado fi) echo "# Borrando el CD-RW" ; nice -20 cdrecord $equipo blank=fast > /dev/null 2>&1 echo "# Grabando copias diarias" ; (nice -20 cdrecord $opciones -multi -eject $equipo $temporal > /dev/null 2>&1 status=$? if [ "$status" -eq 0 ]; then # Si todo bien, notificar, y borrar las ISO echo "Actualizando" > /var/log/volcado_cd.dir echo -e $rojo"Grabada copia incremental con salida $status."$nocolor >> $estado echo -e $verde"Iniciada nueva serie incremental"$nocolor>> $estado echo -e "--------------------------------" >> $estado rm -Rf $diario/*.tar.bz2 rm -Rf /datos/seguridad/cd/diario.iso fi) echo "100" ; sleep 1 # Lo necesita Zenity. Sin el 100 %, no funciona el auto-close echo "# Terminado" ; sleep 1 ) | # Hacemos un pipe a Zenity para que presente la barra de progreso. $COMANDO fi # Y empezamos con la chicha if [ "$valido" = "si" ]; then # ¿Qué copia fue la última?. Pues la otra. echo -e "----------------------------" >> $estado echo -e "La última serie fue $grupo" >> $estado if [ "$grupo" = "impar" ] ; then # Dejamos anotado que hemos cambiado de serie grunum="2" echo "par" > /var/log/volcado_duro.dir else grunum="1" echo "impar" > /var/log/volcado_duro.dir fi echo "La serie actual es `cat /var/log/volcado_duro.dir`" >> $estado echo "----------------------------" >> $estado fi # ---------- Empieza un bucle de oro ---------- for archivo in `find /datos/seguridad/cd/* -print 2>/dev/null` do # Un CD-RW no puede sobrepasar los 700 Mb megas=`du -m $archivo | awk '{print $1}'` if [ $megas -gt 700 ]; then # Si los sobrepasa, avisa del error y cancela todo. echo -e "El CD-RW $grunum/$numero tendría $megas Mb" >> $estado echo -e "Operación cancelada" >> $estado zenity --error --text="El CD-RW tendría $megas Mb. Operación cancelada" valido="no" fi if [ "$valido" = "si" ]; then # Seguir adelante solo si no hubo contraorden echo "Grabando" > /var/log/volcado_cd.dir # registramos que empezamos. Si error quedará esto. echo -e $verde"Grabando"$nocolor" CD-RW $grunum/$numero, de $megas Mb" >> $estado zenity --info --text="Introduce el CD-RW $numero del grupo $grunum/$numero" # Pide el CD if [ "$TERM" = "dumb" ] || [ "$TERM" = "xterm" ]; then # Zenity, si arrancamos desde icono de escritorio o terminal X COMANDO='zenity --progress --pulsate --title="Grabación" --auto-close --text="Grabando el CD-RW" --percentage=10' else COMANDO='cat' fi ( # Empieza la serie de sucesos para la barra de progreso de Zenity echo "# Borrando el CD-RW" ; nice -20 cdrecord $equipo blank=fast > /dev/null 2>&1 echo "# Grabando el archivo `basename $archivo`" ; (nice -20 cdrecord $opciones $carga $equipo $archivo > /dev/null 2>&1 status=$? if [ "$status" -eq 0 ]; then # Si errores, quedará constancia en volcado_cd.dir y $estado echo "Salvado" > /var/log/volcado_cd.dir # si no hubo error, actualizamos volcado_cd.dir echo -e $rojo"Grabado con éxito. Copia a salvo."$nocolor >> $estado rm -Rf $archivo fi) echo "# Comprobando el CD-RW $grunum/$numero" ; (carga="-load" # Mi CD-RW solo puede leer el CD recién grabado si se recarga. nice -20 cdrecord $carga $equipo > /dev/null 2>&1 echo -e $verde"Comprobando"$nocolor" CD-RW $grunum/$numero" >> $estado nbloques=`df -k /mnt/cdrw | grep cdrw | cut -c 25-30` md5cd=`dd if=/dev/scd0 count=$nbloques bs=1024 | md5sum | awk '{print $1}'` # Lleva un rato echo -e " El MD5 del CD-RW $grunum/$numero es$oro $md5cd $nocolor" >> $estado echo -e " El MD5 de la iso $grunum/$numero es$oro `cat /var/log/md5_$numero.log` $nocolor" >> $estado echo -e " ---" >> $estado carga="-eject" nice -20 cdrecord $carga $equipo > /dev/null 2>&1) echo "100" ; sleep 1 # Sin una seccion 100 % no funciona el auto-close de Zenity echo "# Terminado" ; sleep 1 ) | # Y ahora, todo va a parar a la barra de progreso de Zenity o a la salida standard $COMANDO fi # ---------sumamos uno a NUM numero=`expr $numero + 1` done # Y reiniciamos el bucle echo -e "Hecho" >> $estado #-------------------------------------- else # Si no eres root... #echo "¡Solo root puede hacer eso!" if [ "$TERM" = "dumb" ] || [ "$TERM" = "xterm" ]; then # Zenity, si arrancamos desde icono de escritorio o terminal X zenity --error --text="¡Solo ROOT puede hacer eso!" else echo "¡Solo ROOT puede hacer eso!" fi fi # --------------- Y aquí termina