source: repoman/bin/partclone2sync

lgromero-new-oglive
Last change on this file was c28eefa, checked in by Natalia Serrano <natalia.serrano@…>, 19 months ago

Log to syslog in a number of shell scripts

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