summaryrefslogtreecommitdiffstats
path: root/repoman/bin
diff options
context:
space:
mode:
Diffstat (limited to 'repoman/bin')
-rwxr-xr-xrepoman/bin/createfileimage65
-rwxr-xr-xrepoman/bin/mountimage71
-rwxr-xr-xrepoman/bin/partclone2sync178
-rwxr-xr-xrepoman/bin/reduceimage58
-rwxr-xr-xrepoman/bin/unmountimage52
5 files changed, 424 insertions, 0 deletions
diff --git a/repoman/bin/createfileimage b/repoman/bin/createfileimage
new file mode 100755
index 00000000..4fcd7d9d
--- /dev/null
+++ b/repoman/bin/createfileimage
@@ -0,0 +1,65 @@
+#!/bin/bash
+#/**
+# createtimage
+#@brief Crea o redimensiona el archivo de la imagen.
+#@param 1 imagen
+#@param 2 extension [ img|diff ]
+#@param 3 tamaño de la imagen en kb.
+#@return
+#@exception OG_ERR_FORMAT # 1 formato incorrecto.
+#@exception OG_ERR_DONTSYNC_IMAGE #71 Imagen no sincronizable (es monolitica)
+#@version 1.0 - Montar imagen sincronizable
+#@author Irina Gomez
+#@date 2013-05-23
+#*/ ##
+BASEDIR=/opt/opengnsys
+REPODIR="$BASEDIR/images"
+REPOLOG=$BASEDIR/log/ogAdmRepo.log
+# Cargamos los mensajes en el idioma del sistema.
+# Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto.
+ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null
+[ $? -eq 0 ] || LANG="es_ES"
+source $BASEDIR/client/etc/lang.$LANG.conf
+
+PROG="$(basename $0)"
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ echo -e " $PROG: $MSG_HELP_ogCreateFileImage \n" \
+ "$MSG_FORMAT: $PROG image [ img|diff ] size_kb \n" \
+ "base -> $PROG Windows7 img 3900000 \n" \
+ "diff -> $PROG Ubuntu12 diff 450000"
+ exit 0
+fi
+
+[ $# -lt 3 ] && echo -e "$PROG: Error: $MSG_ERR_FORMAT \n $MSG_FORMAT: $PROG image [ img | diff ] size_Kb " && exit 1
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+IMGEXT="$2"
+
+# Si existe imagen, Comprobamos que no esta bloqueada y que es sincronizable
+IMGFILE="$REPODIR/$1.$IMGEXT"
+if [ -f $IMGFILE ]; then
+ [ -f $IMGFILE.lock ] && echo "$PROG: Error: $MSG_ERR_LOCKED $1 $IMGEXT" && exit 4
+
+
+ if ! file $IMGFILE | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " >/dev/null ; then
+ echo "$PROG: Error: $MSG_ERR_DONTSYNC_IMAGE $1 $2"
+ exit 71
+ fi
+fi
+
+touch $IMGFILE.lock
+
+# El tamaño minimo de la imagen es 300000 para poder formatear en fs btrfs.
+SIZEREQUIRED=$3
+[ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000
+
+echo CREATE_IMAGE "$1" $IMGEXT $SIZEREQUIRED
+echo -ne CREATE_IMAGE "$1" $IMGEXT $SIZEREQUIRED| /opt/opengnsys/sbin/ogAdmRepoAux || exit $?
+echo "Los resultado se registran en $REPOLOG. "
+
+rm $IMGFILE.lock
diff --git a/repoman/bin/mountimage b/repoman/bin/mountimage
new file mode 100755
index 00000000..fa059fd7
--- /dev/null
+++ b/repoman/bin/mountimage
@@ -0,0 +1,71 @@
+#!/bin/bash
+#/**
+# mountimage
+#@brief Monta imagen sincronizable en el repositorio con permisos de escritura
+#@param 1 imagen
+#@param 2 extension [ img|diff ] opcional, por defecto img
+#@return Directorio de montaje de la imagen.
+#@exception OG_ERR_FORMAT # 1 formato incorrecto.
+#@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado
+#@exception OG_ERR_DONTSYNC_IMAGE #71 Imagen no sincronizable (es monolitica)
+#@exception OG_ERR_DONTMOUNT_IMAGE # 70 Error al montar una imagen sincronizada
+#@version 1.0 - Montar imagen sincronizable
+#@author Irina Gomez
+#@date 2013-05-23
+#*/ ##
+BASEDIR=/opt/opengnsys
+REPODIR="$BASEDIR/images"
+# Cargamos los mensajes en el idioma del sistema.
+# Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto.
+ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null
+[ $? -eq 0 ] || LANG="es_ES"
+source $BASEDIR/client/etc/lang.$LANG.conf
+
+
+PROG="$(basename $0)"
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ echo -e " $PROG: $MSG_HELP_ogMountImage \n" \
+ "$MSG_FORMAT: $PROG nombre_image [ img|diff ] \n" \
+ "base -> $PROG Windows7 \n" \
+ "diff -> $PROG Ubuntu12 diff"
+ exit 0
+fi
+
+[ $# -lt 1 ] && echo -e "$PROG: Error: $MSG_ERR_FORMAT \n $MSG_FORMAT: $PROG image [ img | diff ]" && exit 1
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+[ "$2" == "" -o "$2" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
+
+# Comprobamos que existe imagen
+IMGFILE="$REPODIR/$1.$IMGEXT"
+[ ! -f $IMGFILE ] && echo "$PROG: Error: $MSG_ERR_NOTFOUND $1 $IMGEXT" && exit 2
+
+
+# Comprobar que la imagen es sincronizable
+file $IMGFILE | grep -i -e " BTRFS Filesystem " >/dev/null && IMGFS=BTRFS
+file $IMGFILE | grep -i -e " ext4 filesystem " >/dev/null && IMGFS=EXT4
+if [ "$IMGFS" != "BTRFS" -a "$IMGFS" != "EXT4" ] ; then
+ echo "$PROG: Error: $MSG_ERR_DONTSYNC_IMAGE $1 $2"
+ exit 71
+fi
+
+MOUNTDIR="$REPODIR/mount/$1"
+[ "$IMGEXT" == "img.diff" ] && MOUNTDIR="$MOUNTDIR.${IMGEXT#*\.}"
+mkdir -p "$MOUNTDIR"
+
+# Comprobamos si la imagen esta montada y si es así nos salimos.
+df |grep "$MOUNTDIR$" 2>&1 >/dev/null && echo "$MOUNTDIR" && exit 0
+
+if [ "$IMGFS" == "EXT4" ] ; then
+ mount -t ext4 "$IMGFILE" "$MOUNTDIR"
+else
+ mount -o compress=lzo "$IMGFILE" "$MOUNTDIR"
+fi
+[ $? -eq 0 ] || ( echo "$MSG_ERR_DONTMOUNT_IMAGE $1 $2" ; exit 70)
+echo "$MOUNTDIR"
+
diff --git a/repoman/bin/partclone2sync b/repoman/bin/partclone2sync
new file mode 100755
index 00000000..0b66fa55
--- /dev/null
+++ b/repoman/bin/partclone2sync
@@ -0,0 +1,178 @@
+#!/bin/bash
+#/**
+# partclone2sync
+#@brief Convierte imagen de partclone en imagen sincronizable.
+#@param 1 imagen partclone.
+#@param 2 imagen sincronizable.
+#@param 3 tipo de sincronización y formato de la imagen SYNC1 (directorio) y SYNC2 (fichero)
+#@exception OG_ERR_FORMAT # 1 formato incorrecto.
+#@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado
+#@exception OG_ERR_LOCKED # 4 Imagen de partclone bloqueada.
+#@exception OG_ERR_IMAGE # 5 Error al crear la imagen.
+#@exception OG_CACHESIZE # 16 No hay espacio suficiente en el disco.
+#@note Necesita tener instalado partclone-utils y lzop
+#@version 1.0 -
+#@author Irina Gomez
+#@date 2014-01-22
+#*/ ##
+trap "onexit \"$1\" \"$2\" $3" 0 5 16 9 15
+
+function onexit() {
+ local exit_status=$?
+ # Desmontamos el cliente de opengnsys y la imagen temporal.
+ umount $OGCLIENTDIR/ogclientmount $AUXDIR
+ rm -rf $IMGINFO $FILEHEAD $TMPLOG
+
+ # Borramos los ficheros de bloqueo de las imagenes nuevas.
+ rm -rf $RSYNCIMG.img.lock $AUXIMG.lock
+ # Borramos los ficheros de bloqueo dela imagen de partclone si no estaba bloqueada.
+ [ $exit_status -eq 4 ] || rm -rf $PARTCLONEIMG.lock
+
+ # Borramos las imagenes y directorios temporales.
+ rm $AUXIMG
+ rmdir $AUXDIR $OGCLIENTDIR/ogclientmount
+
+ exit $exit_status
+}
+
+TIME1=$SECONDS
+
+BASEDIR=/opt/opengnsys
+REPODIR="$BASEDIR/images"
+BINDIR="$BASEDIR/bin"
+PROG="$(basename $0)"
+# Cargamos los mensajes en el idioma del sistema.
+# Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto.
+ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null
+[ $? -eq 0 ] || LANG="es_ES"
+
+source $BASEDIR/client/etc/lang.$LANG.conf
+
+# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
+[ $(uname -r|cut -d. -f2) -lt 7 ] && IMGFS="EXT4" || IMGFS="BTRFS"
+
+# Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2.
+if [ "$*" == "help" -o $# -lt 3 ] && ! [[ "$3" == SYNC[1,2] ]]; then
+ echo -e "$PROG: $MSG_HELP_partclone2sync \n" \
+ "$MSG_FORMAT: $PROG image_partclone image_rsync [ SYNC1 | SYNC2 ] \n" \
+ " $PROG Windows7 Windows72013 SYNC1 "
+ exit 0
+fi
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+
+PARTCLONEIMG="$REPODIR/$1.img"
+RSYNCIMG="$REPODIR/$2"
+AUXIMG="$REPODIR/$1.tmp.img"
+AUXDIR="/tmp/partclone2rsync$$"
+TYPE="$3"
+TMPLOG=/tmp/rsync$$.sal
+
+# Comprobamos que exista la imagen.
+! [ -f $PARTCLONEIMG ] && echo "$MSG_ERR_NOTFOUND: $1" && exit 2
+
+# Comprobamos que la imagen no este bloqueada.
+[ -f $PARTCLONEIMG.lock ] && echo "$MSG_ERR_LOCKED: $1" && exit 4
+
+# Usamos el partclone del ogclient.
+OGCLIENTDIR=$BASEDIR/tftpboot/ogclient
+[ -d $OGCLIENTDIR/ogclientmount ] || mkdir $OGCLIENTDIR/ogclientmount
+mount $OGCLIENTDIR/ogclient.sqfs $OGCLIENTDIR/ogclientmount
+PATHPARTCLONE=$OGCLIENTDIR/ogclientmount/usr/sbin
+
+# Creamos fichero de bloqueo
+touch $PARTCLONEIMG.lock $AUXIMG.lock
+
+
+# Datos imagen.
+echo [10] Obtenemos datos del partclone.
+FILEHEAD=/tmp/$(basename $PARTCLONEIMG).infohead
+COMPRESSOR=`file $PARTCLONEIMG | awk '{print $2}'`
+$COMPRESSOR -dc $PARTCLONEIMG 2>/dev/null | head > $FILEHEAD
+PARTCLONEINFO=$(LC_ALL=C partclone.info $FILEHEAD 2>&1)
+if `echo $PARTCLONEINFO | grep size > /dev/null`
+then
+ FS=$(echo $PARTCLONEINFO | awk '{gsub(/\: /,"\n"); print toupper($8);}')
+ echo $PARTCLONEINFO | grep GB > /dev/null && SIZEFACTOR=1000000 || SIZEFACTOR=1024
+ IMGSIZE=$(echo $PARTCLONEINFO | awk -v FACTOR=$SIZEFACTOR '{gsub(/\: /,"\n"); printf "%d\n", $11*FACTOR;}')
+else
+ echo "Error: partclone.info no detecta la imagen"
+ exit 5
+fi
+[ "$FS" == "NTFS" ] && echo "Error: Todavia no podemos convertir imagenes de Windows" && exit 6
+
+# Calculamos el espacio disponible en la particion de opengnsys.
+echo -n "[20]$MSG_SCRIPTS_CREATE_SIZE "
+for DIR in "/" "/opt" "/opt/opengnsys" "/opt/opengnsys/images"
+do
+ AUXSIZE=$(df|grep $DIR$|awk '{print $3}')
+ [ "$AUXSIZE" != "" ] && PARTSIZE=$AUXSIZE
+done
+let REQUIRESIZE=2*$IMGSIZE
+if [ $PARTSIZE -lt $REQUIRESIZE ]; then
+ echo "No hay espacio suficiente para descomprimir y crear la imagen: $REQUIRESIZE."
+ exit 16
+fi
+echo "$REQUIRESIZE $PARTSIZE"
+
+# Descomprimimos la imagen de partclone.
+echo [30] Descomprimimos la imagen de partclone.
+$COMPRESSOR -dc $PARTCLONEIMG | $PATHPARTCLONE/partclone.restore -C -s - -O $AUXIMG
+
+TIME2=$[SECONDS-TIME1]
+echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME2/60]m $[TIME2%60]s"
+
+# Montamos la imagen:
+mkdir -p $AUXDIR
+mount $AUXIMG $AUXDIR
+
+# Sincronizamos de la imagen del partclone a la del rsync.
+echo "[60] Sincronizamos desde la imagen de partclone a la de rsync."
+if [ "$TYPE" == "SYNC1" ]; then
+ mkdir -p $RSYNCIMG
+ echo " * Log temporal en: $TMPLOG"
+ echo rsync -aHAX $AUXDIR/ $RSYNCIMG --- log: $TMPLOG
+ rsync -aHAXv $AUXDIR/ $RSYNCIMG >> $TMPLOG
+TIME3=$[SECONDS-TIME2]
+echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
+else
+ IMGINFO="/tmp/ogimg.info$$"
+ IMGDIR="$REPODIR/mount/$(basename $RSYNCIMG)"
+ # Calculamos el tamaño de la imagen
+ SIZE=$(df -k|awk -v P="$AUXDIR" '{if ($6==P) print $3}')
+ # Creo fichero de informacion de la imagen
+ echo "#$FSIMG:LZO:$FS:$SIZE" > $IMGINFO
+ # Factor de compresion de la imagen
+ [ "$FS" == "NTFS" ] && ZFACTOR=120 || ZFACTOR=110
+ [ "$FSIMG" == "BTRFS" ] && let ZFACTOR=$ZFACTOR-30
+ let SIZE=$SIZE*$ZFACTOR/100
+
+ # Creamos el fichero de la imagen vacio (queda montado)
+ echo " * $MSG_HELP_ogCreateFileImage"
+ $BINDIR/createfileimage $(basename $RSYNCIMG) img $SIZE || exit 5
+ touch $RSYNCIMG.img.lock
+ TIME3=$[SECONDS-TIME2]
+ echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME3/60]m $[TIME3%60]s"
+
+ # Sincronizo las imagenes antigua y nueva.
+ echo " * Sincroniza las imagenes antigua y nueva. log temporal en: $TMPLOG"
+ echo rsync -aHAX $AUXDIR/ $IMGDIR
+ rsync -aHAXv $AUXDIR/ $IMGDIR >> $TMPLOG
+ TIME4=$[SECONDS-TIME3]
+ echo " $MSG_SCRIPTS_TASK_END: $MSG_SCRIPTS_TIME_PARTIAL: $[TIME4/60]m $[TIME4%60]s"
+ # copiamos el fichero de informacion dentro de la imagen.
+ mv $IMGINFO $IMGDIR/ogimg.info
+ # Desmontamos la imagen y la reducimos al minimo.
+ $BINDIR/unmountimage $(basename $RSYNCIMG) img
+ echo " * $MSG_HELP_ogReduceImage."
+ rm $RSYNCIMG.img.lock
+ $BINDIR/reduceimage $(basename $RSYNCIMG) img
+
+fi
+
+TIME=$[SECONDS-TIME1]
+echo " $MSG_SCRIPTS_END: $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
diff --git a/repoman/bin/reduceimage b/repoman/bin/reduceimage
new file mode 100755
index 00000000..c83f2d50
--- /dev/null
+++ b/repoman/bin/reduceimage
@@ -0,0 +1,58 @@
+#!/bin/bash
+#/**
+# reduceimage
+#@brief Reduce el archivo de la imagen a tamaño datos + 500M
+#@param 1 imagen
+#@param 2 extension [ img|diff ] opcional, por defecto img
+#@return
+#@exception OG_ERR_FORMAT # 1 formato incorrecto.
+#@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado
+#@exception OG_ERR_LOCKED # 4 Partición o fichero bloqueado
+#@exception OG_ERR_DONTSYNC_IMAGE #71 Imagen no sincronizable (es monolitica)
+#@version 1.0 - Reducir tamaño imagen sincronizable
+#@author Irina Gomez
+#@date 2013-05-23
+#*/ ##
+BASEDIR=/opt/opengnsys
+REPODIR="$BASEDIR/images"
+REPOLOG=$BASEDIR/log/ogAdmRepo.log
+# Cargamos los mensajes en el idioma del sistema.
+# Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto.
+ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null
+[ $? -eq 0 ] || LANG="es_ES"
+source $BASEDIR/client/etc/lang.$LANG.conf
+
+PROG="$(basename $0)"
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ echo -e " $PROG: $MSG_HELP_ogReduceImage \n" \
+ "$MSG_FORMAT: $PROG nombre_image [ img|diff ] \n" \
+ "base -> $PROG Windows7 \n" \
+ "diff -> $PROG Ubuntu12 diff"
+ exit 0
+fi
+
+[ $# -lt 1 ] && echo -e "$PROG: Error: $MSG_ERR_FORMAT \n $MSG_FORMAT: $PROG image [ img | diff ]" && exit 1
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+[ "$2" == "" -o "$2" == "img" ] && IMGEXT="img" || IMGEXT="img.diff"
+# Comprobamos que existe imagen y que no este bloqueada
+IMGFILE="$REPODIR/$1.$IMGEXT"
+[ ! -f $IMGFILE ] && echo "$PROG: Error: $MSG_ERR_NOTFOUND $1 $IMGEXT" && exit 2
+[ -f $IMGFILE.lock ] && echo "$PROG: Error: $MSG_ERR_LOCKED $1 $IMGEXT" && exit 4
+
+# Comprobar que la imagen es sincronizable
+if ! file $IMGFILE | grep -i -e " BTRFS Filesystem " -e " ext4 filesystem " >/dev/null ; then
+ echo "$PROG: Error: $MSG_ERR_DONTSYNC_IMAGE $1 $2"
+ exit 71
+fi
+
+touch $IMGFILE.lock
+echo -ne REDUCE_IMAGE "$1" ${IMGEXT#*\.} | /opt/opengnsys/sbin/ogAdmRepoAux
+echo "Los resultado se registran en $REPOLOG. "
+
+rm $IMGFILE.lock
diff --git a/repoman/bin/unmountimage b/repoman/bin/unmountimage
new file mode 100755
index 00000000..031ae9ee
--- /dev/null
+++ b/repoman/bin/unmountimage
@@ -0,0 +1,52 @@
+#!/bin/bash
+#/**
+# unmountimage
+#@brief Desmonta imagen sincronizable
+#@param 1 imagen
+#@param 2 extension [ img|diff ] opcional, por defecto img
+#@return
+#@exception OG_ERR_FORMAT # 1 formato incorrecto.
+#@version 1.0 - Desmontar imagen sincronizable
+#@author Irina Gomez
+#@date 2013-05-23
+#*/ ##
+BASEDIR=/opt/opengnsys
+REPODIR="$BASEDIR/images"
+REPOLOG=$BASEDIR/log/ogAdmRepo.log
+# Cargamos los mensajes en el idioma del sistema.
+# Comprobamos que el fichero de idioma existe. Si no "es_ES" por defecto.
+ls $BASEDIR/client/etc/lang.$LANG.conf &>/dev/null
+[ $? -eq 0 ] || LANG="es_ES"
+
+source $BASEDIR/client/etc/lang.$LANG.conf
+
+PROG="$(basename $0)"
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ echo -e " $PROG: $MSG_HELP_ogUnmountImage \n" \
+ "$MSG_FORMAT: $PROG nombre_image [ img|diff ] \n" \
+ "base -> $PROG Windows7 \n" \
+ "diff -> $PROG Ubuntu12 diff"
+ exit 0
+fi
+
+[ $# -lt 1 ] && echo -e "$PROG: Error: $MSG_ERR_FORMAT \n $MSG_FORMAT: $PROG image [ img | diff ]" && exit 1
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+# Comprobamos que imagen la imagen esta montada
+MOUNTDIR="$REPODIR/mount/$1"
+if [ "$2" == "diff" ]; then
+ IMGEXT="diff"
+ MOUNTDIR="$MOUNTDIR.diff"
+else
+ IMGEXT="img"
+fi
+# Si la imaen no está montada me salgo
+df |grep "$MOUNTDIR$" 2>&1 >/dev/null || exit 0
+
+echo -ne UMOUNT_IMAGE "$1" $IMGEXT | /opt/opengnsys/sbin/ogAdmRepoAux
+echo "Los resultado se registran en $REPOLOG. "