source: client/engine/Image.lib @ 96d7f3f

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 96d7f3f was 9836a86, checked in by ramon <ramongomez@…>, 11 years ago

#602: Soportar ejecutables de Partclone específicos para sistemas de ficheros exFAT y UFS, incluyendo retrocompatibilidad.

git-svn-id: https://opengnsys.es/svn/branches/version1.0@4072 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 26.5 KB
Line 
1#!/bin/bash
2#/**
3#@file    Image.lib
4#@brief   Librería o clase Image
5#@class   Image
6#@brief   Funciones para creación, restauración y clonación de imágenes de sistemas.
7#@version 1.0
8#@warning License: GNU GPLv3+
9#*/
10
11
12
13#/**
14#         ogCreateImageSyntax path_device path_imagefile [str_tool] [str_compressionlevel]
15#@brief   Genera una cadena de texto con la instrucción para crear un fichero imagen
16#@param   path_device           dispositivo Linux del sistema de archivos
17#@param   path_imagefile        path absoluto del fichero imagen
18#@param   [opcional] str_tool   herrmaienta de clonacion [partimage, partclone, ntfsclone]
19#@param   [opcional] str_compressionlevel nivel de compresion. [0 -none-, 1-lzop-, 2-gzip]
20#@return  str_command - cadena con el comando que se debe ejecutar.
21#@warning Salida nula si se producen errores.
22#@TODO    introducir las herramientas fsarchiver, dd
23#@version 1.0 - Primeras pruebas
24#@author  Antonio J. Doblas Viso. Universidad de Málaga
25#@date    2010/02/08
26#@version 1.0.5 - Incrustar códico de antigua función ogPartcloneSyntax
27#@author  Ramon Gomez, ETSII Universidad de Sevilla
28#@date    2012/09/14
29#*/ ##
30function ogCreateImageSyntax()
31{
32local FS TOOL LEVEL PART IMGFILE BUFFER PARAM1 PARAM2 PARAM3
33
34# Si se solicita, mostrar ayuda.
35if [ "$*" == "help" ]; then
36    ogHelp "$FUNCNAME" "$FUNCNAME path_device path_imagefile [str_tool] [str_compressionlevel]" \
37           "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img partclone lzop" \
38           "$FUNCNAME /dev/sda1 /opt/opengnsys/images/prueba.img"
39    return
40fi
41# Error si no se reciben al menos los 2 parámetros para obtener el valor default.
42[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
43
44
45PART="$1"
46IMGFILE="$2"
47case "$#" in
48    2)  # Sintaxis por defecto OG PART IMGFILE
49        TOOL="partclone"
50        LEVEL="gzip"
51        ;;
52    4)  # Sintaxis condicionada.
53        TOOL="${3,,}"
54        LEVEL="${4,,}"
55        ;;
56esac
57
58case "$TOOL" in
59    ntfsclone)
60        PARAM1="ntfsclone --force --save-image -O - $PART"
61        ;;
62    partimage|default)
63        PARAM1="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $PART stdout"
64        ;;
65    partclone)
66        FS="$(ogGetFsType $(ogDevToDisk $PART 2>/dev/null))"
67        umount $PART 2>/dev/null
68        case "$FS" in
69            EXT[234]) PARAM1="partclone.extfs" ;;
70            BTRFS)    PARAM1="partclone.btrfs" ;;
71            REISERFS) PARAM1="partclone.reiserfs" ;;
72            REISER4)  PARAM1="partclone.reiser4" ;;
73            JFS)      PARAM1="partclone.jfs" ;;
74            XFS)      PARAM1="partclone.xfs" ;;
75            NTFS)     PARAM1="partclone.ntfs" ;;
76            EXFAT)    PARAM1="partclone.exfat" ;;
77            FAT16|FAT32) PARAM1="partclone.fat" ;;
78            HFS|HFSPLUS) PARAM1="partclone.hfsp" ;;
79            UFS)      PARAM1="partclone.ufs" ;;
80            *)        PARAM1="partclone.dd" ;;
81        esac
82        # Por compatibilidad, si no existe el ejecutable usar por defecto "parclone.dd".
83        which $PARAM1 &>/dev/null || PARAM1="partclone.dd"
84        PARAM1="$PARAM1 -d0 -F -c -s $PART"
85        ;;
86esac
87# Comprobar que existe mbuffer.
88which mbuffer &>/dev/null && PARAM2="| mbuffer -q -m 40M " || PARAM2=" "
89
90# Nivel de compresion.
91case "$LEVEL" in
92    0|none) PARAM3=" > " ;;
93    1|lzop) PARAM3=" | lzop > " ;;
94    2|gzip) PARAM3=" | gzip -c > " ;;
95    3|bzip) PARAM3=" | bzip -c > " ;;
96esac
97
98# Sintaxis final.
99[ -n "$PARAM1" ] && echo "$PARAM1 $PARAM2 $PARAM3 $IMGFILE"
100}
101
102
103#/**
104#         ogRestoreImageSyntax filename partition [tools]  [levelcompresor]
105#@brief   Genera una cadena de texto con la instrucción para crear un fichero imagen
106#@param 1  filename           path absoluto del fichero imagen
107#@param 2  partition             identificador linux del dispositivo particion.
108#@param 3  [opcional] str_tools          herrmaienta de clonacion [partimage, partclone, ntfsclone]
109#@param 4  [opcional] str_levelcompresor nivel de compresion. [0 -none-, 1-lzop-, 2-gzip]
110#@return  cadena con el comando que se debe ejecutar.
111#@exception OG_ERR_FORMAT    formato incorrecto.
112#@warning En pruebas iniciales
113#@TODO    introducir las herramientas fsarchiver, dd
114#@TODO    introducir el nivel de compresion gzip
115#@version 1.0 - Primeras pruebas
116#@author  Antonio J. Doblas Viso. Universidad de Málaga
117#@date    2010/02/08
118#*/ ##
119
120ogRestoreImageSyntax ()
121{
122local TOOL COMPRESSOR LEVEL PART IMGFILE FILEHEAD INFOIMG
123
124
125# Si se solicita, mostrar ayuda.
126if [ "$*" == "help" ]; then
127    ogHelp "$FUNCNAME" "$FUNCNAME  filename partition [tool] [levelcompresor]" \
128           "$FUNCNAME  /opt/opengnsys/images/prueba.img /dev/sda1 [partclone] [lzop]"
129    return
130fi
131
132# Error si no se reciben al menos 2 parámetros.
133[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
134
135# controlamos que el parametro 1 (imagen) es tipo file.
136[ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
137
138# Si 2 parametros (file-origen-, device-destino-) = ogGetImageFull($1)
139if [ "$#" -eq 2 ]; then
140        IMGFILE=$1
141        PART=$2
142        INFOIMG=$(ogGetImageInfo $IMGFILE) || ogRaiseError $OG_ERR_NOTFOUND "No Image $1" || return $?
143        TOOL=`echo $INFOIMG | cut -f1 -d:`
144        COMPRESSOR=`echo $INFOIMG | cut -f2 -d:`
145        ogRestoreImageSyntax $IMGFILE $PART $TOOL $COMPRESSOR
146fi
147
148
149# Si cuatro parametros genera sintaxis
150if [ "$#" -eq 4 ]; then
151        IMGFILE=$1
152        PART=$2
153        # comprobamos parametro herramienta compresion.
154        TOOL=$(echo $3 | tr [A-Z] [a-z])       
155        #ogCheckProgram $TOOL
156        #comprobar parámetro compresor.
157        LEVEL=$(echo $4 | tr [A-Z] [a-z])
158        #ogCheckProgram $LEVEL
159       
160        case "$LEVEL" in
161        "0"|"none")
162                COMPRESSOR=" "
163        ;;
164        "1"|"lzop" | "LZOP")
165                COMPRESSOR=" lzop -dc "
166        ;;
167        "2"|"gzip" | "GZIP")
168                COMPRESSOR=" gzip -dc "
169        ;;
170        "3"|"bzip" | "BZIP" )
171                COMPRESSOR=" bzip -dc "
172        ;;
173        *)
174                ogRaiseError $OG_ERR_NOTFOUND "Compressor no valid $TOOL" || return $?
175        ;;
176        esac
177    #comprobar mbuffer
178        which mbuffer > /dev/null && MBUFFER="| mbuffer -q -m 40M " || MBUFFER=" "
179
180        case "$TOOL" in
181                "ntfsclone" | "NTFSCLONE")
182                        TOOL="| ntfsclone --restore-image --overwrite $PART -"
183                ;;
184                "partimage"| "PARTIMAGE")
185                        TOOL="| partimage -f3 -B gui=no restore $PART stdin"
186                ;;
187                "partclone" | "PARTCLONE")
188                    # -C para que no compruebe tamaños
189                        TOOL="| partclone.restore -d0 -C -I -o $PART"
190                ;;
191                *)
192                ogRaiseError $OG_ERR_NOTFOUND "Tools imaging no valid $TOOL" || return $?
193        ;;
194        esac
195
196        echo "$COMPRESSOR $IMGFILE $MBUFFER $TOOL"
197fi
198
199}
200
201
202
203
204#/**
205#         ogCreateImage int_ndisk int_npartition str_repo path_image
206#@brief   Crea una imagen a partir de una partición.
207#@param   int_ndisk      nº de orden del disco
208#@param   int_npartition nº de orden de la partición
209#@param   str_repo       repositorio de imágenes (remoto o caché local)
210#@param   path_image     camino de la imagen (sin extensión)
211#@return  (nada, por determinar)
212#@note    repo = { REPO, CACHE }
213#@exception OG_ERR_FORMAT    formato incorrecto.
214#@exception OG_ERR_NOTFOUND  fichero o dispositivo no encontrado.
215#@exception OG_ERR_PARTITION partición no accesible o no soportada.
216#@exception OG_ERR_LOCKED    particion bloqueada por otra operación.
217#@exception OG_ERR_IMAGE     error al crear la imagen del sistema.
218#@warning En pruebas iniciales
219#@todo    Comprobaciones, control de errores, definir parámetros, etc.
220#@version 0.1 -  Integracion para Opengnsys  -  HIDRA:CrearImagen{EXT3, NTFS}.sh;  EAC: CreateImageFromPartition () en Deploy.lib
221#@author  Ramon Gomez, ETSII Universidad de Sevilla
222#@Date    2008/05/13
223#@author  Antonio J. Doblas Viso. Universidad de Malaga
224#@date    2008/10/27
225#@version 0.9 - Versión en pruebas para OpenGnSys
226#@author  Ramon Gomez, ETSII Universidad de Sevilla
227#@date    2009/10/07
228#@version 1.0 - Llama a función ogCreateImageSyntax para generar la llamada al comando.
229#@author  Antonio J. Doblas Viso. Universidad de Málaga
230#@date    2010/02/08
231#*/ ##
232function ogCreateImage ()
233{
234# Variables locales
235local PART PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE
236
237# Si se solicita, mostrar ayuda.
238if [ "$*" == "help" ]; then
239    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart path_dir str_image" \
240           "$FUNCNAME 1 1 REPO /aula1/winxp"
241    return
242fi
243# Error si no se reciben 4 parámetros.
244[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
245
246# Comprobar que no está bloqueada ni la partición, ni la imagen.
247PART="$(ogDiskToDev $1 $2)" || return $?
248if ogIsLocked $1 $2; then
249    ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2"
250    return $?
251fi
252IMGTYPE="img"                   # Extensión genérica de imágenes.
253IMGDIR=$(ogGetParentPath "$3" "$4")
254
255[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $?
256IMGFILE="$IMGDIR/$(basename "$4").$IMGTYPE"
257if ogIsImageLocked "$IMGFILE"; then
258    ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4"
259    return $?
260fi
261# Generar la instruccion a ejecutar antes de aplicar los bloqueos.
262PROGRAM=$(ogCreateImageSyntax $PART $IMGFILE $5 $6)
263# Desmontar partición, bloquear partición e imagen.
264ogUnmount $1 $2 2>/dev/null
265ogLock $1 $2 || return $?
266ogLockImage "$3" "$4.$IMGTYPE" || return $?
267
268# Crear Imagen.
269trap "ogUnlock $1 $2; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9
270echo $PROGRAM
271eval $PROGRAM
272
273# Controlar salida de error y desbloquear partición.
274ERRCODE=$?
275if [ $ERRCODE != 0 ]; then
276    ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
277    rm -f "$IMGFILE"
278fi
279# Desbloquear partición e imagen.
280ogUnlock $1 $2
281ogUnlockImage "$3" "$4.$IMGTYPE"
282return $ERRCODE
283}
284
285
286#/**
287#         ogCreateMbrImage int_ndisk str_repo path_image
288#@brief   Crea una imagen a partir del sector de arranque de un disco.
289#@param   int_ndisk    nº de orden del disco
290#@param   str_repo     repositorio de imágenes (remoto o caché local)
291#@param   path_image   camino de la imagen (sin extensión)
292#@return  (nada, por determinar)
293#@note    repo = { REPO, CACHE }
294#@exception OG_ERR_FORMAT    formato incorrecto.
295#@exception OG_ERR_NOTFOUND  fichero o dispositivo no encontrado.
296#@exception OG_ERR_IMAGE     error al crear la imagen del sistema.
297#@version 0.9 - Versión en pruebas para OpenGNSys
298#@author  Ramon Gomez, ETSII Universidad de Sevilla
299#@date    2010/01/12
300#@version 1.0 - Adaptación a OpenGnSys 1.0
301#@author  Ramon Gomez, ETSII Universidad de Sevilla
302#@date    2011/03/10
303#*/ ##
304function ogCreateMbrImage ()
305{
306# Variables locales
307local DISK IMGDIR IMGFILE
308# Si se solicita, mostrar ayuda.
309if [ "$*" == "help" ]; then
310    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk path_dir str_image" \
311           "$FUNCNAME 1 REPO /aula1/mbr"
312    return
313fi
314# Error si no se reciben 3 parámetros.
315[ $# -lt 3 ] && ogRaiseError $OG_ERR_FORMAT && return $?
316
317DISK=$(ogDiskToDev "$1") || return $?
318IMGDIR=$(ogGetParentPath "$2" "$3")
319[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $?
320IMGFILE="$IMGDIR/$(basename "$3").mbr"
321
322# Crear imagen del MBR.
323dd if="$DISK" of="$IMGFILE" bs=512 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $?
324}
325
326
327#/**
328#         ogCreateBootLoaderImage int_ndisk str_repo path_image
329#@brief   Crea una imagen del boot loader a partir del sector de arranque de un disco.
330#@param   int_ndisk    nº de orden del disco
331#@param   str_repo     repositorio de imágenes (remoto o caché local)
332#@param   path_image   camino de la imagen (sin extensión)
333#@return  (nada, por determinar)
334#@note    repo = { REPO, CACHE }
335#@exception OG_ERR_FORMAT    formato incorrecto.
336#@exception OG_ERR_NOTFOUND  fichero o dispositivo no encontrado.
337#@exception OG_ERR_IMAGE     error al crear la imagen del sistema.
338#@version 1.0 - Adaptacion de ogCreateMbrImage para guardar solo el Boot Loader
339#@author  Juan Carlos Xifre, SICUZ Universidad de Zaragoza
340#@date    2011/03/21
341#*/ ##
342function ogCreateBootLoaderImage ()
343{
344# Variables locales
345local DISK IMGDIR IMGFILE
346# Si se solicita, mostrar ayuda.
347if [ "$*" == "help" ]; then
348    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk path_dir str_image" \
349           "$FUNCNAME 1 REPO /aula1/mbr"
350    return
351fi
352# Error si no se reciben 3 parámetros.
353[ $# -lt 3 ] && ogRaiseError $OG_ERR_FORMAT && return $?
354
355DISK=$(ogDiskToDev "$1") || return $?
356IMGDIR=$(ogGetParentPath "$2" "$3")
357[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$2 $(dirname $3)" || return $?
358IMGFILE="$IMGDIR/$(basename "$3").mbr"
359
360# Crear imagen del Boot Loader dentro del MBR.
361dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $?
362}
363
364
365#/**
366#         ogIsImageLocked [str_repo] path_image
367#@brief   Comprueba si una imagen está bloqueada para uso exclusivo.
368#@param   str_repo     repositorio de imágenes (opcional)
369#@param   path_image   camino de la imagen (sin extensión)
370#@return  Código de salida: 0 - bloqueado, 1 - sin bloquear o error.
371#@note    repo = { REPO, CACHE }
372#@exception OG_ERR_FORMAT    formato incorrecto.
373#@version 1.0 - Adaptación a OpenGnSys 1.0
374#@author  Ramon Gomez, ETSII Universidad de Sevilla
375#@date    2011/03/10
376#@version 1.0.1 - Devolver falso en caso de error.
377#@author  Ramon Gomez, ETSII Universidad de Sevilla
378#@date    2011-05-18
379#*/ ##
380function ogIsImageLocked ()
381{
382# Si se solicita, mostrar ayuda.
383if [ "$*" == "help" ]; then
384    ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \
385           "if $FUNCNAME /opt/opengnsys/images/aula1/winxp.img; then ...; fi" \
386           "if $FUNCNAME REPO /aula1/winxp.img; then ...; fi"
387    return
388fi
389# Error si no se reciben 1 o 2 parámetros.
390[ $# -lt 1 -o $# -gt 2 ] && return 1
391
392# Comprobar si existe el fichero de bloqueo.
393test -n "$(ogGetPath $@.lock)"
394}
395
396
397#/**
398#         ogLockImage [str_repo] path_image
399#@brief   Bloquea una imagen para uso exclusivo.
400#@param   str_repo     repositorio de imágenes (opcional)
401#@param   path_image   camino de la imagen (sin extensión)
402#@return  Nada.
403#@note    Se genera un fichero con extensión .lock
404#@note    repo = { REPO, CACHE }
405#@exception OG_ERR_FORMAT    formato incorrecto.
406#@version 1.0 - Adaptación a OpenGnSys 1.0
407#@author  Ramon Gomez, ETSII Universidad de Sevilla
408#@date    2011/03/10
409#*/ ##
410function ogLockImage ()
411{
412# Variables locales
413local IMGDIR
414
415# Si se solicita, mostrar ayuda.
416if [ "$*" == "help" ]; then
417    ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \
418           "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \
419           "$FUNCNAME REPO /aula1/winxp.img"
420    return
421fi
422# Error si no se reciben 1 o 2 parámetros.
423[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
424# Comprobar que existe directorio de imagen
425IMGDIR=$(ogGetParentPath $@) || return $?
426# Crear fichero de bloqueo.
427touch $IMGDIR/$(basename "${!#}").lock
428}
429
430
431#/**
432#         ogRestoreImage str_repo path_image int_ndisk int_npartition
433#@brief   Restaura una imagen de sistema de archivos en una partición.
434#@param   str_repo       repositorio de imágenes o caché local
435#@param   path_image     camino de la imagen
436#@param   int_ndisk      nº de orden del disco
437#@param   int_npartition nº de orden de la partición
438#@return  (por determinar)
439#@exception OG_ERR_FORMAT   1 formato incorrecto.
440#@exception OG_ERR_NOTFOUND  2 fichero de imagen o partición no detectados.
441#@exception OG_ERR_PARTITION 3  # Error en partición de disco.
442#@exception OG_ERR_LOCKED    4 partición bloqueada por otra operación.
443#@exception OG_ERR_IMAGE    5 error al restaurar la imagen del sistema.
444#@exception OG_ERR_IMGSIZEPARTITION  30 Tamaño de la particion es menor al tamaño de la imagen.
445#@todo    Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc.
446#@version 0.1 -  Integracion para Opengnsys  - HIDRA:RestaurarImagen{EXT3, NTFS}.sh;  EAC: RestorePartitionFromImage() en Deploy.lib
447#@author Ramon Gomez, ETSII Universidad de Sevilla
448#@Date    2008/05/13
449#@author  Antonio J. Doblas Viso. Universidad de Malaga
450#@date    2008/10/27
451#@version 0.9 - Primera version muy en pruebas para OpenGnSys
452#@author  Ramon Gomez, ETSII Universidad de Sevilla
453#@date    2009/09/10
454#@version 1.0 - generacion sintaxis de restauracion
455#@author  Antonio J. Doblas Viso, Universidad de Malaga
456#@date    2011/02/01
457#@version 1.0.1 - Control errores, tamaño particion, fichero-imagen
458#@author  Antonio J. Doblas Viso, Universidad de Malaga
459#@date    2011/05/11
460#*/ ##
461function ogRestoreImage ()
462{
463# Variables locales
464local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE PROGRAM ERRCODE
465
466# Si se solicita, mostrar ayuda.
467if [ "$*" == "help" ]; then
468    ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
469           "$FUNCNAME REPO /aula1/winxp 1 1"
470    return
471fi
472# Error si no se reciben 4 parámetros.
473[ $# -lt 4 ] && return $(ogRaiseError $OG_ERR_FORMAT; echo $?)
474# Procesar parámetros.
475PART="$(ogDiskToDev $3 $4)" || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?)
476#IMGTYPE=$(ogGetImageType "$1" "$2")
477IMGTYPE=img
478IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE")
479[ -r "$IMGFILE" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $3 $4"; echo $?)
480# comprobamos consistencia de la imagen
481ogGetImageInfo $IMGFILE >/dev/null  || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?)
482
483# Error si la imagen no cabe en la particion.
484IMGSIZE=$(ogGetImageSize "$1" "$2") || return $(ogRaiseError $OG_ERR_IMAGE " $1 $2"; echo $?)
485#TODO:
486#Si la particion no esta formateado o tiene problemas formateamos
487ogMount $3 $4 || ogFormat $3 $4
488#PARTSIZE=$(parted -sm $DISK unit kB print | \
489#              awk -F: -v np=$4 '{if ($1==np) {gsub(/kB/,""); print $4} } ')
490PARTSIZE=$(ogGetPartitionSize $3 $4)
491if [ $IMGSIZE -gt $PARTSIZE ]; then
492    ogRaiseError $OG_ERR_IMGSIZEPARTITION "  $PARTSIZE < $IMGSIZE"
493    return $?
494fi
495# Comprobar el bloqueo de la imagen y de la partición.
496if ogIsImageLocked "$IMGFILE"; then
497    ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE"
498    return $?
499fi
500if ogIsLocked $3 $4; then
501    ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $3, $4"
502    return $?
503fi
504# Desmontar y bloquear partición.
505ogUnmount $3 $4 2>/dev/null || return $(ogRaiseError $OG_ERR_PARTITION " $3 $4"; echo $?)
506ogLock $3 $4 || return $(ogRaiseError $OG_ERR_PARTITION " $3 $4"; echo $?)
507trap "ogUnlock $3 $4" 1 2 3 6 9
508
509# Restaurar según el tipo de imagen.
510# Atención: no se comprueba el tipo de sistema de archivos.
511# Atención: no se comprueba incongruencia entre partición e imagen.
512#Solicitamos la generación de la instruccion a ejecutar
513PROGRAM=`ogRestoreImageSyntax  $IMGFILE $PART`
514echo $PROGRAM
515eval $PROGRAM
516
517ERRCODE=$?
518if [ $ERRCODE != 0 ]; then
519    ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4"
520fi
521ogUnlock $3 $4
522return $ERRCODE
523}
524
525
526#/**
527#         ogRestoreMbrImage str_repo path_image int_ndisk
528#@brief   Restaura la imagen del sector de arranque de un disco.
529#@param   str_repo     repositorio de imágenes o caché local
530#@param   path_image   camino de la imagen
531#@param   int_ndisk    nº de orden del disco
532#@return  (por determinar)
533#@exception OG_ERR_FORMAT   formato incorrecto.
534#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
535#@exception OG_ERR_IMAGE    error al restaurar la imagen del sistema.
536#@version 0.9 - Primera versión en pruebas.
537#@author  Ramon Gomez, ETSII Universidad de Sevilla
538#@date    2010/01/12
539#@version 1.0 - Adaptación a OpenGnSys 1.0
540#@author  Ramon Gomez, ETSII Universidad de Sevilla
541#@date    2011/03/10
542#*/ ##
543function ogRestoreMbrImage ()
544{
545# Variables locales
546local DISK IMGFILE
547# Si se solicita, mostrar ayuda.
548if [ "$*" == "help" ]; then
549    ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk" \
550           "$FUNCNAME REPO /aula1/mbr 1"
551    return
552fi
553# Error si no se reciben 3 parámetros.
554[ $# -lt 3 ] && ogRaiseError $OG_ERR_FORMAT && return $?
555# Procesar parámetros.
556DISK=$(ogDiskToDev "$3") || return $?
557IMGFILE=$(ogGetPath "$1" "$2.mbr") || return $?
558[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
559
560# Restaurar imagen del MBR.
561dd if="$IMGFILE" of="$DISK" bs=512 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $?
562}
563
564
565#/**
566#         ogRestoreBootLoaderImage str_repo path_image int_ndisk
567#@brief   Restaura la imagen del boot loader del sector de arranque de un disco.
568#@param   str_repo     repositorio de imágenes o caché local
569#@param   path_image   camino de la imagen
570#@param   int_ndisk    nº de orden del disco
571#@return  (por determinar)
572#@exception OG_ERR_FORMAT   formato incorrecto.
573#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
574#@exception OG_ERR_IMAGE    error al restaurar la imagen del sistema.
575#@version 1.0 - Adaptacion de ogRestoreMbrImage para restaurar solo el Boot Loader
576#@author  Juan Carlos Xifre, SICUZ Universidad de Zaragoza
577#@date    2011/03/21
578#*/ ##
579function ogRestoreBootLoaderImage ()
580{
581# Variables locales
582local DISK IMGFILE
583# Si se solicita, mostrar ayuda.
584if [ "$*" == "help" ]; then
585    ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk" \
586           "$FUNCNAME REPO /aula1/mbr 1"
587    return
588fi
589# Error si no se reciben 3 parámetros.
590[ $# -lt 3 ] && ogRaiseError $OG_ERR_FORMAT && return $?
591# Procesar parámetros.
592DISK=$(ogDiskToDev "$3") || return $?
593IMGFILE=$(ogGetPath "$1" "$2.mbr") || return $?
594[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
595
596# Restaurar imagen del MBR.
597dd if="$IMGFILE" of="$DISK" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $?
598}
599
600#/**
601#         ogUnlockImage [str_repo] path_image
602#@brief   Desbloquea una imagen con uso exclusivo.
603#@param   str_repo     repositorio de imágenes (opcional)
604#@param   path_image   camino de la imagen (sin extensión)
605#@return  Nada.
606#@note    repo = { REPO, CACHE }
607#@note    Se elimina el fichero de bloqueo con extensión .lock
608#@exception OG_ERR_FORMAT    formato incorrecto.
609#@version 1.0 - Adaptación a OpenGnSys 1.0
610#@author  Ramon Gomez, ETSII Universidad de Sevilla
611#@date    2011/03/10
612#*/ ##
613function ogUnlockImage ()
614{
615# Si se solicita, mostrar ayuda.
616if [ "$*" == "help" ]; then
617    ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \
618           "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \
619           "$FUNCNAME REPO /aula1/winxp.img"
620    return
621fi
622# Error si no se reciben 1 o 2 parámetros.
623[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
624
625# Borrar fichero de bloqueo para la imagen.
626rm -f $(ogGetPath $@.lock)
627}
628
629
630#/**
631#         ogGetImageInfo filename
632#@brief   muestra información sobre la imagen monolitica.
633#@param 1   filename           path absoluto del fichero imagen
634#@return  cadena compuesta por clonacion:compresor:sistemaarchivos:tamañoKB
635#@exception OG_ERR_FORMAT    formato incorrecto.
636#@exception OG_ERR_NOTFOUND   fichero no encontrado.
637#@exception OG_ERR_IMAGE        "Image format is not valid $IMGFILE"
638#@warning En pruebas iniciales
639#@TODO    Definir sintaxis de salida (herramienta y compresor en minuscula)
640#@TODO    Arreglar loop para ntfsclone
641#@TODO    insertar parametros entrada tipo OG
642#@version 1.0 - Primeras pruebas
643#@author  Antonio J. Doblas Viso. Universidad de Málaga
644#@date    2010/02/08
645#*/ ##
646
647function ogGetImageInfo ()
648{
649# Si se solicita, mostrar ayuda.
650if [ "$*" == "help" ]; then
651    ogHelp "$FUNCNAME" "$FUNCNAME  filename " \
652           "$FUNCNAME  /opt/opengnsys/images/prueba.img "
653    return
654fi
655
656# Error si no se reciben 1 parámetros.
657[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
658
659#comprobando que el parametro uno es un file.
660[ -f $1 ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
661
662local TOOLS COMPRESSOR IMGFILE FILEHEAD FS SIZE SIZEFACTOR PARTIMAGEINFO PARTCLONEINFO NTFSCLONEINFO IMGDETECT
663IMGDETECT="FALSE"
664
665IMGFILE=$1
666FILEHEAD=/tmp/`basename $IMGFILE`.infohead
667COMPRESSOR=`file $IMGFILE | awk '{print $2}'`
668ogCheckStringInGroup "$COMPRESSOR" "gzip lzop" || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $?
669$($COMPRESSOR -dc $IMGFILE 2>/dev/null | head > $FILEHEAD) || ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $?
670
671## buscando Primera opción.
672if [ "$IMGDETECT" == "FALSE" ]
673then
674        PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1)
675        if `echo $PARTCLONEINFO | grep size > /dev/null`
676        then
677                TOOLS=PARTCLONE
678                FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}')
679                echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024
680                SIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}')
681                IMGDETECT="TRUE"
682        fi
683fi
684#buscando segunda opcion.
685if [ "$IMGDETECT" == "FALSE" -a ! -f /dev/loop2  ]
686then
687        cat $FILEHEAD | grep -w ntfsclone-image > /dev/null && NTFSCLONEINFO=$(cat $FILEHEAD | ntfsclone --restore --overwrite /dev/loop2 - 2>&1)
688        if `echo $NTFSCLONEINFO | grep ntfsclone > /dev/null` 
689        then
690                TOOLS=NTFSCLONE
691                SIZE=$(echo $NTFSCLONEINFO | awk '{gsub(/\(|\)|\./,""); printf "%d\n",$17/1000;}')
692                FS=NTFS
693                IMGDETECT="TRUE"
694        fi
695fi
696## buscando Tercer opción.
697if [ "$IMGDETECT" == "FALSE" ]
698then
699        PARTIMAGEINFO=$(partimage -B gui=no imginfo "$FILEHEAD" 2>&1)
700        if `echo $PARTIMAGEINFO | grep Partition > /dev/null`
701        then   
702                TOOLS=PARTIMAGE
703                FS=$(echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $17;}' | awk '{sub(/\.\.+/," "); print toupper($2)}')
704                SIZE=$( echo $PARTIMAGEINFO | awk '{gsub(/ /,"\n"); print $36;}' | awk '{sub(/\.\.+/," "); printf "%d\n",$2*1024*1024;}')
705                IMGDETECT="TRUE"
706        fi     
707fi
708#comprobamos valores #Chequeamos los valores devueltos.
709if [ -z "$TOOLS" -o -z "$COMPRESSOR" -o "$IMGDETECT" == "FALSE" ]
710then
711        ogRaiseError $OG_ERR_IMAGE "Image format is not valid $IMGFILE" || return $?
712else
713        COMPRESSOR=$(echo $COMPRESSOR | tr [a-z] [A-Z])
714        echo $TOOLS:$COMPRESSOR:$FS:$SIZE
715fi
716}
717
718function ogGetImageProgram ()
719{
720local IMGFILE
721IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
722[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
723ogGetImageInfo $IMGFILE | awk -F: '{print $1}'
724
725}
726
727function ogGetImageCompressor ()
728{
729local IMGFILE
730IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
731[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
732ogGetImageInfo $IMGFILE | awk -F: '{print $2}'
733}
734
735function ogGetImageType ()
736{
737local IMGFILE
738IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
739[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
740#partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \
741#        awk '/^Filesystem/ {sub(/\.\.+/," "); sub(/fs$/,""); print toupper($2);}'
742ogGetImageInfo $IMGFILE | awk -F: '{print $3}'
743
744}
745
746function ogGetImageSize ()
747{
748# Variables locales
749local IMGFILE
750
751# Si se solicita, mostrar ayuda.
752if [ "$*" == "help" ]; then
753    ogHelp "$FUNCNAME" "$FUNCNAME REPO|CACHE /str_image" \
754           "$FUNCNAME REPO /aula1/winxp  ==>  5642158"
755    return
756fi
757# Error si no se reciben menos de 2 parámetros.
758[ $# -lt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
759# Error si el fichero de imagen no es accesible.
760IMGFILE=$(ogGetPath "$1" "$2.img") || return $?
761[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
762
763# Devuelve el tamaño de la imagen en KB.
764#partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \
765#        awk '/Partition size/ {sub(/\.\.+/," "); printf "%d\n",$3*1024*1024;}'
766ogGetImageInfo $IMGFILE | awk -F: '{print $4}'
767}
768
Note: See TracBrowser for help on using the repository browser.