source: client/engine/Image.lib @ a0da76f

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 a0da76f was 8e9669e, checked in by ramon <ramongomez@…>, 13 years ago

Función ogGetImageInfo muestra correctamente el tamaño de la imagen.

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

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