source: client/engine/Image.lib @ fb8c54b

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 fb8c54b was 0fbc05e, checked in by ramon <ramongomez@…>, 14 years ago

Sustitución de Partimage por Partclone como herramienta básica de clonación. Close #237.
Eliminar rama de desarrollo "AdaptacionUs?".

git-svn-id: https://opengnsys.es/svn/trunk@1337 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 13.8 KB
RevLine 
[715bedc]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 0.9
8#@warning License: GNU GPLv3+
9#*/
10
11
12#/**
[ebf06c7]13#         ogCreateImage int_ndisk int_npartition str_repo path_image
[715bedc]14#@brief   Crea una imagen a partir de una partición.
[42669ebf]15#@param   int_ndisk      nº de orden del disco
16#@param   int_npartition nº de orden de la partición
17#@param   str_repo       repositorio de imágenes (remoto o caché local)
18#@param   path_image     camino de la imagen (sin extensión)
[715bedc]19#@return  (nada, por determinar)
[ebf06c7]20#@note    repo = { REPO, CACHE }
[cfeabbf]21#@exception OG_ERR_FORMAT    formato incorrecto.
22#@exception OG_ERR_NOTFOUND  fichero o dispositivo no encontrado.
23#@exception OG_ERR_PARTITION partición no accesible o no soportada.
24#@exception OG_ERR_LOCKED    particion bloqueada por otra operación.
25#@exception OG_ERR_IMAGE     error al crear la imagen del sistema.
[715bedc]26#@warning En pruebas iniciales
[3458879]27#@todo    Comprobaciones, control de errores, definir parámetros, etc.
[985bef0]28#@version 0.1 -  Integracion para Opengnsys  -  HIDRA:CrearImagen{EXT3, NTFS}.sh;  EAC: CreateImageFromPartition () en Deploy.lib
29#@author Ramon Gomez, ETSII Universidad de Sevilla
30#@Date    2008/05/13
31#@author  Antonio J. Doblas Viso. Universidad de Malaga
32#@date    2008/10/27
[0fbc05e]33#@version 0.9 - Versión en pruebas para OpenGnSys
[715bedc]34#@author  Ramon Gomez, ETSII Universidad de Sevilla
[cfeabbf]35#@date    2009/10/07
[1e7eaab]36#*/ ##
[42669ebf]37function ogCreateImage ()
38{
[59f9ad2]39# Variables locales
[cfeabbf]40local PART IMGDIR IMGFILE ERRCODE
[59f9ad2]41
[42669ebf]42# Si se solicita, mostrar ayuda.
[59f9ad2]43if [ "$*" == "help" ]; then
44    ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npart path_dir str_image" \
[3543b3e]45           "$FUNCNAME 1 1 REPO /aula1/winxp"
[59f9ad2]46    return
47fi
[c136ae7]48# Error si no se reciben 4 parámetros.
[0fbc05e]49[ $# -ne 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
[59f9ad2]50
[715bedc]51PART="$(ogDiskToDev $1 $2)" || return $?
[a79dd508]52if ogIsLocked $1 $2; then
53    ogRaiseError $OG_ERR_LOCKED "$1,$2"
54    return $?
55fi
[cfeabbf]56IMGDIR=$(ogGetParentPath "$3" "$4")
57[ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $?
[0fbc05e]58IMGFILE="$IMGDIR/$(basename "$4").pgz"
[cfeabbf]59ogUnmount $1 $2 2>/dev/null
[715bedc]60
[a79dd508]61ogLock $1 $2 || return $?
[c2b03eb]62trap "ogUnlock $1 $2; rm -f $IMGFILE" 1 2 3 6 9
[715bedc]63
64TYPE="$(ogGetFsType $1 $2)"
65case "$TYPE" in
[0fbc05e]66    EXT[234])
67        #partclone.extfs -c -C -F -s $PART | gzip -c > "$IMGFILE"    # Muestra progreso
68        partclone.extfs -c -C -s $PART | gzip -c > "$IMGFILE"
69        ;;
70    REISERFS|XFS|JFS)
71        partclone.dd -c -C -s $PART | gzip -c > "$IMGFILE"
[59f9ad2]72        ;;
[715bedc]73    NTFS|HNTFS)
[0fbc05e]74        partclone.ntfs -c -C -s $PART | gzip -c > "$IMGFILE"
[715bedc]75        ;;
[59f9ad2]76    FAT16|FAT32|HFAT16|HFAT32)
[0fbc05e]77        partclone.fat -c -C -s $PART | gzip -c > "$IMGFILE"
78        ;;
79    HFS|HFS+)
80        partclone.hfsp -c -C -s $PART | gzip -c > "$IMGFILE"
[715bedc]81        ;;
[cfeabbf]82    *)  ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE"
[715bedc]83        return $? ;;
84esac
85
[42669ebf]86# Controlar salida de error y desbloquear partición.
[cfeabbf]87ERRCODE=$?
[f5432db7]88if [ $ERRCODE != 0 ]; then
[cfeabbf]89    ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE"
[f5432db7]90    rm -f "$IMGFILE"
[cfeabbf]91fi
[715bedc]92ogUnlock $1 $2
[cfeabbf]93return $ERRCODE
[715bedc]94}
95
[b094c59]96
97#/**
[0fbc05e]98#         ogGetImageFs str_repo path_image
99#@brief   Devuelve el tipo de sistema de archivos almacenado en un fichero de imagen.
100#@param   str_repo    repositorio de imágenes o caché local
101#@param   path_image  camino de la imagen
102#@return  str_imgtype - mnemónico del tipo de sistema de archivos
103#@exception OG_ERR_FORMAT   formato incorrecto.
104#@exception OG_ERR_NOTFOUND fichero de imagen no encontrado.
105#@todo    Comprobar salidas para todos los tipos de sistemas de archivos.
106#/**
107function ogGetImageFs ()
108{
109local IMGFILE IMGTYPE
110IMGTYPE=$(ogGetImageType "$1" "$2")
111IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE") || return $?
112[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
113case "$IMGTYPE" in
114    img) # Partimage.
115         partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \
116                awk '/^Filesystem/ {sub(/\.\.+/," "); if ($2=="ntfs") print NTFS;
117                                                      else { sub(/fs$/,""); print toupper($2);} }'
118         ;;
119    pgz) # Partclone / GZip
120         gzip -dc "$IMGFILE" | partclone.chkimg -C -s - 2>&1 | \
121                awk '/^File system/ {if ($2=="EXTFS") print "EXT3"; else print $3;}'
122         ;;
123    *)   # Error si el fichero de imagen no es accesible.
124         ogRaiseError OG_ERR_NOTFOUND "$IMGFILE"
125         return $?  ;;
126esac
127}
128
129
[39277f4]130#         ogGetImageSize str_repo path_image
[b094c59]131#@brief   Devuelve el tamaño del sistema de archivos almacenado en un fichero de imagen.
[42669ebf]132#@param   str_repo    repositorio de imágenes o caché local
133#@param   path_image  camino de la imagen
[0fbc05e]134#@return  int_size  - tamaño (en KB)
[b094c59]135#@exception OG_ERR_FORMAT   formato incorrecto.
136#@exception OG_ERR_NOTFOUND fichero de imagen no encontrado.
137#*/
138#@warning En pruebas iniciales
139#@todo    Definición de parámetros y salidas.
140#@version 0.1 - Primera versión muy en pruebas para OpenGNSys
141#@author  Ramon Gomez, ETSII Universidad de Sevilla
142#@date    2009/09/11
[1e7eaab]143#*/ ##
[42669ebf]144function ogGetImageSize ()
145{
[b094c59]146# Variables locales
[0fbc05e]147local IMGFILE IMGTYPE
[b094c59]148
[42669ebf]149# Si se solicita, mostrar ayuda.
[b094c59]150if [ "$*" == "help" ]; then
151    ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
[3543b3e]152           "$FUNCNAME 1 1 REPO /aula1/winxp  ==>  5642158"
[b094c59]153    return
154fi
[42669ebf]155# Error si no se reciben menos de 2 parámetros.
[0fbc05e]156[ $# -ne 2 ] && ogRaiseError $OG_ERR_FORMAT && return $?
[42669ebf]157# Devuelve el tamaño de la imagen en KB.
[0fbc05e]158IMGTYPE=$(ogGetImageType "$1" "$2")
159IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE")
160case "$IMGTYPE" in
161    img) # Partimage.
162         partimage -B gui=no imginfo "$IMGFILE" 2>&1 | \
163                awk '/Partition size/ {sub(/\.\.+/," "); ps=$3} END {print ps*1024*1024;}'
164         ;;
165    pgz) # Partclone / GZip
166         gzip -dc "$IMGFILE" | partclone.chkimg -C -s - 2>&1 | \
167                awk -F: '/Block size/ {bs=$2} /Used block/ {ub=$2} END {print bs*ub/1024}'
168         ;;
169    *)   # Error si el fichero de imagen no es accesible.
170         ogRaiseError OG_ERR_NOTFOUND "$IMGFILE"
171         return $?  ;;
172esac
[b094c59]173}
174
175
[39277f4]176#### PRUEBAS
177# Obtener tipo de imagen
[42669ebf]178function ogGetImageType ()
179{
[0fbc05e]180local IMGFILE IMGTYPE EXT
181for EXT in img pgz; do
182     IMGFILE=$(ogGetPath "$1" "$2.$EXT")
183     [ -r "$IMGFILE" ] && IMGTYPE="$EXT"
184done
185echo $IMGTYPE
[39277f4]186}
187
[b094c59]188#/**
[39277f4]189#         ogRestoreImage str_repo path_image int_ndisk int_npartition
[b094c59]190#@brief   Restaura una imagen de sistema de archivos en una partición.
[42669ebf]191#@param   str_repo       repositorio de imágenes o caché local
192#@param   path_image     camino de la imagen
193#@param   int_ndisk      nº de orden del disco
194#@param   int_npartition nº de orden de la partición
[b094c59]195#@return  (por determinar)
196#@exception OG_ERR_FORMAT   formato incorrecto.
197#@exception OG_ERR_NOTFOUND fichero de imagen o partición no detectados.
198#@exception OG_ERR_LOCKED   partición bloqueada por otra operación.
199#@exception OG_ERR_IMAGE    error al restaurar la imagen del sistema.
[39277f4]200#@todo    Comprobar incongruencias partición-imagen, control de errores, definir parámetros, caché/repositorio, etc.
[0fbc05e]201#@version 0.1 -  Integracion para Opengnsys  - HIDRA:RestaurarImagen{EXT3, NTFS}.sh;  EAC: RestorePartitionFromImage() en Deploy.lib
[985bef0]202#@author Ramon Gomez, ETSII Universidad de Sevilla
203#@Date    2008/05/13
204#@author  Antonio J. Doblas Viso. Universidad de Malaga
205#@date    2008/10/27
[0fbc05e]206#@version 0.9 - Primera version muy en pruebas para OpenGnSys
[b094c59]207#@author  Ramon Gomez, ETSII Universidad de Sevilla
208#@date    2009/09/10
[1e7eaab]209#*/ ##
[42669ebf]210function ogRestoreImage ()
211{
[b094c59]212# Variables locales
[0fbc05e]213local PART PARTSIZE IMGFILE IMGTYPE IMGSIZE FSTYPE
[b094c59]214
[42669ebf]215# Si se solicita, mostrar ayuda.
[b094c59]216if [ "$*" == "help" ]; then
217    ogHelp "$FUNCNAME" "$FUNCNAME path_dir str_image int_ndisk int_npart" \
[3543b3e]218           "$FUNCNAME REPO /aula1/winxp 1 1"
[b094c59]219    return
220fi
[42669ebf]221# Error si no se reciben 4 parámetros.
[b094c59]222[ $# -lt 4 ] && ogRaiseError $OG_ERR_FORMAT && return $?
[3458879]223# Procesar parámetros.
224PART="$(ogDiskToDev "$3" "$4")" || return $?
[0fbc05e]225IMGTYPE=$(ogGetImageType "$1" "$2")
226IMGFILE=$(ogGetPath "$1" "$2.$IMGTYPE")
[b094c59]227[ -r "$IMGFILE" ] || ogRaiseError OG_ERR_NOTFOUND "$IMGFILE" || return $?
[42669ebf]228# Error si la imagen no cabe en la particion.
[3458879]229IMGSIZE=$(ogGetImageSize "$1" "$2")
230PARTSIZE=$(ogGetPartitionSize $3 $4)
231if [ $IMGSIZE -gt $PARTSIZE ]; then
232    ogRaiseError $OG_ERR_PARTITION "$IMGSIZE > $PARTSIZE"
233    return $?
234fi
[b094c59]235
[42669ebf]236# Comprobar el bloqueo de la partición, desmontarla y bloquearla.
[39277f4]237if ogIsLocked $3 $4; then
238    ogRaiseError $OG_ERR_LOCKED "$3,$4"
239    return $?
240fi
[f5432db7]241ogUnmount $3 $4 2>/dev/null || return $?
[39277f4]242ogLock $3 $4 || return $?
[b094c59]243trap "ogUnlock $3 $4" 1 2 3 6 9
244
[0fbc05e]245# Restaurar según el tipo de imagen.
246# Atención: no se comprueba el tipo de sistema de archivos.
[42669ebf]247# Atención: no se comprueba incongruencia entre partición e imagen.
[0fbc05e]248#FSTYPE="$(ogGetFsType $3 $4)"
249case "$IMGTYPE" in
250    img) # Partimage
251         partimage -M -f3 -o -d -V0 -B gui=no -c -z1 --volume=0 restore $PART "$IMGFILE"
252         ;;
253    pgz) # Partclone / GZip
254         #gzip -dc "$IMGFILE" | partclone.restore -C -F -o "$PART"   # Muestra progreso
255         gzip -dc "$IMGFILE" | partclone.restore -C -o "$PART"
256         ;;
257    *)   # Error si imagen no accesible o de tipo desconocido.
258         ogRaiseError $OG_ERR_FORMAT
259         return $? ;;
[b094c59]260esac
[f5432db7]261ERRCODE=$?
262if [ $ERRCODE != 0 ]; then
263    ogRaiseError $OG_ERR_IMAGE "$IMGFILE, $3, $4"
264fi
[b094c59]265ogUnlock $3 $4
[f5432db7]266return $ERRCODE
[b094c59]267}
268
[8f4c506]269
270function ogCreateImageFromPartition () {
271#/**  @function CreateImageFromPartition: @brief Crea una imagen de la particion indicada, utilizando el programa definido en las variable $CloneImageNTFS y $CloneImageEXT23
272#@param  $1 int DiskEAC
273#@param $2 int_PartitionEAC
274#@param $3 str_Repositorio ......... parametro pasado a ConectToRepo, admite $REPO  $CACHE   str_IP_servidorAlterno
275#@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.
276#@param $5 str_NameImage.str_compresion .......... (como compresion admite gzip y lzop)
277#@param ejemplo: CreateImageFromPartition  1               1                   $IP              hdimages/pruebas/   base.gzip
278#@return la propia de la herramienta de clonacion partimage o ntfsclone
279#@return genera la imagen con el nombre (imagen.compresion), y se le a?ade un guion y el numero de particion(parametro $2).
280#@return Tambien se solicita al servidor EAC, la creaci?n del fichero meta torrent, que tendra el nombre tal base.gzip-1.torrent,
281#@return Tambien se crea el fichero base.gzip-1.mcast con informacion para su uso con multicast, tal base.gzip-1.mcast
282#@warning  Salidas de errores no determinada
283#@attention
284#@note   Pendiente: que admita como segundo parametro el valor 0 (para que identifique el MBR del disco)
285#@version 0.1       Date: 27/10/2008                 Author Antonio J. Doblas Viso. Universidad de Malaga
286#*/
287if [ $# != 5 ]
288then
[8f20481]289        echo "sintaxis: CreateImageFromPartition <ndisco> <nparticion> <iprespositorio> <pathbase>              <nombreimagen.compresion>"
290        echo "ejemplo: CreateImageFromPartition         1               1                     \$IP              images/pruebas/   base.gzip"
291        echo " en iprepositorio admite cualquier ip de un servdior EAC, se llama a la funcion MountRepo ip"
[8f4c506]292fi
293if [ $# = 5 ]
294then
[8f20481]295        CloneImageNTFS="${CLONETOOLSNTFS:-partimage}"
296        CloneImageEXT23="${CLONETOOLSEXT:-partimage}"
297        CompresionImage="${CLONETOOLSCOMPRESSOR:-gzip}"
298
[8f4c506]299        disco=`ogDiskToDev $1 $2`
300        ogUnmountPartition $1 $2
301        fs=`ogGetFsType $1 $2`
[8f20481]302
[8f4c506]303        echo determinando tipo de Sistema Operativo y consulando la variable global CloneImageNTFS:  $fs
304        case $fs in
305                "NTFS")
306                        case $CloneImageNTFS in
307                                "ntfsclone")
308                                        #imaged="ntfsclone --force --save-image -O - $disco | "
309                                        imaged="ntfsclone --force --save-image -O - $disco"
310                                        program=ntfsclone
311                                ;;
312                                "partimage")
313                                        #imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout |"
314                                        imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout"
315                                        program=partimage
316                                ;;
317                                "partimage-ng")
318                                        #echo "partimage-ng"
319                                        #imaged="partimage-ng save $disco stdout"
320                                        program=partimage-ng
321                                ;;
322                                "partclone")
323                                        #echo "partclone"
324                                        #imaged="partclone.ntfs -c -F -s $disco | "
325                                        imaged="partclone.ntfs -c -F -s $disco"
326                                        program=partclone.ntfs
327                                        #zcat ~/image_sda1.pcl.gz | partclone.ext4 -r -o /dev/sda1
328                                ;;
329                        esac
330                ;;
331                EXT[234]|REISERFS)
332                        case $CloneImageEXT23 in
333                                "partimage")
334                                        imaged="partimage -M -f3 -o -d -B gui=no -c -z0 --volume=0 save $disco stdout"
335                                        program=partimage
336                                ;;
337                                "partimage-ng")
338                                        #echo "partimage-ng"
339                                        imaged="partimage-ng save $disco stdout"
340                                        program=partimage-ng
341                                ;;
342                                "partclone")
343                                        echo "partclone"
344                                        imaged="partclone.ext3 -c -F -C -s $disco"
345                                        program=partclone.ext3
346                                        #zcat ~/image_sda1.pcl.gz | partclone.ext4 -r -o /dev/sda1
347                                ;;
348                        esac
349                ;;
350        esac
351
352        # utilizando mbuffer para reducir posibles errores de acceso a discos
353        imaged="$imaged | mbuffer -m 70%"
354        #metodo de compresion.
[8f20481]355        case $CompresionImage in
356                "gzip")
357                        comando="$imaged | gzip -c >"
358                ;;
359                "lzop")
360                        comando="$imaged | lzop >"
361                ;;
362        esac
363
[8f4c506]364        #. determnamos el fichero donde se almacenar? la image
365        #camino=`ConnectToRepo $3 $4 $5`
366        #MkdirPath $camino
367        firstcamino=`ogNewPath $3 $4`
368        camino=$firstcamino$5
369        echo $camino
370        sleep 1
[8f20481]371
[8f4c506]372        #preparamos y ejecutamos el comanod a realizar
373        echo "Creando imagen particion $disco programa $program  compresion $CompresionImage en el repositorio $3 como $4 $5 - $2"
374        comando="$comando ${camino}-$2"
375        echo "comando: $comando"
376        echo $comando > /tmp/run.sh
377        sh /tmp/run.sh
378        unset comando
[8f20481]379
[8f4c506]380        #iniciamos la creacion del torrent
381        echo "Iniciando la creacion del punto torrent con CreateTorrentFromImage ip=$3 path=$4 image=$5-$2" echo
[8f20481]382        #CreateTorrentFromImage $3 $4 $5-$2
[8f4c506]383        # iniciacmos el putno mcast
384        echo "creando un punto mcast ${camino}-$2.mcast"
385        echo "program;$program" >  ${camino}.mcast
386        echo "compresion;$CompresionImage" >> ${camino}.mcast
387        echo "fsimage;$fs" >> ${camino}.mcast
388
389        #UmountRepo $3
390fi
391}
Note: See TracBrowser for help on using the repository browser.