summaryrefslogtreecommitdiffstats
path: root/client/shared/scripts/restoreBaseImage
blob: 046c4658b58f89f3ca87f598646c5cd7700773bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#!/bin/bash
#/**
#         restoreBaseImage
#@brief Script de ejemplo para restaurar una imagen 
#@brief   Se usa como base para el programa de restauración de imágenes de OpenGnsys Admin).
#@param 1 REPO|CACHE|IPREPO
#@param 2 imagen
#@param 3 disco 
#@param 4 particion 
#@param 5 protocolo 
#@param 6 opciones protocolo
#@return 
#@exception OG_ERR_FORMAT  # 1 formato incorrecto.
#@exception updateCache    # 15 No hay cache 
#@exception updateCache    # 16 no hay espacio sufiente 
#@exception OG_ERR_LOCKED          # 4 Partición o fichero bloqueado.
#@exception OG_ERR_NOTFOUND        # 2 Fichero o dispositivo no encontrado.
#@exception OG_ERR_FILESYS         # 20 Sistema de archivos desconocido o no se puede montar
#@exception OG_ERR_DONTSYNC_IMAGE  # 71 Imagen no sincronizable (es monolitica)
#@exception OG_ERR_DONTMOUNT_IMAGE # 70 Error al montar una imagen sincronizada.
#@note  se toma como punto de partida el script restoreImage
#@version 1.0 - restauración de imagen con sincronizacion.
#@author  
#@date   2012-12-04
#@version 1.1.1 - Varios repositorios para un mismo cliente (ticket #679).
#@author  Irina Gomez - ETSII Universidad de Sevilla
#@date    2018/11/06
#*/ ##

trap "onexit $REPO \"$2\" $3 $4" 1 2 3 6 9 14 15 EXIT

# Si salimos con error demontamos la imagen y desbloqueamos la imagen y la particion
function onexit() {
    local exit_status=$?
    ogUnmountImage "$REPO" "$2" "$IMGEXT"  &>/dev/null
    [ $exit_status -ne 4 ] && ogUnlock $3 $4 &>/dev/null
    exit $exit_status
}

# Limpiamos los archivo de log
echo -n "" >$OGLOGCOMMAND;
[ "$(ogGetCaller)" == "RestaurarImagenBasica" -o "$(ogGetCaller)" == "restoreDiffImage" ] ||  echo -n "" > $OGLOGSESSION

# Mensaje de inicio de script salvo si es llamado desde restoreDiffImage.
[ "$(ogGetCaller)" == "restoreDiffImage" ] || ogEcho log session "[1] $MSG_SCRIPTS_START  $0 $*" 

TIME1=$SECONDS
PROG="$(basename $0)"
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
    ogHelp  "$PROG: $MSG_HELP_restoreBaseImage" \
	    "$PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST|TORRENT ] [opciones protocolo]" \
            "$PROG REPO Windows7 1 1 " \
	    "$PROG CACHE Ubuntu12 1 6 MULTICAST 9000:full-duplex:239.194.14.00:150M:50:60"
    exit 0
fi

[ $# -lt 4 ] &&     exit $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST|TORRENT ] [opciones protocolo]"; echo $?)

# Procesar parámetros de entrada
REPO="${1^^}"
# No permite directorios diferentes para OU
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

# Carga del configurador del engine
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg

# Procesar parámetros de entrada
REPOFILE="$(ogGetPath "REPO" "$2.$IMGEXT")"
[ -n "$REPOFILE" ] || exit $(ogRaiseError session $OG_ERR_NOTFOUND "REPO, $2.$IMGEXT"; echo $?)

# Comprobar que es sincronizable (con REPO)
ogIsSyncImage REPO "$2" $IMGEXT  ||  exit $(ogRaiseError session $OG_ERR_DONTSYNC_IMAGE  "$REPO $2"; echo $?)

IMGEXT="img"
# Comprobamos si la imagen o la particion estan bloqueada:
ogIsImageLocked "REPO" "$2.$IMGEXT" && exit $(ogRaiseError session $OG_ERR_LOCKED "$REPO $2.$IMGEXT"; echo $?)
ogIsLocked "$3" "$4" && exit $(ogRaiseError session $OG_ERR_LOCKED  "$3 $4"; echo $?)

# Detectamos el sistema de ficheros de la imagen
# TODO ogGetImageInfo
DIRMOUNT=$(ogMountImage "REPO" "$2")
ogWaitSyncImage "REPO" "$2" "$IMGEXT" "mounted"  || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$REPO $2 $IMGEXT: time_out."; echo $?)
IMGFSTYPE=$(head -1 $DIRMOUNT/ogimg.info |cut -d: -f3)

# Comprobamos si el sistema de ficheros se puede montar
ogMount "$3" "$4" &>/dev/null || RETVAL=$?
# Si da error formateamos el sistema de ficheros.
if [  "$RETVAL" ] ; then
	ogEcho log session "      $MSG_HELP_ogFormat: $3 $4 $IMGFSTYPE" 
	ogFormat "$3" "$4" "$IMGFSTYPE" || exit $(ogRaiseError session $OG_ERR_FILESYS "$3 $4"; echo $?)
	ogMount "$3" "$4"  || exit $(ogRaiseError session $OG_ERR_FILESYS "$3 $4"; echo $?)
fi

# Warning si el sistema de ficheros de la imagen es distinto del de la particion destino
[ "$IMGFSTYPE" == "$(ogGetFsType $3 $4)" ] || ogEcho session warning "$MSG_SYNC_DIFFERENTFS"


PROTO=${5:-"UNICAST"}
if [ "$REPO" == "CACHE" -o "$REPO" == "cache" ]; then
   # Las imagenes sincronizables aunque sean iguales no tienen el mismo sum. 
   # Sincronizamos si existe el fichero y si no usamos updateCache.
   ogEcho log session "[10] $MSG_SCRIPTS_TASK_START updateCache REPO $2.$IMGEXT $PROTO $6" 
   ogEcho log session "      updateCache REPO" "/$2.$IMGEXT" "$PROTO" "$6"  
   updateCache REPO "/$2.$IMGEXT" "$PROTO" "$6" 
   RETVAL=$?
   if [ "$RETVAL" != "0" ] 
        then 
        ogEcho log session "[39] $MSG_SCRIPTS_TASK_END updateCache REPO $2.$IMGEXT $5 $6 con error $RETVAL"
        # RC=15 No hay cache 
        # RC=16 no hay espacio sufiente 
        exit $RETVAL 
   fi 
   TIMEAUX1=$[SECONDS-TIME]
   ogEcho log session "      $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX1/60]m $[TIMEAUX1%60]s" 

   # Montamos la imagen de cache
   ogMountImage "$REPO" "$2" >/dev/null
   ogWaitSyncImage "$REPO" "$2" "$IMGEXT" "mounted"  || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$REPO $2 $IMGEXT: time_out."; echo $?)
fi 

TIME2=$SECONDS

# Restaurar la imagen.
ogEcho log session "[40] $MSG_HELP_ogRestoreImage: $REPO $2 $3 $4"  

ogLock $3 $4

# Sincronizamos la partición con la imagen.
ogEcho log session  "[60] $MSG_HELP_ogSyncRestore: $REPO $2 $IMGEXT $3 $4" 
ogSyncRestore "$REPO" "$2" "$IMGEXT" $3 $4
RETVAL=$?
[ $RETVAL == 0 ] || ogEcho session warning "$MSG_ERR_SYNCHRONIZING"

TIMEAUX2=$[SECONDS-TIME2]
ogEcho log session "      $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX2/60]m $[TIMEAUX2%60]s" 

# Desmontamos imagen basica.
ogUnmountImage "$REPO" "$2" "$IMGEXT"

# Restableciendo acl
ogUnlock $3 $4
ogEcho log session "[70] $MSG_HELP_ogRestoreInfoImage" 
ogExecAndLog command ogRestoreInfoImage $3 $4

# Llamar al script de post-configuración del sistema operativo.
# Si a este script lo ha llamado el script restoreDiffImage no post-configuramos
if [ "$(ogGetCaller)" != "restoreDiffImage" ];then
   ogExecAndLog command ogRestoreAclImage  $3 $4
   if which configureOsCustom &>/dev/null; then
	ogEcho log session "[90] configureOsCustom"
	configureOsCustom "$3" "$4" "$REPO" "$2"
   else
	ogEcho log session "[90] $MSG_HELP_configureOs" 
	configureOs $3 $4 
   fi
fi
TIMEAUX3=$[SECONDS-TIMEAUX2]
ogEcho log session "      $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX3/60]m $[TIMEAUX3%60]s" 

TIME=$[SECONDS-TIME1]
ogEcho log session "[100] $MSG_SCRIPTS_END $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" 

# Si ha habido problema al sincronizar nos salimos con error 
[ $RETVAL == 0 ] || exit $OG_ERR_SYNCHRONIZING