summaryrefslogtreecommitdiffstats
path: root/client/shared/scripts/cloneRemoteFromMaster
blob: a7a5e11b490a05a840bd8ace3962f995ad687094 (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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#!/bin/bash

#/**
#         cloneremoteFromMaster
#@brief   Restaura una particion o imagen sobre las particiones de equipos cliente remotos
#@param 1 str_origen admite dirección IP del equipo Master.
#@param 2 str_origen  admite int_disk    str_REPO|str_CACHE
#@param 3 str_origen  admite int partorigen   stre_imagen
#@param 4 str_sesion multicast|unicast
#@param $5 int_disco_destino
#@param $6 init_particion_destino
#@param $7 str_tool_clone
#@param $8 str_tool_compresor
#@param ejemplo: cloneRemoteFromMaster 172.17.36.11 1 1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop
#@param ejemplo: cloneRemoteFromMaster 172.17.36.11 REPO /imagen1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop 
#@param ejemplo: cloneRemoteFromMaster 172.17.36.11 CACHE /imagen1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop 
#@return  
#@exception OG_ERR_FORMAT     formato incorrecto.
#@exception $OG_ERR_IMGSIZEPARTITION=30   #Imagen demasiado pequeña para ser clonada
#@exception OG_ERR_REDUCEFS=17     #error al reducir sistema de archivos.
#@exception OG_ERR_EXTENDFS=18     #errror al expandir el sistema de archivos.
#@exception OG_ERR_UCASTSYNTAXT=50  # Error en la generación de sintaxis de transferenica unicast
#@exception OG_ERR_UCASTSENDPARTITION=51  # Error en envio UNICAST de una particion
#@exception OG_ERR_UCASTSENDFILE=52  # Error en envio UNICAST de un fichero
#@exception OG_ERR_UCASTRECEIVERPARTITION=53  #Error en la recepcion UNICAST de una particion
#@exception OG_ERR_UCASTRECEIVERFILE=54  #Error en la recepcion UNICAST de un fichero
#@exception OG_ERR_MCASTSYNTAXT=55 # Error en la generacion de sintaxis de transferenica Multicast.
#@exception OG_ERR_MCASTSENDFILE=56  # Error en envio MULTICAST de un fichero
#@exception OG_ERR_MCASTRECEIVERFILE=57  #Error en la recepcion MULTICAST de un fichero
#@exception OG_ERR_MCASTSENDPARTITION=58  # Error en envio MULTICAST de una particion
#@exception OG_ERR_MCASTRECEIVERPARTITION=59  # Error en la recepcion MULTICAST de una particion
#@exception OG_ERR_PROTOCOLJOINMASTER=60 # Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER
#@note   
#@todo: 
#@version 0.9.1 - integración con OpenGnsys
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date   2009/03/17
#@version 0.9.2 - adaptacion a OpenGnsys
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2010/07/27
#@version 0.1.0 - gestion unicast
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2011/01/26
#@version 1.0 - control de errores para el ogAdmServer
#@author  Antonio J. Doblas Viso. Universidad de Malaga.
#@date    2011/04/24
#*/ ##


TIME1=$SECONDS
PROG="$(basename $0)"
if [ $# -lt 1 ]; then
	echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp"
	exit 1
fi

if [  $# -lt 6  ]; then
    ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ipMaster SOURCE_disco SOURCE_particion [MULTICAT|UNICAST] SESSION TARGER_disck TARGET_partition" 
    exit $?
fi

# Obtener información de los parámetros de entrada.
HOSTIP=`ogGetIpAddress`
if [ -z "$HOSTIP" ] 
then
	source /tmp/net-eth* 
	HOSTIP=`ogGetIpAddress`
fi
MASTERIP=$1
PROTOCOL=$4
case $PROTOCOL in 
 	MULTICAST|multicast)
		SESSIONMCASTSERVER=$5
		SESSIONMCASTCLIENT=`echo $5 | awk -F: '{print $1}'`
	;;
	UNICAST|unicast) 
		SESSIONUCASTSERVER=$5
    	SESSIONUCASTCLIENT=`echo $5 | awk -F: '{print $1}'`:$MASTERIP
	;;
esac
# contenedor destino (disco particion)
DISKTARGET=$6
PARTTARGET=$7
#herramienta de compresión.
TOOLCLONE=$8
COMPRESOR=$9

pkill faucet

# Preparando Instrucción según sea Master o Client
case $MASTERIP in
	$HOSTIP)
		echo "[1] Equipo Master preparando el origen de los datos a enviar"
		ogGetPath $2 $3.img &>/dev/null; RC=$?; 
		ogDiskToDev $2 $3 &>/dev/null; RETVAL=$?; 

		if [ "$RC" == "0" ]; then 
			IMG=$(ogGetPath $2 $3.img); MODEMASTER=SENDFILE
		elif [ "$RETVAL" == "0" ]; then
			DISKSOURCE=$2; PARTSOURCE=$3; MODEMASTER=SENDPARTITION
		else
			ogRaiseError $OG_ERR_NOTFOUND "$2 $3"; exit $?
		fi 
		echo $MODEMASTER
		# Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE}
					
		case "$MODEMASTER" in
			SENDPARTITION)
				echo "[5] Master en modo  $MODEMASTER: informacion inicial a los clientes-slaves"
				faucet 4000 --out echo "WORKING" &			
				echo "[10]: Desmontando DISK:$DISKSOURCE PARTITION:$PARTSOURCE"
				ogUnmount $2 $3 || exit $?
				echo "[15]: Calculando la reduccion del sistema de archivos DISK:$DISKSOURCE PARTITION:$PARTSOURCE SIZE:$SIZE"
				#Obtener tamaño de la partición.
				SIZE=$(ogGetPartitionSize $2 $3)  
				# Reducir el sistema de archvios.
				ogReduceFs $2 $3 || exit $?
				REDSIZE=$(ogGetFsSize $2 $3) 	
				echo "[20]: Reducido el  sistema de archivos a $REDSIZE  $DISKSOURCE $PARTSOURCE"
				if [ $REDSIZE -lt $SIZE ]; then
    					echo "[24] Redimensionar partición a $REDSIZE KB."
    					ogSetPartitionSize $2 $3 $REDSIZE
				fi
				echo "[25] Master en Modo $MODEMASTER: informacion de transferencia a los clientes-slaves $PROTOCOL $TOOLCLONE $COMPRESOR $REDSIZE"
				pkill faucet
				faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" &
						
				case $PROTOCOL in
					MULTICAST|multicast)
						echo "[29] ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR" 
 						ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR || RETVAL=$?
 					;;
 					UNICAST|unicast)
 						sleep 60
 						echo "[29] ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR"
 						ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR || RETVAL=$?
 					;;
 				esac	
 				
 				if [ $REDSIZE -lt $SIZE ]; then
   					echo "[85] Redimensionar partición a $SIZE KB."
   		 			ogSetPartitionSize $2 $3 $SIZE
   		 			echo "[90] Extender sistema de archivos."
   		 			ogExtendFs $2 $3
				fi
				pkill faucet
			;;
			SENDFILE)				
				echo "[5] Master en modo  $MODEMASTER: informacion inicial a los clientes-slaves"
				echo "[10]: Preparando Imagen: $IMG"
				TOOLCLONE=$(ogGetImageProgram $2 $3)
				COMPRESOR=$(ogGetImageCompressor $2 $3)
				REDSIZE=$(ogGetImageSize $2 $3)
				echo "[25] Master en Modo $MODEMASTER: informacion de transferencia a los clientes-slaves $PROTOCOL $TOOLCLONE $COMPRESOR $REDSIZE"
				faucet 4000 --out echo "READY $TOOLCLONE $COMPRESOR $REDSIZE" &
				case $PROTOCOL in
					MULTICAST|multicast)
						echo "[29] ogMcastSendFile $2 $3.img $SESSIONMCASTSERVER "
						ogMcastSendFile  $2 $3.img $SESSIONMCASTSERVER	|| RETVAL=$?
						;;
 					UNICAST|unicast)
 						sleep 60
 						echo "[29] ogUcastSendFile $2 $3.img $SESSIONUCASTSERVER"
 						ogUcastSendFile $2 $3.img $SESSIONUCASTSERVER || RETVAL=$?
 					;;
 				esac							
				pkill faucet	
			;;
		esac
		#exit $RETVAL
        exit 0
		# FIN Preparando instrucción del Master segun $MODEMASTER{SENDPARTITION SENDFILE}
	;;
	*)
		echo "[1] Equipo -Client- preparando para recibir datos"
		ogUnmount $DISKTARGET $PARTTARGET || exit $?
		echo -n "[25] Buscando informacion extra sobre la clonacion con el master $MASTERIP: "
		sleep 10
		TIMEWAITMASTER=120
		TIMEWAITING=0
		GETINFO="NONE"
		while [ "${GETINFO}" != "OK" ]
		do
			INFOEXTRA=`hose $MASTERIP 4000 --in cat 2>/dev/null`
			sleep 10; echo -n "."
			#Si no consigue conectar con Master, comienza el timeout $TIMEWAITMASTER para abortar
			[ -z "$INFOEXTRA" ] && let TIMEWAITMASTER=$TIMEWAITMASTER-10
			[ "$TIMEWAITMASTER" -gt "0" ] || ogRaiseError $OG_ERR_PROTOCOLJOINMASTER " " || exit $?
			#Si primer parametro desde el server es READY, salimos del bucle
			GETINFO=$(echo $INFOEXTRA | awk '{print $1}')
			[ "$GETINFO" == "READY" ] && GETINFO=OK 
		done		
		echo $INFOEXTRA
		TOOLCLONE=$(echo $INFOEXTRA | awk '{print $2}')
		COMPRESOR=$(echo $INFOEXTRA | awk '{print $3}')
		SIZEIMAGE=$(echo $INFOEXTRA | awk '{print $4}')
		echo -n "[25] $INFOEXTRA = herramienta= $TOOLCLONE  compresor= $COMPRESOR size= $SIZEIMAGE "
		# comprobamos que el tamaño de a imagen es menor que la del cliente.
		SIZEPARTTARGET=$(ogGetPartitionSize $DISKTARGET $PARTTARGET)
		if [ "$SIZEIMAGE" -lt "$SIZEPARTTARGET" ]
 		then	
			echo "[30] Iniciando Cliente $PROTOCOL "
				case $PROTOCOL in
					MULTICAST|multicast)
						echo ogMcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONMCASTCLIENT $TOOLCLONE $COMPRESOR 
						ogMcastReceiverPartition "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR"  || exit $?
		 					;;
 					UNICAST|unicast)
 						echo ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR
 						ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR || exit $?
 					;;
 				esac
			
			
			echo "[90] Extender sistema de archivos"
			ogExtendFs $DISKTARGET $PARTTARGET
			# Cambiar nombre en sistemas Windows.
			if [ "$(ogGetOsType $DISKTARGET $PARTTARGET)" = "Windows" ]; then
    				HOST=$(ogGetHostname)
    				HOST=${HOST:-"UNKNOWN"}
    				echo "[90] Cambiar nombre Windows a \"$HOST\"."
    				ogSetWindowsName $DISKTARGET $PARTTARGET "$HOST"
			fi		
		else
		    # Si el tamaño de los datos recibidos es más grande que la particion destino
			ogRaiseError $OG_ERR_IMGSIZEPARTITION "ERROR tamanio particion= $SIZEPARTTARGET  tamanio de la imagen= $SIZEIMAGE"; exit $?
		fi
	;;
esac
TIME=$[SECONDS-TIME1]
echo "[100] Duración de la operación $[TIME/60]m $[TIME%60]s"