| 1 | #!/bin/bash | 
|---|
| 2 | #/** | 
|---|
| 3 | #@file    deployImage | 
|---|
| 4 | #@brief   Proceso completo de despliegue de imagen, incluyendo actualización de la caché, restauración y post-configuración (este script es llamado por la interfaz RestaurarImagen). | 
|---|
| 5 | #@param   $1 Repositorio (CACHE, REPO o dirección IP) | 
|---|
| 6 | #@param   $2 Nombre canónico de la imagen (sin extensión) | 
|---|
| 7 | #@param   $3 Número de disco | 
|---|
| 8 | #@param   $4 Número de particion | 
|---|
| 9 | #@param   $5 Protocolo (UNICAST, por defecto, MULTICAST o TORRENT) | 
|---|
| 10 | #@param   $6 Opciones del protocolo | 
|---|
| 11 | #@exception OG_ERR_FORMAT   1 formato incorrecto. | 
|---|
| 12 | #@exception OG_ERR_NOTFOUND  2 fichero de imagen o partición no detectados. | 
|---|
| 13 | #@exception OG_ERR_PARTITION 3  # Error en partición de disco. | 
|---|
| 14 | #@exception OG_ERR_LOCKED    4 partición bloqueada por otra operación. | 
|---|
| 15 | #@exception OG_ERR_IMAGE    5 error al restaurar la imagen del sistema. | 
|---|
| 16 | #@exception OG_ERR_IMGSIZEPARTITION  30 Tamaño de la particion es menor al tamaño de la imagen. | 
|---|
| 17 | #@exception OG_ERR_NOTCACHE     No existe cache -15- | 
|---|
| 18 | #@exception OG_ERR_CACHESIZE   Tamaño de la paticion menor al archivo a descargar -16- | 
|---|
| 19 | #@version 1.0.1 - Separación en protocolos de transferencia y postconfiguracion | 
|---|
| 20 | #@author  Antonio J. Doblas Viso. Universidad de Málaga | 
|---|
| 21 | #@date    2011-05-11 | 
|---|
| 22 | #@version 1.0.1 - Separación de los ficheros-log para ser gestionado por el httpd-log | 
|---|
| 23 | #@author  Antonio J. Doblas Viso. Universidad de Málaga   | 
|---|
| 24 | #@date    2011-05-11 | 
|---|
| 25 | #@version 1.0.2 - Logica basada en fichero de configuracion engine.cfg | 
|---|
| 26 | #@author  Antonio J. Doblas Viso. Universidad de Málaga   | 
|---|
| 27 | #@date    2012-01-11 | 
|---|
| 28 | #@version 1.0.5 - Renominación del script como "deployImage". | 
|---|
| 29 | #@author  Antonio J. Doblas Viso y Ramón M. Gómez. | 
|---|
| 30 | #@date    2013-12-04 | 
|---|
| 31 | #@version 1.0.6 - Se añade la gestión de errores de la CACHE cuando en el engine.cfg se define RESTOREPROTOCOLNOCACHE=NONE. | 
|---|
| 32 | #@author  Antonio J. Doblas Viso. | 
|---|
| 33 | #@date    2015-02-23 | 
|---|
| 34 | #@version 1.1 - Cambio de repositorio para el recurso remoto images si es necesario | 
|---|
| 35 | #@author  Irina Gomez, ETSII Universidad de Sevilla | 
|---|
| 36 | #@date    2015-06-16 | 
|---|
| 37 | #@version 1.1 - Control de errores en transferencia multicast (ticket #781)  | 
|---|
| 38 | #@author  Irina Gomez, ETSII Universidad de Sevilla  | 
|---|
| 39 | #@date    2017/04/20  | 
|---|
| 40 | #**/ | 
|---|
| 41 |  | 
|---|
| 42 |  | 
|---|
| 43 | #Descripcion: | 
|---|
| 44 | # Si Repositorio es el global (REPO) realiza un deploy. | 
|---|
| 45 | # Si Repositorio es local (CACHE) realiza un restoreImage CACHE | 
|---|
| 46 | # El deploy, si detecta que el cliente no tiene una CACHE o no tiene espacio suficiente consulta el engine.cfg  RESTOREPROTOCOLNOCACHE | 
|---|
| 47 |  | 
|---|
| 48 |  | 
|---|
| 49 |  | 
|---|
| 50 | PROG="$(basename $0)" | 
|---|
| 51 | if [ $# -lt 4 ]; then | 
|---|
| 52 |     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] ]" | 
|---|
| 53 |     exit $? | 
|---|
| 54 | fi | 
|---|
| 55 |  | 
|---|
| 56 | # Asignación de variables (repositorio y protocolo se convierten a mayúsculas). | 
|---|
| 57 | TIME1=$SECONDS | 
|---|
| 58 | REPO="${1^^}" | 
|---|
| 59 | REPO=${REPO:-"REPO"} | 
|---|
| 60 | IMGNAME="$2" | 
|---|
| 61 | DISK="$3" | 
|---|
| 62 | PART="$4" | 
|---|
| 63 | PROTO="${5^^}" | 
|---|
| 64 | PROTO="${PROTO:-"UNICAST"}" | 
|---|
| 65 | PROTOOPT="$6" | 
|---|
| 66 | # Unidad organizativa. | 
|---|
| 67 | [ "$ogunit" != "" ] && OGUNIT="$ogunit" | 
|---|
| 68 |  | 
|---|
| 69 | #Load engine configurator from engine.cfg file. | 
|---|
| 70 | #Carga el configurador del engine desde el fichero engine.cfg | 
|---|
| 71 | [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg | 
|---|
| 72 |  | 
|---|
| 73 | # Clear temporary file used as log track by httpdlog | 
|---|
| 74 | # Limpia los ficheros temporales usados como log de seguimiento para httpdlog | 
|---|
| 75 | echo " " > $OGLOGCOMMAND | 
|---|
| 76 | [ "$(ogGetCaller)" == "EjecutarScript" ] || echo -n "" > $OGLOGSESSION | 
|---|
| 77 |  | 
|---|
| 78 | # Registro de inicio de ejecución | 
|---|
| 79 | ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" | 
|---|
| 80 |  | 
|---|
| 81 | # Si el origen(pariticion) esta bloqueada salir. | 
|---|
| 82 | ogIsLocked $DISK $PART && exit $(ogRaiseError session $OG_ERR_LOCKED "$MSG_PARTITION, $DISK $PART"; echo $?) | 
|---|
| 83 |  | 
|---|
| 84 | ogEcho log session "$MSG_HELP_ogUnmount $DISK $PART" | 
|---|
| 85 | ogUnmount $DISK $PART 2>/dev/null | 
|---|
| 86 |  | 
|---|
| 87 | # Valor por defecto para el repositorio. | 
|---|
| 88 | if [ "$REPO" == "$(ogGetIpAddress)" -o "$REPO" == "CACHE" ]; then | 
|---|
| 89 |     MODE="CACHE" | 
|---|
| 90 | else | 
|---|
| 91 |     ogCheckIpAddress "$REPO" | 
|---|
| 92 |     if [ $? == 0 -o "$REPO" == "REPO"  ]; then | 
|---|
| 93 |         # Si falla el cambio -> salimos con error repositorio no valido | 
|---|
| 94 |         ogChangeRepo $REPO ${OGUNIT} || exit $(ogRaiseError $OG_ERR_NOTFOUND "$REPO $OGUNIT"; echo $?) | 
|---|
| 95 |         MODE="REPO" | 
|---|
| 96 |     fi | 
|---|
| 97 | fi | 
|---|
| 98 |  | 
|---|
| 99 | #Informacioin previa de la imagen | 
|---|
| 100 | IMGOS=$(ogGetImageInfo `ogGetPath $MODE $IMGNAME.img`) || exit $(ogRaiseError session $OG_ERR_NOTFOUND "$REPO $2"; echo $?) | 
|---|
| 101 | IMGSIZE=$(ls -s `ogGetPath $MODE $IMGNAME.img`| cut -f1 -d" ") | 
|---|
| 102 |  | 
|---|
| 103 | ogEcho log session "[1] REPO=$REPO IMG-FILE=$IMGNAME.img  SIZE=$IMGSIZE (KB)   METADATA=$IMGOS" | 
|---|
| 104 |  | 
|---|
| 105 | # Procesar repositorio. | 
|---|
| 106 | case "$MODE" in | 
|---|
| 107 |     CACHE)  # Repositorio en caché local. | 
|---|
| 108 |         NEXTOPERATION=CACHE | 
|---|
| 109 |     ;; | 
|---|
| 110 |     REPO)   # Repositorio remoto por defecto. | 
|---|
| 111 |         case "$PROTO" in | 
|---|
| 112 |             MULTICAST-DIRECT) | 
|---|
| 113 |                 NEXTOPERATION=MULTICAST | 
|---|
| 114 |             ;; | 
|---|
| 115 |             UNICAST-DIRECT) | 
|---|
| 116 |                 NEXTOPERATION=UNICAST | 
|---|
| 117 |             ;; | 
|---|
| 118 |  | 
|---|
| 119 |             # Si protocolo es torrent|torrent-cache o multicast|multicast-cache | 
|---|
| 120 |             TORRENT|TORRENT-CACHE|MULTICAST|MULTICAST-CACHE|UNICAST|UNICAST-CACHE) | 
|---|
| 121 |                 ogEcho log session "[2] updateCache "$REPO" \"/$IMGNAME.img\" $PROTO $PROTOOPT" | 
|---|
| 122 |                 TIME2=$SECONDS | 
|---|
| 123 |                 updateCache "$REPO" "/$IMGNAME.img" "$PROTO" "$PROTOOPT"                 | 
|---|
| 124 |                 RETVAL=$? | 
|---|
| 125 |                 TIME2=$[SECONDS-TIME2] | 
|---|
| 126 |                 ogEcho log session "   [ ]  $MSG_SCRIPTS_TIME_PARTIAL updateCache $[TIME2/60]m $[TIME2%60]s" | 
|---|
| 127 |                 case $RETVAL in | 
|---|
| 128 |                     0) | 
|---|
| 129 |                         ogEcho log session "[50] updateCache (OK)" | 
|---|
| 130 |                         NEXTOPERATION=CACHE | 
|---|
| 131 |                     ;; | 
|---|
| 132 |                     15|16) | 
|---|
| 133 |                         # no se permite usar la cache (no existe(15) o no espacio sufiente (16). Se consulta engine.cfg para RESTOREPROTOCOLNOCACHE [ multicast   unicast  none ] | 
|---|
| 134 |                         ogEcho log session "[50] $MSG_ERR_NOTCACHE ;  $MSG_ERR_CACHESIZE " | 
|---|
| 135 |                         ogEcho log session "[50] $MSG_SCRIPTS_CHECK_ENGINE:  RESTOREPROTOCOLNOTCACHE=$RESTOREPROTOCOLNOTCACHE " | 
|---|
| 136 |                         case "$RESTOREPROTOCOLNOTCACHE" in | 
|---|
| 137 |                             MULTICAST) | 
|---|
| 138 |                                 case "$PROTO" in | 
|---|
| 139 |                                     MULTICAST)  NEXTOPERATION=MULTICAST ;; | 
|---|
| 140 |                                     TORRENT)    NEXTOPERATION=UNICAST ;; | 
|---|
| 141 |                                     UNICAST)    NEXTOPERATION=UNICAST ;; | 
|---|
| 142 |                                 esac | 
|---|
| 143 |                                 ;; | 
|---|
| 144 |                                 UNICAST) | 
|---|
| 145 |                                 NEXTOPERATION=UNICAST | 
|---|
| 146 |                                 ;; | 
|---|
| 147 |                                 NONE) | 
|---|
| 148 |                                 case $RETVAL in | 
|---|
| 149 |                                         15) | 
|---|
| 150 |                                         ogEcho log session "[100] $MSG_ERR_NOTCACHE" | 
|---|
| 151 |                                         ogRaiseError session $OG_ERR_NOTCACHE "NOT CACHE" | 
|---|
| 152 |                                         exit $? | 
|---|
| 153 |                                     ;; | 
|---|
| 154 |                                     16) | 
|---|
| 155 |                                         ogEcho log session "[100]  $MSG_ERR_CACHESIZE " | 
|---|
| 156 |                                         ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL" | 
|---|
| 157 |                                         exit $? | 
|---|
| 158 |                                     ;; | 
|---|
| 159 |                                 esac # del segundo RETAVAL | 
|---|
| 160 |                                 ;; | 
|---|
| 161 |                         esac # del RESTOREPROTOCOLNOTCACHE | 
|---|
| 162 |                     ;; | 
|---|
| 163 |                     57|60) | 
|---|
| 164 |                         # Time-out en la transferencia multicast (El mensaje de error está enviado) | 
|---|
| 165 |                         exit $RETVAL | 
|---|
| 166 |                     ;; | 
|---|
| 167 |                 esac | 
|---|
| 168 |             ;; | 
|---|
| 169 |             *)  # Error: protocolo desconocido. | 
|---|
| 170 |                 ogRaiseError session $OG_ERR_FORMAT "$MSG_ERR_FORMAT, $PROTO" | 
|---|
| 171 |                 exit $? | 
|---|
| 172 |             ;; | 
|---|
| 173 |         esac | 
|---|
| 174 |     ;; | 
|---|
| 175 |     *)  # Error: repositorio desconocido. | 
|---|
| 176 |         ogRaiseError session $OG_ERR_FORMAT "$MSG_ERR_FORMAT, $REPO"  | 
|---|
| 177 |         exit $? | 
|---|
| 178 |     ;; | 
|---|
| 179 | esac | 
|---|
| 180 |  | 
|---|
| 181 | TIME3=$SECONDS | 
|---|
| 182 |  | 
|---|
| 183 | # Obtener parámetros de restauración.  | 
|---|
| 184 | case "$NEXTOPERATION" in | 
|---|
| 185 |     CACHE) | 
|---|
| 186 |         PARAMS="CACHE $IMGNAME $DISK $PART" ;; | 
|---|
| 187 |     UNICAST) | 
|---|
| 188 |         PARAMS="$REPO $IMGNAME $DISK $PART" ;; | 
|---|
| 189 |     MULTICAST) | 
|---|
| 190 |         PARAMS="$REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT" ;; | 
|---|
| 191 | esac | 
|---|
| 192 |  | 
|---|
| 193 | # Si existe, ejecuta script personalizado "restoreImageCustom"; si no, llama al genérico "restoreImage". | 
|---|
| 194 | if which restoreImageCustom &>/dev/null; then | 
|---|
| 195 |     ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImageCustom $PARAMS" | 
|---|
| 196 |     restoreImageCustom $PARAMS | 
|---|
| 197 | else | 
|---|
| 198 |     ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImage $PARAMS" | 
|---|
| 199 |     restoreImage $PARAMS | 
|---|
| 200 | fi | 
|---|
| 201 | RETVAL=$? | 
|---|
| 202 |  | 
|---|
| 203 | # Mostrar resultados. | 
|---|
| 204 | RESUMERESTOREIMAGE=$(grep -m 1 "Total Time:" $OGLOGCOMMAND) | 
|---|
| 205 | ogEcho log session "   [ ]      $RESUMERESTOREIMAGE " | 
|---|
| 206 | # Si la transferencia ha dado error me salgo. | 
|---|
| 207 | if [ $RETVAL -ne 0 ] ; then | 
|---|
| 208 |     ogRaiseError session $OG_ERR_IMAGE "$REPO $IMGNAME" 2>&1 | 
|---|
| 209 |     # Muestro registro de fin de ejecución si no viene de Ejecutar Script | 
|---|
| 210 |     [ "$(ogGetCaller)" == "EjecutarScript" ] || ogEcho log session "$MSG_INTERFACE_END $OG_ERR_IMAGE" | 
|---|
| 211 |     exit $OG_ERR_IMAGE | 
|---|
| 212 | fi | 
|---|
| 213 | TIME3=$[SECONDS-TIME3] | 
|---|
| 214 | ogEcho log session "   [ ]      $MSG_SCRIPTS_TIME_PARTIAL : $[TIME3/60]m $[TIME3%60]s" | 
|---|
| 215 |  | 
|---|
| 216 | # Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs". | 
|---|
| 217 | if which configureOsCustom &>/dev/null; then | 
|---|
| 218 |     ogEcho log session "[90] configureOsCustom" | 
|---|
| 219 |     configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME" | 
|---|
| 220 | else | 
|---|
| 221 |     ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " | 
|---|
| 222 |     configureOs "$DISK" "$PART" | 
|---|
| 223 | fi | 
|---|
| 224 |  | 
|---|
| 225 | TIME=$[SECONDS-TIME1] | 
|---|
| 226 | ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" | 
|---|
| 227 |  | 
|---|
| 228 | # Registro de fin de ejecución | 
|---|
| 229 | # Si se ha llamado desde ejecutar script no lo muestro para no repetir. | 
|---|
| 230 | if [ "$(ogGetCaller)" != "EjecutarScript" ] ; then | 
|---|
| 231 |     ogEcho log session "$MSG_INTERFACE_END $RETVAL" | 
|---|
| 232 |     exit $RETVAL | 
|---|
| 233 | fi | 
|---|
| 234 |  | 
|---|