summaryrefslogtreecommitdiffstats
path: root/client/engine/Image.lib
diff options
context:
space:
mode:
authoradv <adv@uma.es>2011-02-24 21:19:31 +0000
committeradv <adv@uma.es>2011-02-24 21:19:31 +0000
commit914d834897ea6bbdf9f8486e737c820c87ca69d5 (patch)
tree8719f4f0e18996d022b8b77e3d8be37f6e508335 /client/engine/Image.lib
parent6da16475a3fa860c687f11b5ab1bd297cc47fcc6 (diff)
branch version 1.0
git-svn-id: https://opengnsys.es/svn/branches/version1.0@1503 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client/engine/Image.lib')
-rwxr-xr-xclient/engine/Image.lib793
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
-}