diff options
Diffstat (limited to 'client/engine/Image.lib')
-rwxr-xr-x | client/engine/Image.lib | 793 |
1 files changed, 506 insertions, 287 deletions
diff --git a/client/engine/Image.lib b/client/engine/Image.lib index 8163df3f..fcf2f7ce 100755 --- a/client/engine/Image.lib +++ b/client/engine/Image.lib @@ -8,6 +8,278 @@ #@warning License: GNU GPLv3+ #*/ +# Bloquear imagen para creación. +function ogLockImage () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \ + "$FUNCNAME REPO /aula1/winxp.img" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Comprobar que existe directorio de imagen +IMGDIR=$(ogGetParentPath $@) || return $? +# Crear fichero de bloqueo. +touch $IMGDIR/$(basename "${!#}").lock +} + +# Desbloquear imagen (borrar fichero de bloqueo). +function ogUnlockImage () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \ + "$FUNCNAME REPO /aula1/winxp.img" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Borrar fichero de bloqueo para la imagen. +rm -f $(ogGetPath $@.lock) +} + +# Comprobar si el fichero de bloqueo para una imagen. +function ogIsImageLocked () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "if $FUNCNAME /opt/opengnsys/images/aula1/winxp.img; then ...; fi" \ + "if $FUNCNAME REPO /aula1/winxp.img; then ...; fi" + return +fi +# Comprobar si existe el fichero de bloqueo. +test -n "$(ogGetPath $@.lock)" +} + + +function ogPartcloneSyntax () +{ +#TODO: comprobar como unico parametro particion /dev/sda1 +#COMPAR="partclone.$FS --clone --force --source $PART" +COMPAR="-F -c -s " +TYPE="$(ogGetFsType `ogDevToDisk $1`)" +case "$TYPE" in + EXT[234]) + echo "partclone.extfs $COMPAR $1" + ;; + REISERFS|XFS|JFS) + echo "partclone.dd $COMPAR $1" + ;; + NTFS|HNTFS) + echo "partclone.ntfs $COMPAR $1" + ;; + FAT16|FAT32|HFAT16|HFAT32) + echo "partclone.fat $COMPAR $1" + ;; + HFS|HFS+) + echo "partclone.hfsp $COMPAR $1" + ;; + *) ogRaiseError $OG_ERR_PARTITION "$1 $TYPE" + return $? ;; +esac +} + +#/** +# ogCreateImageSyntax partition filename [tools] [levelcompresor] +#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen +#@param 1 partition identificador linux del dispositivo particion. +#@param 2 filename path absoluto del fichero imagen +#@param 3 [opcional] str_tools herrmaienta de clonacion [partimage, partclone, ntfsclone] +#@param 4 [opcional] str_levelcompresor nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] +#@return cadena con el comando que se debe ejecutar. +#@exception OG_ERR_FORMAT formato incorrecto. +#@warning En pruebas iniciales +#@TODO introducir las herramientas fsarchiver, dd +#@TODO introducir el nivel de compresion gzip +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## + +function ogCreateImageSyntax() +{ +local FS TOOL LEVEL PART IMGFILE BUFFER + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME partition filename [tool] [levelcompresor]" \ + "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img partclone lzop" + return +fi +# Error si no se reciben al menos los 2 parámetros para obtener el valor default. +[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? + + +PART=`echo $1` +IMGFILE=`echo $2` + +case "$#" in + "2") + # Sintaxis por defecto OG PART IMGFILE + #echo "partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART $IMGFILE" + # Se comenta la instruccion que debería ir aqui + ogCreateImageSyntax $1 $2 partclone gzip + ;; + "4") + # Sintaxis condicionada. + # comprobamos parametro herramienta compresion. + TOOL=$(echo $3 | tr [A-Z] [a-z]) + #ogCheckProgram $TOOL + #comprobar parámetro compresor. + LEVEL=$(echo $4 | tr [A-Z] [a-z]) + #ogCheckProgram $LEVEL + + # herramienta + case "$TOOL" in + "ntfsclone") + PARAM1="ntfsclone --force --save-image -O - $PART" + ;; + "partimage"|DEFAULT) + PARAM1="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $PART stdout" + ;; + "partclone") + PARAM1=`ogPartcloneSyntax $PART` || ogRaiseError $OG_ERR_FORMAT || return $? + ;; + esac + # mbuffer + which mbuffer > /dev/null && PARAM2="| mbuffer -q -m 40M " || PARAM2=" " + + # nivel de compresion + case "$LEVEL" in + "0"|"none") + PARAM3=" > " + ;; + "1"|"lzop") + PARAM3=" | lzop > " + ;; + "2"|"gzip") + PARAM3=" | gzip -c > " + ;; + "3"|"bzip") + PARAM3=" | bzip -c > " + ;; + esac + #sintaxis final. + echo "$PARAM1 $PARAM2 $PARAM3 $IMGFILE" + ;; +esac +} + + +#/** +# ogRestoreImageSyntax filename partition [tools] [levelcompresor] +#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen +#@param 1 filename path absoluto del fichero imagen +#@param 2 partition identificador linux del dispositivo particion. +#@param 3 [opcional] str_tools herrmaienta de clonacion [partimage, partclone, ntfsclone] +#@param 4 [opcional] str_levelcompresor nivel de compresion. [0 -none-, 1-lzop-, 2-gzip] +#@return cadena con el comando que se debe ejecutar. +#@exception OG_ERR_FORMAT formato incorrecto. +#@warning En pruebas iniciales +#@TODO introducir las herramientas fsarchiver, dd +#@TODO introducir el nivel de compresion gzip +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## + +ogRestoreImageSyntax () +{ +local TOOL COMPRESSOR LEVEL PART IMGFILE FILEHEAD INFOIMG + + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME filename partition [tool] [levelcompresor]" \ + "$FUNCNAME /opt/opengnsys/images/prueba.img /dev/sda1 [partclone] [lzop]" + return +fi + +# Error si no se reciben al menos 2 parámetros. +[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? + +# controlamos que el parametro 1 (imagen) es tipo file. +[ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + +# Si 2 parametros (file-origen-, device-destino-) = ogGetImageFull($1) +if [ "$#" -eq 2 ]; then + IMGFILE=$1 + PART=$2 + INFOIMG=$(ogGetImageInfo $IMGFILE) || ogRaiseError $OG_ERR_NOTFOUND "No Image $1" || return $? + TOOL=`echo $INFOIMG | cut -f1 -d:` + COMPRESSOR=`echo $INFOIMG | cut -f2 -d:` + ogRestoreImageSyntax $IMGFILE $PART $TOOL $COMPRESSOR +fi + + +# Si cuatro parametros genera sintaxis +if [ "$#" -eq 4 ]; then + IMGFILE=$1 + PART=$2 + # comprobamos parametro herramienta compresion. + TOOL=$(echo $3 | tr [A-Z] [a-z]) + #ogCheckProgram $TOOL + #comprobar parámetro compresor. + LEVEL=$(echo $4 | tr [A-Z] [a-z]) + #ogCheckProgram $LEVEL + + case "$LEVEL" in + "0"|"none") + COMPRESSOR=" " + ;; + "1"|"lzop" | "LZOP") + COMPRESSOR=" lzop -dc " + ;; + "2"|"gzip" | "GZIP") + COMPRESSOR=" gzip -dc " + ;; + "3"|"bzip" | "BZIP" ) + COMPRESSOR=" bzip -dc " + ;; + *) + ogRaiseError $OG_ERR_NOTFOUND "Compressor no valid $TOOL" || return $? + ;; + esac + #comprobar mbuffer + which mbuffer > /dev/null && MBUFFER="| mbuffer -q -m 40M " || MBUFFER=" " + + case "$TOOL" in + "ntfsclone" | "NTFSCLONE") + TOOL="| ntfsclone --restore-image --overwrite $PART -" + ;; + "partimage"| "PARTIMAGE") + TOOL="| partimage -f3 -B gui=no restore $PART stdin" + ;; + "partclone" | "PARTCLONE") + # -C para que no compruebe tamaños + TOOL="| partclone.restore -o $PART" + ;; + *) + ogRaiseError $OG_ERR_NOTFOUND "Tools imaging no valid $TOOL" || return $? + ;; + esac + + echo "$COMPRESSOR $IMGFILE $MBUFFER $TOOL" +fi + +} + + + #/** # ogCreateImage int_ndisk int_npartition str_repo path_image @@ -46,7 +318,7 @@ if [ "$*" == "help" ]; then return fi # Error si no se reciben 4 parámetros. -[ $# -ne 4 ] && ogRaiseError $OG_ERR_FORMAT && return $? +[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $? # Comprobar que no está bloqueada ni la partición, ni la imagen. PART="$(ogDiskToDev $1 $2)" || return $? @@ -54,8 +326,9 @@ if ogIsLocked $1 $2; then ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2" return $? fi -IMGTYPE="pgz" # Partclone / GZip +IMGTYPE="img" # Extensión genérica de imágenes. IMGDIR=$(ogGetParentPath "$3" "$4") + [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? IMGFILE="$IMGDIR/$(basename "$4").$IMGTYPE" if ogIsImageLocked "$IMGFILE"; then @@ -69,22 +342,10 @@ ogLockImage "$3" "$4.$IMGTYPE" || return $? # Crear Imagen. trap "ogUnlock $1 $2; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9 -TYPE="$(ogGetFsType $1 $2)" -case "$TYPE" in - EXT[234]) - PROGRAM=partclone.extfs ;; - REISERFS|XFS|JFS) - PROGRAM=partclone.dd ;; - NTFS|HNTFS) - PROGRAM=partclone.ntfs ;; - FAT16|FAT32|HFAT16|HFAT32) - PROGRAM=partclone.fat ;; - HFS|HFS+) - PROGRAM=partclone.hfsp ;; - *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" - return $? ;; -esac -$PROGRAM -c -C -F -s $PART | mbuffer -q -m 70% | gzip -c > "$IMGFILE" +#Solicitamos la generación de la instruccion a ejecutar +PROGRAM=`ogCreateImageSyntax $PART $IMGFILE $5 $6` +echo $PROGRAM +eval $PROGRAM # Controlar salida de error y desbloquear partición. ERRCODE=$? @@ -99,6 +360,230 @@ return $ERRCODE } + + + + + + +#/** +# ogRestoreImage str_repo path_image int_ndisk int_npartition +#@brief Restaura una imagen de sistema de archivos en una partición. +#@param str_repo repositorio de imágenes o caché local +#@param path_image camino de la imagen +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return (por determinar) +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. +#@exception OG_ERR_LOCKED partición bloqueada por otra operación. +#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. +#@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc. +#@version 0.1 - Integracion para Opengnsys - HIDRA:RestaurarImagen{EXT3, NTFS}.sh; EAC: RestorePartitionFromImage() en Deploy.lib +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@Date 2008/05/13 +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date 2008/10/27 +#@version 0.9 - Primera version muy en pruebas para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009/09/10 +#*/ ## +function ogRestoreImage () +{ +# Variables locales +local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \ + "$FUNCNAME REPO /aula1/winxp 1 1" + return +fi +# Error si no se reciben 4 parámetros. +[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Procesar parámetros. +PART="$(ogDiskToDev "$3" "$4")" || return $? +#IMGTYPE=$(ogGetImageType "$1" "$2") +IMGTYPE=img +IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") +[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? +# Error si la imagen no cabe en la particion. +IMGSIZE=$(ogGetImageSize "$1" "$2") +PARTSIZE=$(ogGetPartitionSize $3 $4) +if [ $IMGSIZE -gt $PARTSIZE ]; then + ogRaiseError $OG_ERR_PARTITION "$IMGSIZE > $PARTSIZE" + return $? +fi + +# Comprobar el bloqueo de la imagen y de la partición. +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" + return $? +fi +if ogIsLocked $3 $4; then + ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $3, $4" + return $? +fi +# Desmontar y bloquear partición. +ogUnmount $3 $4 2>/dev/null || return $? +ogLock $3 $4 || return $? +trap "ogUnlock $3 $4" 1 2 3 6 9 + +# Restaurar según el tipo de imagen. +# Atención: no se comprueba el tipo de sistema de archivos. +# Atención: no se comprueba incongruencia entre partición e imagen. +#Solicitamos la generación de la instruccion a ejecutar +PROGRAM=`ogRestoreImageSyntax $IMGFILE $PART` +echo $PROGRAM +eval $PROGRAM + +ERRCODE=$? +if [ $ERRCODE != 0 ]; then + ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4" +fi +ogUnlock $3 $4 +return $ERRCODE +} + + +#/** +# ogGetImageInfo filename +#@brief muestra información sobre la imagen monolitica. +#@param 1 filename path absoluto del fichero imagen +#@return cadena compuesta por clonacion:compresor:sistemaarchivos:tamañoKB +#@exception OG_ERR_FORMAT formato incorrecto. +#@exception OG_ERR_NOTFOUND fichero no encontrado. +#@exception OG_ERR_IMAGE "Image format is not valid $IMGFILE" +#@warning En pruebas iniciales +#@TODO Definir sintaxis de salida (herramienta y compresor en minuscula) +#@TODO Arreglar loop para ntfsclone +#@TODO insertar parametros entrada tipo OG +#@version 1.0 - Primeras pruebas +#@author Antonio J. Doblas Viso. Universidad de Málaga +#@date 2010/02/08 +#*/ ## + +function ogGetImageInfo () { +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME filename " \ + "$FUNCNAME /opt/opengnsys/images/prueba.img " + return +fi + +# Error si no se reciben 1 parámetros. +[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +#comprobando que el parametro uno es un file. +[ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? + +local TOOLS COMPRESSOR IMGFILE FILEHEAD FS SIZE PARTIMAGEINFO PARTCLONEINFO NTFSCLONEINFO IMGDETECT +IMGDETECT="FALSE" + +IMGFILE=$1 +FILEHEAD=/tmp/`basename $IMGFILE`.infohead +COMPRESSOR=`file $IMGFILE | awk '{print $2}'` +ogCheckStringInGroup "$COMPRESSOR" "gzip lzop" || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? +$($COMPRESSOR -dc $IMGFILE 2>/dev/null | head > $FILEHEAD) || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? + +## buscando Primera opción. +if [ "$IMGDETECT" == "FALSE" ] +then + PARTCLONEINFO=$(partclone.info $FILEHEAD 2>&1) + if `echo $PARTCLONEINFO | grep size > /dev/null` + then + TOOLS=PARTCLONE + FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}') + SIZE=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); printf "%d\n", $11*1024*1024;}') + IMGDETECT="TRUE" + fi +fi +#buscando segunda opcion. +if [ "$IMGDETECT" == "FALSE" -a ! -f /dev/loop2 ] +then + cat $FILEHEAD | grep -w ntfsclone-image > /dev/null && NTFSCLONEINFO=$(cat $FILEHEAD | ntfsclone --restore --overwrite /dev/loop2 - 2>&1) + if `echo $NTFSCLONEINFO | grep ntfsclone > /dev/null` + then + TOOLS=NTFSCLONE + SIZE=$(echo $NTFSCLONEINFO | awk '{gsub(/\(|\)|\./,""); printf "%d\n",$17/1000;}') + FS=NTFS + IMGDETECT="TRUE" + fi +fi +## buscando Tercer opción. +if [ "$IMGDETECT" == "FALSE" ] +then + PARTIMAGEINFO=$(partimage -B gui=no imginfo "$FILEHEAD" 2>&1) + if `echo $PARTIMAGEINFO | grep Partition > /dev/null` + then + TOOLS=PARTIMAGE + FS=$(echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $17;}' | awk '{sub(/\.\.+/," "); print toupper($2)}') + SIZE=$( echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $36;}' | awk '{sub(/\.\.+/," "); printf "%d\n",$2*1024*1024;}') + IMGDETECT="TRUE" + fi +fi +#comprobamos valores #Chequeamos los valores devueltos. +if [ -z "$TOOLS" -o -z "$COMPRESSOR" -o "$IMGDETECT" == "FALSE" ] +then + ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $? +else + COMPRESSOR=$(echo $COMPRESSOR | tr [a-z] [A-Z]) + echo $TOOLS:$COMPRESSOR:$FS:$SIZE +fi +} + +function ogGetImageProgram () +{ +local IMGFILE +IMGFILE=$(ogGetPath "$1" "$2.img") || return $? +[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? +ogGetImageInfo $IMGFILE | awk -F: '{print $1}' + +} + +function ogGetImageCompressor () +{ +local IMGFILE +IMGFILE=$(ogGetPath "$1" "$2.img") || return $? +[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? +ogGetImageInfo $IMGFILE | awk -F: '{print $2}' +} + +function ogGetImageType () +{ +local IMGFILE +IMGFILE=$(ogGetPath "$1" "$2.img") || return $? +[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? +#partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \ +# awk '/^Filesystem/ {sub(/\.\.+/," "); sub(/fs$/,""); print toupper($2);}' +ogGetImageInfo $IMGFILE | awk -F: '{print $3}' + +} + +function ogGetImageSize () +{ +# Variables locales +local IMGFILE + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME testing path_dir str_image int_ndisk int_npart" \ + "$FUNCNAME 1 1 REPO /aula1/winxp ==> 5642158" + return +fi +# Error si no se reciben menos de 2 parámetros. +[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Error si el fichero de imagen no es accesible. +IMGFILE=$(ogGetPath "$1" "$2.img") || return $? +[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? + +# Devuelve el tamaño de la imagen en KB. +#partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \ +# awk '/Partition size/ {sub(/\.\.+/," "); printf "%d\n",$3*1024*1024;}' +ogGetImageInfo $IMGFILE | awk -F: '{print $4}' +} + + #/** # ogGetImageFs str_repo path_image #@brief Devuelve el tipo de sistema de archivos almacenado en un fichero de imagen. @@ -109,7 +594,7 @@ return $ERRCODE #@exception OG_ERR_NOTFOUND fichero de imagen no encontrado. #@todo Comprobar salidas para todos los tipos de sistemas de archivos. #/** -function ogGetImageFs () +function ogGetImageFsUS () { local IMGFILE IMGTYPE IMGTYPE=$(ogGetImageType "$1" "$2") @@ -146,7 +631,7 @@ esac #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009/09/11 #*/ ## -function ogGetImageSize () +function ogGetImageSizeUS () { # Variables locales local IMGFILE IMGTYPE @@ -180,7 +665,7 @@ esac #### PRUEBAS # Obtener tipo de imagen -function ogGetImageType () +function ogGetImageTypeUS () { local IMGFILE IMGTYPE EXT for EXT in img pgz; do @@ -189,269 +674,3 @@ for EXT in img pgz; do done echo $IMGTYPE } - -# Comprobar si el fichero de bloqueo para una imagen. -function ogIsImageLocked () -{ -# Variables locales -local IMGDIR - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ - "if $FUNCNAME /opt/opengnsys/images/aula1/winxp.img; then ...; fi" \ - "if $FUNCNAME REPO /aula1/winxp.img; then ...; fi" - return -fi -# Comprobar si existe el fichero de bloqueo. -test -n "$(ogGetPath $@.lock)" -} - -# Bloquear imagen para creación. -function ogLockImage () -{ -# Variables locales -local IMGDIR - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ - "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \ - "$FUNCNAME REPO /aula1/winxp.img" - return -fi -# Error si no se reciben 1 o 2 parámetros. -[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? -# Comprobar que existe directorio de imagen -IMGDIR=$(ogGetParentPath $@) || return $? -# Crear fichero de bloqueo. -touch $IMGDIR/$(basename "${!#}").lock -} - -# Desbloquear imagen (borrar fichero de bloqueo). -function ogUnlockImage () -{ -# Variables locales -local IMGDIR - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ - "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \ - "$FUNCNAME REPO /aula1/winxp.img" - return -fi -# Error si no se reciben 1 o 2 parámetros. -[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? -# Borrar fichero de bloqueo para la imagen. -rm -f $(ogGetPath $@.lock) -} - -#/** -# ogRestoreImage str_repo path_image int_ndisk int_npartition -#@brief Restaura una imagen de sistema de archivos en una partición. -#@param str_repo repositorio de imágenes o caché local -#@param path_image camino de la imagen -#@param int_ndisk nº de orden del disco -#@param int_npartition nº de orden de la partición -#@return (por determinar) -#@exception OG_ERR_FORMAT formato incorrecto. -#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados. -#@exception OG_ERR_LOCKED partición bloqueada por otra operación. -#@exception OG_ERR_IMAGE error al restaurar la imagen del sistema. -#@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc. -#@version 0.1 - Integracion para Opengnsys - HIDRA:RestaurarImagen{EXT3, NTFS}.sh; EAC: RestorePartitionFromImage() en Deploy.lib -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@Date 2008/05/13 -#@author Antonio J. Doblas Viso. Universidad de Malaga -#@date 2008/10/27 -#@version 0.9 - Primera version muy en pruebas para OpenGnSys -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009/09/10 -#*/ ## -function ogRestoreImage () -{ -# Variables locales -local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE - -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \ - "$FUNCNAME REPO /aula1/winxp 1 1" - return -fi -# Error si no se reciben 4 parámetros. -[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $? -# Procesar parámetros. -PART="$(ogDiskToDev "$3" "$4")" || return $? -IMGTYPE=$(ogGetImageType "$1" "$2") -IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") -[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $? -# Error si la imagen no cabe en la particion. -IMGSIZE=$(ogGetImageSize "$1" "$2") -PARTSIZE=$(ogGetPartitionSize $3 $4) -if [ $IMGSIZE -gt $PARTSIZE ]; then - ogRaiseError $OG_ERR_PARTITION "$IMGSIZE > $PARTSIZE" - return $? -fi - -# Comprobar el bloqueo de la imagen y de la partición. -if ogIsImageLocked "$IMGFILE"; then - ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" - return $? -fi -if ogIsLocked $3 $4; then - ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $3, $4" - return $? -fi -# Desmontar y bloquear partición. -ogUnmount $3 $4 2>/dev/null || return $? -ogLock $3 $4 || return $? -trap "ogUnlock $3 $4" 1 2 3 6 9 - -# Restaurar según el tipo de imagen. -# Atención: no se comprueba el tipo de sistema de archivos. -# Atención: no se comprueba incongruencia entre partición e imagen. -#FSTYPE="$(ogGetFsType $3 $4)" -case "$IMGTYPE" in - img) # Partimage - partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" - ;; - pgz) # Partclone / GZip - gzip -dc "$IMGFILE" | mbuffer -q -m 70% | partclone.restore -C -F -o "$PART" - ;; - *) # Error si imagen no accesible o de tipo desconocido. - ogRaiseError $OG_ERR_FORMAT - return $? ;; -esac -ERRCODE=$? -if [ $ERRCODE != 0 ]; then - ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4" -fi -ogUnlock $3 $4 -return $ERRCODE -} - - -function ogCreateImageFromPartition () { -#/** @function CreateImageFromPartition: @brief Crea una imagen de la particion indicada, utilizando el programa definido en las variable $CloneImageNTFS y $CloneImageEXT23 -#@param $1 int DiskEAC -#@param $2 int_PartitionEAC -#@param $3 str_Repositorio ......... parametro pasado a ConectToRepo, admite $REPO $CACHE str_IP_servidorAlterno -#@param $4 str_pathbase .............. Pathbase, directorio relativo, de la imagen, en EAC, se ha definido que todo repositorio comience por hdimages, pero puede variar, para adaparse a usb, o cualquier otro almacenamiento. -#@param $5 str_NameImage.str_compresion .......... (como compresion admite gzip y lzop) -#@param ejemplo: CreateImageFromPartition 1 1 $IP hdimages/pruebas/ base.gzip -#@return la propia de la herramienta de clonacion partimage o ntfsclone -#@return genera la imagen con el nombre (imagen.compresion), y se le a?ade un guion y el numero de particion(parametro $2). -#@return Tambien se solicita al servidor EAC, la creaci?n del fichero meta torrent, que tendra el nombre tal base.gzip-1.torrent, -#@return Tambien se crea el fichero base.gzip-1.mcast con informacion para su uso con multicast, tal base.gzip-1.mcast -#@warning Salidas de errores no determinada -#@attention -#@note Pendiente: que admita como segundo parametro el valor 0 (para que identifique el MBR del disco) -#@version 0.1 Date: 27/10/2008 Author Antonio J. Doblas Viso. Universidad de Malaga -#*/ -if [ $# != 5 ] -then - echo "sintaxis: CreateImageFromPartition <ndisco> <nparticion> <iprespositorio> <pathbase> <nombreimagen.compresion>" - echo "ejemplo: CreateImageFromPartition 1 1 \$IP images/pruebas/ base.gzip" - echo " en iprepositorio admite cualquier ip de un servdior EAC, se llama a la funcion MountRepo ip" -fi -if [ $# = 5 ] -then - CloneImageNTFS="${CLONETOOLSNTFS:-partimage}" - CloneImageEXT23="${CLONETOOLSEXT:-partimage}" - CompresionImage="${CLONETOOLSCOMPRESSOR:-gzip}" - - disco=`ogDiskToDev $1 $2` - ogUnmountPartition $1 $2 - fs=`ogGetFsType $1 $2` - - echo determinando tipo de Sistema Operativo y consulando la variable global CloneImageNTFS: $fs - case $fs in - "NTFS") - case $CloneImageNTFS in - "ntfsclone") - #imaged="ntfsclone --force --save-image -O - $disco | " - imaged="ntfsclone --force --save-image -O - $disco" - program=ntfsclone - ;; - "partimage") - #imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout |" - imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout" - program=partimage - ;; - "partimage-ng") - #echo "partimage-ng" - #imaged="partimage-ng save $disco stdout" - program=partimage-ng - ;; - "partclone") - #echo "partclone" - #imaged="partclone.ntfs -c -F -s $disco | " - imaged="partclone.ntfs -c -F -s $disco" - program=partclone.ntfs - #zcat ~/image_sda1.pcl.gz | partclone.ext4 -r -o /dev/sda1 - ;; - esac - ;; - EXT[234]|REISERFS) - case $CloneImageEXT23 in - "partimage") - imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout" - program=partimage - ;; - "partimage-ng") - #echo "partimage-ng" - imaged="partimage-ng save $disco stdout" - program=partimage-ng - ;; - "partclone") - echo "partclone" - imaged="partclone.ext3 -c -F -C -s $disco" - program=partclone.ext3 - #zcat ~/image_sda1.pcl.gz | partclone.ext4 -r -o /dev/sda1 - ;; - esac - ;; - esac - - # utilizando mbuffer para reducir posibles errores de acceso a discos - imaged="$imaged | mbuffer -m 70%" - #metodo de compresion. - case $CompresionImage in - "gzip") - comando="$imaged | gzip -c >" - ;; - "lzop") - comando="$imaged | lzop >" - ;; - esac - - #. determnamos el fichero donde se almacenar? la image - #camino=`ConnectToRepo $3 $4 $5` - #MkdirPath $camino - firstcamino=`ogNewPath $3 $4` - camino=$firstcamino$5 - echo $camino - sleep 1 - - #preparamos y ejecutamos el comanod a realizar - echo "Creando imagen particion $disco programa $program compresion $CompresionImage en el repositorio $3 como $4 $5 - $2" - comando="$comando ${camino}-$2" - echo "comando: $comando" - echo $comando > /tmp/run.sh - sh /tmp/run.sh - unset comando - - #iniciamos la creacion del torrent - echo "Iniciando la creacion del punto torrent con CreateTorrentFromImage ip=$3 path=$4 image=$5-$2" echo - #CreateTorrentFromImage $3 $4 $5-$2 - # iniciacmos el putno mcast - echo "creando un punto mcast ${camino}-$2.mcast" - echo "program;$program" > ${camino}.mcast - echo "compresion;$CompresionImage" >> ${camino}.mcast - echo "fsimage;$fs" >> ${camino}.mcast - - #UmountRepo $3 -fi -} |