369 lines
11 KiB
Bash
369 lines
11 KiB
Bash
#!/bin/bash
|
|
#___________________________________________________________________
|
|
#
|
|
#@file ImagenesSincronizadas.lib
|
|
#@brief Librería o clase ImagenesSincronizadas
|
|
#@class ImagenesSincronizadas
|
|
#@brief Funciones para la creación y restauración de imagenes por sincronización.
|
|
#@version 1.0.4
|
|
#@warning License: GNU GPLv3+
|
|
#___________________________________________________________________
|
|
|
|
#Load engine configurator from engine.cfg file.
|
|
#Carga el configurador del engine desde el fichero engine.cfg
|
|
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
|
|
|
|
# Clear temporary file used as log track by httpdlog
|
|
# Limpia los ficheros temporales usados como log de seguimieincludento para httpdlog
|
|
echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.tmp
|
|
|
|
# Registro de inicio de ejecución
|
|
#echo "[START Interface ] Run this command: $0 $*" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
echo "$MSG_INTERFACE_START $0 $*" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
|
|
# Solo ejecutable por OpenGnsys Client.
|
|
PATH=$PATH:$(dirname $0)
|
|
PROG=$(basename $0)
|
|
|
|
#___________________________________________________________________
|
|
#
|
|
# Variables globales
|
|
#___________________________________________________________________
|
|
|
|
TIPOPARTICION="$(ogGetPartitionId $DISCO $NPART)"; # Tipo de particion
|
|
if [ -z $TIPOPARTICION ]; then
|
|
echo "No existe la partición $NPART, debe crearla" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
exit $OG_ERR_PARTITION
|
|
fi
|
|
|
|
PARTICION=$(ogMount $DISCO $NPART); # Monta partición
|
|
if [ -z $PARTICION ]; then
|
|
echo "No existe la unidad /dev/sda$NPART o no está formateada" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
exit $OG_ERR_PARTITION
|
|
fi
|
|
|
|
SISTEMAFICHERO="$(ogGetFsType $DISCO $NPART)" # Sistema de ficheros
|
|
if [ -z $SISTEMAFICHERO ]; then
|
|
echo "No se ha definido un sistema de fichero en la unidad /dev/sda$NPART. Debe formatearla previamente." | tee -a $OGLOGSESSION $OGLOGFILE
|
|
exit $OG_ERR_PARTITION
|
|
fi
|
|
|
|
REPOSITORIO="opengnsys@$IPREPOSITORIO::ogimages" # Ruta de las imagenes en el repositorio
|
|
|
|
FILE_ACL="ogwinimage.acl"
|
|
|
|
|
|
# Envío de archivo completo
|
|
OP_WHOLE="--whole"
|
|
if [ $WHLFILE -eq 0 ]; then
|
|
OP_WHOLE=""
|
|
fi
|
|
|
|
# Borrar archivos en destino
|
|
OP_DELETE="--delete"
|
|
if [ $NOBORRACHIVOS -eq 1 ]; then
|
|
OP_DELETE=""
|
|
fi
|
|
if [ $RMVFILE -eq 0 ]; then
|
|
OP_DELETE=""
|
|
fi
|
|
|
|
# Opción de compresión
|
|
OP_COMPRESS="-z"
|
|
if [ $CMPFILE -eq 0 ]; then
|
|
OP_COMPRESS=""
|
|
fi
|
|
|
|
#___________________________________________________________________
|
|
#
|
|
# Fichero con la clave remota del rsync para el parámetro
|
|
# "--password-file" para que no se pida ésta en el proceso.
|
|
#___________________________________________________________________
|
|
#
|
|
FILE_PASSWD="--password-file=/scripts/passrsync"
|
|
|
|
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: montaCache
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Monta la cache y devuelve la ruta hacía ella
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# Ninguno
|
|
#___________________________________________________________________
|
|
#
|
|
function montaCache()
|
|
{
|
|
# Error si no existe caché
|
|
if ! $(ogFindCache >/dev/null); then
|
|
echo ""
|
|
return
|
|
fi
|
|
cache=$(ogMountCache)
|
|
echo $cache
|
|
}
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: editarLista
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Edita lista de archivos a transferir para depurar lineas
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1 Lista de entrada
|
|
# $2 Lista de salida
|
|
#___________________________________________________________________
|
|
#
|
|
function editarLista()
|
|
{
|
|
# Edición:
|
|
# a) Quitarle lineas que contengan './'
|
|
# b) La primera linea (reporter del rsync)
|
|
# c) Las dos últimas lineas del final (reporter del rsync)
|
|
|
|
echo "Editando lista de archivos Entrada:$1 Salida:$2" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
cat $1 | sed '/\.\//d' | sed '1d' | sed -n -e :a -e '1,2!{P;N;D;};N;ba'>$2
|
|
|
|
# Otra forma
|
|
#sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGINFO
|
|
#sed -i '/^\.\//d' $IMGINFO
|
|
|
|
}
|
|
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: crearImagen
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Sincroniza archivos entre origen y destino. Al final del
|
|
# proceso el contenido de destino será igual al de origen.
|
|
# La creación de imagen siempre tiene lugar entre una partición
|
|
# y un repositorio como origen y destino respectivamente.
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1: Origen
|
|
# $2: Destino
|
|
# $3: Sistema de ficheros de la partición
|
|
# $4: Indica si la sincronización es local o remota
|
|
# 1: El origen o el destino es remoto
|
|
# 2: Tanto el origen como el destino son locales
|
|
# $5: Vale
|
|
# 1=Para crear la lista de archivos a transferir
|
|
# 2= Cuando se quiere sincronizar usando la lista
|
|
# $6: Path a la lista de archivos
|
|
#___________________________________________________________________
|
|
#
|
|
function crearImagen()
|
|
{
|
|
case "$3" in
|
|
NTFS)
|
|
OP_ARCHIVO="-aH"
|
|
rm "$1pagefile.sys"
|
|
#OP_EXCLUDE="--exclude 'pagefile.sys'"
|
|
;;
|
|
EXT2 | EXT3 | EXT4 )
|
|
OP_ARCHIVO="-alH"
|
|
OP_EXCLUDE="--exclude 'tmp' --exclude 'proc' --exclude 'sys'"
|
|
;;
|
|
esac
|
|
|
|
|
|
case "$4" in
|
|
1)
|
|
OP_PASSWD=$FILE_PASSWD
|
|
;;
|
|
2)
|
|
OP_PASSWD=""
|
|
;;
|
|
esac
|
|
|
|
FREG=$OGLOGCOMMAND # Por defecto se redirecciona al archivo de log de comandos
|
|
case "$5" in
|
|
1)
|
|
OP_ARCHIVO=$OP_ARCHIVO"nv" # Simulación para crear lista
|
|
FREG=$6
|
|
;;
|
|
2)
|
|
OP_FILELIST="--files-from=$6"
|
|
OP_ARCHIVO="$OP_ARCHIVO $OP_FILELIST"
|
|
;;
|
|
esac
|
|
|
|
echo "rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_EXCLUDE $OP_PASSWD $1 $2 " | tee -a $OGLOGSESSION $OGLOGFILE
|
|
rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_EXCLUDE $OP_PASSWD $1 $2>$FREG;
|
|
}
|
|
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: restaurarImagen
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Sincroniza archivos entre origen y destino. Al final del
|
|
# proceso el contenido de destino será igual al de origen.
|
|
# La restauración de imagen siempre tiene lugar entre la caché
|
|
# o un repositorio y una partición o carpeta como origen y destino
|
|
# respectivamente.
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1: Origen
|
|
# $2: Destino
|
|
# $3: Sistema de ficheros de la partición
|
|
# $4: Indica si la sincronización es local o remota
|
|
# 1: El origen o el destino es remoto
|
|
# 2: Tanto el origen como el destino son locales
|
|
#___________________________________________________________________
|
|
#
|
|
function restaurarImagen()
|
|
{
|
|
case "$3" in
|
|
NTFS)
|
|
OP_ARCHIVO="-aH"
|
|
;;
|
|
EXT2 | EXT3 | EXT4)
|
|
OP_ARCHIVO="-alH"
|
|
;;
|
|
esac
|
|
|
|
case "$4" in
|
|
1)
|
|
OP_PASSWD=$FILE_PASSWD
|
|
;;
|
|
2)
|
|
OP_PASSWD=""
|
|
;;
|
|
esac
|
|
|
|
echo "rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_PASSWD $1 $2" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
rsync $OP_ARCHIVO $OP_COMPRESS $OP_DELETE $OP_PASSWD $1 $2>$OGLOGCOMMAND;
|
|
}
|
|
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: crearListaAcl
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Crea la lista de control de archivos para el sistema operativo
|
|
# que ocupa la partición que se quiere clonar
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1: Origen
|
|
# $2: Destino
|
|
# $3: Sistema de ficheros de la partición
|
|
# $4: disco
|
|
# $5: partición
|
|
#___________________________________________________________________
|
|
#
|
|
function crearListaAcl()
|
|
{
|
|
case "$3" in
|
|
NTFS)
|
|
echo "Creando lista de control de acceso a ficheros para el sistema windows de la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
echo "Desmontando la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
ogUnmount $4 $5 | tee -a $OGLOGSESSION $OGLOGFILE
|
|
echo "Ejecutando comando ntfs-3g.secaudit -b /dev/sda$5 /" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
ntfs-3g.secaudit -b /dev/sda$5 / > /tmp/$FILE_ACL
|
|
echo "Montando de nuevo la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
ogMount $4 $5
|
|
echo "Copiando archivo de listas de control (ACL) desde /tmp/$FILE_ACL a $1." | tee -a $OGLOGSESSION $OGLOGFILE
|
|
cp /tmp/$FILE_ACL $1.
|
|
;;
|
|
esac
|
|
}
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: restauraListaAcl
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Restaura la lista de control de archivos para el sistema operativo
|
|
# que ocupa la partición que se quiere restaurar
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1: Origen
|
|
# $2: Destino
|
|
# $3: Sistema de ficheros de la partición
|
|
# $4: disco
|
|
# $5: partición
|
|
#___________________________________________________________________
|
|
#
|
|
function restauraListaAcl()
|
|
{
|
|
case "$3" in
|
|
NTFS)
|
|
echo "Restaurando lista de control de acceso a ficheros para el sistema windows de la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
echo "Copiando archivo de listas de control (ACL) desde $2$FILE_ACL a /tmp/." | tee -a $OGLOGSESSION $OGLOGFILE
|
|
cp $2$FILE_ACL /tmp/.
|
|
echo "Desmontando la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
ogUnmount $4 $5 | tee -a $OGLOGSESSION $OGLOGFILE
|
|
echo "Ejecutando comando ntfs-3g.secaudit -se /dev/sda$5 /" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
ntfs-3g.secaudit -se /dev/sda$5 /tmp/$FILE_ACL
|
|
echo "Montando de nuevo la particion $5" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
ogMount $4 $5
|
|
echo "Borrando archivo de listas de control (ACL) de $2$FILE_ACL" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
rm $2$FILE_ACL
|
|
;;
|
|
esac
|
|
}
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: eliminaListaAcl
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Elimina la lista de control de archivos creada temporalmente
|
|
# para el proceso de creación e imagen
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1: Origen
|
|
# $2: Sistema de ficheros de la partición
|
|
#___________________________________________________________________
|
|
#
|
|
function eliminaListaAcl()
|
|
{
|
|
case "$2" in
|
|
NTFS)
|
|
echo "Borrando archivo de listas de control (ACL) de $1$FILE_ACL" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
rm $1$FILE_ACL
|
|
;;
|
|
esac
|
|
}
|
|
#___________________________________________________________________
|
|
#
|
|
# Función: comprimeImagen
|
|
#
|
|
# Descripción:
|
|
#
|
|
# Comprimer la carpeta donde está se ha almacenado la imagen
|
|
# recientemente creada
|
|
#
|
|
# Parámetros:
|
|
#
|
|
# $1: Nombre de la imagen (Es el mismo que la carpeta que la alberga)
|
|
#___________________________________________________________________
|
|
#
|
|
function comprimeImagen()
|
|
{
|
|
TIME1=$SECONDS
|
|
RUTAIMG="/opt/opengnsys/images"
|
|
CARPETAIMAGEN=$RUTAIMG/$1
|
|
echo "Comprimiendo la imagen $1. Ruta de la imagen: $RUTAIMG" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
echo "find $CARPETAIMAGEN | cpio -H newc -oa | gzip -9c en $CARPETAIMAGEN.IMG" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
find $CARPETAIMAGEN | cpio -H newc -oa | gzip -9c > $CARPETAIMAGEN.IMG
|
|
TIME=$[SECONDS-TIME1]
|
|
echo "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" | tee -a $OGLOGSESSION $OGLOGFILE
|
|
}
|