summaryrefslogtreecommitdiffstats
path: root/client/engine/Image.lib
blob: fe97d7147fdd0bdaca6a733f162592d3ce9e4660 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
#!/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.
#@param   int_ndisk      nº de orden del disco
#@param   int_npartition nº de orden de la partición
#@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 }
#@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, etc.
#@version 0.1 -  Integracion para Opengnsys  -  HIDRA:CrearImagen{EXT3, NTFS}.sh;  EAC: CreateImageFromPartition () 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 - Version 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 REPO /aula1/winxp"
    return
fi
# Error si no se reciben 4 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").img"
ogUnmount $1 $2 2>/dev/null

ogLock $1 $2 || return $?
trap "ogUnlock $1 $2; rm -f $IMGFILE" 1 2 3 6 9

TYPE="$(ogGetFsType $1 $2)"
case "$TYPE" in
    EXT[234]|REISERFS|XFS|JFS)
        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.
#@param   str_repo    repositorio de imágenes o caché local
#@param   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 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;}'
}


#### PRUEBAS
# Obtener tipo de imagen 
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);}'
}


#/**
#         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.
#@warning En pruebas iniciales
#@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 IMGSIZE

# 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 $?
IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
[ -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 partición, desmontarla y bloquearla.
if ogIsLocked $3 $4; then
    ogRaiseError $OG_ERR_LOCKED "$3,$4"
    return $?
fi
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 sistema de archivos.
# Atención: no se comprueba incongruencia entre partición e imagen.
TYPE="$(ogGetFsType $3 $4)"
case "$TYPE" in
    EXT[234]|REISERFS|XFS|JFS)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
        ;;
    NTFS|HNTFS)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
        ;;
    FAT16|FAT32|HFAT16|HFAT32)
        partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
        ;;
    *)  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
}