summaryrefslogtreecommitdiffstats
path: root/client/shared/scripts/restoreBaseImage
blob: 1891439612a38cc2575fd208288eb3dc9062a29d (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
#!/bin/bash
#/**
#         restoreBaseImage
#@brief Script de ejemplo para restaurar una imagen 
#@brief (puede usarse como base para el programa de restauración de imágenes usado por OpenGNSys Admin).
#@param 1 REPO|CACHE
#@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
#*/ ##

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

# Si salimos con error demontamos la imagen y desbloqueamos la imagen y la particion
function onexit() {
    local exit_status=$?
    local MSG="$(ogRaiseError $exit_status \"$1 $2 $3 $4\" 2>&1)"
    echo "$MSG" |tee -a $OGLOGFILE  $OGLOGSESSION
    ogUnmountImage "$1" "$2" "$IMGEXT"  &>/dev/null
    [ $exit_status -ne 4 ] && ogUnlock $3 $4 &>/dev/null
    exit $exit_status
}

# Limpiamos los archivo de log
echo -n "" >$OGLOGCOMMAND; echo -n "" $OGLOGFILE; echo -n ""  $OGLOGSESSION

echo "[1] $MSG_SCRIPTS_START  $0 $*" | tee -a $OGLOGFILE  $OGLOGSESSION

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 ] &&     ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST|TORRENT ] [opciones protocolo]"

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

# Procesar parámetros de entrada
REPOFILE="$(ogGetPath "REPO" "$2.$IMGEXT")" || ogRaiseError $OG_ERR_NOTFOUND "REPO, $2.$IMGEXT"

# Comprobar que es sincronizable (con REPO)
ogIsSyncImage REPO "$2" $IMGEXT  ||  ogRaiseError $OG_ERR_DONTSYNC_IMAGE  "$1 $2"

# 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
	# TODO ogGetImageInfo
	DIRMOUNT=$(ogMountImage "$1" "$2")
	ogWaitMountImage "$1" "$2" "$IMGEXT"  || ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $IMGEXT: time_out."
	FSTYPE=$(head -1 $DIRMOUNT/ogimg.info |cut -d: -f3)	
	ogUnmountImage $1 "$2"
	echo "      $MSG_HELP_ogFormat: $3 $4 $FSTYPE" | tee -a $OGLOGFILE
	ogFormat "$3" "$4" "$FSTYPE" || ogRaiseError $OG_ERR_FILESYS "$3 $4"
	ogMount "$3" "$4"  || ogRaiseError $OG_ERR_FILESYS "$3 $4"
fi

IMGEXT="img"

# Comprobamos si la imagen o la particion estan bloqueada:
ogIsImageLocked "$1" "$2.$IMGEXT" && ogRaiseError $OG_ERR_LOCKED "$1 $2.$IMGEXT"
ogIsLocked "$3" "$4" && ogRaiseError $OG_ERR_LOCKED  "$3 $4"

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

fi 

TIME2=$SECONDS

# Restaurar la imagen.
echo "[40] $MSG_HELP_ogRestoreImage: $1 $2 $3 $4"  | tee -a $OGLOGFILE $OGLOGSESSION

ogLock $3 $4

# Montamos la imagen basica.
ogMountImage "$1" "$2" "$IMGEXT"  >/dev/null
#  Comprobar que la imagen completa se ha montado.
ogWaitMountImage "$1" "$2" "$IMGEXT"  || ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $IMGEXT: time_out."
# Sincronizamos la partición con la imagen.
echo  "[60] $MSG_HELP_ogSyncRestore: $1 $2 $IMGEXT $3 $4"  |tee -a $OGLOGFILE $OGLOGSESSION
ogSyncRestore "$1" "$2" "$IMGEXT" $3 $4 

TIMEAUX2=$[SECONDS-TIME2]
echo "      $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX2/60]m $[TIMEAUX2%60]s" | tee -a $OGLOGFILE $OGLOGSESSION

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

# Restableciendo acl
ogUnlock $3 $4
echo "[70] $MSG_HELP_ogRestoreInfoImage" |tee -a $OGLOGFILE $OGLOGSESSION
ogRestoreInfoImage $3 $4  &>>$OGLOGCOMMAND

# Llamar al script de post-configuración del sistema operativo.
# Si a este script lo ha llamado el script restoreDiffImage no post-configuramos
ps -ef|grep -v "grep" |grep "$PPID.*restoreDiffImage " &>/dev/null || RETVAL=$?
if [ $RETVAL -ne 0 ]; then
	echo "[90] $MSG_HELP_configureOs" |tee -a $OGLOGFILE $OGLOGSESSION
	# el || echo es para evitar que se maneje el error.
	configureOs $3 $4  &>>$OGLOGCOMMAND || echo "$?" &>>$OGLOGCOMMAND
fi

TIME=$[SECONDS-TIME1]
echo "[100] $MSG_SCRIPTS_END $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" |tee -a $OGLOGFILE $OGLOGSESSION