286 lines
9.7 KiB
Bash
286 lines
9.7 KiB
Bash
#!/bin/bash
|
|
PARM=`cat`
|
|
#PARM=$@
|
|
|
|
|
|
#TODO: ticket 379
|
|
#buscar parametro de identificador de operacion.
|
|
#usar parametro de identificacion para anexarlo al nombre de log
|
|
#Comprobar si la variable está seteas.
|
|
#Si no lo está setearla.
|
|
#Si esta seteada (en progreso) salir.
|
|
|
|
|
|
TIME=$SECONDS
|
|
|
|
BASEDIR=/opt/opengnsys
|
|
PATH=$PATH:$BASEDIR/bin
|
|
REPONAME=ogAdmRepo
|
|
REPODIR="$BASEDIR/images/"
|
|
|
|
# Para las sincronizadas
|
|
# BACKUP: Define si se realiza copia de seguridad al crear una imagen (true|false).
|
|
# IMGFS: Sistema de ficheros al crear las sincronizadas tipo archivo (EXT4|BTRFS).
|
|
[ -z $OGENGINECONFIGURATE ] && source $BASEDIR/client/etc/engine.cfg
|
|
# FS segun la configuracion y la version del kernel. ext4 para < 3.7, para >= BTRFS
|
|
KERNEL=$(file -bkr /opt/opengnsys/tftpboot/ogclient/ogvmlinuz |awk '/Linux/ {for(i=1;i<=NF;i++) if($i~/version/) {v=$(i+1);printf("%d",v);sub(/[0-9]*\./,"",v);printf(".%02d",v)}}')
|
|
[ $KERNEL \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"}
|
|
|
|
# Añade registro de incidencias.
|
|
function echolog () {
|
|
logger --tag $0 --priority local0.info "$*"
|
|
echo "$*"
|
|
}
|
|
|
|
function mountImage () {
|
|
#@param 1 image_file
|
|
#@param 2 mount_dir
|
|
#@param 3 openciones mount
|
|
[ "$3" != "" ] && OPTMOUNT=" -o $3 "
|
|
# Si está montado nada que hacer
|
|
df |grep "$2$" 2>&1 >/dev/null && return 0
|
|
# FS de la imagen segun el contenido del archivo .img
|
|
if file "$1" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then
|
|
echolog "mount $OPTMOUNT -t ext4 $1 $2"
|
|
mount $OPTMOUNT -t ext4 $1 $2
|
|
else
|
|
echolog "mount $OPTMOUNT -o compress=lzo $1 $2"
|
|
mount $OPTMOUNT -o compress=lzo "$1" "$2"
|
|
fi
|
|
# Si esta montado da error 32, lo damos como bueno
|
|
RETVAL=$?
|
|
[ $RETVAL -eq 32 ] && RETVAL=0
|
|
return $RETVAL
|
|
}
|
|
|
|
|
|
PARM1=$(echo $PARM | cut -f1 -d" ")
|
|
PARM2=$(echo $PARM | cut -f2 -d" ")
|
|
PARM3=$(echo $PARM | cut -f3 -d" ")
|
|
PARM4=$(echo $PARM | cut -f4 -d" ")
|
|
|
|
# Determinamos el tipo de sistema de fichero de las imagenes segun el kernel que tenga
|
|
|
|
|
|
case "$PARM1" in
|
|
START_MULTICAST)
|
|
#1 START_MULTICAST
|
|
#2 fichero a enviar
|
|
#3 opciones de multicast
|
|
FILE="$PARM2"
|
|
MCASTOPT="$PARM3"
|
|
echolog "Ejecutar $(which sendFileMcast) $FILE $MCASTOPT"
|
|
sendFileMcast $FILE $MCASTOPT |logger --tag $0 --priority local0.info
|
|
case $? in
|
|
1) echolog "Parametros insuficientes"
|
|
exit 1 ;;
|
|
2) echolog "Fichero no accesible"
|
|
exit 2 ;;
|
|
3) echolog "Sesion multicast no valida"
|
|
exit 3 ;;
|
|
esac
|
|
;;
|
|
CREATE_IMAGE)
|
|
# Creamos/Redimensionamos el fichero de imagen y lo montamos para que se pueda escribir sobre el
|
|
#1 CREATE_IMAGE
|
|
#2 nombre imagen
|
|
#3 tipo de imagen [ img | diff ]
|
|
#4 tamaño imagen
|
|
LOOPDEVICE=$(losetup -f)
|
|
DIRMOUNT="$REPODIR/mount/$PARM2"
|
|
if [ "$PARM3" == "img" ] ; then
|
|
IMGEXT="img"
|
|
else
|
|
IMGEXT="img.diff"
|
|
DIRMOUNT="$DIRMOUNT.diff"
|
|
fi
|
|
IMGFILE="$REPODIR/$PARM2.$IMGEXT"
|
|
IMGDIR="$(dirname $IMGFILE)"
|
|
[ -d $IMGDIR ] || mkdir -p $IMGDIR
|
|
mkdir -p "$DIRMOUNT"
|
|
|
|
LOCKFILE="$IMGFILE.lock"
|
|
|
|
SIZEREQUIRED="$PARM4"
|
|
|
|
# Si existe la imagen hacemos copia de seguridad y la redimesionamos
|
|
if [ -f "$IMGFILE" ]; then
|
|
echolog "La imagen $IMGFILE ya existe."
|
|
# TODO modificar ogGetImageSize
|
|
IMGSIZE=$(ls -l --block-size=1024 $IMGFILE| cut -f5 -d" ")
|
|
|
|
if [ "$BACKUP" == "true" -o "$BACKUP" == "TRUE" -o $IMGSIZE -lt $SIZEREQUIRED ]; then
|
|
# Si la imagen esta montada la desmonto
|
|
if [ -r "$DIRMOUNT/ogimg.info" ]; then
|
|
echolog "umount $DIRMOUNT"
|
|
umount "$DIRMOUNT"
|
|
[ $? -ne 0 ] && echolog "Error: No podemos desmontar la imagen para hacer copia de seguridad o redimensionar" && exit 1
|
|
fi
|
|
fi
|
|
|
|
# Copia de seguridad de la imagen
|
|
if [ "$BACKUP" == "true" -o "$BACKUP" == "TRUE" ]; then
|
|
echolog "Copia de seguridad de la imagen anterior"
|
|
echolog "cp $IMGFILE $IMGFILE.ant"
|
|
cp "$IMGFILE" "$IMGFILE.ant"
|
|
echolog mv -f "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null
|
|
mv -f "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null
|
|
fi
|
|
|
|
# Redimensionamos la imagen al tamaño necesario
|
|
if [ $IMGSIZE -lt $SIZEREQUIRED ];then
|
|
echolog "Redimensionamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED"
|
|
echolog "truncate --size=\">$SIZEREQUIRED\"k $IMGFILE"
|
|
truncate --size=">$SIZEREQUIRED"k $IMGFILE 2>&1 |logger --tag $0 --priority local0.info
|
|
# FS de la imagen segun el contenido del archivo .img
|
|
if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then
|
|
losetup $LOOPDEVICE "$IMGFILE"
|
|
echolog "resize2fs -f $LOOPDEVICE"
|
|
resize2fs -f $LOOPDEVICE |logger --tag $0 --priority local0.info
|
|
else
|
|
mount -o compress=lzo "$IMGFILE" "$DIRMOUNT"
|
|
echolog "btrfs filesystem resize max $DIRMOUNT"
|
|
btrfs filesystem resize max "$DIRMOUNT" 2>&1 |logger --tag $0 --priority local0.info
|
|
fi
|
|
fi
|
|
|
|
|
|
# Si no existe la imagen creamos el fichero.
|
|
else
|
|
echolog "Creamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED"
|
|
touch "$IMGFILE"
|
|
echolog "truncate --size=\">$SIZEREQUIRED\"k $IMGFILE"
|
|
truncate --size=">$SIZEREQUIRED"k $IMGFILE 2>&1 |logger --tag $0 --priority local0.info
|
|
#Formateamos imagen
|
|
echo losetup $LOOPDEVICE "$IMGFILE"
|
|
losetup $LOOPDEVICE "$IMGFILE"
|
|
if [ $IMGFS == "EXT4" ] ; then
|
|
echolog " mkfs.ext4 -i 4096 -b 4096 -L ${PARM2##*\/} $LOOPDEVICE"
|
|
mkfs.ext4 -i 4096 -b 4096 -L ${PARM2##*\/} $LOOPDEVICE
|
|
else
|
|
echolog mkfs.btrfs -L ${PARM2##*\/} $LOOPDEVICE
|
|
mkfs.btrfs -L ${PARM2##*\/} $LOOPDEVICE #&> $OGLOGCOMMAND
|
|
fi
|
|
fi
|
|
# Montamos la imagen.
|
|
mountImage "$IMGFILE" "$DIRMOUNT"
|
|
if [ $? -ne 0 ]; then
|
|
rmdir "$DIRMOUNT"
|
|
echolog "Error al crear/redimensionar la imagen"
|
|
exit 1
|
|
fi
|
|
|
|
#touch "$DIRMOUNT/ogimg.info"
|
|
echo "mounted"> "$LOCKFILE"
|
|
TIME2=$[SECONDS-TIME]
|
|
echolog "Fin creación/redimension de la imagen: $[TIME2/60]m $[TIME2%60]s"
|
|
# Si existe dispositivo loop lo borramos.
|
|
[ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null && losetup -d $LOOPDEVICE
|
|
# TODO: comprobar que no se quede el losetup bloqueado.
|
|
|
|
;;
|
|
MOUNT_IMAGE)
|
|
# Montamos el fichero imagen para que se pueda
|
|
#1 MOUNT_IMAGE
|
|
#2 nombre imagen
|
|
#3 tipo de imagen [ img | diff ]
|
|
DIRMOUNT="$REPODIR""mount/$PARM2"
|
|
if [ "$PARM3" == "img" ] ; then
|
|
IMGEXT="img"
|
|
else
|
|
IMGEXT="img.diff"
|
|
DIRMOUNT="$DIRMOUNT.diff"
|
|
fi
|
|
IMGFILE="$REPODIR/$PARM2.$IMGEXT"
|
|
echolog "Montamos la imagen $IMGFILE "
|
|
mkdir -p "$DIRMOUNT"
|
|
mountImage "$IMGFILE" "$DIRMOUNT" ro || (echolog "Error al montar la imagen"; exit 1)
|
|
;;
|
|
UMOUNT_IMAGE)
|
|
# Desmontamos el fichero imagen.
|
|
# Si el directorio esta ocupado no se desmontará
|
|
#1 UMOUNT_IMAGE
|
|
#2 nombre imagen
|
|
#3 tipo de imagen [ img | diff ]
|
|
IMGTYPE="$PARM3"
|
|
DIRMOUNT="$REPODIR/mount/$PARM2"
|
|
if [ "$IMGTYPE" == "img" ]; then
|
|
IMGEXT="img"
|
|
else
|
|
DIRMOUNT="$DIRMOUNT.$IMGTYPE"
|
|
IMGEXT="img.diff"
|
|
fi
|
|
LOCKFILE="$REPODIR/$PARM2.$IMGEXT.lock"
|
|
echolog "Desmontamos la imagen $PARM2 $PARM3 "
|
|
umount $DIRMOUNT
|
|
rmdir $DIRMOUNT
|
|
[ -f $LOCKFILE ] && sed -i s/mounted//g $LOCKFILE
|
|
|
|
;;
|
|
REDUCE_IMAGE)
|
|
# Reduce el archivo de la imagen a tamaño datos + 500M
|
|
#1 REDUCE_IMAGE
|
|
#2 Nombre Imagen
|
|
#3 Tipo de imagen [ img |diff ]
|
|
DIRMOUNT="${REPODIR}mount/${PARM2}"
|
|
if [ "$PARM3" == "img" ] ; then
|
|
IMGEXT="img"
|
|
else
|
|
IMGEXT="img.diff"
|
|
DIRMOUNT="$DIRMOUNT.diff"
|
|
fi
|
|
IMGFILE="$REPODIR$PARM2.$IMGEXT"
|
|
LOCKFILE="$IMGFILE.lock"
|
|
[ ! -f $IMGFILE ] && echolog "Imagen $IMGFILE no existe" && exit 1
|
|
|
|
# Para imagenes EXT4 reduzco, para BTRFS solo desmonto.
|
|
if file $IMGFILE |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then
|
|
|
|
[ -d $DIRMOUNT ] || mkdir $DIRMOUNT
|
|
mountImage "$IMGFILE" "$DIRMOUNT" || (echolog "Error al montar la imagen $IMGFILE"; exit 1)
|
|
|
|
|
|
# Si el espacio libre menor que 200Mb desmontamos la imagen y nos salimos
|
|
AVAILABLE=$(df -k|grep $DIRMOUNT|awk '{print $4}')
|
|
if [ $AVAILABLE -lt 200000 ]; then
|
|
echolog "reducir imagen REPO $PARM2 $IMGEXT. tamaño minimo, nada que hacer"
|
|
umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1)
|
|
else
|
|
|
|
# Calculamos la diferencia entre el tamaño interno y externo
|
|
EXTSIZE=$(ls -l --block-size=1024 $IMGFILE | cut -f5 -d" ")
|
|
INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
|
|
let EDGESIZE=$EXTSIZE-$INTSIZE
|
|
|
|
echolog "reducir imagen REPO $PARM2 $IMGEXT, tamaño final: $ENDSIZE"
|
|
umount $DIRMOUNT
|
|
LOOPDEVICE=$(losetup -f)
|
|
losetup $LOOPDEVICE "$IMGFILE"
|
|
|
|
# Redimensiono sistema de ficheros
|
|
echolog "resize2fs -fpM $LOOPDEVICE "
|
|
resize2fs -fpM $LOOPDEVICE # 2>&1 |logger --tag $0 --priority local0.info
|
|
mountImage "$IMGFILE" "$DIRMOUNT"
|
|
# Calculamos el tamaño final del archivo
|
|
INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}')
|
|
let EXTSIZE=$INTSIZE+$EDGESIZE
|
|
umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1)
|
|
# Si existe dispositivo loop lo borramos.
|
|
[ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null && losetup -d $LOOPDEVICE
|
|
# Corto el archivo al tamaño del sistema de ficheros
|
|
echo "truncate --size=\"$EXTSIZE\"k $IMGFILE"
|
|
echolog "truncate --size=\"$EXTSIZE\"k $IMGFILE"
|
|
truncate --size="$EXTSIZE"k $IMGFILE
|
|
fi
|
|
else
|
|
umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1)
|
|
fi
|
|
rmdir $DIRMOUNT
|
|
echo "reduced" >$LOCKFILE
|
|
|
|
;;
|
|
default)
|
|
echolog "Solicitud con parametros \"$PARM\" no realizada, no registrada o con errores"
|
|
;;
|
|
esac
|