source: repoman/bin/partclone2sync @ eeade34

v1.2.0
Last change on this file since eeade34 was 744ecd6, checked in by irina <irinagomez@…>, 7 years ago

#770 Script de servidor sincronizadas: si no existe fichero de idioma toma por defecto el castellano.

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

  • Property mode set to 100755
File size: 6.3 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.
45# Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto.
46ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null
47[ $? -eq 0 ] || LANG="es_ES"
48
49source $BASEDIR/client/etc/lang.$LANG.conf
50
51# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
52[  $(uname -r|cut -d. -f2) -lt 7 ] &&  IMGFS="EXT4" || IMGFS="BTRFS"
53
54# Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2.
55if [ "$*" == "help" -o $# -lt 3 ] && ! [[ "$3" == SYNC[1,2] ]]; then
56    echo -e "$PROG: $MSG_HELP_partclone2sync \n" \
57            "$MSG_FORMAT: $PROG image_partclone image_rsync [ SYNC1 | SYNC2 ] \n" \
58            "       $PROG Windows7 Windows72013 SYNC1 "
59   exit 0
60fi
61
62if [ "$USER" != "root" ]; then
63        echo "$PROG: Error: solo ejecutable por root" >&2
64        exit 1
65fi
66
67
68PARTCLONEIMG="$REPODIR/$1.img"
69RSYNCIMG="$REPODIR/$2"
70AUXIMG="$REPODIR/$1.tmp.img"
71AUXDIR="/tmp/partclone2rsync$$"
72TYPE="$3"
73TMPLOG=/tmp/rsync$$.sal
74
75# Comprobamos que exista la imagen.
76! [ -f $PARTCLONEIMG ] && echo "$MSG_ERR_NOTFOUND: $1" && exit 2
77
78# Comprobamos que la imagen no este bloqueada.
79[ -f $PARTCLONEIMG.lock ] && echo "$MSG_ERR_LOCKED: $1" && exit 4
80
81# Usamos el partclone del ogclient.
82OGCLIENTDIR=$BASEDIR/tftpboot/ogclient
83[ -d $OGCLIENTDIR/ogclientmount ] || mkdir $OGCLIENTDIR/ogclientmount
84mount  $OGCLIENTDIR/ogclient.sqfs $OGCLIENTDIR/ogclientmount
85PATHPARTCLONE=$OGCLIENTDIR/ogclientmount/usr/sbin
86
87# Creamos fichero de bloqueo
88touch $PARTCLONEIMG.lock $AUXIMG.lock
89
90
91# Datos imagen.
92echo [10] Obtenemos datos del partclone.
93FILEHEAD=/tmp/$(basename $PARTCLONEIMG).infohead
94COMPRESSOR=`file $PARTCLONEIMG | awk '{print $2}'`
95$COMPRESSOR -dc $PARTCLONEIMG 2>/dev/null | head > $FILEHEAD
96PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1)
97if `echo $PARTCLONEINFO | grep size > /dev/null`
98then
99      FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}')
100      echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024
101      IMGSIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}')
102else
103      echo "Error: partclone.info no detecta la imagen"
104      exit 5
105fi
106[ "$FS" == "NTFS" ] && echo "Error: Todavia no podemos convertir imagenes de Windows" && exit 6
107
108# Calculamos el espacio disponible en la particion de opengnsys.
109echo -n "[20]$MSG_SCRIPTS_CREATE_SIZE "
110for DIR in "/"  "/opt" "/opt/opengnsys" "/opt/opengnsys/images"
111do
112        AUXSIZE=$(df|grep $DIR$|awk '{print $3}')
113        [ "$AUXSIZE" != "" ] && PARTSIZE=$AUXSIZE
114done
115let REQUIRESIZE=2*$IMGSIZE
116if [ $PARTSIZE -lt  $REQUIRESIZE ]; then
117        echo "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE."
118        exit 16 
119fi
120echo "$REQUIRESIZE $PARTSIZE"
121
122# Descomprimimos la imagen de partclone.
123echo [30] Descomprimimos la imagen de partclone.
124$COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG
125
126TIME2=$[SECONDS-TIME1]
127echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s"
128
129# Montamos la imagen:
130mkdir -p $AUXDIR
131mount $AUXIMG $AUXDIR
132
133# Sincronizamos de la imagen del partclone a la del rsync.
134echo "[60] Sincronizamos desde la imagen de partclone a la de rsync."
135if [ "$TYPE" == "SYNC1" ]; then
136        mkdir -p $RSYNCIMG
137        echo "    * Log temporal en: $TMPLOG"
138        echo rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG
139        rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG
140TIME3=$[SECONDS-TIME2]
141echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
142else
143        IMGINFO="/tmp/ogimg.info$$"
144        IMGDIR="$REPODIR/mount/$(basename $RSYNCIMG)"
145        # Calculamos el tamaño de la imagen
146        SIZE=$(df -k|awk  -v P="$AUXDIR" '{if ($6==P) print $3}')
147        # Creo fichero de informacion de la imagen
148        echo "#$FSIMG:LZO:$FS:$SIZE" > $IMGINFO
149        # Factor de compresion de la imagen
150        [ "$FS" == "NTFS" ] && ZFACTOR=120 ||  ZFACTOR=110
151        [ "$FSIMG" == "BTRFS" ] && let ZFACTOR=$ZFACTOR-30
152        let SIZE=$SIZE*$ZFACTOR/100
153
154        # Creamos el fichero de la imagen vacio (queda montado)
155        echo "    * $MSG_HELP_ogCreateFileImage"
156        $BINDIR/createfileimage $(basename $RSYNCIMG)  img $SIZE || exit 5
157        touch $RSYNCIMG.img.lock
158        TIME3=$[SECONDS-TIME2]
159        echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
160       
161        # Sincronizo las imagenes antigua y nueva.
162        echo "    * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG"
163        echo rsync -aHAX $AUXDIR/ $IMGDIR 
164        rsync -aHAXv  $AUXDIR/ $IMGDIR  >> $TMPLOG
165        TIME4=$[SECONDS-TIME3]
166        echo "     $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s"
167        # copiamos el fichero de informacion dentro de la imagen.
168        mv $IMGINFO $IMGDIR/ogimg.info
169        # Desmontamos la imagen y la reducimos al minimo.
170        $BINDIR/unmountimage $(basename $RSYNCIMG)  img
171        echo "    * $MSG_HELP_ogReduceImage."
172        rm $RSYNCIMG.img.lock
173        $BINDIR/reduceimage $(basename $RSYNCIMG)  img
174
175fi     
176
177TIME=$[SECONDS-TIME1]
178echo "    $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
Note: See TracBrowser for help on using the repository browser.