diff options
author | Irina Gómez <irinagomez@us.es> | 2020-06-16 11:41:25 +0200 |
---|---|---|
committer | Irina Gómez <irinagomez@us.es> | 2020-06-16 11:41:25 +0200 |
commit | f8711cec895c0879632831086be7d8a8e374ed9d (patch) | |
tree | 31920702f684d28dffce1ea985babd389b20e45a | |
parent | 1d1e06d319e3ba52619d4c7d7f3f790e675439d7 (diff) |
#894 Scripts and functions for disk images:
ogGetSizeParameters: supports images of partition and disk.
deployImage: supports images of partition and disk.
deployDiskImage: link to deployImage.
createDiskImage: script to create disk image (provisional).
restoreDiskImage: script to restore disk image.
-rwxr-xr-x | client/engine/Image.lib | 72 | ||||
-rwxr-xr-x | client/shared/scripts/createDiskImage | 138 | ||||
l--------- | client/shared/scripts/deployDiskImage | 1 | ||||
-rwxr-xr-x | client/shared/scripts/deployImage | 109 | ||||
-rwxr-xr-x | client/shared/scripts/restoreDiskImage | 105 |
5 files changed, 363 insertions, 62 deletions
diff --git a/client/engine/Image.lib b/client/engine/Image.lib index 20e7f7df..480d4253 100755 --- a/client/engine/Image.lib +++ b/client/engine/Image.lib @@ -455,7 +455,7 @@ dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IM # ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff] #@brief Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido. #@param int_disk numero de disco -#@param int_part numero de particion +#@param int_part numero de particion (opcional) #@param str_repo repositorio de imágenes { REPO, CACHE } #@param str_imageName Nombre de la imagen #@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional) @@ -471,31 +471,59 @@ dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IM #@version 1.1.0 - Si la imagen ya existe en el REPO se suma su tamaño al espacio libre #@author Irina Gomez - ETSII Universidad de Sevilla #@date 2017-11-08 +#@version 1.1.2 - Calcula espacio necesario para imágenes de disco +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2020-05-12 #*/ ## function ogGetSizeParameters () { -local REPO MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP FACTORSYNC SIZEFREE +local REPO MNTDIR DEVICE SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP FACTORSYNC SIZEFREE local IMGTYPE IMGDIR IMGFILE IMGEXT IMGSIZE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo path_imgname [monolit|sync|diff]" \ + ogHelp "$FUNCNAME" "$FUNCNAME num_disk [ num_part ] str_repo path_imgname [monolit|sync|diff]" \ "if $FUNCNAME 1 2 REPO Windows10 sync ; then ...; fi" \ - "if $FUNCNAME 1 6 Ubuntu16 CACHE ; then ...; fi" + "if $FUNCNAME 1 disk1 CACHE ; then ...; fi" return fi -# Error si no se reciben 1 o 2 parámetros. -[ $# -lt 4 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE imgname [monolit|sync|diff]" ; echo $?) # Recogemos parametros -REPO=${3^^} -IMGTYPE="_${5^^}_" -MNTDIR=$(ogMount $1 $2) -if [ "$MNTDIR" == "" ]; then - ogRaiseError $OG_ERR_PARTITION "$1 $2" - return $? -fi +case "$#" in + 3) + # Imagenes de disco + # Montamos las particiones + for ((p=1; p<=$(ogGetPartitionsNumber $1); p++)); do + ogMount $1 $p &>/dev/null + done + DEVICE=$(ogDiskToDev $1) || return $? + REPO=${2^^} + IMGEXT="dsk.ant" + IMGNAME="$3" + ;; + 4|5) + # Imágenes de particiones + MNTDIR=$(ogMount $1 $2) || return $? + DEVICE=$(ogDiskToDev $1 $2) + REPO=${3^^} + IMGNAME="$4" + IMGTYPE="_${5^^}_" + # Extensión de imagen antigua (si existe en repositorio de destino) + case "${IMGTYPE}" in + _DIFF_) IMGEXT="img.diff" + ;; + _SYNC_) IMGEXT="img" + ;; + *) IMGEXT="img.ant" + ;; + esac + ;; + *) + # Error si no se reciben entre 3 y 5 parámetros. + return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco [ nparticion ] REPO|CACHE imgname [monolit|sync|diff]" ; echo $?) + ;; +esac # Datos contenidos en la particion o en la lista de archivos de contiene la diferencial. if [ "$IMGTYPE" == "_DIFF_" ]; then @@ -504,7 +532,7 @@ if [ "$IMGTYPE" == "_DIFF_" ]; then SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1) cd / else - SIZEDATA=$(df -k | grep $MNTDIR\$ | awk '{print $3}') + SIZEDATA=$(df -k| awk -v D=$DEVICE '{if ($1~D) SUM += $3} END {print SUM}') fi #Aplicar factor de compresion @@ -522,7 +550,6 @@ if [ "$IMGTYPE" == "_SYNC_" -o "$IMGTYPE" == "_DIFF_" ]; then [ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000 else - FACTORGZIP=55/100 FACTORLZOP=65/100 let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP fi @@ -531,19 +558,8 @@ fi [ "$REPO" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) [ "$REPO" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') -# Comprobamos si existe una imagen con el mismo nombre en $REPO -# En sincronizadas restamos tamaño de la imagen y en monoloticas de la .ant -case "${IMGTYPE}" in - _DIFF_) IMGEXT="img.diff" - ;; - _SYNC_) IMGEXT="img" - ;; - *) IMGEXT="img.ant" - ;; -esac - -IMGDIR=$(ogGetParentPath "$REPO" "/$4") -IMGFILE=$(ogGetPath "$IMGDIR/$(basename "/$4").$IMGEXT") +IMGDIR=$(ogGetParentPath "$REPO" "/$IMGNAME") +IMGFILE=$(ogGetPath "$IMGDIR/$(basename "/$IMGNAME").$IMGEXT" ) if [ -z "$IMGFILE" ]; then IMGSIZE=0 else diff --git a/client/shared/scripts/createDiskImage b/client/shared/scripts/createDiskImage new file mode 100755 index 00000000..46ddc0b4 --- /dev/null +++ b/client/shared/scripts/createDiskImage @@ -0,0 +1,138 @@ +#!/bin/bash + +#/** +#@file createDiskImage +#@brief Script de ejemplo para crear una imagen de un disco +#@brief Se usa como base para el programa de creación de imágenes de OpenGnsys Admin). +#@param 1 disco +#@param 2 REPO|CACHE +#@param 3 imagen +#@return +#@exception OG_ERR_FORMAT # 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND # 2 Dispositivo o encontrado (disco) +#@exception OG_ERR_IMAGE # 5 Error en funcion ogCreateImage o ogRestoreImage. +#@exception OG_ERR_NOTWRITE # 14 error de escritura +#@exception OG_ERR_NOTCACHE # 15 si cache no existe 15 +#@exception OG_ERR_CACHESIZE # 16 si espacio de la cache local o remota no tiene espacio 16 +#@exception OG_ERR_REDUCEFS # 17 error al reducir sistema de archivos. +#@exception OG_ERR_EXTENDFS # 18 Errror al expandir el sistema de archivos. +#@note Se toma como base el script createImage +#@todo: que hacer, si el tamaño de la cache es sufciente, pero no tiene espacio libre +#@todo: que hacer, si hay una imagen con igual nombre en la cache +#@version 1.2 - Versión inicial +#@author Irina Gomez - ETSII Universidad de Sevilla +#@date 2020-05-14 +#*/ ## + +PROG="$(basename $0)" +if [ $# -ne 3 ]; then + ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco REPO|CACHE imagen" + exit $? +fi + +TIME1=$SECONDS + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Valores por defecto en etc/engine.cfg +#IMGCOMP="lzop" +IMGEXT="dsk" +#IMGREDUCE="TRUE" +DISK=$1 +REPO="${2^^}" +IMGNAME="$3" + +# Unidad organizativa +[ "$ogunit" != "" ] && OGUNIT="$ogunit" + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +# salvo si es llamado desde createImageCustom +if [ "$(ogGetCaller)" != "createImageCustom" ]; then + echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp +fi + +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Si es una ip y es igual a la del equipo restaura desde cache +[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPO +if [ $? == 0 -o $REPO == "REPO" ] ; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO $OGUNIT || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO'; echo $?) + REPO="REPO" +fi + +# Si el repositorio es CACHE comprobamos que exista +if [ "$REPO" == "CACHE" ]; then + ! ogFindCache >/dev/null && exit $(ogRaiseError $OG_ERR_NOTCACHE "CACHE "; echo $?) +fi + +# Obtener información de los parámetros de entrada. +ogDiskToDev "$DISK" &>/dev/null || exit $(ogRaiseError $OG_ERR_NOTFOUND "$DISK"; echo $?) + +#Comprobamos acceso de escritura. +DIRTEMP=$(date +%Y%m%d-%H%M%S) +ogMakeDir $REPO /$IMGNAME$DIRTEMP 2>/dev/null || exit $(ogRaiseError $OG_ERR_NOTWRITE "$REPO"; echo $?) && ogDeleteTree $REPO /$IMGNAME$DIRTEMP + +IMGDIR=$(ogGetParentPath "$REPO" "/$IMGNAME") +# Si no existe, crear subdirectorio de la imagen. +if [ $? != 0 ]; then + ogEcho log session "[5] $MSG_HELP_ogMakeDir \"$REPO $(dirname "$IMGNAME")." + ogMakeDir "$REPO" $(dirname "/$IMGNAME") || exit $(ogRaiseError $OG_ERR_NOTWRITE "$REPO /$IMGNAME"; echo $?) + IMGDIR=$(ogGetParentPath "$REPO" "/$IMGNAME") || exit $(ogRaiseError $OG_ERR_NOTWRITE "$REPO /$IMGNAME"; echo $?) +fi +IMGFILE=$IMGDIR/$(basename "/$IMGNAME").$IMGEXT + +echo " " > $OGLOGCOMMAND +# Borramos ficheros de paginacion y configuracion +for ((part=1; part<=$(ogGetPartitionsNumber $DISK); part++)); do + ogCleanOs $DISK $part +done + +#Comprobar espacio que requerira la imagen para ser almacenada +read SIZEDATA SIZEREQUIRED SIZEFREE ISENOUGHSPACE <<< $(ogGetSizeParameters $DISK "$REPO" "$IMGNAME") + +ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED $SIZEFREE $ISENOUGHSPACE" +[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$REPO"; echo $?) + +# Comprobar consistencia del sistema de archivos. +for ((part=1; part<=$(ogGetPartitionsNumber $DISK); part++)); do + echo " " > $OGLOGCOMMAND + SIZEFS=$(ogGetFsSize $DISK $part) + ogEcho log session "[20] $MSG_HELP_ogCheckFs $part $SIZEFS (KB)" + ogUnmount $DISK $part 2>/dev/null + # Muestro mensaje de error pero no me salgo. + ogCheckFs $DISK $part +done + +# Renombrar el fichero de imagen si ya existe. +if [ -f "$IMGFILE" ]; then + ogEcho log session "[35] $MSG_SCRIPTS_FILE_RENAME \"$IMGFILE\" -> \"$IMGFILE.ant\"." + mv "$IMGFILE" "$IMGFILE.ant" + mv "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null + mv "$IMGFILE.sum" "$IMGFILE.sum.ant" 2>/dev/null + mv "$IMGFILE.full.sum" "$IMGFILE.full.sum.ant" 2>/dev/null +fi + +# Crear la imagen. +echo " " > $OGLOGCOMMAND +TIME2=$SECONDS +ogEcho log session "[40] $MSG_HELP_ogCreateDiskImage : ogCreateDiskImage $DISK $REPO $IMGNAME" +ogExecAndLog command ogCreateDiskImage "$DISK" "$REPO" "/$IMGNAME" &>> $OGLOGCOMMAND || exit $(ogRaiseError $OG_ERR_IMAGE "ogCreateDiskImage"; echo $?) +RESUMECREATEIMAGE=$(grep "Total Time:" $OGLOGCOMMAND) +TIMEAUX2=$[SECONDS-TIME2] +ogEcho log session " $RESUMECREATEIMAGE " +ogEcho log session " $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX2/60]m $[TIMEAUX2%60]s" + +#resumen de la operacion +IMGSIZE=$(ls -s `ogGetPath $REPO /$IMGNAME.$IMGEXT`| cut -f1 -d" ") +IMGOS=$(ogGetImageInfo `ogGetPath $REPO /$IMGNAME.$IMGEXT`) + +TIME=$[SECONDS-TIME1] +ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" +ogEcho log session " FileSystem $DISK with $NEWSIZEFS KB data created onto file-image as $IMGNAME and used $IMGSIZE KB" +ogEcho log session " Image-file $IMGNAME metada: $IMGOS" diff --git a/client/shared/scripts/deployDiskImage b/client/shared/scripts/deployDiskImage new file mode 120000 index 00000000..17af902f --- /dev/null +++ b/client/shared/scripts/deployDiskImage @@ -0,0 +1 @@ +deployImage
\ No newline at end of file diff --git a/client/shared/scripts/deployImage b/client/shared/scripts/deployImage index d74d3ac2..5fb8d671 100755 --- a/client/shared/scripts/deployImage +++ b/client/shared/scripts/deployImage @@ -37,6 +37,9 @@ #@version 1.1 - Control de errores en transferencia multicast (ticket #781) #@author Irina Gomez, ETSII Universidad de Sevilla #@date 2017/04/20 +#@version 1.2 - Soporta imágenes de disco +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2020/06/15 #**/ @@ -48,28 +51,53 @@ PROG="$(basename $0)" -if [ $# -lt 4 ]; then - ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]" +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg (IMGEXT="img") +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Para imagen de partición +NUMARGS=4 +ARGS=( "${@}" ) +CMDRESTORE="restoreImage" +# Para imagen de disco +if [ "$PROG" == "deployDiskImage" ]; then + NUMARGS=3 + # Incluyo un argumento ficticio para la particion + ARGS=( "${ARGS[@]:0:3}" "diskImage" "${ARGS[@]:3}" ) + CMDRESTORE="restoreDiskImage" + IMGEXT="dsk" +fi +if [ $# -lt $NUMARGS ]; then + [ "$IMGEXT" == "dsk" ] && MSGPART="" || MSGPART="nparticion" + ogRaiseError session log $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco $MSGPART [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]" exit $? fi # Asignación de variables (repositorio y protocolo se convierten a mayúsculas). TIME1=$SECONDS -REPO="${1^^}" +REPO="${ARGS[0]^^}" REPO=${REPO:-"REPO"} -IMGNAME="$2" -DISK="$3" -PART="$4" -PROTO="${5^^}" +IMGNAME="${ARGS[1]}" +DISK="${ARGS[2]}" +PART="${ARGS[3]}" +PROTO="${ARGS[4]^^}" PROTO="${PROTO:-"UNICAST"}" -PROTOOPT="$6" +PROTOOPT="${ARGS[5]}" +# Imagen de disco: para configurar recorremos todas las particiones +# Imagen de partición: al recorrer las particiones sólo hay una +if [ "$PROG" == "deployDiskImage" ]; then + INIP=1 + ENDP=$(ogGetPartitionsNumber $DISK) + [ -n "$ENDP" ] || exit $OG_ERROR_NOTFOUND +else + INIP=$PART + ENDP=$PART +fi + +ogEcho session log "REPO $REPO IMG $IMGNAME DISK $DISK PART $PART PROT $PROTO OPT $PROTOOPT" # Unidad organizativa. [ "$ogunit" != "" ] && OGUNIT="$ogunit" -#Load engine configurator from engine.cfg file. -#Carga el configurador del engine desde el fichero engine.cfg -[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg - # Clear temporary file used as log track by httpdlog # Limpia los ficheros temporales usados como log de seguimiento para httpdlog echo " " > $OGLOGCOMMAND @@ -78,11 +106,15 @@ echo " " > $OGLOGCOMMAND # Registro de inicio de ejecución ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" -# Si el origen(pariticion) esta bloqueada salir. -ogIsLocked $DISK $PART && exit $(ogRaiseError session $OG_ERR_LOCKED "$MSG_PARTITION, $DISK $PART"; echo $?) +# Si el origen (pariticion y disco) están bloqueados salir. +[ "$PROG" == "deployDiskImage" ] && ogIsDiskLocked $DISK && exit $(ogRaiseError session $OG_ERR_LOCKED "$MSG_DISK, $DISK"; echo $?) +# Recorremos las particiones +for ((p=$INIP; p<=$ENDP; p++)); do + ogIsLocked $DISK $p && exit $(ogRaiseError session $OG_ERR_LOCKED "$MSG_PARTITION, $DISK $p"; echo $?) -ogEcho log session "$MSG_HELP_ogUnmount $DISK $PART" -ogUnmount $DISK $PART 2>/dev/null + ogEcho log session "$MSG_HELP_ogUnmount $DISK $p" + ogUnmount $DISK $p 2>/dev/null +done # Valor por defecto para el repositorio. if [ "$REPO" == "$(ogGetIpAddress)" -o "$REPO" == "CACHE" ]; then @@ -97,7 +129,7 @@ else fi #Informacioin previa de la imagen -IMGOS=$(ogGetImageInfo `ogGetPath $MODE $IMGNAME.img`) +IMGOS=$(ogGetImageInfo `ogGetPath $MODE $IMGNAME.$IMGEXT`) case $? in 0) ;; 1) ogRaiseError session $OG_ERR_NOTFOUND "$REPO $2" || exit $? ;; @@ -106,7 +138,7 @@ case $? in esac IMGSIZE=$(ls -s `ogGetPath $MODE $IMGNAME.img`| cut -f1 -d" ") -ogEcho log session "[1] REPO=$REPO IMG-FILE=$IMGNAME.img SIZE=$IMGSIZE (KB) METADATA=$IMGOS" +ogEcho log session "[1] REPO=$REPO IMG-FILE=$IMGNAME.$IMGEXT SIZE=$IMGSIZE (KB) METADATA=$IMGOS" # Procesar repositorio. case "$MODE" in @@ -126,9 +158,11 @@ case "$MODE" in TORRENT|TORRENT-CACHE|MULTICAST|MULTICAST-CACHE|UNICAST|UNICAST-CACHE) # Eliminamos CACHE o DIRECT PROTO=${PROTO%%-*} - ogEcho log session "[2] updateCache "$REPO" \"/$IMGNAME.img\" $PROTO $PROTOOPT" + # Si imagen es de tipo disco comprobamos que el disco de destino no contenga la cache + [ "$PROG" == "deployDiskImage" ] && [[ "$(ogFindCache)" =~ "$DISK " ]] && exit $(ogRaiseError $OG_ERR_GENERIC "Disco de destino Contiene Cache") + ogEcho log session "[2] updateCache "$REPO" \"/$IMGNAME.$IMGEXT\" $PROTO $PROTOOPT" TIME2=$SECONDS - updateCache "$REPO" "/$IMGNAME.img" "$PROTO" "$PROTOOPT" + updateCache "$REPO" "/$IMGNAME.$IMGEXT" "$PROTO" "$PROTOOPT" RETVAL=$? TIME2=$[SECONDS-TIME2] ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL updateCache $[TIME2/60]m $[TIME2%60]s" @@ -202,13 +236,18 @@ case "$NEXTOPERATION" in PARAMS="$REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT" ;; esac +# Si es imagen de disco eliminamos el parámetro particion +[ "$PROG" == "deployDiskImage" ] && PARAMS=$(echo $PARAMS| awk '{print $1, $2, $3, $5, $6}') + # Si existe, ejecuta script personalizado "restoreImageCustom"; si no, llama al genérico "restoreImage". -if which restoreImageCustom &>/dev/null; then - ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImageCustom $PARAMS" - restoreImageCustom $PARAMS +if which ${CMDRESTORE}Custom &>/dev/null; then + ogEcho log session "[55] $MSG_HELP_ogRestoreImage: ${CMDRESTORE}Custom $PARAMS" + #restoreImageCustom $PARAMS + eval ${CMDRESTORE}Custom $PARAMS else - ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImage $PARAMS" - restoreImage $PARAMS + ogEcho log session "[55] $MSG_HELP_ogRestoreImage: ${CMDRESTORE} $PARAMS" + #restoreImage $PARAMS + eval ${CMDRESTORE} $PARAMS fi RETVAL=$? @@ -225,15 +264,17 @@ fi TIME3=$[SECONDS-TIME3] ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL : $[TIME3/60]m $[TIME3%60]s" -# Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs". -if which configureOsCustom &>/dev/null; then - ogEcho log session "[90] configureOsCustom" - configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME" -else - ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " - configureOs "$DISK" "$PART" -fi - +# Si es imagen de disco hacemos recorremos todas las particiones +for ((p=$INIP; p<=$ENDP; p++)); do + # Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs". + if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom" + configureOsCustom "$DISK" "$p" "$REPO" "$IMGNAME" + else + ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE $DISK $p" + configureOs "$DISK" "$p" + fi +done TIME=$[SECONDS-TIME1] ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" diff --git a/client/shared/scripts/restoreDiskImage b/client/shared/scripts/restoreDiskImage new file mode 100755 index 00000000..f910fc66 --- /dev/null +++ b/client/shared/scripts/restoreDiskImage @@ -0,0 +1,105 @@ +#!/bin/bash +#/** +#@file restoreDiskImage +#@brief Script de ejemplo para restaurar una imagen de disco. +#@param $1 Repositorio (CACHE, REPO o dirección IP) +#@param $2 Nombre canónico de la imagen (sin extensión) +#@param $3 Número de disco +#@param $4 Protocolo (UNICAST, UNICAST-DIRECT, MULTICAST o MULTICAST-DIRECT) +#@param $5 Opciones del protocolo +#@exception OG_ERR_FORMAT 1 formato incorrecto. +#@exception OG_ERR_NOTFOUND 2 cambio de repositorio: repositorio no encontrado +#@exception OG_ERR_NOTFOUND 2 fichero de imagen o partición no detectados. +#@exception $OG_ERR_MCASTRECEIVERFILE 57 Error en la recepción Multicast de un fichero +#@exception $OG_ERR_PROTOCOLJOINMASTER 60 Error en la conexión de una sesión Unicast|Multicast con el Master +#@version 1.2 - Versión inicial +#@note Se toma como base el script restoreImage +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2020/05/14 +#**/ + +TIME1=$SECONDS +PROG="$(basename $0)" +if [ $# -lt 3 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco" + exit $? +fi + +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGCOMMAND +ogCheckStringInGroup "$(ogGetCaller)" "deployImage restoreImageCustom" || echo -n "" > $OGLOGSESSION; + +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Procesar parámetros de entrada +REPO="${1^^}" +IMGNAME="$2" +DISK="$3" +PROTO="${4^^}" +PROTO=${PROTO:-"UNICAST"} +PROTOOPT="$5" +# Si MCASTWAIT menos que tiempo de espera del servidor lo aumento +if [ "${PROTO%-*}" == "MULTICAST" ] && [[ ${PROTOOPT##*:} =~ ^-?[0-9]+$ ]]; then + [ ${MCASTWAIT:-0} -lt ${PROTOOPT##*:} ] && let MCASTWAIT=${PROTOOPT##*:}+5 +fi +IMGEXT="dsk" + +# Unidad organizativa +[ "$ogunit" != "" ] && OGUNIT="$ogunit/" + +# Si es una ip y es igual a la del equipo restaura desde cache +[ "$REPO" == "$(ogGetIpAddress)" ] && REPO="CACHE" +# Si es una ip y es distinta a la del recurso samba cambiamos de REPO. +ogCheckIpAddress $REPO +if [ $? == 0 -o $REPO == "REPO" ] ; then + # Si falla el cambio -> salimos con error repositorio no valido + ogChangeRepo $REPO ${OGUNIT%/} || exit $(ogRaiseError $OG_ERR_NOTFOUND '$REPO $OGUNIT'; echo $?) + REPO="REPO" +fi + +# Comprobar que existe la imagen del origen. +IMGFILE=$(ogGetPath "$REPO" "$IMGNAME.$IMGEXT") +IMGDIR=$(ogGetParentPath "$REPO" "$IMGNAME") +if [ "$IMGFILE" == "" -o "$IMGDIR" == "" ]; then + ogRaiseError session $OG_ERR_NOTFOUND "$REPO, ${IMGNAME%/*}" + exit $? +fi + +# Desmontamos todas las particiones del disco +ogUnmountAll $DISK || exit $? + +# Procesar protocolos de transferencia. +case "$PROTO" in + UNICAST|UNICAST-DIRECT) + # Restaurar la imagen. + ogEcho log session "[40] ogRestoreDiskImage $REPO $IMGNAME $DISK" + ogExecAndLog command ogRestoreDiskImage "$REPO" "$IMGNAME" "$DISK" + RETVAL=$? + ;; +# TODO: Crear si es posible función ogMcastReceiverDisk +# MULTICAST|MULTICAST-DIRECT) +# PORT=$(echo $PROTOOPT | cut -f1 -d":") +# TOOL=$(ogGetImageProgram REPO $IMGNAME) +# COMPRESS=$(ogGetImageCompressor REPO $IMGNAME) +# #TODO comprobar parametros anteriores +# ogEcho log session "[40] ogMcastReceiverPartition $DISK $PART $PORT $TOOL $COMPRESS" +# ogMcastRequest "$IMGNAME.img" "$PROTOOPT" || exit $? +# ogExecAndLog command ogMcastReceiverPartition "$DISK" "$PART" "$PORT" "$TOOL" "$COMPRESS" +# RETVAL=$? +# ;; + *) # Protocolo desconocido. + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco [ UNICAST ]" + exit $? +esac + +TIME=$[SECONDS-TIME1] +ogEcho log session "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s" + +# Código de salida del comando prinicpal de restauración. +exit $RETVAL + |