source: admin/Sources/Services/ogAdmRepoAux @ 87a78ad6

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 87a78ad6 was 87a78ad6, checked in by irina <irinagomez@…>, 11 years ago

#565 Correccion errata valor variable backup para las sincronizadas tipo archivo

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

  • Property mode set to 100755
File size: 9.1 KB
Line 
1#!/bin/bash
2PARM=`cat`
3#PARM=$@
4
5
6#TODO:  ticket 379
7#buscar parametro de identificador de operacion.
8#usar parametro de identificacion para anexarlo al nombre de log
9#Comprobar si la variable está seteas.
10#Si no lo está setearla.
11#Si esta seteada (en progreso) salir.
12
13
14TIME=$SECONDS
15
16BASEDIR=/opt/opengnsys
17PATH=$PATH:$BASEDIR/bin
18REPONAME=ogAdmRepo
19REPOLOG=$BASEDIR/log/$REPONAME.log
20MCASTLOGBASE=$BASEDIR/log/mcastlog
21MCASTLOG=$MCASTLOGBASE/ogAdmRepoMcast.`date +%Y%m%d-%H%M%S`
22REPODIR="$BASEDIR/images/"
23
24# Para las sincronizadas
25# BACKUP: Define si se realiza copia de seguridad al crear una imagen (true|false).
26eval $(grep BACKUP $BASEDIR/client/etc/engine.cfg)
27# FS segun kernel. ext4 para < 3.7, para >= BTRFS
28KERNEL=$(file $BASEDIR/tftpboot/ogclient/ogvmlinuz |awk -F . '{print $2}')
29[ $KERNEL -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS"
30
31# Añade registro de incidencias.
32function echolog () {
33        if [ "$1" == "-o" ]; then
34                shift
35                date +"%Y%m%d-%H%M%S $*"|tee -a $REPOLOG
36        else
37                date +"%Y%m%d-%H%M%S $*" >> $REPOLOG
38        fi
39}
40
41function mountImage () {
42        #@param 1 image_file
43        #@param 2 mount_dir
44        #@param 3 openciones mount
45        [ "$3" != "" ] && OPTMOUNT=" -o $3 "   
46        # Si está montado nada que hacer
47        df |grep "$2$"  2>&1 >/dev/null  && return 0
48        if [ $IMGFS == "EXT4" ]; then
49                echolog "mount $OPTMOUNT -t ext4 $1 $2"
50                mount $OPTMOUNT -t ext4 $1 $2
51        else
52                echolog "mount $OPTMOUNT -o compress=lzo  $1 $2"
53                mount $OPTMOUNT -o compress=lzo  "$1" "$2"
54        fi
55        return $?
56}
57
58mkdir -p $MCASTLOGBASE
59
60
61PARM1=$(echo $PARM | cut -f1 -d" ")
62PARM2=$(echo $PARM | cut -f2 -d" ")
63PARM3=$(echo $PARM | cut -f3 -d" ")
64PARM4=$(echo $PARM | cut -f4 -d" ")
65
66# Determinamos el tipo de sistema de fichero de las imagenes segun el kernel que tenga
67
68
69case "$PARM1" in
70        START_MULTICAST)
71                #1 START_MULTICAST
72                #2 fichero a enviar
73                #3 opciones de multicast
74                FILE="$PARM2"
75                MCASTOPT="$PARM3"
76                echolog "Ejecutar $(which sendFileMcast) $FILE $MCASTOPT"
77                sendFileMcast $FILE $MCASTOPT &>> $MCASTLOG
78                case $? in
79                        1)  echolog "Parametros insuficientes"
80                            exit 1 ;;
81                        2)  echolog "Fichero no accesible"
82                            exit 2 ;;
83                        3)  echolog "Sesion multicast no valida"
84                            exit 3 ;;
85                esac
86        ;;
87        CREATE_IMAGE)
88                # Creamos/Redimensionamos el fichero de imagen y lo montamos para que se pueda escribir sobre el
89                #1 CREATE_IMAGE
90                #2 nombre imagen
91                #3 tipo de imagen [ img | diff ]
92                #4 tamaño imagen
93                LOOPDEVICE=$(losetup -f)
94                DIRMOUNT="$REPODIR/mount/$PARM2"
95                if [ "$PARM3" == "img" ] ; then
96                        IMGEXT="img"
97                else
98                        IMGEXT="img.diff"
99                        DIRMOUNT="$DIRMOUNT.diff"
100                fi
101                IMGFILE="$REPODIR/$PARM2.$IMGEXT"
102                IMGDIR="$(dirname $IMGFILE)"
103                [ -d  $IMGDIR ] || mkdir -p $IMGDIR
104
105                mkdir -p "$DIRMOUNT"
106
107                SIZEREQUIRED="$PARM4"
108
109                # Si existe la imagen hacemos copia de seguridad y la redimesionamos
110                if [ -f "$IMGFILE" ]; then
111                    echolog "La imagen $IMGFILE ya existe."
112                    # TODO modificar ogGetImageSize
113                    IMGSIZE=$(ls -l --block-size=1024 $IMGFILE| cut -f5 -d" ")
114
115                    if [ "$BACKUP" == "true" -o "$BACKUP" == "TRUE"  -o $IMGSIZE -lt $SIZEREQUIRED ]; then
116                        # Si la imagen esta montada la desmonto
117                        if [ -r "$DIRMOUNT/ogimg.info" ]; then
118                                echolog "umount $DIRMOUNT"
119                                umount "$DIRMOUNT"
120                                [ $? -ne 0 ] && echolog "Error: No podemos desmontar la imagen para hacer copia de seguridad o redimensionar" && exit 1
121                        fi
122                    fi
123
124                    # Copia de seguridad de la imagen
125                    if [ "$BACKUP" == "true" -o "$BACKUP" == "TRUE" ]; then
126                        echolog "Copia de seguridad de la imagen anterior"
127                        echolog "cp  $IMGFILE $IMGFILE.ant"
128                        cp  "$IMGFILE" "$IMGFILE.ant"
129                        echolog mv -f "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null
130                        mv -f "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null
131                    fi
132
133                    # Redimensionamos la imagen al tamaño necesario
134                    if [ $IMGSIZE -lt $SIZEREQUIRED ];then
135                        echolog "Redimensionamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED"
136                        echolog "truncate --size=\">$SIZEREQUIRED\"k $IMGFILE"
137                        truncate --size=">$SIZEREQUIRED"k $IMGFILE 2>&1 > $REPOLOG
138                        # Montamos la imagen, si da error nos salimos
139                        if [ $IMGFS == "EXT4" ]; then
140                           losetup $LOOPDEVICE "$IMGFILE"
141                           echolog "resize2fs -f $LOOPDEVICE"
142                           resize2fs -f $LOOPDEVICE &> $REPOLOG
143                        else
144                           mount -o compress=lzo  "$IMGFILE" "$DIRMOUNT"
145                           echolog "btrfs filesystem resize max $DIRMOUNT"
146                           btrfs filesystem resize max "$DIRMOUNT"  2>&1 > $REPOLOG
147                        fi
148                    fi
149
150
151                # Si no existe la imagen creamos el fichero.   
152                else
153                    echolog "Creamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED"
154                    echolog dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED
155                    dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED
156                    #Formateamos imagen
157                    echo losetup $LOOPDEVICE "$IMGFILE"
158                    losetup $LOOPDEVICE "$IMGFILE"
159                    if [ $IMGFS == "EXT4" ] ; then
160                        echolog "      mkfs.ext4 -i 4096  -b 4096 -L ${PARM2##*\/} $LOOPDEVICE"
161                        mkfs.ext4 -i 4096  -b 4096 -L ${PARM2##*\/} $LOOPDEVICE
162                    else
163                        echolog mkfs.btrfs  -L ${PARM2##*\/} $LOOPDEVICE
164                        mkfs.btrfs  -L ${PARM2##*\/} $LOOPDEVICE #&> $OGLOGCOMMAND
165                    fi
166                fi
167                # Montamos la imagen.
168                mountImage "$IMGFILE" "$DIRMOUNT"
169                RETVAL=$?
170                if [ $RETVAL -ne 0 ]; then
171                        rmdir "$DIRMOUNT"
172                        echolog -o "Error al crear/redimensionar la imagen"
173                        exit $RETVAL
174                fi
175
176                touch "$DIRMOUNT/ogimg.info"
177                TIME2=$[SECONDS-TIME]
178                echolog "Fin creación/redimension de la  imagen: $[TIME2/60]m $[TIME2%60]s"
179                # Si existe dispositivo loop lo borramos.
180                [ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null  &&  losetup -d $LOOPDEVICE
181                # TODO: comprobar que no se quede el losetup bloqueado.
182
183        ;;
184        MOUNT_IMAGE)
185                # Montamos el fichero imagen para que se pueda
186                #1 MOUNT_IMAGE
187                #2 nombre imagen
188                #3 tipo de imagen [ img | diff ]
189                DIRMOUNT="$REPODIR""mount/$PARM2"
190                if [ "$PARM3" == "img" ] ; then
191                        IMGEXT="img"
192                else
193                        IMGEXT="img.diff"
194                        DIRMOUNT="$DIRMOUNT.diff"
195                fi
196                IMGFILE="$REPODIR/$PARM2.$IMGEXT"
197                echolog "Montamos la imagen $IMGFILE "
198                mkdir -p "$DIRMOUNT"
199                mountImage "$IMGFILE" "$DIRMOUNT"  ro || (echolog "Error al montar la imagen"; exit 1)
200        ;;
201        UMOUNT_IMAGE)
202                # Desmontamos el fichero imagen.
203                        # Si el directorio esta ocupado no se desmontará
204                #1 UMOUNT_IMAGE
205                #2 nombre imagen
206                #3 tipo de imagen [ img | diff ]
207                IMGTYPE="$PARM3"
208                DIRMOUNT="$REPODIR/mount/$PARM2"
209                [ "$IMGTYPE" == "diff" ] && DIRMOUNT="$DIRMOUNT.$IMGTYPE"
210                echolog "Desmontamos la imagen $PARM2 $PARM3 "
211                umount $DIRMOUNT
212                rmdir $DIRMOUNT
213
214        ;;
215        REDUCE_IMAGE)
216                # Reduce el archivo de la imagen a tamaño datos + 500M
217                #1 REDUCE_IMAGE
218                #2 Nombre Imagen
219                #3 Tipo de imagen [ img |diff ]
220                DIRMOUNT="$REPODIR""mount/${PARM2}"
221                if [ "$PARM3" == "img" ] ; then
222                        IMGEXT="img"
223                else
224                        IMGEXT="img.diff"
225                        DIRMOUNT="$DIRMOUNT.diff"
226                fi
227                IMGFILE="$REPODIR$PARM2.$IMGEXT"
228                [ ! -f $IMGFILE ] && echolog "Imagen $IMGFILE no existe" && exit 1
229
230                # Solo funciona si la imagen es ext4, si no nos salimos sin error
231                file $IMGFILE |grep -i -e " ext4 filesystem " 2>&1 > /dev/null || exit 0
232
233                [ -d $DIRMOUNT ] || mkdir $DIRMOUNT
234                mountImage "$IMGFILE" "$DIRMOUNT" || (echolog "Error al montar la imagen"; exit 1)
235               
236                # Si el espacio libre menor que 500Mb desmontamos la imagen y nos salimos
237                AVAILABLE=$(df -k|grep $DIRMOUNT|awk '{print $4}')
238                if [ $AVAILABLE -lt 200000 ]; then
239                     echolog "reducir imagen REPO $PARM2 $IMGEXT. tamaño minimo, nada que hacer"
240                     umount $DIRMOUNT
241                     rmdir $DIRMOUNT
242                     exit 0
243                fi
244
245                # Calculamos la diferencia entre el tamaño interno y externo
246                EXTSIZE=$(ls -l --block-size=1024 $IMGFILE | cut -f5 -d" ")
247                INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
248                let EDGESIZE=$EXTSIZE-$INTSIZE
249
250                echolog "reducir imagen REPO $PARM2 $IMGEXT, tamaño final: $ENDSIZE"
251                umount $DIRMOUNT
252                LOOPDEVICE=$(losetup -f)
253                losetup $LOOPDEVICE "$IMGFILE"
254
255                # Redimensiono sistema de ficheros
256                echolog "resize2fs -fpM $LOOPDEVICE "
257                resize2fs -fpM $LOOPDEVICE # 2>&1 > $REPOLOG
258                mountImage "$IMGFILE" "$DIRMOUNT"
259                # Calculamos el tamaño final del archivo
260                INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
261                let EXTSIZE=$INTSIZE+$EDGESIZE
262                umount $DIRMOUNT
263                # Si existe dispositivo loop lo borramos.
264                [ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null  &&  losetup -d $LOOPDEVICE
265                # Corto el archivo al tamaño del sistema de ficheros
266                echo "truncate --size=\"$EXTSIZE\"k $IMGFILE"
267                echolog "truncate --size=\"$EXTSIZE\"k $IMGFILE"
268                truncate --size="$EXTSIZE"k $IMGFILE
269
270                rmdir $DIRMOUNT
271
272        ;;
273        LOCK_IMAGE)
274                # Bloquea el archivo de la imagen.
275                #1 LOCK_IMAGE
276                #2 Nombre_Imagen.extension
277                echolog "Bloqueamos imagen $REPODIR$PARM2"
278                touch "$REPODIR$PARM2.lock"
279        ;;
280        UNLOCK_IMAGE)
281                # Desloquea el archivo de la imagen.
282                #1 UNLOCK_IMAGE
283                #2 Nombre_Imagen.extension
284                echolog "Desbloqueamos imagen $REPODIR$PARM2"
285                rm -f "$REPODIR$PARM2.lock"
286        ;;
287        default)
288            echolog "Solicitud con parametros  \"$PARM\"  no realizada, no registrada o con errores"
289        ;;
290esac
Note: See TracBrowser for help on using the repository browser.