source: client/shared/scripts/updateCache @ 79a4175

918-git-images-111dconfigfileconfigure-oglivegit-imageslgromero-new-oglivemainmaint-cronmount-efivarfsmultivmmultivm-ogboot-installerogClonningEngineogboot-installer-jenkinsoglive-ipv6test-python-scriptsticket-301ticket-50ticket-50-oldticket-577ticket-585ticket-611ticket-612ticket-693ticket-700ubu24tplunification2use-local-agent-oglivevarios-instalacionwebconsole3
Last change on this file since 79a4175 was fe6843b, checked in by irina <irinagomez@…>, 10 years ago

#679 Cambio Repo: script de clonación y librerías de imagenes monolíticas comprobados con todos los protocolos

git-svn-id: https://opengnsys.es/svn/branches/version1.1@4653 a21b9725-9963-47de-94b9-378ad31fedc9

  • Property mode set to 100755
File size: 12.5 KB
Line 
1#!/bin/bash
2#/**
3#         updateCache
4#@brief   Actualiza la cache del cliente con imagen o fichero iso.
5#@param 1 REPO          Origen del fichero. -accesible por nfs-samba-
6#@param 2 str_fichero   nombre del fichero a actualizar.
7#@param 3 str_protoco.  TORRENT | MULTICAST    | UNICAST.
8#@param 4 str_opcionesprotocolo
9#@param 4 str_opcionesupdatecache
10#@ejemplo: oneRemoteFromMaster 172.17.36.11 CACHE /imagen1 9000:full-duplex:239.194.17.36:70M:50:100 1 1 partclone lzop
11#@return 
12#@exception OG_ERR_FORMAT       formato incorrecto.
13#@exception OG_ERR_NOTCACHE     No existe cache -15-
14#@exception $OG_ERR_CACHESIZE   Tamaño de la paticion menor al archivo a descargar -16-
15#@note   
16#@todo:
17#@version 0.9.1 - integracion EAC
18#@author  Antonio J. Doblas Viso. Universidad de Malaga.
19#@date    2008/03/17
20#@version 0.9.2 - integracion OpenGnsys
21#@author  Antonio J. Doblas Viso. Universidad de Malaga.
22#@date    2010/07/27
23#@version 1.0.1 - Control de espacio requerido
24#@author  Antonio J.Doblas Viso
25#@date   2011-05-10
26#@version 2.0.1 - Imagenes sincronizadas
27#@date    2013-02-20
28#@version 1.0.5 - uso de md5 full para las transferencias torrent, en la llamada => ogUpdateCacheIsNecesary
29#@date    2014-07-09
30#@version 1.1 - Cambio de repositorio para el recurso remoto images si es necesario
31#@author  Irina Gomez, ETSII Universidad de Sevilla
32#@date    2015-06-16
33#*/ ##
34
35PROG="$(basename $0)"
36if [ $# -lt 3 ]; then
37    ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG str_REPO _str_Relative_Path_OGIMG_with_/ PROTOCOLO OPCIONES_PROTOCOLO OPCIONES_UPDATECACHE"
38    exit $?
39fi
40
41#Carga del configurador del engine
42[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
43
44# Clear temporary file used as log track by httpdlog
45# Limpia los ficheros temporales usados como log de seguimiento para httpdlog
46echo " " > $OGLOGCOMMAND
47[ "$(ogGetCaller)" == "deployImage" -o "$(ogGetCaller)" == "restoreBaseImage" -o "$(ogGetCaller)" == "restoreDiffImage" ] || echo -n "" > $OGLOGSESSION;
48
49REPOSITORIO="${1^^}"
50PROTOCOLO="${3^^}"
51OPTPROTOCOLO="$4"
52# Si es una ip y es distinta a la del recurso samba cambiamos de REPO.
53ogCheckIpAddress $REPOSITORIO
54if [ $? == 0 -o $REPOSITORIO == "REPO" ] ; then
55        # Si falla el cambio -> salimos con error repositorio no valido
56        ogChangeRepo $REPOSITORIO || exit $(ogRaiseError $OG_ERR_NOTFOUND $REPOSITORIO; echo $?)
57        REPOSITORIO="REPO"
58fi
59REPOIP=$(ogGetRepoIp)
60ogEcho log session  $REPOSITORIO $REPOIP $PROTOCOLO $OPTPROTOCOLO
61
62# Si el repositorio local CACHE no existe error 15.
63if ! $(ogFindCache >/dev/null); then
64        ogRaiseError session $OG_ERR_NOTCACHE "CACHE"
65        exit $?
66fi
67
68# comprobar si la imagen existe (.img, .img.diff o directorio)
69REPOFILE=$(ogGetPath "REPO" "/$2") || exit $(ogRaiseError session $OG_ERR_NOTFOUND "REPO /$2"; echo $?)
70
71ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_DOUPDATE"
72# Distingo si es monolitica o sincronizable
73file "$REPOFILE" | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " -e " directory" 2>&1 > /dev/null
74if [ $? == 0 ]; then
75        IMGSYNC=TRUE
76        # Para imagen sincronizada, si hay imagen en cache siempre protocolo = rsync.
77        CACHEFILE="$(ogGetPath "CACHE" "/$2")"  && PROTOCOLO="RSYNC"
78        # Si es sincronizada tipo directorio  siempre protocolo = rsync.
79        [ -d $REPOFILE ] && PROTOCOLO="RSYNC" && IMGTYPE="dir"
80
81        # Si es imagen sincronizada siempre da distinto md5. No podemos comprobar -> actualizamos.
82        RETVAL=0
83else
84        # Si la imagen es monolitica y ha elegido protocolo = RSYNC salimos con error.
85        [ $PROTOCOLO == "RSYNC" ] && exit $(ogRaiseError session $OG_ERR_DONTSYNC_IMAGE "REPO $2"; echo $?)
86        IMGSYNC=FALSE
87        ogUpdateCacheIsNecesary "$REPOSITORIO" "$2" "$PROTOCOLO"
88        RETVAL=$?
89fi
90# si RETVAL=0 => actualizamos  si RETVAL=1 no actaulizasmo-exit 0  || si RETVAL>2 exit 1
91[ "$RETVAL" == "1" ] && exit 0
92[ "$RETVAL" -gt  "1" ] && exit $OG_ERR_UPDATECACHE
93
94ogEcho log session  "$MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE"
95CACHESIZE=$(ogGetCacheSize)
96CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`)
97FILESIZE=$(ls -sk $(ogGetPath $REPOSITORIO "$2") | cut -f1 -d" ")
98if [ "$IMGTYPE" == "dir" ]; then
99        ogEcho log session "   * $MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR"
100        ogEcho log session "     du -sk $REPOFILE"
101        REALFILESIZE=$(du -sk "$REPOFILE"|awk '{print $1}')
102else
103        REALFILESIZE=$(ls -l --block-size=1024 $REPOFILE | cut -f5 -d" ")
104fi
105
106# La sincronizada, si existe la imagen en cache el espacio necesario
107#        es la nueva menos lo que ocupa la que ya hay.
108if [ "$PROTOCOLO" == "RSYNC" ]; then
109        if [ "$CACHEFILE" == "" ]; then
110                CACHEFILESIZE=0
111        else
112           if [ "$IMGTYPE" == "dir" ]; then
113                ogEcho log session "   * $MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR $CACHEFILESIZE"
114                ogEcho log session "     du -sk $CACHEFILE"
115                CACHEFILESIZE=$(du -sk $CACHEFILE |awk '{print $1}')
116           else
117                CACHEFILESIZE=$(ls -l --block-size=1024 "$CACHEFILE" | cut -f5 -d" ")
118           fi
119        fi
120        let SIZEREQUIRED=$REALFILESIZE-$CACHEFILESIZE
121        [ $SIZEREQUIRED -lt 0 ] && SIZEREQUIRED=0
122else
123        SIZEREQUIRED=$FILESIZE
124fi
125
126#ERROR CACHESIZE 16 (tamanyo de la CACHE insuficiente)
127if [ "$SIZEREQUIRED" -ge "$CACHESIZE" ] 
128then
129        ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE:  $2 = $SIZEREQUIRED > CACHE = $CACHESIZE"
130        ogRaiseError session $OG_ERR_CACHESIZE "CACHE"
131        exit $?
132fi
133
134
135#ERROR CACHESIZE 16 (Espacio libre en CACHE insuficiente)
136if [ "$SIZEREQUIRED" -ge "$CACHESIZEFREE" ] 
137then
138    ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO: ACTIONCACHEFULL=$ACTIONCACHEFULL"
139        case "$ACTIONCACHEFULL" in
140        NONE)
141                ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE:  $2 = $SIZEREQUIRED > FREE SPACE CACHE = $CACHESIZEFREE"
142                ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL, NO SPACE FREE"
143                exit $?
144        ;;
145        FORMAT)
146            ogEcho log session  "[51] $MSG_HELP_ogFormatCache "
147            ogUnmountCache
148            ogFormatCache
149            ogMountCache
150            NEXTOPERATION=REPEAT
151        ;;
152        DELETE)
153            ogEcho log session "[51] #MSG_HELP_ogDeleteTree $OGCAC$OGIMG/* "
154            rm -fr  $OGCAC$OGIMG/*
155            NEXOPERATION=REPEAT
156        ;;
157        *)
158                ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE:  $2 = $FILESIZE > CACHE = $CACHESIZEFREE"
159                ogRaiseError session $OG_ERR_CACHESIZE "CACHE"
160                exit $?
161        ;;
162        esac   
163fi
164
165# Comprobamos que imagen cache igual a la del repo. Si sincronizada no podemos comprobar.
166[ "$IMGSYNC" == "TRUE" ] || ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO"
167RETVAL=$?
168# si RETVAL=0 => actualizamos  si RETVAL=1 no actaulizasmo-exit 0  || si RETVAL>2 exit 1
169[ "$RETVAL" == "1" ] && exit 0
170[ "$RETVAL" -gt  "1" ] && exit $OG_ERR_UPDATECACHE
171
172ogMountCache >/dev/null
173
174## Si no existe, crear subdirectorio para el fichero en la cache.
175IMGDIR=$(ogGetParentPath CACHE "/$2")
176if [ $? != 0 ]; then
177    ogEcho log session "[5] $MSG_HELP_ogMakeDir  \"$2 $(dirname "$2")."
178    ogMakeDir CACHE $(dirname "/$2")
179    IMGDIR=$(ogGetParentPath CACHE "/$2") || exit $?
180fi
181
182TIME1=$SECONDS
183
184case "$PROTOCOLO" in
185        TORRENT)
186                ogEcho log session "ogCopyFile $REPOSITORIO $2.torrent absolute $OGCAC/$OGIMG"
187                # tiempos
188                timewait=$(expr $(printf '%d\n' 0x$(ogGetMacAddress | awk -F: '{print $5$6}')) \* 120 / 65535)                         
189                ogExecAndLog command ogCopyFile $REPOSITORIO "$2.torrent" "$IMGDIR"
190                #TODO: comprobar que el tracker definido en el fichero es correcto.
191                #TODO comprobar que el fichero torrent está en cache
192                # retardamos el inicio -aleatorio de 0 a 120 segundos- al tracker para gestionar mas de +-40 equipos
193                P2PWAIT=$[ ( $RANDOM % 120 )  + 1 ]
194                ogEcho log session "   [ ] $MSG_SCRIPTS_TASK_SLEEP :  $P2PWAIT seconds ogTorrentStart CACHE $2.torrent $4"
195                sleep $P2PWAIT
196                ogEcho log session "   [  ] $MSG_SCRIPTS_TASK_START:  ogTorrentStart CACHE $2.torrent $4"
197                ogExecAndLog command ogTorrentStart CACHE "$2.torrent" $4
198                RESUMEUPDATECACHE=$(grep -m 1 -B1 "Download" $OGLOGCOMMAND)
199                RESUMEUPDATECACHEbf=$(grep -m 1 "Download" $OGLOGCOMMAND)
200                if [ "$RESUMEUPDATECACHEbf" == "Download complete." ]; then
201                        rm -f $IMGDIR$2".torrent.bf"
202                fi
203        ;;
204        MULTICAST)
205                PORT=$(echo $OPTPROTOCOLO | cut -f1 -d":")
206                let PORTAUX=$PORT+1
207                ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_CHECKMCASTSESSION : $REPOIP:$PORTAUX:$PORT"
208                #TODO: ticket 379
209                NUMBER=$[ ( $RANDOM % 30 )  + 1 ]
210                sleep $NUMBER
211                #FIN TODO
212                if (nmap -n -sU -p $PORTAUX $REPOIP | grep open)
213                then
214                        ogExecAndLog command ogMcastReceiverFile $PORT CACHE "$2"
215
216                else
217                    # TODO ticket 379 Realizar la petición basada en identificador de operacion
218                        ogEcho log session "$MSG_SCRIPTS_TASK_START :  hose $REPOIP 2009 --out sh -c \"echo -ne START_MULTICAST $2 $OPTPROTOCOLO\""
219                        hose $REPOIP 2009 --out sh -c "echo -ne START_MULTICAST $2 $OPTPROTOCOLO"
220                        #echo "espero y llamo a: ogMcastReceiverFile $PORT CACHE $2"
221                        sleep 10
222                        if (nmap -n -sU -p $PORTAUX $REPOIP | grep open)
223                        then
224                                ogExecAndLog command ogMcastReceiverFile $PORT CACHE "$2"
225                        else
226                                ogEcho log session "$MSG_SCRIPTS_TASK_ERR : hose $REPOIP 2009 --out sh -c echo -ne START_MULTICAST $2 $OPTPROTOCOLO"
227                                exit $OG_ERR_UPDATECACHE
228                        fi
229                fi
230                #cat $OGLOGCOMMAND.tmp | grep -B1 "Transfer complete"
231                sleep 5
232                #cat $OGLOGCOMMAND.tmp | grep -B1 "Transfer complete"
233                RESUMEUPDATECACHE=$(grep -m 1  -B1 "Transfer complete" $OGLOGCOMMAND.tmp)
234        ;;
235        UNICAST)
236                #ogEcho log session "unicast"
237                ogExecAndLog command ogCopyFile $REPOSITORIO "$2" "$IMGDIR"
238                sleep 5
239                RESUMEUPDATECACHE=$(grep -m 1  "100%" $OGLOGCOMMAND.tmp)
240        ;;
241        RSYNC)
242           # Si parametro de protocolo no era rsync, mensaje de cambio protocolo
243           [ "${3^^}" == "RSYNC" ] || ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_RSYNCPROTOCOLCHANGE"
244           # Opciones de rsync
245           USERRSYNC="opengnsys"
246           PASSWORD=" --password-file=/scripts/passrsync "
247           OPTRSYNC=" --delete --progress "
248           [ "$ogrsyncz" ==  "true" ] && OPTRSYNC="z $OPTRSYNC"
249           [ "$ogrsyncw" ==  "true" ] && OPTRSYNC="w$OPTRSYNC"
250
251           if [ -d $REPOFILE ]; then
252                # Si es sincronizada tipo directorio.
253                [ -d "$OGCAC$OGIMG/$2" ] || mkdir "$OGCAC$OGIMG/$2"
254                ogEcho log session "rsync -aHAX$OPTRSYNC  $USERRSYNC@$REPOIP::ogimages/$2/ $OGCAC$OGIMG/$2"
255                rsync -aHAX$OPTRSYNC  $PASSWORD "$USERRSYNC@$REPOIP::ogimages/$2/" "$OGCAC$OGIMG/$2" 2>> $OGLOGCOMMAND  | egrep "^sent|^sending|^total%" >>  $OGLOGCOMMAND
256           else
257                # Si es sincronizada tipo archivo.
258                [ "${2##*.}" == "img" ] && IMGTYPE="img" ||  IMGTYPE="diff"
259                IMGNAME="${2%.img*}"
260
261                DIRMOUNT=$(ogGetMountImageDir "$IMGNAME" $IMGTYPE)
262                DIRLOCAL="/tmp/$DIRMOUNT"
263                mkdir "$DIRLOCAL" 2>/dev/null
264                ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_CHECKSIZEIMG"
265
266                # Si la imagen no existe la creo
267                # Si la imagen del repositorio es mayor, redimensiono la imagen de cache
268                if [ "$CACHEFILE" == "" -o  $CACHEFILESIZE -lt $REALFILESIZE ]; then
269                        ogEcho log session "$MSG_HELP_ogCreateFileImage"
270                        ogCreateFileImage CACHE "$IMGNAME" $IMGTYPE $REALFILESIZE
271                        TIMEAUX3=$[SECONDS-TIMEAUX3]
272                        ogEcho log session "      $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL: $[TIMEAUX3/60]m $[TIMEAUX3%60]s"
273                fi
274                # Montamos las imagenes para sincronizarlas. Quitamos / inicial.
275                ogMountImage CACHE  "${IMGNAME#\/}" $IMGTYPE || exit $?
276                ogMountImage REPO  "${IMGNAME#\/}" $IMGTYPE
277                # Esperamos que se monte la imagen en el servidor
278                ogWaitSyncImage  REPO  "$IMGNAME" $IMGTYPE "mounted" || exit $?
279                ogEcho log session "      rsync -aHAX$OPTRSYNC  $USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/ $DIRLOCAL"
280                rsync -aHAX$OPTRSYNC  $PASSWORD "$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/" "$DIRLOCAL" 2>>$OGLOGCOMMAND  | egrep "^sent|^sending|^total|%" >>   $OGLOGCOMMAND
281                # RETVAL="1" -> OK  RETVAL="2" -> error  # valores igual que ogUpdateCacheIsNecesary
282                [ ${PIPESTATUS[0]} -eq 0 ] && RETVAL="1"|| RETVAL="2"
283                # Desmonto las imagenes
284                ogUnmountImage CACHE  "$IMGNAME" $IMGTYPE
285                ogUnmountImage REPO  "$IMGNAME" $IMGTYPE
286                ogUnlockImage CACHE "$2"
287           fi
288        ;;
289esac
290
291TIME1=$[SECONDS-TIME1]
292
293ogEcho log session "   [ ] $RESUMEUPDATECACHE "
294ogEcho log session "   [ ] $MSG_SCRIPTS_TIME_PARTIAL updateCache $[TIME1/60]m $[TIME1%60]s"
295ogEcho log session "   [ ] $MSG_SCRIPTS_TASK_START $MSG_HELP_ogCalculateChecksum "
296TIME2=$SECONDS
297# Si es imagen sincronizada siempre da distinto md5. No podemos comprobar
298if [ "$IMGSYNC" == "TRUE" ]; then
299        # RETVAL="1" -> OK  RETVAL="2" -> error  # valores igual que ogUpdateCacheIsNecesary
300        [ $PROTOCOLO == "RSYNC" ] || RETVAL=1
301else
302        ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO"
303        RETVAL=$?
304fi
305if [ "$(ogGetCaller)" != "deployImage" ]; then
306        TIME2=$[SECONDS-TIME2]
307        ogEcho log session "   [ ] $MSG_SCRIPTS_TIME_PARTIAL $MSG_HELP_ogCalculateChecksum $[TIME2/60]m $[TIME2%60]s"
308fi
309# si RETVAL=0 => actualizamos  si RETVAL=1 no actaulizamos-exit 0  || si RETVAL>2 exit 1
310[ "$RETVAL" == "0" ] && exit $OG_ERR_UPDATECACHE
311[ "$RETVAL" == "1" ] && exit 0
312[ "$RETVAL" -gt  "1" ] && exit $OG_ERR_UPDATECACHE
313
Note: See TracBrowser for help on using the repository browser.