source: server/bin/partclone2sync @ d5c3ce2

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

#565 se crean script: partclone2sync y clean-mountdirimage. Se controla el error al crear la imagen.

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

  • Property mode set to 100755
File size: 6.1 KB
Line 
1#!/bin/bash
2#/**
3#        partclone2sync
4#@brief  Convierte imagen de partclone en imagen sincronizable.
5#@param 1 imagen partclone.
6#@param 2 imagen sincronizable.
7#@param 3 tipo de sincronización y formato de la imagen SYNC1 (directorio) y SYNC2 (fichero)
8#@exception OG_ERR_FORMAT     # 1 formato incorrecto.
9#@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado
10#@exception OG_ERR_LOCKED # 4 Imagen de partclone bloqueada.
11#@exception OG_ERR_IMAGE # 5 Error al crear la imagen.
12#@exception OG_CACHESIZE # 16 No hay espacio suficiente en el disco.
13#@note Necesita tener instalado partclone-utils y lzop
14#@version 1.0 -
15#@author  Irina Gomez
16#@date   2014-01-22
17#*/ ##
18trap "onexit \"$1\" \"$2\" $3" 0 5 16 9 15
19
20function onexit() {
21        local exit_status=$?
22        # Desmontamos el cliente de opengnsys y la imagen temporal.
23        umount $OGCLIENTDIR/ogclientmount $AUXDIR
24        rm -rf $IMGINFO  $FILEHEAD $TMPLOG
25
26        # Borramos los ficheros de bloqueo de las imagenes nuevas.
27        rm -rf  $RSYNCIMG.img.lock $AUXIMG.lock
28        # Borramos los ficheros de bloqueo dela imagen de partclone si no estaba bloqueada.
29        [ $exit_status -eq 4 ] || rm -rf $PARTCLONEIMG.lock
30
31        # Borramos las imagenes y directorios temporales.
32        rm $AUXIMG
33        rmdir $AUXDIR $OGCLIENTDIR/ogclientmount
34
35        exit $exit_status
36}
37
38TIME1=$SECONDS
39
40BASEDIR=/opt/opengnsys
41REPODIR="$BASEDIR/images"
42BINDIR="$BASEDIR/bin"
43PROG="$(basename $0)"
44# Cargamos los mensajes en el idioma del sistema.
45source $BASEDIR/client/etc/lang.$LANG.conf
46
47# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
48[  $(uname -r|cut -d. -f2) -lt 7 ] &&  IMGFS="EXT4" || IMGFS="BTRFS"
49
50# Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2.
51if [ "$*" == "help" -o $# -lt 3 ] && ! [[ "$3" == SYNC[1,2] ]]; then
52    echo -e "$PROG: $MSG_HELP_partclone2sync \n" \
53            "$MSG_FORMAT: $PROG image_partclone image_rsync [ SYNC1 | SYNC2 ] \n" \
54            "       $PROG Windows7 Windows72013 SYNC1 "
55   exit 0
56fi
57
58if [ "$USER" != "root" ]; then
59        echo "$PROG: Error: solo ejecutable por root" >&2
60        exit 1
61fi
62
63
64PARTCLONEIMG="$REPODIR/$1.img"
65RSYNCIMG="$REPODIR/$2"
66AUXIMG="$REPODIR/$1.tmp.img"
67AUXDIR="/tmp/partclone2rsync$$"
68TYPE="$3"
69TMPLOG=/tmp/rsync$$.sal
70
71# Comprobamos que exista la imagen.
72! [ -f $PARTCLONEIMG ] && echo "$MSG_ERR_NOTFOUND: $1" && exit 2
73
74# Comprobamos que la imagen no este bloqueada.
75[ -f $PARTCLONEIMG.lock ] && echo "$MSG_ERR_LOCKED: $1" && exit 4
76
77# Usamos el partclone del ogclient.
78OGCLIENTDIR=$BASEDIR/tftpboot/ogclient
79[ -d $OGCLIENTDIR/ogclientmount ] || mkdir $OGCLIENTDIR/ogclientmount
80mount  $OGCLIENTDIR/ogclient.sqfs $OGCLIENTDIR/ogclientmount
81PATHPARTCLONE=$OGCLIENTDIR/ogclientmount/usr/sbin
82
83# Creamos fichero de bloqueo
84touch $PARTCLONEIMG.lock $AUXIMG.lock
85
86
87# Datos imagen.
88echo [10] Obtenemos datos del partclone.
89FILEHEAD=/tmp/$(basename $PARTCLONEIMG).infohead
90COMPRESSOR=`file $PARTCLONEIMG | awk '{print $2}'`
91$COMPRESSOR -dc $PARTCLONEIMG 2>/dev/null | head > $FILEHEAD
92PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1)
93if `echo $PARTCLONEINFO | grep size > /dev/null`
94then
95      FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}')
96      echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024
97      IMGSIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}')
98else
99      echo "Error: partclone.info no detecta la imagen"
100      exit 5
101fi
102[ "$FS" == "NTFS" ] && echo "Error: Todavia no podemos convertir imagenes de Windows" && exit 6
103
104# Calculamos el espacio disponible en la particion de opengnsys.
105echo -n "[20]$MSG_SCRIPTS_CREATE_SIZE "
106for DIR in "/"  "/opt" "/opt/opengnsys" "/opt/opengnsys/images"
107do
108        AUXSIZE=$(df|grep $DIR$|awk '{print $3}')
109        [ "$AUXSIZE" != "" ] && PARTSIZE=$AUXSIZE
110done
111let REQUIRESIZE=2*$IMGSIZE
112if [ $PARTSIZE -lt  $REQUIRESIZE ]; then
113        echo "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE."
114        exit 16
115fi
116echo "$REQUIRESIZE $PARTSIZE"
117
118# Descomprimimos la imagen de partclone.
119echo [30] Descomprimimos la imagen de partclone.
120$COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG
121
122TIME2=$[SECONDS-TIME1]
123echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s"
124
125# Montamos la imagen:
126mkdir -p $AUXDIR
127mount $AUXIMG $AUXDIR
128
129# Sincronizamos de la imagen del partclone a la del rsync.
130echo "[60] Sincronizamos desde la imagen de partclone a la de rsync."
131if [ "$TYPE" == "SYNC1" ]; then
132        mkdir -p $RSYNCIMG
133        echo "    * Log temporal en: $TMPLOG"
134        echo rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG
135        rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG
136TIME3=$[SECONDS-TIME2]
137echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
138else
139        IMGINFO="/tmp/ogimg.info$$"
140        IMGDIR="$REPODIR/mount/$(basename $RSYNCIMG)"
141        # Calculamos el tamaño de la imagen
142        SIZE=$(df -k|awk  -v P="$AUXDIR" '{if ($6==P) print $3}')
143        # Creo fichero de informacion de la imagen
144        echo "#$FSIMG:LZO:$FS:$SIZE" > $IMGINFO
145        # Factor de compresion de la imagen
146        [ "$FS" == "NTFS" ] && ZFACTOR=120 ||  ZFACTOR=110
147        [ "$FSIMG" == "BTRFS" ] && let ZFACTOR=$ZFACTOR-30
148        let SIZE=$SIZE*$ZFACTOR/100
149
150        # Creamos el fichero de la imagen vacio (queda montado)
151        echo "    * $MSG_HELP_ogCreateFileImage"
152        $BINDIR/createfileimage $(basename $RSYNCIMG)  img $SIZE || exit 5
153        touch $RSYNCIMG.img.lock
154        TIME3=$[SECONDS-TIME2]
155        echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
156       
157        # Sincronizo las imagenes antigua y nueva.
158        echo "    * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG"
159        echo rsync -aHAX $AUXDIR/ $IMGDIR
160        rsync -aHAXv  $AUXDIR/ $IMGDIR  >> $TMPLOG
161        TIME4=$[SECONDS-TIME3]
162        echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s"
163        # copiamos el fichero de informacion dentro de la imagen.
164        mv $IMGINFO $IMGDIR/ogimg.info
165        # Desmontamos la imagen y la reducimos al minimo.
166        $BINDIR/unmountimage $(basename $RSYNCIMG)  img
167        echo "    * $MSG_HELP_ogReduceImage."
168        rm $RSYNCIMG.img.lock
169        $BINDIR/reduceimage $(basename $RSYNCIMG)  img
170
171fi     
172
173TIME=$[SECONDS-TIME1]
174echo "    $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
Note: See TracBrowser for help on using the repository browser.