sábado, 18 de febrero de 2012

Shell Scritp Ejercicio bastante completito

#!/bin/bash
#TODOS LOS SCRIPTS EN http://oposinf.blogspot.com/search/label/shellscript
#Realizar un script llamado copiaSeg para gestionar el sistema centralizado de copias de seguridad de un servidor.
#El script sin parámetros hará una copia de segundad de todos los usuarios del sistema, y con el parámetro -u usuario hará una copia de seguridad de la información del usuario pasado como parámetro. Este script sólo podrá ser ejecutado por root. La sintaxis del script será:
#copiaSeg [-u usuario ]
#Los usuarios podrán utilizar el sistema de copias automatizado creando en su directorio de trabajo un fichero oculto, llamado copiaSeg.dat con el siguiente contenido:
#Copias que se desean mantener
#numeroCopias=2
#Contenido de la copia, único obligatorio
#contenidoCopia=dir1:dir2:fichero1:fichero2,,.
#En caso de que no exista alguno de los campos configurables anteriores, se usarán los valores por defecto, definidos en el propio script. El único campo obligatorio es el campo contenidoCopia,que contendrá todos los ficheros y directorios que se desean incluir en la copia.
#Si dicho campo no estuviese definido, no se copiaría nada para ese usuario.
#El sistema creará un directorio /copiaSeg y dentro un directorio por usuario, si no existiese, que sólo podrá ser accesible por su dueño. En el interior de este directorio se almacenarán tantas copias de seguridad copiaSeg_hhmmDDMMYYYY.tgz como defina numeroCopias. Paraque un fichero o directorio sea añadido a la copia debe ser de su propiedad.
#El script borrará las copias más antiguas manteniendo en el sistema sólo las que se indiquen en el fichero de configuración copiaSeg.dat y, si no está definido numeroCopias, lo que marque el valor por defecto.

function error {
    echo "¡¡Horror!! Uso "$0" [-u usuario]"
    exit
}

#capturar parámetros en variables
parametro=$1
nusuario=$2
#variables por defecto
numcopiaspordefecto=3
directoriocopiasgeneral="/copiaSeg"
carpetausuarios="/home"

#si no introducimos parámetros, se hace la copia de seguridad completa
if [ "$parametro" = "" ]
then
    echo "Entrando en copia de seguridad completa"
    #comprobar si existe la carpeta
    if [ -d $directoriocopiasgeneral ]
    then
        echo "El directorio general de copias existe. Se sigue el proceso."
    else
        echo "El directorio no existe. Se crea."
        sudo mkdir $directoriocopiasgeneral
        if [ $? -ne 0 ]
        then
            echo "Error al crear el directorio. Seguramente, no tienes permiso para copiar en él"
            echo "Saliendo del programa"
            exit
        fi
    fi
    #calcula el número de copias realizadas
    #lista solo los archivos que hay en el directorio raiz y cuenta el número de líneas
    numcopiashechas=`ls -p $directoriocopiasgeneral | grep -v / | wc -l`
    echo $numcopiashechas
    #si se ha llegado al límite de número de copias
    if [ "$numcopiashechas" -eq "$numcopiaspordefecto" ]
    then
        #busca la más antigua
        ficheromasantiguo=`ls -ptr $directoriocopiasgeneral | grep -v / | head -1`
        #y la borra
        sudo rm $directoriocopiasgeneral/$ficheromasantiguo
    else
        #no se hace nada
        echo -n
    fi
    #genera nombre del archivo
    hora=`date +%H`
    minutos=`date +%M`
    dia=`date +%d`
    mes=`date +%m`
    ano=`date +%Y`
    nombrecopia=`echo copiaSeg_$hora$minutos$dia$mes$ano.tgz`
    echo $nombrecopia
    #cambia nombre carpeta para pruebas
    carpetausuarios="/home/jluserovilchez/Escritorio/scripts"
    sudo tar -czf "$directoriocopiasgeneral/$nombrecopia" "$carpetausuarios"
   
#si el parámetro es -u
elif [ "$parametro" = "-u" ]
then
    #y el usuario no es vacío
    if [ "$nusuario" != "" ]
    then
        echo "Entrando en copia de seguridad de usuario"
        echo $nusuario
        #crear carpeta de usuario si no existe
        if [ -d $directoriocopiasgeneral/$nusuario ]
        then
            #si existe, no se crea
            echo -n
        else
            #si no existe, se crea
            sudo mkdir $directoriocopiasgeneral/$nusuario
        fi
        #buscar archivo copiaSeg.dat en carpeta de usuario
        #si existe carpeta de usuario
        if [ -d /home/$nusuario ]
        then
            #buscar el archivo oculto de usuario
            if [ -e "/home/$nusuario/.copiaSeg.dat" ]
            then
                echo "El fichero copiaSeg.dat existe"
                existecontenidoCopia=`cat /home/$nusuario/.copiaSeg.dat | grep "contenidoCopia"`
            #echo $existecontenidoCopia
            if [ "$existecontenidoCopia" = "" ]
            then
                echo "No existe contenidoCopia"
                echo "Defina la variable contenidoCopia en el archivo copiaSeg.dat para seleccionar archivos. Copiando todos los archivos del usuario."
                numcopias=$numcopiaspordefecto
            #comienzo de copia de archivos
                numcopiashechas=`ls -p $directoriocopiasgeneral/$nusuario | grep -v / | wc -l`
                echo $numcopiashechas
                #si se ha llegado al límite de número de copias
                if [ "$numcopiashechas" -eq "$numcopiaspordefecto" ]
                then
                    #busca la más antigua
                    ficheromasantiguo=`ls -ptr $directoriocopiasgeneral/$nusuario | grep -v / | head -1`
                    #y la borra
                    sudo rm $directoriocopiasgeneral/$nusuario/$ficheromasantiguo
                else
                    #no se hace nada
                    echo -n
                fi
                #genera nombre del archivo
                hora=`date +%H`
                minutos=`date +%M`
                dia=`date +%d`
                mes=`date +%m`
                ano=`date +%Y`
                nombrecopia=`echo copiaSeg_$hora$minutos$dia$mes$ano.tgz`
                echo $nombrecopia
                #cambia nombre carpeta para pruebas
                carpetausuario="/home/jluserovilchez/Escritorio/scripts"
                #descomentar siguiente línea para funcionamiento real
                #carpetausuario="/home/$nusuario"
                sudo tar -czf "$directoriocopiasgeneral/$nusuario/$nombrecopia" "$carpetausuario"
            #fin copia todos los archivos del usuario
           
            else
                #comienzo copia de seguridad archivos elegidos por usuario
                echo "Sí existe contenidoCopia"
                echo "Obteniendo número de copias por defecto para usuario $nusuario"
                existencopias=`cat /home/$nusuario/.copiaSeg.dat | grep "numeroCopias"`
                echo "Existencopias:$existencopias"
                if [ "$existencopias" = "" ]
                then
                    echo "No existe número de copias. Valor por defecto $numcopiaspordefecto"
                    numcopias=$numcopiaspordefecto
                else
                    echo "Sí existe número de copias"
                    numcopias=`cat /home/$nusuario/.copiaSeg.dat | head -1 | awk -F= '{print $2}'`
                    echo $numcopias
                fi
                numcopiashechas=`ls -p $directoriocopiasgeneral/$nusuario | grep -v / | wc -l`
                echo $numcopiashechas
                #si se ha llegado al límite de número de copias
                if [ "$numcopiashechas" -eq "$numcopias" ]
                then
                    #busca la más antigua
                    ficheromasantiguo=`ls -ptr $directoriocopiasgeneral/$nusuario | grep -v / | head -1`
                    #y la borra
                    sudo rm $directoriocopiasgeneral/$nusuario/$ficheromasantiguo
                else
                    #no se hace nada
                    echo -n
                fi
                #genera nombre del archivo
                hora=`date +%H`
                minutos=`date +%M`
                dia=`date +%d`
                mes=`date +%m`
                ano=`date +%Y`
                nombrecopia=`echo copiaSeg_$hora$minutos$dia$mes$ano.tgz`
                echo $nombrecopia
                #cambia nombre carpeta para pruebas
                #carpetausuario="/home/jluserovilchez/Escritorio/scripts"
                #descomentar siguiente línea para funcionamiento real
                carpetausuario="/home/$nusuario"
                #sudo tar -czf "$directoriocopiasgeneral/$nusuario/$nombrecopia" "$carpetausuario"
                #obtener lista de archivos
                listaarchivos=`cat /home/$nusuario/.copiaSeg.dat | tail -1 | awk -F= '{print $2}'`
                echo $listaarchivos
                #separar carpetas y archivos
                arr=$(echo $listaarchivos | tr ":" " " | tr "," "\n")
                echo $arr
                cd $carpetausuario
                sudo tar -czvf "$directoriocopiasgeneral/$nusuario/$nombrecopia" $arr
                #código interesante para el futuro
                #for x in $arr
                #do
                #    echo "Copiando $x"
                #done
                #fin copia de seguridad archivos elegidos por usuario
            fi
            else
                echo "No existe el fichero copiaSeg.dat Creelo para definir los ficheros a copiar y el número de copias"
            fi
        else
            #si no existe carpeta de usuario
            echo "No existe carpeta de usuario. El usuario no existe"
        fi
    else
        #error por no introducir el nombre de usuario
        echo "No ha introducido nombre de usuario"
        error
    fi
else
    #error por introducir parámetro distinto de -u
    echo "El parámetro ha de ser -u. Parámetro incorrecto."
    error
fi

No hay comentarios:

Publicar un comentario