summaryrefslogtreecommitdiffstats
path: root/client/engine/Image.lib
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2009-10-19 09:47:15 +0000
committerramon <ramongomez@us.es>2009-10-19 09:47:15 +0000
commit8964f9b26b06f61e20fba15bfe4fb653cc1a31b5 (patch)
tree8663353fbea6faab97ee1ac38d541d5485771018 /client/engine/Image.lib
parent87b02b26e403807cf587356ed77ac52c74eba3fd (diff)
Resstructuración de trunk.
git-svn-id: https://opengnsys.es/svn/trunk@390 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client/engine/Image.lib')
-rwxr-xr-xclient/engine/Image.lib324
1 files changed, 324 insertions, 0 deletions
diff --git a/client/engine/Image.lib b/client/engine/Image.lib
new file mode 100755
index 00000000..0821d093
--- /dev/null
+++ b/client/engine/Image.lib
@@ -0,0 +1,324 @@
+#!/bin/bash
+#/**
+#@file Image.lib
+#@brief Librería o clase Image
+#@class Image
+#@brief Funciones para creación, restauración y clonación de imágenes de sistemas.
+#@version 0.9
+#@warning License: GNU GPLv3+
+#*/
+
+
+#/**
+# ogCreateImage int_ndisk int_npartition str_repo path_image
+#@brief Crea una imagen a partir de una partición.
+#@arg \c ndisk nº de orden del disco
+#@arg \c npartition nº de orden de la partición
+#@arg \c str_repo repositorio de imágenes (remoto o caché local)
+#@arg \c path_image camino completo de la imagen (sin extensión)
+#@return (nada, por determinar)
+#@note repo = { REPO, CACHE }
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND fichero o dispositivo no encontrado.
+#@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, caché/repositorio, etc.
+#@version 0.9 - Versión en pruebas para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/10/07
+#*/
+function ogCreateImage () {
+
+# Variables locales
+local PART IMGDIR IMGFILE ERRCODE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart path_dir str_image" \
+ "$FUNCNAME 1 1 aula1 winxp"
+ return
+fi
+#/// Error si no se reciben menos de 2 parámetros.
+[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+
+PART="$(ogDiskToDev $1 $2)" || return $?
+if ogIsLocked $1 $2; then
+ ogRaiseError $OG_ERR_LOCKED "$1,$2"
+ return $?
+fi
+IMGDIR=$(ogGetParentPath "$3" "$4")
+[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $?
+IMGFILE="$IMGDIR/$(basename "$4")"
+ogUnmount $1 $2 2>/dev/null
+
+ogLock $1 $2 || return $?
+trap "ogUnlock $1 $2; rm -f $IMGFILE" 1 2 6 9
+
+TYPE="$(ogGetFsType $1 $2)"
+case "$TYPE" in
+ EXT[234]|REISERFS)
+ partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
+ ;;
+ NTFS|HNTFS)
+ partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
+ ;;
+ FAT16|FAT32|HFAT16|HFAT32)
+ partimage -M -f3 -o -d -V0 -B gui=no -c -z1 save $PART "$IMGFILE"
+ ;;
+ *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
+ return $? ;;
+esac
+
+#/// Controlar salida de error y desbloquear partición.
+ERRCODE=$?
+if [ $ERRCODE != 0] ]; then
+ ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
+ rm -f "$IMGFILE"
+fi
+ogUnlock $1 $2
+return $ERRCODE
+}
+
+
+#/**
+# ogGetImageSize str_repo path_image
+#@brief Devuelve el tamaño del sistema de archivos almacenado en un fichero de imagen.
+#@arg \c str_repo repositorio de imágenes o caché local
+#@arg \c path_image camino de la imagen
+#@return tamaño (en KB)
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@exception OG_ERR_NOTFOUND fichero de imagen no encontrado.
+#*/
+#@warning En pruebas iniciales
+#@todo Definición de parámetros y salidas.
+#@version 0.1 - Primera versión muy en pruebas para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/09/11
+#*/
+function ogGetImageSize () {
+
+# Variables locales
+local IMGFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
+ "$FUNCNAME 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") || 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;}'
+}
+
+
+#### PRUEBAS
+# Obtener tipo de imagen
+function ogGetImageType () {
+local IMGFILE
+IMGFILE=$(ogGetPath "$1" "$2") || 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);}'
+}
+
+
+#/**
+# ogRestoreImage str_repo path_image int_ndisk int_npartition
+#@brief Restaura una imagen de sistema de archivos en una partición.
+#@arg \c str_repo repositorio de imágenes o caché local
+#@arg \c path_image camino de la imagen
+#@arg \c int_ndisk nº de orden del disco
+#@arg \c 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.
+#@warning En pruebas iniciales
+#@todo Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc.
+#@version 0.1 - Primera versión muy en pruebas para OpenGNSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009/09/10
+#*/
+function ogRestoreImage () {
+
+# Variables locales
+local PART IMGFILE
+
+#/// Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
+ "$FUNCNAME aula1 winxp 1 1"
+ return
+fi
+#/// Error si no se reciben menos de 2 parámetros.
+[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
+
+PART="$(ogDiskToDev $3 $4)" || return $?
+IMGFILE=$(ogGetPath "$1" "$2") || return $?
+[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
+# Error si la imagen no cabe en la particion.
+[ $(ogGetImageSize "$1" "$2") -gt $(ogGetPartitionSize $3 $4) ] && ogRaiseError $OG_ERR_PARTITION && return $?
+
+#/// Comprobar el bloqueo de la partición, desmontarla y bloquearla.
+if ogIsLocked $3 $4; then
+ ogRaiseError $OG_ERR_LOCKED "$3,$4"
+ return $?
+fi
+ogUnmount $3 $4 >/dev/null || return $?
+ogLock $3 $4 || return $?
+trap "ogUnlock $3 $4" 1 2 3 6 9
+
+#/// Restaurar según el tipo de sistema de archivos.
+#/// Atención: no se comprueba incongruencia entre partición e imagen.
+TYPE="$(ogGetFsType $3 $4)"
+case "$TYPE" in
+ EXT[234]|REISERFS)
+ partimage -M -f3 -o -d -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" || ogRaiseError $OG_ERR_IMAGE "$IMGFILE,$3,$4" || return $?
+ ;;
+ NTFS|HNTFS)
+ partimage -M -f3 -o -d -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" || ogRaiseError $OG_ERR_IMAGE "$IMGFILE,$3,$4" || return $?
+ ;;
+ FAT16|FAT32|HFAT16|HFAT32)
+ partimage -M -f3 -o -d -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE" || ogRaiseError $OG_ERR_IMAGE "$IMGFILE,$3,$4" || return $?
+ ;;
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $? ;;
+esac
+
+ogExtendFs $3 $4
+ogUnlock $3 $4
+}
+
+
+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
+}