summaryrefslogtreecommitdiffstats
path: root/client/engine/Image.lib
diff options
context:
space:
mode:
Diffstat (limited to 'client/engine/Image.lib')
-rwxr-xr-xclient/engine/Image.lib348
1 files changed, 287 insertions, 61 deletions
diff --git a/client/engine/Image.lib b/client/engine/Image.lib
index 7940b4f5..dfbcb487 100755
--- a/client/engine/Image.lib
+++ b/client/engine/Image.lib
@@ -4,12 +4,11 @@
#@brief Librería o clase Image
#@class Image
#@brief Funciones para creación, restauración y clonación de imágenes de sistemas.
-#@version 1.0.5
+#@version 1.1.0
#@warning License: GNU GPLv3+
#*/
-
#/**
# ogCreateImageSyntax path_device path_filename [str_tool] [str_compressionlevel]
#@brief Genera una cadena de texto con la instrucción para crear un fichero imagen
@@ -29,7 +28,7 @@
#*/ ##
function ogCreateImageSyntax()
{
-local FS TOOL LEVEL PART IMGFILE BUFFER PARAM1 PARAM2 PARAM3
+local FS TOOL LEVEL DEV IMGFILE BUFFER PARAM1 PARAM2 PARAM3
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -42,10 +41,10 @@ fi
[ $# -ge 2 -a $# -le 4 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $?
# Asignación de parámetros.
-PART="$1"
+DEV="$1"
IMGFILE="$2"
case "$#" in
- 2) # Sintaxis por defecto OG PART IMGFILE
+ 2) # Sintaxis por defecto OG DEV IMGFILE
TOOL="partclone"
LEVEL="gzip"
;;
@@ -57,14 +56,13 @@ esac
case "$TOOL" in
ntfsclone)
- PARAM1="ntfsclone --force --save-image -O - $PART"
+ PARAM1="ntfsclone --force --save-image -O - $DEV"
;;
partimage|default)
- PARAM1="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $PART stdout"
+ PARAM1="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $DEV stdout"
;;
partclone)
- FS="$(ogGetFsType $(ogDevToDisk $PART 2>/dev/null) 2>/dev/null)"
- umount $PART 2>/dev/null
+ FS="$(ogGetFsType $(ogDevToDisk $DEV 2>/dev/null) 2>/dev/null)"
case "$FS" in
EXT[234]) PARAM1="partclone.extfs" ;;
BTRFS) PARAM1="partclone.btrfs" ;;
@@ -72,16 +70,21 @@ case "$TOOL" in
REISER4) PARAM1="partclone.reiser4" ;;
JFS) PARAM1="partclone.jfs" ;;
XFS) PARAM1="partclone.xfs" ;;
+ F2FS) PARAM1="partclone.f2fs" ;;
+ NILFS2) PARAM1="partclone.nilfs2" ;;
NTFS) PARAM1="partclone.ntfs" ;;
EXFAT) PARAM1="partclone.exfat" ;;
FAT16|FAT32) PARAM1="partclone.fat" ;;
HFS|HFSPLUS) PARAM1="partclone.hfsp" ;;
UFS) PARAM1="partclone.ufs" ;;
- *) PARAM1="partclone.dd" ;;
+ VMFS) PARAM1="partclone.vmfs" ;;
+ *) PARAM1="partclone.imager" ;;
esac
# Por compatibilidad, si no existe el ejecutable usar por defecto "parclone.dd".
which $PARAM1 &>/dev/null || PARAM1="partclone.dd"
- PARAM1="$PARAM1 -d0 -F -c -s $PART"
+ PARAM1="$PARAM1 -d0 -F -c -s $DEV"
+ # Algunas versiones de partclone.dd no tienen opción "-c".
+ [ -z "$(eval ${PARAM1%% *} --help 2>&1 | grep -- -c)" ] && PARAM1="${PARAM1/ -c / }"
;;
esac
# Comprobar que existe mbuffer.
@@ -116,8 +119,7 @@ esac
#@author Antonio J. Doblas Viso. Universidad de Málaga
#@date 2010/02/08
#*/ ##
-
-ogRestoreImageSyntax ()
+function ogRestoreImageSyntax ()
{
local TOOL COMPRESSOR LEVEL PART IMGFILE FILEHEAD INFOIMG
@@ -177,17 +179,20 @@ if [ "$#" -eq 4 ]; then
#comprobar mbuffer
which mbuffer > /dev/null && MBUFFER="| mbuffer -q -m 40M " || MBUFFER=" "
- case "$TOOL" in
- "ntfsclone" | "NTFSCLONE")
+ case "${TOOL,,}" in
+ ntfsclone)
TOOL="| ntfsclone --restore-image --overwrite $PART -"
;;
- "partimage"| "PARTIMAGE")
+ partimage)
TOOL="| partimage -f3 -B gui=no restore $PART stdin"
;;
- "partclone" | "PARTCLONE")
+ partclone*)
# -C para que no compruebe tamaños
TOOL="| partclone.restore -d0 -C -I -o $PART"
;;
+ dd)
+ TOOL="| pv | dd conv=sync,noerror bs=1M of=$PART"
+ ;;
*)
ogRaiseError $OG_ERR_NOTFOUND "Tools imaging no valid $TOOL" || return $?
;;
@@ -202,6 +207,88 @@ fi
#/**
+# ogCreateDiskImage int_ndisk str_repo path_image [str_tools] [str_compressionlevel]
+#@brief Crea una imagen (copia de seguridad) de un disco completo.
+#@param int_ndisk nº de orden del disco
+#@param str_repo repositorio de imágenes (remoto o caché local)
+#@param path_image camino de la imagen (sin extensión)
+#@return (nada, por determinar)
+#@note repo = { REPO, CACHE }
+#@note Esta primera versión crea imágenes con dd comprimidas con gzip.
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
+#@exception OG_ERR_LOCKED particion bloqueada por otra operación.
+#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
+#@warning En pruebas iniciales
+#@todo Gestión de bloqueos de disco
+#@todo Comprobar si debe desmontarse la caché local
+#@todo Comprobar que no se crea la imagen en el propio disco
+#@version 1.1.0 - Primera versión para OpenGnsys con herramientas prefijadas.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@Date 2016/04/08
+#*/ ##
+function ogCreateDiskImage ()
+{
+# Variables locales
+local DISK PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE
+
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \
+ "$FUNCNAME 1 REPO /disk1"
+ return
+fi
+# Error si no se reciben entre 3 y 5 parámetros.
+[ $# -ge 3 -a $# -le 5 ] || ogRaiseError $OG_ERR_FORMAT "$*" || return $?
+
+# Comprobar que no está bloqueada ni la partición, ni la imagen.
+DISK="$(ogDiskToDev $1)" || return $?
+if ogIsDiskLocked $1; then
+ ogRaiseError $OG_ERR_LOCKED "$MSG_LOCKED $1"
+ return $?
+fi
+IMGTYPE="dsk" # Extensión genérica de imágenes de disco.
+IMGDIR=$(ogGetParentPath "$2" "$3")
+[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $?
+IMGFILE="$IMGDIR/$(basename "$3").$IMGTYPE"
+if ogIsImageLocked "$IMGFILE"; then
+ ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4"
+ return $?
+fi
+
+# No guardar imagen en el propio disco (disco no incluido en el camino del repositorio).
+if [[ $(ogGetPath "$2" /) =~ ^$DISK ]]; then
+ ogRaiseError $OG_ERR_IMAGE "$2 = $DISK"
+ return $?
+fi
+
+# Generar la instruccion a ejecutar antes de aplicar los bloqueos.
+PROGRAM=$(ogCreateImageSyntax $DISK $IMGFILE)
+# Desmontar todos los sistemas de archivos del disco, bloquear disco e imagen.
+ogUnmountAll $1 2>/dev/null
+ogLockDisk $1 || return $?
+ogLockImage "$2" "$3.$IMGTYPE" || return $?
+
+# Crear Imagen.
+trap "ogUnlockDisk $1; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9
+eval $PROGRAM
+
+# Controlar salida de error, crear fichero de información y desbloquear partición.
+ERRCODE=$?
+if [ $ERRCODE == 0 ]; then
+ echo "$(ogGetImageInfo $IMGFILE):$(ogGetHostname)" > $IMGFILE.info
+else
+ ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
+ rm -f "$IMGFILE"
+fi
+# Desbloquear disco e imagen.
+ogUnlockDisk $1
+ogUnlockImage "$2" "$3.$IMGTYPE"
+return $ERRCODE
+}
+
+
+#/**
# ogCreateImage int_ndisk int_npartition str_repo path_image [str_tools] [str_compressionlevel]
#@brief Crea una imagen a partir de una partición.
#@param int_ndisk nº de orden del disco
@@ -217,7 +304,6 @@ fi
#@exception OG_ERR_PARTITION partición no accesible o no soportada.
#@exception OG_ERR_LOCKED particion bloqueada por otra operación.
#@exception OG_ERR_IMAGE error al crear la imagen del sistema.
-#@warning En pruebas iniciales
#@todo Comprobaciones, control de errores, definir parámetros, etc.
#@version 0.1 - Integracion para Opengnsys - HIDRA:CrearImagen{EXT3, NTFS}.sh; EAC: CreateImageFromPartition () en Deploy.lib
#@author Ramon Gomez, ETSII Universidad de Sevilla
@@ -238,8 +324,8 @@ local PART PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart path_dir str_image" \
- "$FUNCNAME 1 1 REPO /aula1/winxp"
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart str_repo path_image" \
+ "$FUNCNAME 1 1 REPO /aula1/win7"
return
fi
# Error si no se reciben entre 4 y 6 parámetros.
@@ -248,7 +334,7 @@ fi
# Comprobar que no está bloqueada ni la partición, ni la imagen.
PART="$(ogDiskToDev $1 $2)" || return $?
if ogIsLocked $1 $2; then
- ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2"
+ ogRaiseError $OG_ERR_LOCKED "$MSG_LOCKED $1, $2"
return $?
fi
@@ -272,9 +358,11 @@ ogLockImage "$3" "$4.$IMGTYPE" || return $?
trap "ogUnlock $1 $2; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9
eval $PROGRAM
-# Controlar salida de error y desbloquear partición.
+# Controlar salida de error, crear fichero de información y desbloquear partición.
ERRCODE=$?
-if [ $ERRCODE != 0 ]; then
+if [ $ERRCODE == 0 ]; then
+ echo "$(ogGetImageInfo $IMGFILE):$(ogGetHostname)" > $IMGFILE.info
+else
ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
rm -f "$IMGFILE"
fi
@@ -309,7 +397,7 @@ function ogCreateMbrImage ()
local DISK IMGDIR IMGFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk path_dir str_image" \
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \
"$FUNCNAME 1 REPO /aula1/mbr"
return
fi
@@ -347,7 +435,7 @@ function ogCreateBootLoaderImage ()
local DISK IMGDIR IMGFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk path_dir str_image" \
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk str_repo path_image" \
"$FUNCNAME 1 REPO /aula1/mbr"
return
fi
@@ -369,25 +457,39 @@ dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IM
#@param int_disk numero de disco
#@param int_part numero de particion
#@param str_repo repositorio de imágenes { REPO, CACHE }
+#@param str_imageName Nombre de la imagen
#@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional)
-#@return SIZEDATA SIZEREQUIRED ISENOUGHSPACE
+#@return SIZEDATA SIZEREQUIRED SIZEFREE ISENOUGHSPACE
#@note si str_imageType= diff necesario /tmp/ogimg.info, que es creado por ogCreateInfoImage.
+#@note para el tamaño de la imagen no sigue enlaces simbólicos.
#@exception OG_ERR_FORMAT formato incorrecto.
#@author Irina Gomez, ETSII Universidad de Sevilla
#@date 2014/10/24
+#@version 1.1.0 - En la salida se incluye el espacio disponible en el repositorio (ticket #771)
+#@author Irina Gomez - ETSII Universidad de Sevilla
+#@date 2017-03-28
+#@version 1.1.0 - Si la imagen ya existe en el REPO se suma su tamaño al espacio libre
+#@author Irina Gomez - ETSII Universidad de Sevilla
+#@date 2017-11-08
#*/ ##
function ogGetSizeParameters ()
{
-local MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP SIZEFREE
+local REPO MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP FACTORSYNC SIZEFREE
+local IMGTYPE IMGDIR IMGFILE IMGEXT IMGSIZE
+
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo [monolic|sync|diff]" \
- "if $FUNCNAME 1 2 REPO sync ; then ...; fi" \
- "if $FUNCNAME 1 6 CACHE ; then ...; fi"
+ ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo path_imgname [monolit|sync|diff]" \
+ "if $FUNCNAME 1 2 REPO Windows10 sync ; then ...; fi" \
+ "if $FUNCNAME 1 6 Ubuntu16 CACHE ; then ...; fi"
return
fi
# Error si no se reciben 1 o 2 parámetros.
-[ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE [monolitic|sync]" ; echo $?)
+[ $# -lt 4 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE imgname [monolit|sync|diff]" ; echo $?)
+
+# Recogemos parametros
+REPO=${3^^}
+IMGTYPE="_${5^^}_"
MNTDIR=$(ogMount $1 $2)
if [ "$MNTDIR" == "" ]; then
@@ -396,21 +498,22 @@ if [ "$MNTDIR" == "" ]; then
fi
# Datos contenidos en la particion o en la lista de archivos de contiene la diferencial.
-if [ "_${4^^}_" == "_DIFF_" ]; then
+if [ "$IMGTYPE" == "_DIFF_" ]; then
[ -r /tmp/ogimg.info ] || return $(ogRaiseError session $OG_ERR_NOTFOUND "/tmp/ogimg.info"; echo $?)
cd $MNTDIR
SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1)
+ cd /
else
- SIZEDATA=$(df -k | grep $MNTDIR | awk '{print $3}')
+ SIZEDATA=$(df -k | grep $MNTDIR\$ | awk '{print $3}')
fi
#Aplicar factor de compresion
-if [ "_${4^^}_" == "_SYNC_" -o "_${4^^}_" == "_DIFF_" ]; then
+if [ "$IMGTYPE" == "_SYNC_" -o "$IMGTYPE" == "_DIFF_" ]; then
# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"}
- FACTORSYNC=${FACTORSYNC:-"120"}
+ FACTORSYNC=${FACTORSYNC:-"130"}
# Si IMGFS="BTRFS" la compresion es mayor.
[ $IMGFS == "BTRFS" ] && let FACTORSYNC=$FACTORSYNC-20
@@ -425,13 +528,33 @@ else
fi
#Comprobar espacio libre en el contenedor.
-[ "${3^^}" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`)
-[ "${3^^}" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}')
+[ "$REPO" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`)
+[ "$REPO" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}')
+
+# Comprobamos si existe una imagen con el mismo nombre en $REPO
+# En sincronizadas restamos tamaño de la imagen y en monoloticas de la .ant
+case "${IMGTYPE}" in
+ _DIFF_) IMGEXT="img.diff"
+ ;;
+ _SYNC_) IMGEXT="img"
+ ;;
+ *) IMGEXT="img.ant"
+ ;;
+esac
-[ "$SIZEREQUIRED" -lt "$SIZEFREE" ] && ISENOUGHSPACE=TRUE || ISENOUGHSPACE=FALSE
+IMGDIR=$(ogGetParentPath "$REPO" "/$4")
+IMGFILE=$(ogGetPath "$IMGDIR/$(basename "/$4").$IMGEXT")
+if [ -z "$IMGFILE" ]; then
+ IMGSIZE=0
+else
+ IMGSIZE=$(ls -s "$IMGFILE" | cut -f1 -d" ")
+fi
+
+let SIZEFREE=$SIZEFREE+$IMGSIZE
-echo $SIZEDATA $SIZEREQUIRED $ISENOUGHSPACE
+[ "$SIZEREQUIRED" -lt "$SIZEFREE" ] && ISENOUGHSPACE=TRUE || ISENOUGHSPACE=FALSE
+echo $SIZEDATA $SIZEREQUIRED $SIZEFREE $ISENOUGHSPACE
}
@@ -455,8 +578,8 @@ function ogIsImageLocked ()
# 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"
+ "if $FUNCNAME /opt/opengnsys/images/aula1/win7.img; then ...; fi" \
+ "if $FUNCNAME REPO /aula1/win7.img; then ...; fi"
return
fi
# Error si no se reciben 1 o 2 parámetros.
@@ -488,8 +611,8 @@ 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"
+ "$FUNCNAME /opt/opengnsys/images/aula1/win7.img" \
+ "$FUNCNAME REPO /aula1/win7.img"
return
fi
# Error si no se reciben 1 o 2 parámetros.
@@ -502,6 +625,81 @@ touch $IMGDIR/$(basename "${!#}").lock 2>/dev/null || ogRaiseError $OG_ERR_NOTWR
#/**
+# ogRestoreDiskImage str_repo path_image int_npartition
+#@brief Restaura (recupera) una imagen de un disco completo.
+#@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
+#@return (por determinar)
+#@warning Primera versión en pruebas
+#@todo Gestionar bloqueos de disco
+#@todo Comprobar que no se intenta restaurar de la caché sobre el mismo disco
+#@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.
+#@exception OG_ERR_IMGSIZEPARTITION Tamaño de la particion es menor al tamaño de la imagen.
+#@version 1.1.0 - Primera versión para OpenGnsys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@Date 2016/04/08
+#*/ ##
+function ogRestoreDiskImage ()
+{
+# Variables locales
+local DISK DISKSIZE IMGFILE IMGTYPE IMGSIZE PROGRAM ERRCODE
+
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \
+ "$FUNCNAME REPO /aula1/win7 1"
+ return
+fi
+# Error si no se reciben 4 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+# Procesar parámetros.
+DISK="$(ogDiskToDev $3)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?)
+IMGTYPE="dsk"
+IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE")
+[ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?)
+
+# comprobamos consistencia de la imagen
+ogGetImageInfo $IMGFILE >/dev/null || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?)
+# Error si la imagen no cabe en la particion.
+#IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?)
+#DISKSIZE=$(ogGetDiskSize $3)
+#if [ $IMGSIZE -gt $DISKSIZE ]; then
+# ogRaiseError $OG_ERR_IMGSIZEPARTITION "$DISKSIZE < $IMGSIZE"
+# 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 ogIsDiskLocked $3; then
+ ogRaiseError $OG_ERR_LOCKED "$MSG_DISK $3"
+ return $?
+fi
+# Solicitamos la generación de la instruccion a ejecutar
+PROGRAM=$(ogRestoreImageSyntax $IMGFILE $DISK)
+
+# Bloquear el disco
+ogLockDisk $3 || return $?
+trap "ogUnlockDisk $3" 1 2 3 6 9
+
+# Ejecutar restauración según el tipo de imagen.
+eval $PROGRAM
+
+ERRCODE=$?
+if [ $ERRCODE != 0 ]; then
+ ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4"
+fi
+ogUnlockDisk $3 $4
+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
@@ -538,8 +736,8 @@ local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE PROGRAM ERRCODE
# 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"
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk int_npart" \
+ "$FUNCNAME REPO /aula1/win7 1 1"
return
fi
# Error si no se reciben 4 parámetros.
@@ -618,7 +816,7 @@ function ogRestoreMbrImage ()
local DISK IMGFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk" \
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \
"$FUNCNAME REPO /aula1/mbr 1"
return
fi
@@ -654,7 +852,7 @@ function ogRestoreBootLoaderImage ()
local DISK IMGFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk" \
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image int_ndisk" \
"$FUNCNAME REPO /aula1/mbr 1"
return
fi
@@ -687,8 +885,8 @@ function ogUnlockImage ()
# 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"
+ "$FUNCNAME /opt/opengnsys/images/aula1/win7.img" \
+ "$FUNCNAME REPO /aula1/win7.img"
return
fi
# Error si no se reciben 1 o 2 parámetros.
@@ -720,12 +918,12 @@ function ogGetImageInfo ()
{
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME filename " \
- "$FUNCNAME /opt/opengnsys/images/prueba.img "
+ ogHelp "$FUNCNAME" "$FUNCNAME path_filename" \
+ "$FUNCNAME /opt/opengnsys/images/prueba.img ==> PARTCLONE:LZOP:NTFS:5642158"
return
fi
-# Error si no se reciben 1 parámetros.
+# Error si no se recibe 1 parámetro.
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
#comprobando que el parametro uno es un file.
@@ -786,7 +984,13 @@ then
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
+ if file $FILEHEAD 2> /dev/null | grep -q "boot sector"; then
+ TOOLS="partclone.dd"
+ FS=
+ SIZE=
+ IMGDETECT="TRUE"
+ fi
fi
#comprobamos valores #Chequeamos los valores devueltos.
if [ -z "$TOOLS" -o -z "$COMPRESSOR" -o "$IMGDETECT" == "FALSE" ]
@@ -798,34 +1002,58 @@ else
fi
}
+
function ogGetImageProgram ()
{
local IMGFILE
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \
+ "$FUNCNAME REPO prueba ==> PARTCLONE"
+ return
+fi
+# Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $?
ogGetImageInfo $IMGFILE | awk -F: '{print $1}'
-
}
+
function ogGetImageCompressor ()
{
local IMGFILE
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \
+ "$FUNCNAME REPO prueba ==> LZOP"
+ return
+fi
+# Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
[ -r "$IMGFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$IMGFILE" || return $?
ogGetImageInfo $IMGFILE | awk -F: '{print $2}'
}
+
function ogGetImageType ()
{
local IMGFILE
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo path_image" \
+ "$FUNCNAME REPO prueba ==> NTFS"
+ return
+fi
+# Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
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
@@ -833,8 +1061,8 @@ local IMGFILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE /str_image" \
- "$FUNCNAME REPO /aula1/winxp ==> 5642158"
+ ogHelp "$FUNCNAME" "$FUNCNAME str repo path_image" \
+ "$FUNCNAME REPO prueba ==> 5642158"
return
fi
# Error si no se reciben 2 parámetros.
@@ -844,8 +1072,6 @@ 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}'
}