summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2015-05-29 07:34:07 +0000
committerramon <ramongomez@us.es>2015-05-29 07:34:07 +0000
commitde687e3ba82883fa561b00bca0dbd0a73b6ee2d5 (patch)
tree617373349e83966c6914cb4f49980dcc0f90fc88 /client
parente589e1def0bea3c39e7691283a2ea13e170d84cd (diff)
#673: Integrar código de la versión 1.0.6 en rama principal.
git-svn-id: https://opengnsys.es/svn/trunk@4641 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client')
-rwxr-xr-xclient/boot-tools/boottoolsfunctions.lib15
-rw-r--r--client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions61
-rwxr-xr-xclient/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh3
-rw-r--r--client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic4
-rw-r--r--client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local14
-rwxr-xr-xclient/boot-tools/ogclientImg2Sqfs55
-rwxr-xr-xclient/boot-tools/ogclientSqfs2Img120
-rwxr-xr-xclient/engine/Boot.lib265
-rwxr-xr-xclient/engine/Disk.lib116
-rwxr-xr-xclient/engine/File.lib39
-rwxr-xr-xclient/engine/FileSystem.lib132
-rwxr-xr-xclient/engine/Image.lib71
-rwxr-xr-xclient/engine/Inventory.lib149
-rwxr-xr-xclient/engine/Net.lib44
-rwxr-xr-xclient/engine/PostConf.lib148
-rwxr-xr-xclient/engine/Protocol.lib99
-rwxr-xr-xclient/engine/Registry.lib16
-rwxr-xr-xclient/engine/Rsync.lib131
-rwxr-xr-xclient/engine/String.lib7
-rwxr-xr-xclient/engine/System.lib158
-rwxr-xr-xclient/shared/bin/rsync-3.1.0bin0 -> 1417064 bytes
-rw-r--r--client/shared/etc/engine.cfg13
-rwxr-xr-xclient/shared/etc/init/default.sh17
-rw-r--r--client/shared/etc/lang.ca_ES.conf14
-rw-r--r--client/shared/etc/lang.en_GB.conf10
-rw-r--r--client/shared/etc/lang.es_ES.conf15
-rwxr-xr-xclient/shared/etc/preinit/default.sh2
-rwxr-xr-xclient/shared/etc/preinit/loadenviron.sh2
-rwxr-xr-xclient/shared/etc/preinit/loadmodules.sh7
-rwxr-xr-xclient/shared/etc/preinit/metadevs.sh28
-rwxr-xr-xclient/shared/etc/preinit/mountrepo.sh25
-rwxr-xr-xclient/shared/scripts/cloneRemoteFromMaster65
-rwxr-xr-xclient/shared/scripts/configureOs116
-rw-r--r--client/shared/scripts/configureOsCustom.template28
-rwxr-xr-xclient/shared/scripts/createBaseImage48
-rwxr-xr-xclient/shared/scripts/createDiffImage56
-rwxr-xr-xclient/shared/scripts/createImage41
-rw-r--r--client/shared/scripts/createImageCustom.template35
-rw-r--r--client/shared/scripts/createImageCustomPost.template12
-rw-r--r--client/shared/scripts/createImageCustomPre.template11
-rwxr-xr-xclient/shared/scripts/deployImage84
-rwxr-xr-xclient/shared/scripts/generateMenuDefault13
-rwxr-xr-xclient/shared/scripts/initCache2
-rwxr-xr-xclient/shared/scripts/installOfflineMode60
-rwxr-xr-xclient/shared/scripts/ogRestaurarImagenBasica9
-rwxr-xr-xclient/shared/scripts/poweroff2
-rwxr-xr-xclient/shared/scripts/reboot3
-rwxr-xr-xclient/shared/scripts/restoreBaseImage16
-rwxr-xr-xclient/shared/scripts/restoreDiffImage28
-rwxr-xr-xclient/shared/scripts/restoreImage8
-rw-r--r--client/shared/scripts/restoreImageCustom.template34
-rwxr-xr-xclient/shared/scripts/updateCache36
52 files changed, 1850 insertions, 637 deletions
diff --git a/client/boot-tools/boottoolsfunctions.lib b/client/boot-tools/boottoolsfunctions.lib
index d27aea3d..d0ede9cd 100755
--- a/client/boot-tools/boottoolsfunctions.lib
+++ b/client/boot-tools/boottoolsfunctions.lib
@@ -51,6 +51,7 @@ case "${1,,}" in
OSDISTRIB="ubuntu"
OSCODENAME="precise"
OSRELEASE="3.2.0-23-generic"
+ #OSRELEASE="3.11.0-26-generic"
OSARCH="i386"
OSHTTP="http://es.archive.ubuntu.com/ubuntu/"
;;
@@ -365,8 +366,18 @@ function btogIsoGenerator {
btogGetVar
#Preparamos los gestores de arranque
mkdir -p /tmp/iso/isolinux
-cp -prv /usr/lib/syslinux/* /tmp/iso/isolinux/
-cp -prv /usr/share/gpxe/* /tmp/iso/isolinux/
+cp -av /usr/lib/syslinux/* /tmp/iso/isolinux/
+cp -av /usr/share/gpxe/* /tmp/iso/isolinux/
+
+# Si existe isolinux/gpxe.iso, montarlo para extraer isolinux.bin.
+if [ -f /tmp/iso/isolinux/gpxe.iso ]; then
+ mkdir -p /tmp/iso/isolinux/mount
+ mount -o loop /tmp/iso/isolinux/gpxe.iso /tmp/iso/isolinux/mount
+ cp -va /tmp/iso/isolinux/mount/* /tmp/iso/isolinux
+ umount /tmp/iso/isolinux/mount
+ rmdir /tmp/iso/isolinux/mount
+ rm -f /tmp/iso/isolinux/gpxe.iso
+fi
cat << FIN > /tmp/iso/isolinux/isolinux.cfg
DEFAULT menu.c32
diff --git a/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions b/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions
index 1870dcaf..991ec890 100644
--- a/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions
+++ b/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions
@@ -74,6 +74,8 @@ ogExportVarEnvironment ()
{
export CFGINITRD="/tmp/initrd.cfg"
OGPROTOCOL="${ogprotocol:-smb}"
+ # OPTIONS Para samba y local (a nfs no le afecta)
+ export OPTIONS=" -o user=opengnsys,pass=og"
case "$OGPROTOCOL" in
nfs|NFS)
export SRCOGLIVE="/var/lib/tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD
@@ -82,14 +84,17 @@ ogExportVarEnvironment ()
export SRCOGIMAGES="/opt/opengnsys/images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
;;
smb|SMB|cifs|CIFS|samba|SAMBA)
- export OPTIONS=" -o user=opengnsys,pass=og"
export SRCOGLIVE="tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD
export SRCOGSHARE="ogclient" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
export SRCOGLOG="oglog" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
export SRCOGIMAGES="ogimages" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
;;
local|LOCAL)
+ # Ponemos variables SRC compatibles con smb y nfs.
export SRCOGLIVE="local"
+ export SRCOGSHARE="client" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD
+ export SRCOGLOG="log" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD
+ export SRCOGIMAGES="images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD
;;
esac
#punto de acceso al boot-tools live
@@ -214,8 +219,39 @@ ogPostConfigureFS()
#enlace si iniciamos desde ogprotocolo=local { cdrom, usb, cache } .
# monta el raiz del dispositivo local en /opt/og2fs/tftpboot - acceso al fichero .sqfs
# y monta el sistema root sqfs en /opt/og2fs/2ndfs
- [ "$LOCALMEDIA" == "CACHE" ] && ln -s $DSTOGLIVE /opt/opengnsys/cache
- [ "$ogprotocol" == "local" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
+ #[ "$LOCALMEDIA" == "CACHE" ] && ln -s $DSTOGLIVE /opt/opengnsys/cache
+ #[ "$ogprotocol" == "local" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
+ if [ "$ogprotocol" == "local" ]; then
+ # Creamos los subdirectorios de /opt/opengnsys/
+ [ "$ogstatus" == "offline" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/
+ # Montamos CACHE
+ # Si existe particion identificada como CACHE se monta.
+ DEVICECACHE=$(blkid -L "CACHE")
+ if [ "$DEVICECACHE" != "" ]; then
+ # Se monta diferente segun el dispositivo de cache igual o no al de ogclient.
+ DEVICEOGLIVE=$(df |grep $DSTOGLIVE|awk '{print $1}')
+ if [[ "$DEVICECACHE" == "*$DEVICEOGLIVE*" ]];then
+ mount --bind $DSTOGLIVE /opt/opengnsys/cache
+ else
+ mount $DEVICECACHE /opt/opengnsys/cache
+ fi
+ if [ "$ogstatus" == "offline" ]; then
+ [ -d /opt/opengnsys/cache/log ] || mkdir /opt/opengnsys/cache/log
+ mount --bind /opt/opengnsys/cache/log /opt/opengnsys/log
+ fi
+ fi
+ # Montamos REPO
+ if [ "$ogstatus" == "offline" ]; then
+ # Si estatus distinto de online buscamos un dispositivo con etiqueta repo
+ # y si no existe montamos la cache como repo (si existe).
+ TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \")
+ if [ "$TYPE" == "" ]; then
+ [ -d "/opt/opengnsys/cache$DSTOGIMAGES" ] && mount --bind /opt/opengnsys/cache$DSTOGIMAGES $DSTOGIMAGES
+ else
+ mount -t $TYPE LABEL=REPO $DSTOGIMAGES &>/dev/null
+ fi
+ fi
+ fi
#Montamos un directorio temporal para el apt-get
mount tmpfs /var/cache/apt/archives -t tmpfs -o size=15M
@@ -361,6 +397,17 @@ ogConnect ()
smb)
mount.cifs //${SERVER}/${SRC} ${DST} ${OPTIONS}${READONLY}
;;
+ local)
+ # Comprobamos que estatus sea online y que la variable del server no esta vacia.
+ if [ "$ogstatus" != "offline" -a "$SERVER" != "" -a "$SRC" != "" ]; then
+ # Comprobamos que existe un servicio de samba.
+ smbclient -L $SERVER -N &>/dev/null
+ if [ $? -eq 0 ]; then
+ mount.cifs //${SERVER}/og${SRC} ${DST} ${OPTIONS}${READONLY}
+ fi
+ # TODO: buscar condicion para NFS
+ fi
+ ;;
esac
}
@@ -387,11 +434,11 @@ ogConnectOgLive ()
then
# Si local es particion CACHE es identificada como CACHE
mount LABEL=CACHE $DSTOGLIVE
- export LOCALMEDIA=CACHE
+ #export LOCALMEDIA=CACHE
fi
else
-# Si ogprotocol es remoto. TODO en smb rw y en nfs ro??
- ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE
+ # Si ogprotocol es remoto. TODO en smb rw y en nfs ro??
+ ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE
fi
# Si el montaje ha sido correcto, tanto en local como en remoto. Procedemos con la union
ogMergeLive
@@ -612,6 +659,8 @@ done
if [ -n "${DEVICE}" ]; then
export DEVICE
export DEVICECFG="/run/net-${DEVICE}.conf"
+ # En algunos casos, el fichero de configuración está en /tmp.
+ [ ! -f $DEVICECFG -a -f ${DEVICECFG/run/tmp} ] && mv ${DEVICECFG/run/tmp} $DEVICECFG
source $DEVICECFG
echo "DEVICE=$DEVICE" >> $CFGINITRD
echo "DEVICECFG=$DEVICECFG" >> $CFGINITRD
diff --git a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh
index 17437b56..70207cae 100755
--- a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh
+++ b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh
@@ -48,7 +48,8 @@ if [ "$OSRELEASE" == "3.7.6-030706-generic" ]; then
rm -fr /tmp/kernel
else
# Instalar Kernel del repositorio de paquetes.
- apt-get -y --force-yes install linux-image-${OSRELEASE} linux-image-extra-${OSRELEASE} linux-headers-${OSRELEASE}
+ apt-get -y --force-yes install linux-image-${OSRELEASE} linux-headers-${OSRELEASE}
+ apt-get -y --force-yes install linux-image-extra-${OSRELEASE} 2>/dev/null
fi
diff --git a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic
index 1dd2ac6a..7708c146 100644
--- a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic
+++ b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic
@@ -13,6 +13,8 @@ install gawk
install subversion
install python-openssl
install python
+install php5-cli
install dmidecode
-#install hwinfo
install realpath
+install rpm
+install sqlite3
diff --git a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local
index 2978f409..ab9aca8b 100644
--- a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local
+++ b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local
@@ -2,7 +2,6 @@
install squashfs-tools
install unionfs-fuse
install drbl-ntfsprogs
-#install ntfsprogs
install ntfs-3g
install dosfstools
install fatresize
@@ -22,9 +21,10 @@ install hfsprogs
install hfsutils
install nilfs-tools
install ufsutils
-#install ubuntu-zfs
-install zfs-fuse
-install android-tools-adb
-install android-tools-fastboot
-install android-tools-fsutils
-install f2fs-tools
+install vmfs-tools
+install ubuntu-zfs
+# Solo en ogLive basado en Ubuntu 14.04
+#install android-tools-adb
+#install android-tools-fastboot
+#install android-tools-fsutils
+#install f2fs-tools
diff --git a/client/boot-tools/ogclientImg2Sqfs b/client/boot-tools/ogclientImg2Sqfs
new file mode 100755
index 00000000..5dfb2b00
--- /dev/null
+++ b/client/boot-tools/ogclientImg2Sqfs
@@ -0,0 +1,55 @@
+#!/bin/bash
+#/**
+#@brief Comprime el fichero ogclient.img en ogclient.sqfs.
+#@param none
+#@exeption 1 No es usuario root
+#@exeption 2 No existe el fichero ogclient.img
+#@date 2013-11.27
+#*/
+PROG="$(basename $0)"
+# Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2.
+if [ "$*" == "help" ]; then
+ echo -e "$PROG: Comprime el fichero ogclient.img en ogclient.sqfs. \n"
+ " Uso: $PROG (sin parametros)"
+ exit 0
+fi
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+
+DATE=$(date +%y-%m-%d)
+OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
+OGCLIENTBASEDIR=$OPENGNSYS/tftpboot/ogclient/;
+OGCLIENTFILE=${OGCLIENTBASEDIR}ogclient.img;
+OGCLIENTSQFS=${OGCLIENTBASEDIR}ogclient.sqfs
+OGCLIENTMOUNT=${OGCLIENTBASEDIR}ogclientmount;
+OGCLIENTSIZEMB=1900;
+OGCLIENTLABEL=ogClient;
+
+# Comprobamos que existe el cliente .sqfs
+! [ -f $OGCLIENTFILE -a -d $OGCLIENTMOUNT ] && echo "No existe $OGCLIENTFILE o $OGCLIENTMOUNT" && exit 3
+# Montamos ogclient.img.
+echo "Montamos ogclient.img."
+mkdir -p $OGCLIENTMOUNT;
+mount | grep $OGCLIENTMOUNT || mount $OGCLIENTFILE $OGCLIENTMOUNT -o loop,offset=32256;
+
+# Si existe ogclient.sqfs hacemos copia de seguridad.
+echo "Si existe ogclient.sqfs hacemos copia de seguridad."
+[ -f ${OGCLIENTSQFS} ] && mv ${OGCLIENTSQFS} ${OGCLIENTSQFS}.$DATE
+
+# Comprimimos el cliente.
+echo "Comprimimos el cliente."
+echo "mksquashfs $OGCLIENTMOUNT ${OGCLIENTSQFS}"
+mksquashfs $OGCLIENTMOUNT ${OGCLIENTSQFS}
+
+# Desmontamos el ogclient.img
+echo "Desmontamos el ogclient.img"
+umount $OGCLIENTMOUNT
+
+# Generamos nuevo archivo de suma de comprobación.
+echo "Generamos nuevo archivo de suma de comprobacion."
+mv ${OGCLIENTSQFS}.sum ${OGCLIENTSQFS}.sum.$DATE
+md5sum ${OGCLIENTSQFS} |awk '{print $1}' >${OGCLIENTSQFS}.sum
diff --git a/client/boot-tools/ogclientSqfs2Img b/client/boot-tools/ogclientSqfs2Img
new file mode 100755
index 00000000..4f8447da
--- /dev/null
+++ b/client/boot-tools/ogclientSqfs2Img
@@ -0,0 +1,120 @@
+#!/bin/bash
+#/**
+#@brief Descomprime el fichero ogclient.sqfs en ogclient.img con un formato donde podemos escribir.
+#@param none
+#@note Copiado del wiki: http://opengnsys.es/wiki/ClienteInitrdDSGenerarlo
+#@note para "entrar" en ogclient: schroot -c ogclient.img o mount ogclient.img ogclientmount -o loop,offset=32256
+#@exeption 1 No es usuario root
+#@exeption 2 No existe el fichero ogclient.sqfs
+#@date 2013-11.27
+#*/
+PROG="$(basename $0)"
+# Mostrar ayuda si se solicita.
+if [ "$*" == "help" ]; then
+ echo -e "$PROG: Descomprime el fichero ogclient.sqfs en ogclient.img con un formato donde podemos escribir. \n" \
+ " Uso: $PROG (sin parametros)"
+ exit 0
+fi
+
+if [ "$USER" != "root" ]; then
+ echo "$PROG: Error: solo ejecutable por root" >&2
+ exit 1
+fi
+
+
+
+DATE=$(date +%y-%m-%d)
+OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"}
+OGCLIENTBASEDIR=$OPENGNSYS/tftpboot/ogclient/;
+OGCLIENTSQFS=${OGCLIENTBASEDIR}ogclient.sqfs
+OGCLIENTFILE=${OGCLIENTBASEDIR}ogclient.img;
+OGCLIENTMOUNT=${OGCLIENTBASEDIR}ogclientmount;
+OGCLIENTSIZEMB=1900;
+OGCLIENTLABEL=ogClient;
+
+# Comprobamos que existe el cliente .sqfs
+! [ -f $OGCLIENTSQFS ] && echo "No existe $OGCLIENTSQFS" && exit 3
+
+# instalamos los paquetes necesarios.
+echo "Si no existen, instalamos los paquetes necesarios: squashfs-tools schroot."
+if ! which schroot unsquashfs 2>&1 >/dev/null; then
+ apt-get update
+ apt-get -y install squashfs-tools schroot
+fi
+
+# Creamos el archivo.
+echo -e "\nCreamos el archivo."
+echo dd if=/dev/zero of=$OGCLIENTFILE bs=1048576 count=$OGCLIENTSIZEMB;
+dd if=/dev/zero of=$OGCLIENTFILE bs=1048576 count=$OGCLIENTSIZEMB;
+DISKLOOP=$(losetup -f);
+losetup $DISKLOOP $OGCLIENTFILE;
+echo -e "n\np\n1\n\n\nt\n83\nw" | fdisk $DISKLOOP;
+losetup -d $DISKLOOP ;
+
+# Creamos el sistema de ficheros.
+echo "Creamos el sistema de ficheros."
+echo "mkfs.ext4 -b 4096 -L $OGCLIENTLABEL $PARTLOOP"
+PARTLOOP=$(losetup -f);
+losetup -o 32256 $PARTLOOP $OGCLIENTFILE && mkfs.ext4 -b 4096 -L $OGCLIENTLABEL $PARTLOOP;
+losetup -d $PARTLOOP ;
+
+# Descomprimimos el ogclient.sqfs en el sistema de ficheros.
+mkdir -p $OGCLIENTMOUNT;
+echo "Descomprimimos el ogclient.sqfs en el sistema de ficheros."
+mount | grep $OGCLIENTMOUNT || mount $OGCLIENTFILE $OGCLIENTMOUNT -o loop,offset=32256;
+echo "unsquashfs -d ${OGCLIENTMOUNT}/ -f $OGCLIENTSQFS"
+unsquashfs -d ${OGCLIENTMOUNT}/ -f $OGCLIENTSQFS
+umount $OGCLIENTMOUNT;
+
+# Creamos los archivos de configuracion de schroot.
+echo "Creamos los archivos de configuracion de schroot."
+cp /etc/schroot/schroot.conf /etc/schroot/schroot.conf.$DATE
+cat << EOF > /etc/schroot/schroot.conf
+[ogclient.img]
+type=loopback
+file=${OGCLIENTBASEDIR}ogclient.img
+description=ogclient ubuntu luc IMGi
+#priority=1
+users=root
+groups=root
+root-groups=root
+mount-options=-o offset=32256
+root-users=root
+#[DIRogclient]
+#type=directory
+#directory=${OGCLIENTBASEDIR}ogclientmount
+#description=ogclient ubuntu lucid DIR
+#priority=2
+#users=root
+#groups=root
+#root-groups=root
+#root-users=root
+EOF
+
+cp /etc/schroot/mount-defaults /etc/schroot/mount-defaults.$DATE
+cat << EOF > /etc/schroot/mount-defaults
+# mount.defaults: static file system information for chroots.
+# Note that the mount point will be prefixed by the chroot path
+# (CHROOT_PATH)
+#
+# <file system> <mount point> <type> <options> <dump> <pass>
+proc /proc proc defaults 0 0
+#procbususb /proc/bus/usb usbfs defaults 0 0
+/dev /dev none rw,bind 0 0
+/dev/pts /dev/pts none rw,bind 0 0
+/dev/shm /dev/shm none rw,bind 0 0
+#/home /home none rw,bind 0 0
+/tmp /tmp none rw,bind 0 0
+EOF
+
+# Si existen dispositivos loop los eliminamos.
+echo "Si existen dispositivos loop los eliminamos."
+LOOPDEVICES=$(losetup -a|grep $OGCLIENTFILE |cut -d: -f1)
+for DEVICE in $LOOPDEVICES
+do
+ echo "losetup -d $DEVICE"
+ losetup -d $DEVICE
+done
+
+echo -e "Para \"entrar\" en ogclient: \n \t schroot -c ogclient.img o \n \t mount ogclient.img ogclientmount -o loop,offset=32256"
+echo "El servicio schroot montará el cliente automaticamente, si no queremos que pase hay que apagarlo."
diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib
index a32e7720..ea3badb7 100755
--- a/client/engine/Boot.lib
+++ b/client/engine/Boot.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase Boot
#@class Boot
#@brief Funciones para arranque y post-configuración de sistemas de archivos.
-#@version 1.0.5
+#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
@@ -29,6 +29,9 @@
#@version 1.0.4 - Soporta modo de arranque Windows (parámetro de inicio "winboot").
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2012-04-12
+#@version 1.0.6 - Selección a partir de tipo de sistema operativo (en vez de S.F.).
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-08-28
#*/ ##
function ogBoot ()
{
@@ -46,30 +49,37 @@ fi
# Detectar tipo de sistema de archivos y montarlo.
PART=$(ogDiskToDev $1 $2) || return $?
-TYPE=$(ogGetFsType $1 $2) || return $?
+TYPE=$(ogGetOsType $1 $2) || return $?
# Error si no puede montar sistema de archivos.
MNTDIR=$(ogMount $1 $2) || return $?
case "$TYPE" in
- EXT[234]|REISERFS|REISER4|JFS|XFS)
+ Linux|Android)
# Obtiene los parámetros de arranque para Linux.
- PARAMS=$(ogLinuxBootParameters $1 $2) || return $?
+ PARAMS=$(ogLinuxBootParameters $1 $2)
+ # Si no existe, buscar sistema de archivo /boot en /etc/fstab.
+ if [ -z "$PARAMS" -a -e $MNTDIR/etc/fstab ]; then
+ # Localizar S.F. /boot en /etc/fstab del S.F. actual.
+ PART=$(ogDevToDisk $(awk '$2=="/boot" {print $1}' $MNTDIR/etc/fstab))
+ # Buscar los datos de arranque.
+ PARAMS=$(ogLinuxBootParameters $PART) || exit $?
+ fi
read -e KERNEL INITRD APPEND <<<"$PARAMS"
# Si no hay kernel, no hay sistema operativo.
- [ -n "$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS || return $?
+ [ -n "$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $?
# Arrancar de partición distinta a la original.
[ -e "$MNTDIR/etc" ] && APPEND=$(echo $APPEND | awk -v P="$PART " '{sub (/root=[-+=_/a-zA-Z0-9]* /,"root="P);print}')
# Configurar kernel Linux con los parámetros leídos de su GRUB.
kexec -l "${MNTDIR}${KERNEL}" --append="$APPEND" --initrd="${MNTDIR}${INITRD}"
kexec -e &
;;
- NTFS|HNTFS|FAT32|HFAT32)
+ Windows|WinLoader)
# Compruebar si hay un cargador de Windows.
for f in io.sys ntldr bootmgr; do
FILE="$(ogGetPath $1 $2 $f 2>/dev/null)"
[ -n "$FILE" ] && LOADER="$f"
done
- [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS || return $?
+ [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $?
if [ "$winboot" == "kexec" ]; then
# Modo de arranque en caliente (con kexec).
cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen)
@@ -89,7 +99,17 @@ case "$TYPE" in
reboot
fi
;;
- *) ogRaiseError $OG_ERR_PARTITION "$1, $2"
+ MacOS)
+ # Modo de arranque por reinicio.
+ # Nota: el cliente tiene que tener configurado correctamente Grub.
+ touch ${MNTDIR}/boot.mac &>/dev/null
+ reboot
+ ;;
+ GrubLoader)
+ # Reiniciar.
+ reboot
+ ;;
+ *) ogRaiseError $OG_ERR_NOTOS "$1 $2 ${TYPE:+($TYPE)}"
return $?
;;
esac
@@ -150,11 +170,14 @@ ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerN
#@version 1.0.5 - Mejoras en tratamiento de GRUB2.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-05-14
+#@version 1.0.6 - Detectar instalaciones sobre EFI.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-09-15
#*/ ##
function ogLinuxBootParameters ()
{
# Variables locales.
-local MNTDIR CONFDIR CONFFILE
+local MNTDIR CONFDIR CONFFILE f
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -169,13 +192,12 @@ fi
MNTDIR=$(ogMount $1 $2) || return $?
# Fichero de configuración de GRUB.
-CONFDIR=$MNTDIR # Partición de arranque /boot.
-[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot # Partición raíz con directorio boot.
-CONFFILE="$CONFDIR/grubPARTITION/boot/grub/grub.cfg"
-[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub/menu.lst"
-[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub/grub.cfg"
-[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub2/grub.cfg"
-[ -e $CONFFILE ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $?
+CONFDIR=$MNTDIR # Sistema de archivos de arranque (/boot).
+[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot # Sist. archivos raíz con directorio boot.
+for f in $MNTDIR/{,grubPARTITION/}{,boot/}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg,grub.cfg.backup.og}; do
+ [ -r $f ] && CONFFILE=$f
+done
+[ -n "$CONFFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $?
# Toma del fichero de configuracion los valores del kernel, initrd
# y parámetros de arranque usando las cláusulas por defecto
@@ -184,15 +206,16 @@ CONFFILE="$CONFDIR/grubPARTITION/boot/grub/grub.cfg"
# /* (comentario Doxygen)
awk 'BEGIN {cont=-1;}
$1~/^default$/ {sub(/=/," "); def=$2;}
- $1~/^set$/ && $2~/^default$/ {gsub(/[="]/," "); def=$3;
+ $1~/^set$/ && $2~/^default/ { gsub(/[="]/," "); def=$3;
if (def ~ /saved_entry/) def=0;
- }
+ }
$1~/^(title|menuentry)$/ {cont++}
- $1~/^(kernel|linux)$/ {if (def==cont) {
- kern=$2;
- sub($1,"");sub($1,"");sub(/^[ \t]*/,"");app=$0} # /* (comentario Doxygen)
- }
- $1~/^initrd$/ {if (def==cont) init=$2}
+ $1~/^(kernel|linux(efi)?)$/ { if (def==cont) {
+ kern=$2;
+ sub($1,""); sub($1,""); sub(/^[ \t]*/,""); app=$0
+ } # /* (comentario Doxygen)
+ }
+ $1~/^initrd(efi)?$/ {if (def==cont) init=$2}
END {if (kern!="") printf("%s %s %s", kern,init,app)}
' $CONFFILE
# */ (comentario Doxygen)
@@ -966,3 +989,199 @@ MNTDIR=$(ogMount $1 $2) || return $?
rm -f ${MNTDIR}/etc/udev/rules.d/70-persistent-net.rules
}
+#/**
+# ogGrubAddOgclient num_disk num_part [ timeout ] [ offline ]
+#@brief Crea entrada de menu grub para ogclient, tomando como paramentros del kernel los actuales del cliente.
+#@param 1 Numero de disco
+#@param 2 Numero de particion
+#@param 3 timeout Segundos de espera para iniciar el sistema operativo por defecto (opcional)
+#@param 4 offline configura el modo offline [offline|online] (opcional)
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND No existe kernel o initrd en cache.
+#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub.
+# /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
+#*/
+
+ogGrubAddOgclient () {
+ local TIMEOUT DIRMOUNT GRUBGFC PARTTABLETYPE NUMDISK NUMPART KERNEL STATUS NUMLINE MENUENTRY
+
+ # Si se solicita, mostrar ayuda.
+ if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [ time_out ] [ offline|online ] " \
+ "$FUNCNAME 1 1" \
+ "$FUNCNAME 1 6 15 offline"
+ return
+ fi
+
+ # Error si no se reciben 2 parámetros.
+ [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part [ timeout ]"; echo $?)
+ [[ "$3" =~ ^[0-9]*$ ]] && TIMEOUT="$3"
+
+ # Error si no existe el kernel y el initrd en la cache.
+ # Falta crear nuevo codigo de error.
+ [ -r $OGCAC/boot/ogvmlinuz -a -r $OGCAC/boot/oginitrd.img ] || return $(ogRaiseError log session OG_ERR_NOTFOUND "CACHE: ogvmlinuz, oginitrd.img" 1>&2; echo ?)
+
+ # Archivo de configuracion del grub
+ DIRMOUNT=$(ogMount $1 $2)
+ GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg"
+
+ # Error si no existe archivo del grub
+ [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?)
+
+ # Si existe la entrada de opengnsys nos salimos.
+ grep "menuentry Opengnsys" $GRUBGFC &>/dev/null && return 0
+
+ # Tipo de tabla de particiones
+ PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:])
+
+ # Localizacion de la cache
+ read NUMDISK NUMPART <<< $(ogFindCache)
+ let NUMDISK=$NUMDISK-1
+ # kernel y sus opciones. Pasamos a modo usuario
+ KERNEL="/boot/ogvmlinuz $(sed -e s/^.*linuz//g -e s/ogactiveadmin=true/ogactiveadmin=false/g /proc/cmdline)"
+
+ # Configuracion offline si existe parametro
+ echo "$@" |grep offline &>/dev/null && STATUS=offline
+ echo "$@" |grep online &>/dev/null && STATUS=online
+ [ -z "$STATUS" ] || KERNEL="$(echo $KERNEL | sed s/"ogprotocol=[a-z]* "/"ogprotocol=local "/g ) ogstatus=$STATUS"
+
+ # Numero de línea de la primera entrada del grub.
+ NUMLINE=$(grep -n -m 1 "^menuentry" $GRUBGFC|cut -d: -f1)
+ # Texto de la entrada de opengnsys
+MENUENTRY="menuentry "Opengnsys" --class gnu-linux --class gnu --class os { \n \
+\tinsmod part_$PARTTABLETYPE \n \
+\tinsmod ext2 \n \
+\tset root='(hd${NUMDISK},$PARTTABLETYPE${NUMPART})' \n \
+\tlinux $KERNEL \n \
+\tinitrd /boot/oginitrd.img \n \
+}"
+
+
+ # Insertamos la entrada de opengnsys antes de la primera entrada existente.
+ sed -i "${NUMLINE}i\ $MENUENTRY" $GRUBGFC
+
+ # Ponemos que la entrada por defecto sea la primera.
+ sed -i s/"set.*default.*$"/"set default=\"0\""/g $GRUBGFC
+
+ # Si me dan valor para timeout lo cambio en el grub.
+ [ $TIMEOUT ] && sed -i s/timeout=.*$/timeout=$TIMEOUT/g $GRUBGFC
+}
+
+
+#/**
+# ogGrubHidePartitions num_disk num_part
+#@brief Configura el grub para que oculte las particiones de windows que no se esten iniciando.
+#@param 1 Numero de disco
+#@param 2 Numero de particion
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception No existe archivo de configuracion del grub.
+#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
+#*/
+function ogGrubHidePartitions {
+ local DIRMOUNT GRUBGFC PARTTABLETYPE WINENTRY ENTRY TEXT ENTRY2 LINE2 PART2 HIDDEN
+
+ # Si se solicita, mostrar ayuda.
+ if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 6"
+ return
+ fi
+
+ # Error si no se reciben 2 parámetros.
+ [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?)
+
+ # Archivo de configuracion del grub
+ DIRMOUNT=$(ogMount $1 $2)
+ GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg"
+
+ # Error si no existe archivo del grub
+ [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?)
+
+ # Si solo hay una entrada de Windows me salgo
+ [ $(grep -n "menuentry.*Windows" $GRUBGFC |wc -l) -eq 1 ] && return 0
+
+ # Elimino llamadas a parttool, se han incluido en otras ejecuciones de esta funcion.
+ sed -i '/parttool/d' $GRUBGFC
+
+ PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:])
+
+ # Entradas de Windows: numero de linea y particion. De mayor a menor.
+ WINENTRY=$(awk '/menuentry.*Windows/ { gsub(/\/dev\/sda/,""); gsub(/\)\"/, ""); print NR":"$6} ' $GRUBGFC | sed '1!G;h;$!d' )
+ # Modifico todas las entradas de Windows.
+ for ENTRY in $WINENTRY; do
+ LINE=${ENTRY%:*}
+ # En cada entrada, oculto o muestro cada particion.
+ TEXT=""
+ for ENTRY2 in $WINENTRY; do
+ LINE2=${ENTRY2%:*}
+ PART2=${ENTRY2#*:}
+ # Muestro solo la particion de la entrada actual.
+ [ $LINE2 -eq $LINE ] && HIDDEN="-" || HIDDEN="+"
+
+ TEXT="\tparttool (hd0,$PARTTABLETYPE$PART2) hidden$HIDDEN \n$TEXT"
+ done
+
+ sed -i "${LINE}a\ $TEXT" $GRUBGFC
+ done
+
+ # Activamos la particion que se inicia en todas las entradas de windows.
+ sed -i "/chainloader/i\\\tparttool \$\{root\} boot+" $GRUBGFC
+
+}
+
+#/**
+# ogGrubDeleteEntry num_disk num_part num_part_delete
+#@brief Borra en el grub las entradas para el inicio en una particion.
+#@param 1 Numero de disco donde esta el grub
+#@param 2 Numero de particion donde esta el grub
+#@parm 3 Numero de la particion de la que borramos las entradas
+#@return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception No existe archivo de configuracion del grub.
+#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos.
+#*/
+
+
+function ogGrubDeleteEntry {
+ local DIRMOUNT GRUBGFC MENUENTRY DELETEENTRY ENDENTRY ENTRY
+
+ # Si se solicita, mostrar ayuda.
+ if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_npartition_delete" \
+ "$FUNCNAME 1 6 2"
+ return
+ fi
+
+ # Error si no se reciben 3 parámetros.
+ [ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?)
+
+ # Archivo de configuracion del grub
+ DIRMOUNT=$(ogMount $1 $2)
+ GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg"
+
+ # Error si no existe archivo del grub)
+ [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC"; echo $?)
+
+ # Numero de linea de cada entrada, de mayor a menor.
+ MENUENTRY="$(grep -n -e menuentry.*/dev/sda $GRUBGFC| cut -d: -f1 | sed '1!G;h;$!d' )"
+
+ # Entradas que hay que borrar.
+ DELETEENTRY=$(grep -n menuentry.*/dev/sda$3 $GRUBGFC| cut -d: -f1)
+
+ # Recorremos el fichero del final hacia el principio.
+ ENDENTRY="$(wc -l $GRUBGFC|cut -d" " -f1)"
+ for ENTRY in $MENUENTRY; do
+ # Comprobamos si hay que borrar la entrada.
+ if ogCheckStringInGroup $ENTRY "$DELETEENTRY" ; then
+ let ENDENTRY=$ENDENTRY-1
+ sed -i -e $ENTRY,${ENDENTRY}d $GRUBGFC
+ fi
+
+ # Guardamos el número de línea de la entrada, que sera el final de la siguiente.
+ ENDENTRY=$ENTRY
+ done
+
+}
+
diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib
index 88fb132b..adb9cb01 100755
--- a/client/engine/Disk.lib
+++ b/client/engine/Disk.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase Disk
#@class Disk
#@brief Funciones para gestión de discos y particiones.
-#@version 1.0.5
+#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
@@ -351,41 +351,56 @@ esac
#/**
-# ogDevToDisk path_device
-#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo.
-#@param path_device Camino del fichero de dispositivo.
+# ogDevToDisk path_device | LABEL="str_label" | UUID="str_uuid"
+#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o a la etiqueta o UUID del sistema de archivos asociado.
+#@param path_device Camino del fichero de dispositivo.
+#@param str_label etiqueta de sistema de archivos.
+#@param str_uuid UUID de sistema de archivos.
#@return int_ndisk (para dispositivo de disco)
#@return int_ndisk int_npartition (para dispositivo de partición).
#@exception OG_ERR_FORMAT Formato incorrecto.
#@exception OG_ERR_NOTFOUND Dispositivo no detectado.
-#@note Requisitos: awk
+#@note Solo se acepta en cada llamada 1 de los 3 tipos de parámetros.
#@version 0.1 - Integracion para Opengnsys - EAC: DiskEAC() en ATA.lib
#@author Antonio J. Doblas Viso, Universidad de Malaga
#@date 2008/10/27
#@version 0.9 - Primera version para OpenGnSys
#@author Ramon Gomez, ETSII Universidad Sevilla
#@date 2009/07/20
+#@version 1.0.6 - Soporta parámetro con UIID o etiqueta.
+#@author Ramon Gomez, ETSII Universidad Sevilla
+#@date 2014/07/13
#*/ ##
function ogDevToDisk ()
{
# Variables locales.
-local d n
+local DEV d n
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME path_device" \
- "$FUNCNAME /dev/sda => 1 1"
+ ogHelp "$FUNCNAME" "$FUNCNAME path_device | LABEL=str_label | UUID=str_uuid" \
+ "$FUNCNAME /dev/sda => 1" \
+ "$FUNCNAME /dev/sda1 => 1 1" \
+ "$FUNCNAME LABEL=CACHE => 1 4"
return
fi
# Error si no se recibe 1 parámetro.
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+# Obtener dispositivo a partir de camino, etiqueta o UUID.
+DEV="$1"
+case "$DEV" in
+ LABEL=*) DEV=$(blkid -L "${1#*=}") ;;
+ UUID=*) DEV=$(blkid -U "${1#*=}") ;;
+esac
+
# Error si no es fichero de bloques.
-[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
+[ -b "$DEV" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $?
# Procesa todos los discos para devolver su nº de orden y de partición.
n=1
for d in $(ogDiskToDev); do
- [ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return
+ [ -n "$(echo $DEV | grep $d)" ] && echo "$n ${DEV#$d}" && return
n=$[n+1]
done
ogRaiseError $OG_ERR_NOTFOUND "$1"
@@ -415,11 +430,14 @@ return $OG_ERR_NOTFOUND
#@version 1.0.5 - Comprobación correcta de parámetros para soportar valores > 9.
#@author Ramon Gomez, ETSII Universidad Sevilla
#@date 2013-05-07
+#@version 1.0.6 - Soporta RAID hardware y Multipath.
+#@author Ramon Gomez, ETSII Universidad Sevilla
+#@date 2014-09-23
#*/ ##
function ogDiskToDev ()
{
# Variables locales
-local ALLDISKS VOLGROUPS DISK PART
+local ALLDISKS MPATH VOLGROUPS DISK PART i
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -430,11 +448,23 @@ if [ "$*" == "help" ]; then
return
fi
-# Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd).
-ALLDISKS=$(awk '($1==3 || $1==8) && $4!~/[0-9]/ {printf "/dev/%s ",$4}' /proc/partitions)
+# Listar dispositivos de discos duros.
+ALLDISKS=$(lsblk -n | awk '$6~/^disk$/ {gsub(/!/,"/"); printf "/dev/%s ",$1}')
+
+# Listar volúmenes lógicos.
VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}')
ALLDISKS="$ALLDISKS $VOLGROUPS"
+# Detectar caminos múltiples (ignorar mensaje si no está configurado Multipath).
+if MPATH=$(multipath -l -v 1 2>/dev/null | awk '{printf "/dev/mapper/%s ",$1}'; exit ${PIPESTATUS[0]}); then
+ # Quitar de la lista los discos que forman parte de Multipath.
+ for i in $(multipath -ll | awk '$6=="ready" {printf "/dev/%s ",$3}'); do
+ ALLDISKS="${ALLDISKS//$i/}"
+ done
+ # Añadir caminos múltiples a los discos detectados.
+ ALLDISKS="$ALLDISKS $MPATH"
+fi
+
# Mostrar salidas segun el número de parametros.
case $# in
0) # Muestra todos los discos, separados por espacios.
@@ -455,14 +485,21 @@ case $# in
# Comprobar si es partición.
if [ -b "$PART" ]; then
echo "$PART"
- elif [ -n "$VOLGROUPS" ]; then
- # Comprobar si volumen lógico. /* (comentario Doxygen)
- PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}')
- [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
- # (comentario Doxygen) */
- echo "$PART"
else
- ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
+ # Comprobar si RAID o Multipath (tener en cuenta enlace simbólico).
+ PART="${DISK}p$2"
+ if [ "$(stat -L -c "%A" "$PART" 2>/dev/null | cut -c1)" == "b" ]; then
+ echo "$PART"
+ elif [ -n "$VOLGROUPS" ]; then
+ # Comprobar si volumen lógico. /* (comentario Doxygen)
+ PART=$(lvscan -a 2>/dev/null | \
+ awk -F\' -v n=$2 "\$2~/^${DISK//\//\\/}\// {if (NR==n) print \$2}")
+ [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
+ # (comentario Doxygen) */
+ echo "$PART"
+ else
+ ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $?
+ fi
fi
;;
*) # Formato erroneo.
@@ -484,11 +521,14 @@ esac
#@version 0.9.2 - Primera version para OpenGnSys
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/09/15
+#@version 1.0.6 - Soportar LVM.
+#@author Universidad de Huelva
+#@date 2014/09/04
#*/ ##
function ogGetDiskSize ()
{
# Variables locales.
-local DISK
+local DISK SIZE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -500,7 +540,13 @@ fi
# Obtener el tamaño del disco.
DISK="$(ogDiskToDev $1)" || return $?
-awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions
+SIZE=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions)
+# Si no, obtener tamaño del grupo de volúmenes.
+[ -z "$SIZE" ] && SIZE=$(vgs --noheadings --units=B -o dev_size $DISK 2>/dev/null | \
+ awk '{print $1/1024}')
+
+# Mostrar salida.
+[ -n "$SIZE" ] && echo "$SIZE"
}
@@ -727,6 +773,9 @@ esac
#@version 1.0.4 - Uso de /proc/partitions para detectar el numero de particiones
#@author Universidad de Huelva
#@date 2012/03/28
+#@version 1.0.6 - Soportar LVM.
+#@author Universidad de Huelva
+#@date 2014/09/04
#*/ ##
function ogGetPartitionsNumber ()
{
@@ -746,6 +795,7 @@ DISK=$(ogDiskToDev $1) 2>/dev/null
case "$(ogGetPartitionTableType $1)" in
GPT) grep -c "${DISK#/dev/}." /proc/partitions ;;
MSDOS) sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK" ;;
+ LVM) lvs --noheadings $DISK 2>/dev/null | wc -l ;;
esac
}
@@ -761,11 +811,14 @@ esac
#@version 1.0.4 - Primera versión para OpenGnSys
#@author Universidad de Huelva
#@date 2012/03/01
+#@version 1.0.6 - Soportar LVM.
+#@author Universidad de Huelva
+#@date 2014/09/04
#*/ ##
function ogGetPartitionTableType ()
{
# Variables locales.
-local DISK
+local DISK TYPE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -777,8 +830,14 @@ fi
[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Sustituye n de disco por su dispositivo.
-DISK=`ogDiskToDev $1` || return $?
-parted -sm $DISK print | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}'
+DISK=$(ogDiskToDev $1) || return $?
+
+# Comprobar tabla de particiones.
+[ -b $DISK ] && TYPE=$(parted -sm $DISK print | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}')
+[ -d $DISK ] && vgs $DISK &>/dev/null && TYPE="LVM"
+
+# Mostrar salida.
+[ -n "$TYPE" ] && echo "$TYPE"
}
@@ -1108,12 +1167,15 @@ ID="${3^^}"
PTTYPE=$(ogGetPartitionTableType $1)
case "$PTTYPE" in
GPT) sgdisk -t$2:$ID $DISK 2>/dev/null ;;
- MSDOS) echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK &>/dev/null ;;
+ MSDOS) echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK | grep Syncing &>/dev/null ;;
*) ogRaiseError $OG_ERR_OUTOFLIMIT "$1,$PTTYPE"
return $? ;;
esac
-if [ $? == 0 ]; then
+
+# MSDOS) Correcto si fdisk sin error o con error pero realiza Syncing
+if [ "${PIPESTATUS[1]}" == "0" -o $? -eq 0 ]; then
partprobe $DISK 2>/dev/null
+ return 0
else
ogRaiseError $OG_ERR_PARTITION "$1,$2,$3"
return $?
diff --git a/client/engine/File.lib b/client/engine/File.lib
index e602b64d..88e0af7e 100755
--- a/client/engine/File.lib
+++ b/client/engine/File.lib
@@ -80,6 +80,39 @@ test "$(cat "$SOURCE.sum" 2>/dev/null)" == "$(cat "$TARGET.sum" 2>/dev/null)"
#/**
+# ogCalculateFullChecksum [ str_repo | int_ndisk int_npart ] path_filepath
+#@brief Devuelve la suma COMPLETA de comprobación (checksum) de un fichero.
+#@param path_filepath camino del fichero (independiente de mayúsculas)
+#@param str_repo repositorio de ficheros
+#@param int_ndisk nº de orden del disco
+#@param int_npartition nº de orden de la partición
+#@return hex_checksum Checksum del fichero
+#@version 1.0.5 - Primera versión para OpenGnSys.
+#@author Antonio Doblas Viso, EVLT Universidad de Málaga
+#@date 2014-07-09
+#*/ ##
+function ogCalculateFullChecksum ()
+{
+# Variables locales.
+local FILE
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \
+ "$FUNCNAME REPO ubuntu.img ==> ef899299caf8b517ce36f1157a93d8bf"
+ return
+fi
+
+# Comprobar que existe el fichero y devolver sus datos.
+FILE=$(ogGetPath "$@")
+[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $?
+#ADV
+md5sum "$FILE" -b 2>&1 | cut -f1 -d" "
+# tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" "
+}
+
+
+
+
+#/**
# ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target
#@brief Metafunción para copiar un fichero de sistema OpenGnSys a un directorio.
#@see ogGetPath
@@ -232,8 +265,11 @@ case $# in
return $? ;;
esac
-# Eliminar caracteres \c / iniciales, finales y duplicados.
+# Volver a directorio inicial en caso de error.
CURRENTDIR="$PWD"
+trap "cd $CURRENTDIR" RETURN
+
+# Eliminar caracteres \c / iniciales, finales y duplicados.
# /* (comentario Doxygen)
FILE="$(echo $FILE|sed -e 's/\(\/\)*\1/\//g' -e 's/^\///' -e 's/\/$//')"
PREVFILE=""
@@ -248,7 +284,6 @@ done
# (comentario Doxygen) */
# Muestra el camino Linux, quitando el / inicial duplicado.
[ "$FILEPATH" != "/" ] && echo ${FILEPATH#/}
-cd $CURRENTDIR
}
diff --git a/client/engine/FileSystem.lib b/client/engine/FileSystem.lib
index 2cdc1c0b..257c5a23 100755
--- a/client/engine/FileSystem.lib
+++ b/client/engine/FileSystem.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase FileSystem
#@class FileSystem
#@brief Funciones para gestión de sistemas de archivos.
-#@version 1.0.5
+#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
@@ -227,7 +227,7 @@ esac
function ogFormatFs ()
{
# Variables locales
-local PART ID TYPE LABEL PROG PARAMS LABELPARAM ERRCODE
+local PART TYPE LABEL PROG PARAMS LABELPARAM ERRCODE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -244,7 +244,7 @@ fi
PART="$(ogDiskToDev $1 $2)" || return $?
# Error si la partición está montada o bloqueada.
if ogIsMounted $1 $2; then
- ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error
+ ogRaiseError $OG_ERR_DONTFORMAT "$MSG_MOUNT: $1 $2"
return $?
fi
if ogIsLocked $1 $2; then
@@ -384,7 +384,7 @@ echo ${SIZE%.0*}
function ogGetFsType ()
{
# Variables locales.
-local PART ID TYPE
+local PART TYPE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
@@ -396,16 +396,13 @@ fi
# Detectar tipo de sistema de archivo (independientemente del tipo de partición).
PART=$(ogDiskToDev "$1" "$2") || return $?
-TYPE=$(blkid -o export $PART | awk -F= '$1~/^TYPE/ { print toupper($2) }')
+TYPE=$(blkid -o export $PART | awk -F= '$1=="TYPE" { print toupper($2) }')
# Componer valores correctos.
case "$TYPE" in
EXT4) # Comprobar si es caché o Ext4.
- if [ "$1 $2" == "$(ogFindCache)" ]; then
- ogIsFormated $1 $2 2>/dev/null && TYPE="CACHE"
- fi
- ;;
- VFAT) TYPE="$(blkid -po export $PART | awk -F= '$1~/^VERSION$/ { print toupper($2) }')" ;;
+ [ "$1 $2" == "$(ogFindCache)" ] && TYPE="CACHE" ;;
+ VFAT) TYPE="$(blkid -po export $PART | awk -F= '$1=="VERSION" { print toupper($2) }')" ;;
SWAP) TYPE="LINUX-SWAP" ;;
LVM*) TYPE="LINUX-LVM" ;;
*RAID*) TYPE="LINUX-RAID" ;;
@@ -428,6 +425,9 @@ esac
#@version 0.9 - Primera versión para OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2009-10-15
+#@version 1.0.6 - Usar comando findmnt.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-09-04
#*/ ##
function ogGetMountPoint ()
{
@@ -444,7 +444,8 @@ fi
# Obtener partición.
PART="$(ogDiskToDev $1 $2)" || return $?
-mount | awk -v P=$PART '{if ($1==P) {print $3}}'
+# Devolver punto de montaje.
+findmnt -n -o TARGET $PART
}
@@ -739,11 +740,14 @@ echo $MNTDIR
#@version 1.0 - Deteccion automatica del tamaño minimo adecuado
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date 2011-02-24
+#@version 1.0.6 - Integrar código de antigua función "ogReduceFsCheck".
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-10-28
#*/ ##
function ogReduceFs ()
{
# Variables locales
-local PART BLKS SIZE
+local PART BLKS SIZE MAXSIZE EXTRASIZE=0 RETVAL
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -769,6 +773,7 @@ case "$(ogGetFsType $1 $2)" in
#resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
resize2fs -fpM $PART &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
;;
+
BTRFS)
MNTDIR=$(ogMount $1 $2)
# Calcular tamaño ocupado + 10%.
@@ -776,98 +781,55 @@ case "$(ogGetFsType $1 $2)" in
btrfs filesystem resize ${SIZE}k $MNTDIR
;;
REISERFS|REISER4)
- MNTDIR=$(ogMount $1 $2)
# Calcular tamaño ocupado + 10%.
+ MNTDIR=$(ogMount $1 $2)
SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ]
ogUnmount $1 $2 2>/dev/null
- resize_reiserfs -s${SIZE}K $PART
+ resize_reiserfs -s${SIZE}K $PART <<<"y"
;;
+
JFS) ;; # No se reduce (por el momento).
XFS) ;; # No se reduce (por el momento).
+
NTFS)
- # Borrar ficheros de hibernación y paginación de Windows.
- ogDeleteFile $1 $2 hiberfil.sys 2>/dev/null
- ogDeleteFile $1 $2 pagefile.sys 2>/dev/null
- ogDeleteFile $1 $2 swapfile.sys 2>/dev/null
- ogUnmount $1 $2 2>/dev/null
- ## NTFS: Obtiene tamaño mínimo en MB.
- #SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print int($8*1.1)}')
- #ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
- #ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
- SIZE=$(ogReduceFsCheck $1 $2)
- [ "$SIZE" == 0 ] && return 1
- ntfsresize -fs "${SIZE}M" $PART <<<"y" || ogRaiseError $OG_ERR_PARTITION "error reduciendo $1,$2" || return $?
+ # Calcular tamaño ocupado + 10%.
+ ogUnmount $1 $2 &>/dev/null
+ read -e MAXSIZE SIZE <<<$(ntfsresize -fi $PART | \
+ awk '/device size/ {d=$4}
+ /resize at/ {r=int($5*1.1/1024+1)*1024}
+ END { print d,r}')
+ # Error si no puede obtenerse el tamaño máximo del volumen.
+ [ -n "$MAXSIZE" ] || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
+ # Simular la redimensión y comprobar si es necesario ampliarala.
+ RETVAL=1
+ while [ $RETVAL != 0 -a $[ SIZE+=EXTRASIZE ] -lt $MAXSIZE ]; do
+ # Obtener espacio de relocalización y devolver código de salida
+ # (ntfsresize devuelve 0 si no necesita relocalizar).
+ EXTRASIZE=$(ntfsresize -fns $SIZE $PART 2>/dev/null | \
+ awk '/Needed relocations/ {print int($4*1.1/1024+1)*1024}'
+ exit ${PIPESTATUS[0]})
+ RETVAL=$?
+ done
+ # Redimensionar solo si hace falta.
+ if [ $SIZE -lt $MAXSIZE ]; then
+ ntfsresize -fs $SIZE $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $?
+ fi
;;
+
EXFAT) ;; # No se reduce (por el momento).
FAT32|FAT16) ;; # No se reduce (probar "fatresize").
HFS|HFSPLUS) ;; # No se reduce (por el momento).
UFS) ;; # No se reduce (por el momento).
+
*) ogRaiseError $OG_ERR_PARTITION "$1,$2"
return $? ;;
esac
-ogGetFsSize $1 $2
-}
-
-
-function ogReduceFsCheck ()
-{
-#IMPORTANTE: retorna el valor en MB que podrá reducir el FS de una particion ntfs
-#valor devuelto 0, y codigo error 1. No se puede reducir, probar a reiniciar windows y chkdsk
-
-local PART RC MODE SIZE SIZEDATA
-[ $# == 2 ] && MODE=STAGE1
-[ $# == 3 ] && MODE=STAGE2
-[ -z $MODE ] && return
-
-PART="$(ogDiskToDev $1 $2)" || return $?
-ogUnmount $1 $2 &>/dev/null
-
-
-case $MODE in
- STAGE1)
- # echo "primera etapa $*"
- # Mostramos el error
- #ntfsresize -fi $PART &>/dev/null
- ntfsresize -fi $PART | grep -A 10 -e ERROR >&2
- RC=`echo $?`
- # echo "RC es" $RC
- # if [ "$RC" -eq "1" ] # con error la salida del grep es 0
- if [ "$RC" -eq "0" ]
- then
- echo "0"
- return 1
- fi
- SIZEDATA=$(ntfsresize -fi $PART | awk '/resize at/ {print $8+1000}')
- # echo "salida" $?
- # echo $SIZEDATA
- ogReduceFsCheck $1 $2 $SIZEDATA
- return 0
- ;;
- STAGE2)
- # echo "segunda etapa $*"
- SIZEDATA=$3
- ntfsresize -fns "${SIZEDATA}M" $PART &>/tmp/ntfsresize.txt
- RC=$?
- if [ "$RC" == "0" ]
- then
- SIZE=$SIZEDATA
- echo $SIZE
- else
- SIZEEXTRA=$(cat /tmp/ntfsresize.txt | awk '/Needed relocations :/ {print $0}' | awk -F"(" '{print $2}' | awk '{print $1+500}')
- SIZE=$(expr $SIZEDATA + $SIZEEXTRA)
- ogReduceFsCheck $1 $2 $SIZE
- return 0
- fi
- ;;
- *)
- return
- ;;
-esac
+# Devuelve tamaño del sistema de ficheros.
+ogGetFsSize $1 $2
}
-
#/**
# ogUnlock int_ndisk int_npartition
#@see ogUnlockPartition
diff --git a/client/engine/Image.lib b/client/engine/Image.lib
index 81014462..5e799968 100755
--- a/client/engine/Image.lib
+++ b/client/engine/Image.lib
@@ -363,6 +363,77 @@ IMGFILE="$IMGDIR/$(basename "$3").mbr"
dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $?
}
+#/**
+# ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff]
+#@brief Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido.
+#@param int_disk numero de disco
+#@param int_part numero de particion
+#@param str_repo repositorio de imágenes { REPO, CACHE }
+#@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional)
+#@return SIZEDATA SIZEREQUIRED ISENOUGHSPACE
+#@note si str_imageType= diff necesario /tmp/ogimg.info, que es creado por ogCreateInfoImage.
+#@exception OG_ERR_FORMAT formato incorrecto.
+#@author Irina Gomez, ETSII Universidad de Sevilla
+#@date 2014/10/24
+#*/ ##
+function ogGetSizeParameters ()
+{
+local MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP SIZEFREE
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo [monolic|sync|diff]" \
+ "if $FUNCNAME 1 2 REPO sync ; then ...; fi" \
+ "if $FUNCNAME 1 6 CACHE ; then ...; fi"
+ return
+fi
+# Error si no se reciben 1 o 2 parámetros.
+[ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE [monolitic|sync]" ; echo $?)
+
+MNTDIR=$(ogMount $1 $2)
+if [ "$MNTDIR" == "" ]; then
+ ogRaiseError $OG_ERR_PARTITION "$1 $2"
+ return $?
+fi
+
+# Datos contenidos en la particion o en la lista de archivos de contiene la diferencial.
+if [ "_${4^^}_" == "_DIFF_" ]; then
+ [ -r /tmp/ogimg.info ] || return $(ogRaiseError session $OG_ERR_NOTFOUND "/tmp/ogimg.info"; echo $?)
+ cd $MNTDIR
+ SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1)
+else
+ SIZEDATA=$(df -k | grep $MNTDIR | awk '{print $3}')
+fi
+
+#Aplicar factor de compresion
+if [ "_${4^^}_" == "_SYNC_" -o "_${4^^}_" == "_DIFF_" ]; then
+
+ # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
+ KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
+ [ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"}
+ FACTORSYNC=${FACTORSYNC:-"120"}
+ # Si IMGFS="BTRFS" la compresion es mayor.
+ [ $IMGFS == "BTRFS" ] && let FACTORSYNC=$FACTORSYNC-20
+
+ let SIZEREQUIRED=$SIZEDATA*$FACTORSYNC/100
+ # El tamaño mínimo del sistema de ficheros btrfs es 250M, ponemos 300
+ [ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000
+
+else
+ FACTORGZIP=55/100
+ FACTORLZOP=65/100
+ let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP
+fi
+
+#Comprobar espacio libre en el contenedor.
+[ "${3^^}" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`)
+[ "${3^^}" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}')
+
+[ "$SIZEREQUIRED" -lt "$SIZEFREE" ] && ISENOUGHSPACE=TRUE || ISENOUGHSPACE=FALSE
+
+echo $SIZEDATA $SIZEREQUIRED $ISENOUGHSPACE
+
+
+}
#/**
# ogIsImageLocked [str_repo] path_image
diff --git a/client/engine/Inventory.lib b/client/engine/Inventory.lib
index 60da936f..4cbdcabb 100755
--- a/client/engine/Inventory.lib
+++ b/client/engine/Inventory.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase Inventory
#@class Inventory
#@brief Funciones para recogida de datos de inventario de hardware y software de los clientes.
-#@version 1.0.5
+#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
@@ -29,6 +29,26 @@ fi
#/**
+# ogGetOsType int_ndisk int_npartition
+#@brief Devuelve el tipo del sistema operativo instalado.
+#@param int_ndisk nº de orden del disco
+#@param int_npartition nº de orden de la partición
+#@return OSType - Tipo de sistema operativo.
+#@see ogGetOsVersion
+#*/ ##
+function ogGetOsType ()
+{
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
+ "$FUNCNAME 1 2 => Linux"
+ return
+fi
+ogGetOsVersion "$@" | cut -sf1 -d:
+}
+
+
+#/**
# ogGetOsVersion int_ndisk int_nfilesys
#@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos.
#@param int_ndisk nº de orden del disco
@@ -48,6 +68,9 @@ fi
#@version 1.0.5 - Incluir tipos GrubLoader, Hurd y WinLoader, leer por defecto fichero /etc/os-release.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-10-07
+#@version 1.0.6 - Detectar GrubLoader al final y sistemas basados en EFI.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-08-27
#*/ ##
function ogGetOsVersion ()
{
@@ -87,16 +110,6 @@ fi
[ -z "$VERSION" ] && VERSION=$(chroot $MNTDIR lsb_release -d 2>/dev/null | awk -F":\t" '{print $2}')
# Comprobar Linux de 64 bits.
[ -n "$VERSION" ] && [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT"
-# Para cargador GRUB, comprobar fichero de configuración.
-if [ -z "$VERSION" ]; then
- TYPE="GrubLoader"
- for FILE in $MNTDIR/{,boot/}grub/menu.lst; do
- [ -r $FILE ] && VERSION="GRUB Loader"
- done
- for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do
- [ -r $FILE ] && VERSION="GRUB2 Loader"
- done
-fi
# Para Android, leer fichero de propiedades.
if [ -z "$VERSION" ]; then
TYPE="Android"
@@ -120,12 +133,11 @@ fi
if [ -z "$VERSION" ]; then
TYPE="WinLoader"
FILE="$(ogGetPath $MNTDIR/boot/bcd)"
+ [ -z "$FILE" ] && FILE="$(ogGetPath $MNTDIR/EFI/Microsoft/boot/bcd)"
if [ -n "$FILE" ]; then
- for DISTRIB in "Windows 8" "Windows 7" "Windows Vista" \
- "Windwos Server 2008" "Windwos Server 2008 R2" \
- "Windwos Recovery Environment"; do
+ for DISTRIB in "Windows Recovery" "Windows Boot"; do
if grep -qs "$(echo "$DISTRIB" | sed 's/./&./g')" $FILE; then
- VERSION="$DISTRIB loader"
+ VERSION="$DISTRIB loader"
fi
done
fi
@@ -133,19 +145,22 @@ fi
# Para MacOS: detectar kernel y completar con fichero plist de información del sistema.
if [ -z "$VERSION" ]; then
TYPE="MacOS"
- # Kernel de Mac OS.
+ # Kernel de Mac OS (no debe ser fichero de texto).
FILE="$MNTDIR/mach_kernel"
- [ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="Mac OS"
- [ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT"
- # Datos de configuración de versión de Mac OS.
- FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist"
- [ -r $FILE ] && VERSION=$(awk -F"[<>]" '
- /ProductName/ {getline;s=$3}
- /ProductVersion/ {getline;v=$3}
- END {print s,v}' $FILE)
- # Datos de recuperación de Mac OS.
- FILE="$MNTDIR/com.apple.recovery.boot"
- [ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery"
+ if [ -z "$(file -b $FILE | grep 'text')" ]; then
+ # Obtener tipo de kernel.
+ [ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="Mac OS"
+ [ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT"
+ # Datos de configuración de versión de Mac OS.
+ FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist"
+ [ -r $FILE ] && VERSION=$(awk -F"[<>]" '
+ /ProductName/ {getline;s=$3}
+ /ProductVersion/ {getline;v=$3}
+ END {print s,v}' $FILE)
+ # Datos de recuperación de Mac OS.
+ FILE="$MNTDIR/com.apple.recovery.boot"
+ [ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery"
+ fi
fi
# Para FreeBSD: obtener datos del Kernel.
### TODO Revisar solución.
@@ -164,6 +179,16 @@ if [ -z "$VERSION" ]; then
FILE="$MNTDIR/etc/release"
[ -r $FILE ] && VERSION="$(head -1 $FILE)"
fi
+# Para cargador GRUB, comprobar fichero de configuración.
+if [ -z "$VERSION" ]; then
+ TYPE="GrubLoader"
+ for FILE in $MNTDIR/{,boot/}grub/menu.lst; do
+ [ -r $FILE ] && VERSION="GRUB Loader"
+ done
+ for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do
+ [ -r $FILE ] && VERSION="GRUB2 Loader"
+ done
+fi
# Mostrar resultado y salir sin errores.
[ -n "$VERSION" ] && echo "$TYPE:$VERSION $IS64BIT"
@@ -172,27 +197,6 @@ return 0
#/**
-# ogGetOsType int_ndisk int_npartition
-#@brief Devuelve el tipo del sistema operativo instalado.
-#@param int_ndisk nº de orden del disco
-#@param int_npartition nº de orden de la partición
-#@return OSType - Tipo de sistema operativo.
-#@note OSType = { Android, BSD, Linux, MacOS, Windows }
-#@see ogGetOsVersion
-#*/ ##
-function ogGetOsType ()
-{
-# Si se solicita, mostrar ayuda.
-if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \
- "$FUNCNAME 1 2 => Linux"
- return
-fi
-ogGetOsVersion "$@" | cut -sf1 -d:
-}
-
-
-#/**
# ogListHardwareInfo
#@brief Lista el inventario de hardware de la máquina cliente.
#@return TipoDispositivo:Modelo (por determinar)
@@ -259,6 +263,9 @@ lshw | awk 'BEGIN {type="mod";}
#@version 1.0.5 - Aproximación para inventario de software de Mac OS.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2013-10-08
+#@version 1.0.6 - Proceso depende del tipo de SO y sporte para FreeBSD.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-11-13
#*/ ##
function ogListSoftware ()
{
@@ -274,11 +281,11 @@ fi
[ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Obtener tipo de sistema de archivos y montarlo.
-TYPE=$(ogGetFsType $1 $2) || return $?
MNTDIR=$(ogMount $1 $2) || return $?
+TYPE=$(ogGetOsType $1 $2) || return $?
case "$TYPE" in
- EXT[234]|REISERFS|REISER4) # Software de GNU/Linux.
+ Linux) # Software de GNU/Linux.
# Procesar paquetes dpkg.
DPKGDIR="${MNTDIR}/var/lib/dpkg"
if [ -r $DPKGDIR ]; then
@@ -292,7 +299,7 @@ case "$TYPE" in
vers=$2}
/Status:/ {if ($2!="install") pack=vers=""}
END {if (pack!="") print pack,vers}
- ' $MNTDIR/var/lib/dpkg/status | sort | uniq
+ ' $DPKGDIR/status | sort | uniq
else
# FIXME Sólo 32 bits
chroot "$MNTDIR" /usr/bin/dpkg -l | \
@@ -304,14 +311,21 @@ case "$TYPE" in
# Procesar paquetes RPM.
RPMDIR="${MNTDIR}/var/lib/rpm"
if [ -r $RPMDIR ]; then
- # Correccion inconsistencia de version de base de datos.
- # rm -f ${RPMDIR}/__db.*
- # rpm --dbpath $RPMDIR -qa --qf "%{NAME} %{VERSION}\n" | \
- # FIXME Sólo 32 bits
- chroot $MNTDIR /bin/rpm -qa --qf "%{NAME} %{VERSION}\n" | \
- awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' | \
- sort | uniq
- # rm -f ${RPMDIR}/__db.*
+ # Listar si está instalado el paquete "rpm" en el cliente.
+ if which rpm &>/dev/null; then
+ rm -f ${RPMDIR}/__db.*
+ rpm --dbpath $RPMDIR -qa --qf "%{NAME} %{VERSION}\n" 2>/dev/null | \
+ awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' | sort | uniq
+ rm -f ${RPMDIR}/__db.*
+ else
+ # Obtener el nombre de cada paquete en la BD de RPM.
+ python <<<"
+import re;
+import bsddb;
+db=bsddb.hashopen('$RPMDIR/Name','r');
+for k in db.keys():
+ print re.sub('-devel$','',k);" | sort | uniq
+ fi
fi
# Procesar paquetes pacman.
PACMANDIR="${MNTDIR}/var/lib/pacman/local"
@@ -320,7 +334,7 @@ case "$TYPE" in
ls -A $PACMANDIR
fi
;;
- NTFS|HNTFS|FAT32|HFAT32) # Software de Windows.
+ Windows) # Software de Windows.
# Claves de registro para programas instalados: formato "{clave}".
KEYS=$(ogListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall')
KEYS32=$(ogListRegistryKeys $MNTDIR software '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall')
@@ -340,18 +354,27 @@ case "$TYPE" in
fi
done) | sort | uniq
;;
- HFS|HFSPLUS) # Software de Mac OS.
- # Listar directorios de aplicaciones (falta buscar versiones en ficheros .plist).
+ MacOS) # Software de Mac OS.
+ # Listar directorios de aplicaciones e intentar obtener la versión del fichero .plist (tanto original como descomprimido).
find "${MNTDIR}/Applications" -type d -name "*.app" -prune -print | \
while read k; do
- echo "$(basename "$k" .app)"
+ FILE="$k/Contents/version.plist"
+ [ -s "$FILE" ] || FILE="$k/Contents/version.plist.uncompress"
+ [ -s "$FILE" ] && VERSION=$(awk -F"[<>]" '/ShortVersionString/ {getline;v=$3}
+ END {print v}' "$FILE")
+ echo "$(basename "$k" .app) $VERSION"
done | sort
;;
+ BSD) # Software de FreeBSD.
+ sqlite3 $MNTDIR/var/db/pkg/local.sqlite <<<"SELECT name FROM pkg_search;" 2>/dev/null | \
+ sed 's/\(.*\)-\(.*\)/\1 \2/g' | sort
+ ;;
*) ogRaiseError $OG_ERR_PARTITION "$1, $2"
return $? ;;
esac
}
+
#/** @function ogInfoCache: @brief muestra la informacion de la CACHE.
#@param sin parametros
#@return texto que se almacena en $IP.-InfoCache. punto_montaje, tama?oTotal, TamanioOcupado, TaminioLibre, imagenes dentro de la cahce
diff --git a/client/engine/Net.lib b/client/engine/Net.lib
index 10f55abd..f76dcc11 100755
--- a/client/engine/Net.lib
+++ b/client/engine/Net.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase Net
#@class Net
#@brief Funciones básicas de red.
-#@version 1.0.2
+#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
@@ -187,20 +187,27 @@ fi
#@note Comprobacion segun protocolo de conexion al Repo
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011-02-24
+#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-08-27
#*/ ##
function ogGetRepoIp ()
{
+# Variables locales.
+local SOURCE FSTYPE
+
+# Mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2"
return
fi
-# Obtener direcciones IP, segun el protocolo de montaje
-if [ -n "$OGIMG" ]; then
- case "$ogprotocol" in
- nfs) mount | grep " on $OGIMG " | cut -f1 -d: ;;
- smb) mount | grep " on $OGIMG " | cut -f3 -d/ ;;
- esac
-fi
+
+# Obtener direcciones IP, según el tipo de montaje.
+eval $(findmnt -P -o SOURCE,FSTYPE $OGIMG)
+case "$FSTYPE" in
+ nfs) echo "$SOURCE" | cut -f1 -d: ;;
+ cifs) echo "$SOURCE" | cut -f3 -d/ ;;
+esac
}
@@ -215,20 +222,27 @@ fi
#@note Comprobacion segun protocolo de conexion al Repo
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011-02-24
+#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-08-27
#*/ ##
function ogGetServerIp ()
{
+# Variables locales.
+local SOURCE FSTYPE
+
+# Mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2"
return
fi
-# Obtener direcciones IP.
-if [ -n "$OPENGNSYS" ]; then
- case "$ogprotocol" in
- nfs) mount | grep " on $OPENGNSYS " | cut -f1 -d: ;;
- smb) mount | grep " on $OPENGNSYS " | cut -f3 -d/ ;;
- esac
-fi
+
+# Obtener direcciones IP, según el tipo de montaje.
+eval $(findmnt -P -o SOURCE,FSTYPE $OPENGNSYS)
+case "$FSTYPE" in
+ nfs) echo "$SOURCE" | cut -f1 -d: ;;
+ cifs) echo "$SOURCE" | cut -f3 -d/ ;;
+esac
}
diff --git a/client/engine/PostConf.lib b/client/engine/PostConf.lib
index 24fb00d8..e82c00cb 100755
--- a/client/engine/PostConf.lib
+++ b/client/engine/PostConf.lib
@@ -8,6 +8,50 @@
#@warning License: GNU GPLv3+
#*/
+
+#/**
+# ogCleanOs int_ndisk int_nfilesys
+#@brief Elimina los archivos que no son necesarios en el sistema operativo.
+#@param int_ndisk nº de orden del disco
+#@param int_nfilesys nº de orden del sistema de archivos
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo.
+#@exception OG_ERR_PARTITION Partición desconocida o no accesible.
+#@note Antes incluido en la funcion ogReduceFs
+#@author Irina Gomez. Universidad de Sevilla.
+#@return (nada)
+#@date 2014-10-27
+#*/ ##
+function ogCleanOs {
+
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \
+ "$FUNCNAME 1 1"
+ return
+fi
+
+# Error si no se reciben 2 parámetros.
+[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys" || return $?
+
+case "$(ogGetOsType $1 $2)" in
+ Linux)
+ # Borramos los ficheros de dispositivos y los temporales.
+ ogCleanLinuxDevices $1 $2
+ rm -rf $(ogMount $1 $2)/tmp/*
+ ;;
+ Windows)
+ # Borrar ficheros de hibernación y paginación de Windows.
+ ogGetPath $1 $2 pagefile.sys &>/dev/null && ogDeleteFile $1 $2 pagefile.sys
+ ogGetPath $1 $2 hiberfil.sys &>/dev/null && ogDeleteFile $1 $2 hiberfil.sys
+ ogGetPath $1 $2 swapfile.sys &>/dev/null && ogDeleteFile $1 $2 swapfile.sys
+ ;;
+esac
+
+}
+
+
+
#/**
# ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ]
#@brief Metafunción para instalar archivo que se ejecutará en el arranque de Windows.
@@ -258,6 +302,110 @@ EOF
}
+### PRUEBAS.
+
+#/**
+# ogInstallLaunchDaemon int_ndisk int_nfilesys str_filename
+#@brief Instala archivo que se ejecutará en el arranque de Mac OS.
+#@param int_ndisk nº de orden del disco
+#@param int_nfilesys nº de orden del sistema de archivos
+#@param str_filename nombre del script
+#return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado.
+#@npte Crea ficheros de configuración /Library/LaunchDaemon/es.opengnsys.Script.plist.
+#@version 1.0.6 - Primera versión para OpenGnSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-10-06
+#*/ ##
+function ogInstallLaunchDaemon ()
+{
+# Variables locales.
+local LAUNCHDIR SCRIPTDIR
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \
+ "$FUNCNAME 1 2 postconf"
+ return
+fi
+
+# Error si no se reciben 3 parámetros.
+[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+# Comprobar directorios.
+LAUNCHDIR=$(ogGetPath $1 $2 /Library/LaunchDaemons)
+[ -n "$LAUNCHDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /Library/LaunchDaemons" || return $?
+SCRIPTDIR=$(ogGetPath $1 $2 /usr/share)
+[ -n "$SCRIPTDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share" || return $?
+
+# Crear fichero de configuración del servicio de arranque.
+cat << EOT $LAUNCHDIR/es.opengnsys.$3.plist
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>es.opengnsys.$3</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>$SCRIPTDIR/$3.sh</string>
+ </array>
+ <key>RunAtLoad</key>
+ <true/>
+ <key>StandardOutPath</key>
+ <string>/var/log/$3.log</string>
+ <key>StandardErrorPath</key>
+ <string>/var/log/$3.err</string>
+ <true/>
+ </dict>
+</plist>
+EOT
+
+# Crear un fichero de script vacío.
+rm -f $SCRIPTDIR/$3.sh
+touch $SCRIPTDIR/$3.sh
+chmod +x $SCRIPTDIR/$3.sh
+}
+
+
+### PRUEBAS.
+
+#/**
+# ogAddToLaunchDaemon int_ndisk int_nfilesys str_filename str_commands
+#@brief Añade comandos al script creado por ogInstalLaunchDaemon.
+#@param int_ndisk nº de orden del disco
+#@param int_nfilesys nº de orden del sistema de archivos
+#@param str_filename nombre del script (siempre se guardará en /usr/share para que sea visible por el sistema
+#@param str_commands comando o comandos que se añadiran al fichero
+#return (nada)
+#@exception OG_ERR_FORMAT Formato incorrecto.
+#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado.
+#@version 1.0.6 - Primera versión para OpenGnSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014-10-06
+#*/ ##
+function ogAddToLaunchDaemon ()
+{
+# Variables locales.
+local SCRIPTFILE
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \
+ "$FUNCNAME 1 2 postconf \"diskutil enableJournal disk0s2\""
+ return
+fi
+
+# Error si no se reciben 4 parámetros.
+[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
+# Comprobar que existe el fichero de comandos.
+SCRIPTFILE=$(ogGetPath $1 $2 "/usr/share/$3.sh")
+[ -n "$SCRIPTFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share/$3" || return $?
+
+# Concatenamos el comando en el fichero de comandos
+cat >> "$SCRIPTFILE" << EOT
+$4
+EOT
+}
+
+
#/**
# ogInstallLinuxClient int_ndisk int_filesys
#@brief Instala el cliente OpenGnSys para sistemas operativos GNU/Linux.
diff --git a/client/engine/Protocol.lib b/client/engine/Protocol.lib
index 603f6e1b..36ef1fba 100755
--- a/client/engine/Protocol.lib
+++ b/client/engine/Protocol.lib
@@ -983,77 +983,118 @@ ctorrent -t `basename $SOURCE` -u http://$IPTORRENT:6969/announce -s $SOURCE.tor
#@brief Comprueba que el fichero que se desea almacenar en la cache del cliente, no esta.
#@param 1 str_REPO
#@param 2 str_Relative_path_file_OGIMG_with_/
-#@return 0 si es necesario actualizar el fichero.
-#@return 1 si la imagen ya esta en la cache, por lo tanto no es necesario actualizar el fichero
+#@param 3 md5 to check: use full to check download image torrent
+#@return 0 (true) cache sin imagen, SI es necesario actualizar el fichero.
+#@return 1 (false) imagen en la cache, NO es necesario actualizar el fichero
+#@return >1 (false) error de sintaxis (TODO)
#@note
#@todo: Proceso en el caso de que el fichero tenga el mismo nombre, pero su contenido sea distinto.
#@todo: Se dejan mensajes mientras se confirma su funcionamiento.
#@version 0.1 - Integracion para OpenGNSys.
#@author Antonio J. Doblas Viso. Universidad de Malaga
#@date
+#@version 1.6 - gestiona ficheros hash full.sum (TORRENT) y .sum (MULTICAST)
+#@author Antonio J. Doblas Viso. Universidad de Malaga
+#@date
#*/ ##
function ogUpdateCacheIsNecesary ()
{
-
+#echo "admite full check con 3param TORRENT"
# Variables locales.
local ERROR SOURCE CACHE FILESOURCE MD5SOURCE FILETARGET MD5TARGET
ERROR=0
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME $FUNCNAME [ str_repo] [ [Relative_path_image] " \
- "$FUNCNAME REPO /PS1_PH1.img" \
- "$FUNCNAME REPO /ogclient.sqfs"
+ ogHelp "$FUNCNAME" "$FUNCNAME str_repo relative_path_image [protocol|FULL]" \
+ "$FUNCNAME REPO /PS1_PH1.img UNICAST" \
+ "$FUNCNAME REPO /ogclient.sqfs FULL"
return
fi
#Control de la cache
-ogFindCache || return $(ogRaiseError $OG_ERR_NOTCACHE; echo $?)
+ogFindCache &>/dev/null || return $(ogRaiseError $OG_ERR_NOTCACHE; echo $?)
+
+#Control de parametros: ahora admite tres.
+[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG str_repo relative_path_image [protocol|FULL]"; echo $?)
-[ $# == "2" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?)
ogCheckStringInGroup "$1" "REPO repo" || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?)
FILESOURCE=`ogGetPath $1 $2` || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?)
-#echo "paso 1. si no existe la imagen, confirmamos que es necesaria la actualizacion de la cache."
+#echo "paso 1. si no existe la imagen, confirmar que es necesario actualizar la cache."
FILETARGET=`ogGetPath CACHE $2`
if [ -z $FILETARGET ]
then
# borramos el fichero bf del torrent, en el caso de que se hubiese quedado de algun proceso fallido
- ogDeleteFile CACHE "/$2.torrent.bf" &> /dev/null
- ogDeleteFile CACHE "/$2.sum" &> /dev/null
- echo "TRUE=0, es necesario actualizar. Paso 1, la cache no contiene esa imagen "
+ ogGetPath CACHE "/$2.torrent.bf" && ogDeleteFile CACHE "/$2.torrent.bf" &> /dev/null
+ ogGetPath CACHE "/$2.sum" && ogDeleteFile CACHE "/$2.sum" &> /dev/null
+ ogGetPath CACHE "/$2.full.sum" && ogDeleteFile CACHE "/$2.full.sum" &> /dev/null
+ echo "TRUE(0), es necesario actualizar. Paso 1, la cache no contiene esa imagen "
return 0
fi
#echo "Paso 2. Comprobamos que la imagen no estuviese en un proceso previo torrent"
if ogGetPath $FILETARGET.torrent.bf > /dev/null
then
- #TODO: comprobar los md5 para asegurarnos que la imagen es la misma.
- echo "TRUE=0, es necesario actualizar. Paso 2, la imagen esta en un estado de descarga torrent interrumpido"
+ #TODO: comprobar los md5 del fichero .torrent para asegurarnos que la imagen a descarga es la misma.
+ echo "TRUE(0), es necesario actualizar. Paso 2, la imagen esta en un estado de descarga torrent interrumpido"
return 0
fi
## En este punto la imagen en el repo y en la cache se llaman igual,
-#echo "paso 4. recuperamos o calculamos los md5 de los ficheros"
-if [ -f $FILESOURCE.sum ]
-then
- MD5SOURCE=$(cat $FILESOURCE.sum)
-else
- MD5SOURCE=$(ogCalculateChecksum $FILESOURCE)
-fi
-[ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum
-MD5TARGET=$(cat $FILETARGET.sum)
+#echo "paso 4. Obtener los md5 del fichero imagen en la cacha segun PROTOCOLO $3"
+case "${3^^}" in
+ FULL|TORRENT)
+ #Buscamos MD5 en el REPO SOURCE
+ if [ -f $FILESOURCE.full.sum ]
+ then
+ MD5SOURCE=$(cat $FILESOURCE.full.sum)
+ else
+ MD5SOURCE=$(ogCalculateFullChecksum $FILESOURCE)
+ fi
+ # Generamos el MD5 (full) en la CACHE
+ [ ! -f $FILETARGET.full.sum ] && ogCalculateFullChecksum $FILETARGET > $FILETARGET.full.sum
+ MD5TARGET=$(cat $FILETARGET.full.sum)
+ # Generamos el MD5 (little) en la CACHE para posteriores usos del protocolo MULTICAST
+ [ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum
+ ;;
+ *)
+ #Buscamos MD5 en el REPO SOURCE
+ if [ -f $FILESOURCE.sum ]
+ then
+ MD5SOURCE=$(cat $FILESOURCE.sum)
+ else
+ MD5SOURCE=$(ogCalculateChecksum $FILESOURCE)
+ fi
+ # Generamos el MD5 (little) en la CACHE
+ [ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum
+ MD5TARGET=$(cat $FILETARGET.sum)
+ #Generamos o copiamos MD5 (full) en la CACHE para posteriores usos con Torrent
+ # Si no existe el full.sum y si existe el .sum es porque el upateCACHE multicast o unicast ha sido correcto.
+ if [ ! -f $FILETARGET.full.sum -a $FILETARGET.sum ]
+ then
+ if [ -f $FILESOURCE.full.sum ]
+ then
+ #Existe el .full.sum en REPO realizamos COPIA
+ cp $FILESOURCE.full.sum $FILETARGET.full.sum
+ else
+ #No existe .full.sum no en REPO LO GENERAMOS en la cache: situacion dificil que ocurra
+ ogCalculateFullChecksum $FILETARGET > $FILETARGET.full.sum
+ fi
+ fi
+
+esac
-#echo "Paso 5. comparamos los md5"
-#TODO: que hacer cuando los md5 son distintos. Por defecto borrar.
+#echo "Paso 5. comparar los md5"
if [ "$MD5SOURCE" == "$MD5TARGET" ]
-then
- echo "FALSE=1, No es neceario actualizar. Paso5.A la imagen esta en cache"
+then
+ echo "FALSE (1), No es neceario actualizar. Paso5.A la imagen esta en cache"
return 1
else
- echo "TRUE=0, Si es necesario actualizar. paso 5.b la imagen en cache es distinta, borramos la imagen anterior y devolvemos 0 para confirmar la actualizacion"
- rm -f $FILETARGET $FILETARGET.sum $FILETARGET.torrent
+ echo "imagen en cache distinta, borramos la imagen anterior"
+ rm -f $FILETARGET $FILETARGET.sum $FILETARGET.torrent $FILETARGET.full.sum
+ echo "TRUE (0), Si es necesario actualizar."
return 0
fi
}
diff --git a/client/engine/Registry.lib b/client/engine/Registry.lib
index 1a6045f2..a46404d0 100755
--- a/client/engine/Registry.lib
+++ b/client/engine/Registry.lib
@@ -94,12 +94,12 @@ fi
[ $# == 3 -o $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $?
# Camino del fichero de registro.
FILE=$(ogGetHivePath "$1" "$2") || return $?
-case "$4" in
- string|STRING|"") TYPE=1 ;;
- binary|BINARY) TYPE=3 ;;
- dword|DWORD) TYPE=4 ;;
- *) ogRaiseError $OG_ERR_OUTOFLIMIT "$4"
- return $? ;;
+case "${4^^}" in
+ STRING|"") TYPE=1 ;;
+ BINARY) TYPE=3 ;;
+ DWORD) TYPE=4 ;;
+ *) ogRaiseError $OG_ERR_OUTOFLIMIT "$4"
+ return $? ;;
esac
# Devolver el dato del valor de registro.
@@ -222,7 +222,7 @@ local FILE FILENT FILEXP
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive"
+ ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive" \
"$FUNCNAME /mnt/sda1 SOFTWARE => /mnt/sda1/WINDOWS/System32/config/SOFTWARE"
return
fi
@@ -388,7 +388,7 @@ local FILE
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data"
+ ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data" \
"$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' 1"
return
fi
diff --git a/client/engine/Rsync.lib b/client/engine/Rsync.lib
index 5b735c5e..a2889dac 100755
--- a/client/engine/Rsync.lib
+++ b/client/engine/Rsync.lib
@@ -1,4 +1,21 @@
#!/bin/bash
+
+#/**
+# rsync
+#@brief Función para utilizar la versión de rsync situada en $OPENGNSYS/bin en vez de la del sistema operativo.
+#@param los mismos que el comando rsync del sistema operativo.
+#@return instrucción para ser ejecutada.
+#*/
+function rsync ()
+{
+local RSYNC
+[ -x $OPENGNSYS/bin/rsync ] && RSYNC=$OPENGNSYS/bin/rsync
+RSYNC=${RSYNC:-$(which rsync)}
+
+$RSYNC "$@"
+}
+
+
#/**
# ogCreateFileImage [ REPO | CACHE ] image_name extension size
#@brief Crear el archivo
@@ -64,8 +81,8 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
ogEcho log session " $MSG_SYNC_RESIZE"
echo " truncate --size=>$SIZEREQUIRED k $IMGFILE"
truncate --size=">$SIZEREQUIRED"k "$IMGFILE" &> $OGLOGCOMMAND
- # FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs
- if [ $KERNELVERSION \< 3.07 ]; then
+ # 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"
echo " resize2fs -f $LOOPDEVICE"
resize2fs -f $LOOPDEVICE &> $OGLOGCOMMAND
@@ -78,12 +95,15 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
fi
fi
else
- echo " dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED"
- dd if=/dev/zero of="$IMGFILE" bs=1024 count=$SIZEREQUIRED 2>&1 | tee -a $OGLOGCOMMAND
+ touch "$IMGFILE"
+ echo " truncate --size=>$SIZEREQUIRED k $IMGFILE"
+ truncate --size=">$SIZEREQUIRED"k "$IMGFILE" &> $OGLOGCOMMAND
#Formateamos imagen
losetup $LOOPDEVICE $IMGFILE
- # FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs
- if [ $KERNELVERSION \< 3.07 ]; then
+ # FS de la imagen segun la configuracion y la version del kernel: < 3.7 ext4, si >= btrfs
+ [ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"}
+
+ if [ "$IMGFS" == "EXT4" ]; then
echo " mkfs.ext4 -i 4096 -b 4096 -L "${2##*\/}" $LOOPDEVICE"
mkfs.ext4 -i 4096 -b 4096 -L "${2##*\/}" $LOOPDEVICE 2>&1 |tee -a $OGLOGCOMMAND
else
@@ -94,7 +114,6 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
# Monto la imagen
ogMountImage $1 "$2" $3 &>/dev/null
[ $? -eq 0 ] || return $( ogRaiseError $OG_ERR_IMAGE "$3 $4"; echo $?)
- #touch "$DIRMOUNT/ogimg.info"
echo "mounted"> $IMGFILE.lock
# Si existe dispositivo de loop lo borro.
@@ -117,8 +136,9 @@ function ogCreateInfoImage () {
#@param 3 Repositorio [ REPO | CACHE ] (opcional en las completas)
#@param 4 Nombre Imagen Basica (opcional en las completas)
#@param 5 Tipo imagen [ img | diff ]
+#@version 1.0.6 rsync opcion W (whole) para que sea más rápido
#*/
-local IMGTYPE IMGDIRAUX DIRMOUNT DESTRSYNC PASSWORD OPTRSYNC USERRSYNC ORIG FSTYPE PART DIREMPTY IMGLIST IMGINFO IMGACL KERNELVERSION
+local IMGTYPE IMGDIRAUX DIRMOUNT DESTRSYNC PASSWORD USERRSYNC ORIG FSTYPE PART DIREMPTY IMGLIST IMGINFO IMGACL KERNELVERSION
# Ayuda o menos de 5 parametros y la imagen no es basica
if [ "$*" == "help" -o $# -lt 5 -a "$3" != "img" ]; then
ogHelp "$FUNCNAME" : "$MSG_HELP_ogCreateInfoImage" \
@@ -177,23 +197,20 @@ SIZEDATA=${SIZEDATA:-"SIZEDATA"}
# Incluimos información de la imagen. Segun el kernel sera ext4 o btrfs.
KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
-if [ $KERNELVERSION \< 3.07 ]; then
- echo "#EXT4:NO:$FSTYPE:$SIZEDATA" > $IMGINFO
-else
- echo "#BTRFS:LZO:$FSTYPE:$SIZEDATA" > $IMGINFO
-fi
+[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"}
+echo "#$IMGFS:NO:$FSTYPE:$SIZEDATA" > $IMGINFO
if [ "$IMGTYPE" == "img" ]; then
# Imagen Basica
- echo " rsync -aHAXvn --delete $ORIG/ $DIREMPTY >> $IMGINFO"
- rsync -aHAXvn --delete $ORIG/ $DIREMPTY>> $IMGINFO
+ echo " rsync -aHAXWvn --delete $ORIG/ $DIREMPTY >> $IMGINFO"
+ rsync -aHAXWvn --delete $ORIG/ $DIREMPTY>> $IMGINFO
sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGINFO
sed -i '/^\.\//d' $IMGINFO
else
# Imagen Diferencial
- echo " rsync -aHAXvn$OPTRSYNC --delete $ORIG/ $DESTRSYNC a $IMGLIST"
- rsync -aHAXvn$OPTRSYNC $PASSWORD --delete "$ORIG/" "$DESTRSYNC" >> $IMGLIST
+ echo " rsync -aHAXWvn --delete $ORIG/ $DESTRSYNC a $IMGLIST"
+ rsync -aHAXWvn $PASSWORD --delete "$ORIG/" "$DESTRSYNC" >> $IMGLIST
sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGLIST
sed -i '/^\.\//d' $IMGLIST
@@ -226,14 +243,14 @@ fi
#/**
# ogAclFilter
-#@brief Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial
+#@brief Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial (falla: no se usa)
#@param No.
#@return (nada)
#*/
function ogAclFilter () {
local IMGACL IMGINFO FILES ACLTMP
-# Ayuda o menos de 5 parametros y la imagen no es basica
+# Ayuda
if [ "$*" == "help" ]; then
ogHelp "$MSG_HELP_ogAclFilter" \
"$FUNCNAME [ no parameters ] "
@@ -252,14 +269,12 @@ ACLFILES="/tmp/aclfiles$$"
echo "" > $ACLTMP
grep -n -e "File" -e "Directory" $IMGACL > $ACLFILES
-# Al fichero le quitamos las líneas sobrantes: comentarios y lineas vacias.
-sed -e s/"^#.*$"//g $IMGINFO > $FILES
-sed -i '/^$/d' $FILES
+# Al listado de ficheros le quitamos las líneas sobrantes: comentarios y lineas vacias.
+sed -e s/"^#.*$"//g -e '/^$/d' $IMGINFO > $FILES
# Recorremos el listado y extraemos la acl correspondiente al fichero o directorio.
while read LINE; do
- #read END INI <<< "$(grep -n -e "File" -e "Directory" $IMGACL| grep -A 1 "$LINE"| awk -F : '!(NR%2){print $1" "p}{p=$1}' )"
read END INI <<< "$(grep -A 1 "$LINE" $ACLFILES | awk -F : '!(NR%2){print $1" "p}{p=$1}' )"
let NUM=$END-$INI-1
# Si algún archivo no se encuentra, el error lo mandamos a /dev/null
@@ -301,12 +316,16 @@ DEST=$(ogMount $1 $2) || return $?
IMGACL="ogimg.acl"
IMGLN="ogimg.ln"
+IMGINFO="ogimg.info"
+
+# Copiamos informacion de la imagen a /tmp (para basicas)
+[ -r $DEST/$IMGACL ] && cp $DEST/ogimg.* /tmp
#Creamos o modificamos los enlaces.
# La imagen diferencial tiene ogimg.ln
# para la completa lo generamos con los enlaces que contengan /mnt/
-[ -r "$DEST/$IMGLN" ] || grep -e "->" -e "=>" "$DEST/ogimg.info"|grep "/mnt/" > "$DEST/$IMGLN"
-if [ $(wc -l "$DEST/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then
+[ -r "/tmp/$IMGLN" ] || grep -e "->" -e "=>" "/tmp/$IMGINFO"|grep "/mnt/" > "/tmp/$IMGLN"
+if [ $(wc -l "/tmp/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then
while read LINEA
do
ORIGLN="${LINEA#*> }"
@@ -327,15 +346,26 @@ if [ $(wc -l "$DEST/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then
rm -f "$(basename "$DESTLN")"
ln $OPTLN "$ORIGLN" "$(basename "$DESTLN")"
echo -n "."
- done < "$DEST/$IMGLN" 2>/dev/null
+ done < "/tmp/$IMGLN" 2>/dev/null
echo ""
fi
+cd /
+}
+#/**
+# ogRestoreAclImage
+#@brief Restaurar las ACL. La informacion esta ya copiada al directorio /tmp
+#@param 1 num_disk
+#@param 2 num_part
+#*/
+function ogRestoreAclImage () {
+local PART IMGACL
+PART=$(ogDiskToDev "$1" "$2") || return $?
+IMGACL="ogimg.acl"
# Restauramos acl
-if [ "$(ogGetFsType $1 $2)" == "NTFS" -a -f "$DEST/$IMGACL" ] ; then
+if [ "$(ogGetFsType $1 $2)" == "NTFS" -a -f "/tmp/$IMGACL" ] ; then
cd /
- cp "$DEST/$IMGACL" /tmp
ogUnmount "$1" "$2"
echo "ntfs-3g.secaudit -se $PART /tmp/$IMGACL"
ntfs-3g.secaudit -se $PART /tmp/$IMGACL
@@ -442,6 +472,7 @@ DESTRSYNC=$(ogGetMountPoint $4 $5)
# Borramos ficheros de informacion de restauraciones antiguas
rm -rf $DESTRSYNC/ogimg.*
+rm -rf /tmp/ogimg.*
# Origen y destino de la sincronizacion y en REPO opciones rsync
if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
@@ -467,23 +498,25 @@ ogEcho log session " $MSG_SYNC_RESTORE"
if [ "$3" == "diff" ]; then
# Lista de archivos a copiar:
IMGINFO="ogimg.info"
- FILESFROM=" --files-from=$DESTRSYNC/$IMGINFO"
+ FILESFROM=" --files-from=/tmp/$IMGINFO"
- echo " rsync -aHAX$OPTRSYNC --progress $ORIG/ogimg* $DESTRSYNC"
- rsync -aHAX$OPTRSYNC $PASSWORD --progress "$ORIG"/ogimg* $DESTRSYNC
+ echo " rsync -aHAX$OPTRSYNC --progress $ORIG/ogimg* /tmp"
+ rsync -aHAX$OPTRSYNC $PASSWORD --progress "$ORIG"/ogimg* /tmp
# Borramos linea de información de la imagen, sino busca un fichero con ese nombre
- sed -i '/^\#/d' $DESTRSYNC/$IMGINFO
+ sed -i '/^\#/d' /tmp/$IMGINFO
cd $DESTRSYNC
# Diferencial: Borramos archivos sobrantes.
ogEcho log session " $MSG_SYNC_DELETE"
- cat "$DESTRSYNC/ogimg.rm" 2>/dev/null | xargs rm -rf
+ sed -e s/^/\"/g -e s/$/\"/g "/tmp/ogimg.rm" 2>/dev/null | xargs rm -rf
fi
echo " rsync -aHAX$OPTRSYNC --progress $FILESFROM $ORIG/ $DESTRSYNC"
rsync -aHAX$OPTRSYNC $PASSWORD --progress $FILESFROM "$ORIG/" "$DESTRSYNC" 2>$OGLOGCOMMAND | egrep "^deleting|^sent|^sending|^total|%" |tee -a $OGLOGCOMMAND
-return ${PIPESTATUS[0]}
+RETVAL=${PIPESTATUS[0]}
+cd /
+return $RETVAL
}
@@ -528,9 +561,9 @@ else
|| return $(ogRaiseError $OG_ERR_NOTFOUND "$1 $2.$IMGEXT"; echo $?)
mkdir -p "/tmp/$DIRMOUNT"
- # FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs
- KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
- if [ $KERNELVERSION \< 3.07 ]; then
+
+ # FS de la imagen segun el contenido del archivo .img
+ if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then
mount -t ext4 -o loop "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null
else
mount -o compress=lzo "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null
@@ -669,7 +702,7 @@ echo -n -e " $MSG_SYNC_SLEEP: $DIRMOUNT\n #" | tee -a $OGLOGSESSION $
let TIMEOUT=$SIZE/$CREATESPEED
[ $TIMEOUT -lt 60 ] && TIMEOUT=60
until $(grep -i $STATE $LOCKFILE &>/dev/null) ; do
- [ $STATE = "mounted" -a -f "$DIRMOUNT/ogimg.info" ] && ogEcho session "" && return 0
+ [ $STATE = "mounted" -a -f "$DIRMOUNT/ogimg.info" ] && ogEcho log session "" && return 0
TIMEAUX=$[SECONDS-TIME]
[ "$TIMEAUX" -lt "$TIMEOUT" ] || return $(ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$3 $4 $IMGEXT: time_out."; echo $?)
echo -n "#" | tee -a $OGLOGSESSION $OGLOGFILE
@@ -710,10 +743,10 @@ fi
IMGDIR="$(ogGetParentPath "$1" "/$2")"
IMGFILE="${IMGDIR}/$(basename "/$2").$IMGEXT"
-# Solo es posible para imagenes EXT4. Si no es EXT4 salimos sin error
-file "$IMGFILE" | grep -i " ext4 filesystem " 2>&1 > /dev/null || return 0
if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
+ # Para imagenes EXT4 reduzco, para BTRFS solo desmonto.
+ if file "$IMGFILE" | grep -i " ext4 filesystem " 2>&1 > /dev/null; then
# Al montar se comprueba la existencia de la imagen
DIRMOUNT="$(ogMountImage $1 "$2" ${IMGEXT#*\.})"
AVAILABLE=$(df -k|grep "$DIRMOUNT$"|awk '{print $4}')
@@ -748,10 +781,13 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
# Corto el archivo al tamaño del sistema de ficheros.
echo " truncate --size=\"$EXTSIZE\"k $IMGFILE "
truncate --size="$EXTSIZE"k "$IMGFILE"
-
+ else
# Desmonto la imagen
- echo "reduced" > "$IMGFILE.lock"
- rmdir "$DIRMOUNT"
+ umount "$DIRMOUNT"
+ fi
+
+ echo "reduced" > "$IMGFILE.lock"
+ rmdir "$DIRMOUNT"
else
[ -z $REPOIP ] && REPOIP=$(ogGetRepoIp)
@@ -838,13 +874,12 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then
else
[ -f "$OGIMG/mount/$2${IMGEXT#img}/ogimg.info" ] && ISMOUNT=TRUE
fi
-[ "$ISMOUNT" == TRUE ] && ogEcho session warning "$MSG_SYNC_NOCHECK" && return 0
+[ "$ISMOUNT" == TRUE ] && ogEcho log session warning "$MSG_SYNC_NOCHECK" && return 0
DIRMOUNT="/tmp/ogCheckImage$$"
-mkdir "$DIRMOUNT"
-# FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs
-KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
-if [ $KERNELVERSION \< 3.07 ]; then
+mkdir "$DIRMOUNT"
+# FS de la imagen segun el contenido del archivo .img
+if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then
mount -t ext4 -o loop "$IMGFILE" "$DIRMOUNT" 2>&1 | tee -a $OGLOGCOMMAND
RETVAL=${PIPESTATUS[0]}
else
diff --git a/client/engine/String.lib b/client/engine/String.lib
index a81e3b07..3c4430e6 100755
--- a/client/engine/String.lib
+++ b/client/engine/String.lib
@@ -15,8 +15,9 @@
#@date 2010/05/09
#*/ ##
#/**
-ogCheckStringInGroup ()
+function ogCheckStringInGroup ()
{
+local i
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME str_elemento str_grupo" \
@@ -56,7 +57,7 @@ return 1
#/**
-ogCheckStringInReg()
+function ogCheckStringInReg()
{
local REG
@@ -91,7 +92,7 @@ REG=$2
#@date 2010/05/09
#*/ ##
#/**
-ogCheckIpAddress()
+function ogCheckIpAddress()
{
local REG IP arrIP
diff --git a/client/engine/System.lib b/client/engine/System.lib
index 51365902..cbadd952 100755
--- a/client/engine/System.lib
+++ b/client/engine/System.lib
@@ -4,7 +4,7 @@
#@brief Librería o clase System
#@class System
#@brief Funciones básicas del sistema.
-#@version 1.0.5
+#@version 1.0.6
#@warning License: GNU GPLv3+
#*/
@@ -25,7 +25,7 @@
#@date 2009-07-23
#@version 1.0.5 - Elegir fichero de log.
#@author Ramon Gomez, ETSII Universidad de Sevilla
-#@date 2009-07-23
+#@date 2014-03-17
#*/
function ogEcho () {
@@ -61,6 +61,108 @@ fi
#/**
+# ogExecAndLog str_logfile ... str_command ...
+#@brief Ejecuta un comando y guarda su salida en fichero de registro.
+#@param str_logfile fichero de registro (pueden ser varios).
+#@param str_command comando y comandos a ejecutar.
+#@return Salida de ejecución del comando.
+#@note str_logfile = { LOG, SESSION, COMMAND }
+#@version 1.0.6 - Primera versión para OpenGnSys
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2013-07-02
+#*/
+function ogExecAndLog () {
+
+# Variables locales
+local ISCOMMAND ISLOG ISSESSION COMMAND CONTINUE=1 FILES REDIREC
+
+# Si se solicita, mostrar ayuda.
+if [ "$*" == "help" ]; then
+ ogHelp "$FUNCNAME str_logfile ... str_command ..." \
+ "$FUNCNAME COMMAND ls -al /"
+ return
+fi
+
+# Procesar parámetros.
+while [ $CONTINUE ]; do
+ case "${1,,}" in
+ command) ISCOMMAND=1; shift ;;
+ log) ISLOG=1; shift ;;
+ session) ISSESSION=1; shift ;;
+ *) COMMAND="$@"
+ CONTINUE= ;;
+ esac
+done
+# Error si no se recibe un comando que ejecutar.
+[ -n "$COMMAND" ] || ogRaiseError $OG_ERR_FORMAT || return $?
+
+# Componer lista de ficheros de registro.
+if [ $ISCOMMAND ]; then
+ FILES="$OGLOGCOMMAND"
+ > $FILES
+ REDIREC="2>&1"
+fi
+[ $ISLOG ] && FILES="$FILES $OGLOGFILE"
+[ $ISSESSION ] && FILES="$FILES $OGLOGSESSION"
+
+# Ejecutar comando.
+eval $COMMAND $REDIREC | tee -a $FILES
+# Salida de error del comando ejecutado.
+return ${PIPESTATUS[0]}
+}
+
+
+#/**
+# ogGetCaller
+#@brief Devuelve nombre del programa o script ejecutor (padre).
+#@param No.
+#@return str_name - Nombre del programa ejecutor.
+#@version 0.10 - Primera versión para OpenGnSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2011-01-17
+#*/
+function ogGetCaller () {
+
+# Obtener el nombre del programa o del script que ha llamado al proceso actual.
+basename "$(ps hlp $PPID | awk '{if ($13~/bash/ && $14!="") print $14;
+ else { sub(/^-/,"",$13); print $13; } }')"
+}
+
+
+#/**
+# ogHelp ["str_function" ["str_format" ["str_example" ... ]]]
+#@brief Muestra mensaje de ayuda para una función determinda.
+#@param str_function Nombre de la función.
+#@param str_format Formato de ejecución de la función.
+#@param str_example Ejemplo de ejecución de la función.
+#@return str_help - Salida de ayuda.
+#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME
+#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas.
+#@note Pueden especificarse varios mensajes con ejemplos.
+#@version 0.9 - Primera versión para OpenGnSys.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-07-27
+#*/
+function ogHelp () {
+
+# Variables locales.
+local FUNC MSG
+
+# Mostrar función, descripción y formato.
+FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}"
+MSG="MSG_HELP_$FUNC"
+ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}"
+[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2"
+# Mostrar ejemplos (si existen).
+shift 2
+while [ $# -gt 0 ]; do
+ ogEcho help " $MSG_EXAMPLE: $1"
+ shift
+done
+}
+
+
+#/**
# ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...]
#@brief Devuelve el mensaje y el código de error correspondiente.
#@param str_logtype tipo de registro de incidencias.
@@ -110,6 +212,7 @@ case "$CODE" in
$OG_ERR_EXTENDFS) MSG="$MSG_ERR_EXTENDFS \"$2\"" ;;
$OG_ERR_IMGSIZEPARTITION) MSG="$MSG_ERR_IMGSIZEPARTITION \"$2\"" ;;
$OG_ERR_UPDATECACHE) MSG="$MSG_ERR_UPDATECACHE \"$2\"" ;;
+ $OG_ERR_DONTFORMAT) MSG="$MSG_ERR_DONTFORMAT \"$2\"" ;;
$OG_ERR_UCASTSYNTAXT) MSG="$MSG_ERR_UCASTSYNTAXT \"$2\"" ;;
$OG_ERR_UCASTSENDPARTITION) MSG="$MSG_ERR_UCASTSENDPARTITION \"$2\"" ;;
$OG_ERR_UCASTSENDFILE) MSG="$MSG_ERR_UCASTSENDFILE \"$2\"" ;;
@@ -140,23 +243,6 @@ return $CODE
#/**
-# ogGetCaller
-#@brief Devuelve nombre del programa o script ejecutor (padre).
-#@param No.
-#@return str_name - Nombre del programa ejecutor.
-#@version 0.10 - Primera versión para OpenGnSys.
-#@author Ramon Gomez, ETSII Universidad de Sevilla
-#@date 2011-01-17
-#*/
-function ogGetCaller () {
-
-# Obtener el nombre del programa o del script que ha llamado al proceso actual.
-basename "$(ps hlp $PPID | awk '{if ($13~/bash/ && $14!="") print $14;
- else { sub(/^-/,"",$13); print $13; } }')"
-}
-
-
-#/**
# ogIsRepoLocked
#@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos).
#@param No.
@@ -183,40 +269,6 @@ test -n "$FILES"
}
-
-#/**
-# ogHelp ["str_function" ["str_format" ["str_example" ... ]]]
-#@brief Muestra mensaje de ayuda para una función determinda.
-#@param str_function Nombre de la función.
-#@param str_format Formato de ejecución de la función.
-#@param str_example Ejemplo de ejecución de la función.
-#@return str_help - Salida de ayuda.
-#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME
-#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas.
-#@note Pueden especificarse varios mensajes con ejemplos.
-#@version 0.9 - Primera versión para OpenGnSys.
-#@author Ramon Gomez, ETSII Universidad de Sevilla
-#@date 2009-07-27
-#*/
-function ogHelp () {
-
-# Variables locales.
-local FUNC MSG
-
-# Mostrar función, descripción y formato.
-FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}"
-MSG="MSG_HELP_$FUNC"
-ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}"
-[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2"
-# Mostrar ejemplos (si existen).
-shift 2
-while [ $# -gt 0 ]; do
- ogEcho help " $MSG_EXAMPLE: $1"
- shift
-done
-}
-
-
function ogCheckProgram ()
{
# Si se solicita, mostrar ayuda.
diff --git a/client/shared/bin/rsync-3.1.0 b/client/shared/bin/rsync-3.1.0
new file mode 100755
index 00000000..366204f0
--- /dev/null
+++ b/client/shared/bin/rsync-3.1.0
Binary files differ
diff --git a/client/shared/etc/engine.cfg b/client/shared/etc/engine.cfg
index 103a0211..895881be 100644
--- a/client/shared/etc/engine.cfg
+++ b/client/shared/etc/engine.cfg
@@ -10,8 +10,8 @@ OGWINCHKDISK=TRUE
#Configuracion de interface restauracion
#Que hacer cuando la cache no tenga espacio libre. [ NONE | FORMAT ] ]
ACTIONCACHEFULL=NONE
-# Protocolo a usar en el caso de que no exita cache o no haya espacio sufiencie.
-RESTOREPROTOCOLNOCACHE=UNICAST
+#Que protocolo de restauracion usar en el caso de que no exista cache o no exista espacio sufiente. [NONE | UNICAST | MULTICAST].NONE retorna error
+RESTOREPROTOCOLNOTCACHE=UNICAST
#script Creacion imagen
IMGPROG="partclone"
@@ -27,9 +27,14 @@ OGWINREDUCE=TRUE
# Factor para calcular el time-out al crear la imagen. 100000k -> 4s
CREATESPEED=100000*4
# Factor de compresion para las imagenes (windos en ext4).
-ZSYNC=120
+FACTORSYNC=120
# Realizar copia de seguridad antes de crear la imagen.
-BACKUP="false"
+BACKUP=false
+# Sistema de archivo de la imagenes sincronizadas. EXT4 o BTRFS
+IMGFS=EXT4
# Tiempo de sleep antes de realizar el reboot
OGSLEEP="20"
+
+# Indica si se instala automáticamente el cliente OpenGnSys en el despliegue de un SO (por defecto, no instalar).
+INSTALLOSCLIENT=FALSE
diff --git a/client/shared/etc/init/default.sh b/client/shared/etc/init/default.sh
index 7d18def1..e87b4b61 100755
--- a/client/shared/etc/init/default.sh
+++ b/client/shared/etc/init/default.sh
@@ -20,13 +20,20 @@ if [ -x $OPENGNSYS/job_executer/init.d/job_executer ]; then
fi
# Arranque de OpenGnSys Client daemon (socket).
-if [ -x "$OPENGNSYS/bin/ogAdmClient" ]; then
- echo "${MSG_LAUNCHCLIENT:-.}"
- [ $ogactiveadmin == "true" ] && boot="admin"
- # Indicar fichero de teclado de Qt para el idioma especificado (tipo "es.qmap").
- [ -f /usr/local/etc/${LANG%_*}.qmap ] && export QWS_KEYBOARD="TTY:keymap=/usr/local/etc/${LANG%_*}.qmap"
+echo "${MSG_LAUNCHCLIENT:-.}"
+[ "$ogactiveadmin" == "true" ] && boot="admin"
+# Indicar fichero de teclado de Qt para el idioma especificado (tipo "es.qmap").
+[ -f /usr/local/etc/${LANG%_*}.qmap ] && export QWS_KEYBOARD="TTY:keymap=/usr/local/etc/${LANG%_*}.qmap"
+
+if [ -x "$OPENGNSYS/bin/ogAdmClient" -a "$ogstatus" != "offline" ]; then
# Ejecutar servicio cliente.
$OPENGNSYS/bin/ogAdmClient -f $OPENGNSYS/etc/ogAdmClient.cfg -l $OGLOGFILE -d $LOGLEVEL
+else
+ for FILE in index $OGGROUP $(ogGetIpAddress)
+ do
+ [ -f $OGCAC/menus/$FILE.html ] && OGMENU="$OGCAC/menus/$FILE.html"
+ done
+ $OPENGNSYS/bin/browser -qws $OGMENU
fi
# Si fallo en cliente y modo "admin", cargar shell; si no, salir.
diff --git a/client/shared/etc/lang.ca_ES.conf b/client/shared/etc/lang.ca_ES.conf
index 6aa9fa2a..24ca7798 100644
--- a/client/shared/etc/lang.ca_ES.conf
+++ b/client/shared/etc/lang.ca_ES.conf
@@ -10,7 +10,7 @@ MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo"
MSG_ERR_CACHE="Error en partición de caché local"
MSG_ERR_NOGPT="El disco indicado no contiene una particion GPT"
MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar"
-MSG_ERR_NOTOS="Sistema operativo no instalado o no detectado"
+MSG_ERR_NOTOS="Sistema operativo no detectado o no se puede iniciar"
MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema"
MSG_ERR_NOTEXEC="Programa o función no ejecutable"
MSG_ERR_NOTWRITE="No hay acceso de escritura"
@@ -31,6 +31,7 @@ MSG_ERR_MCASTRECEIVERFILE="Error en la recepcion MULTICAST de un fichero"
MSG_ERR_MCASTSENDPARTITION="Error en envio MULTICAST de una particion"
MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepcion MULTICAST de un fichero"
MSG_ERR_PROTOCOLJOINMASTER="Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER"
+MSG_ERR_DONTFORMAT="Error al formatear"
MSG_ERR_DONTMOUNT_IMAGE="Error al montar/reducir la imagen"
MSG_ERR_DONTUNMOUNT_IMAGE="Error al desmontar la imagen"
MSG_ERR_DONTSYNC_IMAGE="Imagen no sincronizable"
@@ -40,6 +41,7 @@ MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restaurac
# Mensajes de avisos.
MSG_DONTMOUNT="Sistema de archivos no montado"
MSG_DONTUNMOUNT="El sistema de archivos no se puede desmontar o no está montado"
+MSG_MOUNT="Sistema de archivos montado"
# Mensajes complementarios para las ayudas.
MSG_64BIT="64 bits"
@@ -90,6 +92,7 @@ MSG_HELP_ogBoot="Arranca un sistema operativo instalado."
MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero."
MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos."
MSG_HELP_ogCheckSyncImage="Muestra el contenido de la imagen para comprobarla."
+MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo."
MSG_HELP_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros."
MSG_HELP_ogCopyFile="Copia un fichero a otro almacenamiento."
MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final del disco 1."
@@ -119,7 +122,7 @@ MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser r
MSG_HELP_ogGetDiskSize="Devuelve el tamaño del disco."
MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos."
MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos."
-MSG_HELP_ogGetGroupDir="Devuelve el cmaino del directorio por defecto para el grupo del cliente."
+MSG_HELP_ogGetGroupDir="Devuelve el camino del directorio por defecto para el grupo del cliente."
MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente."
MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows."
MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local."
@@ -141,7 +144,11 @@ MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnS
MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows."
MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos."
MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal."
+MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido."
MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows."
+MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys."
+MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion."
+MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando."
MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones."
MSG_HELP_ogHidePartition="Oculta una partición de Windows."
MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición."
@@ -198,6 +205,7 @@ MSG_HELP_ogUnmountAll="Desmonta todos los sistemas de archivos."
MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local."
MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount
MSG_HELP_ogUnmountImage="Desmonta la imagen"
+MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local."
MSG_HELP_ogUpdatePartitionTable="Actualiza informacion tabla particiones del disco"
MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen en el servidor."
@@ -228,7 +236,7 @@ MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: "
MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: "
# Script updateCache.
-MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobamos si Actualizacion - existe una imagen con igual nombre pero distinto sum-"
+MSG_SCRIPTS_UPDATECACHE_DOUPDATE="comprovar si es necessari actualitzar el fitxer imatge"
MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la cache es mayor que el fichero a descargar."
# Script updateCache: para las imágenes sincronizadas tipo dir.
MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calculamos el tamaño de la imagen."
diff --git a/client/shared/etc/lang.en_GB.conf b/client/shared/etc/lang.en_GB.conf
index 98dd7877..e3698328 100644
--- a/client/shared/etc/lang.en_GB.conf
+++ b/client/shared/etc/lang.en_GB.conf
@@ -10,7 +10,7 @@ MSG_ERR_LOCKED="Resource locked by an operation"
MSG_ERR_CACHE="Local cache error"
MSG_ERR_NOGPT="The current disc does not contain a GPT partition"
MSG_ERR_FILESYS="Unknown or unmounted filesystem"
-MSG_ERR_NOTOS="Undetected operating system"
+MSG_ERR_NOTOS="Cannot detect or boot the operating system"
MSG_ERR_IMAGE="Cannot create or cannot restore an image"
MSG_ERR_NOTEXEC="The function or binary is not executable"
MSG_ERR_NOTWRITE="Write permission denied"
@@ -31,6 +31,7 @@ MSG_ERR_MCASTRECEIVERFILE="Error en la recepcion MULTICAST de un fichero"
MSG_ERR_MCASTSENDPARTITION="Error en envio MULTICAST de una particion"
MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepcion MULTICAST de un fichero"
MSG_ERR_PROTOCOLJOINMASTER="Error in connecting a Unicast|Multicast session to the master"
+MSG_ERR_DONTFORMAT="Error al formatear"
MSG_ERR_DONTMOUNT_IMAGE="Failed to mount/reduce image"
MSG_ERR_DONTUNMOUNT_IMAGE="Failed to unmount image"
MSG_ERR_DONTSYNC_IMAGE="Not synchronized image"
@@ -40,6 +41,7 @@ MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restaurac
# Warning messages.
MSG_DONTMOUNT="Unmounted filesystem"
MSG_DONTUNMOUNT="Cannot unmount the filesystem"
+MSG_MOUNT="Sistema de archivos montado"
# Help auxiliary menssages.
MSG_64BIT="64 bit"
@@ -90,6 +92,7 @@ MSG_HELP_ogBoot="Boot a installed operating system."
MSG_HELP_ogCalculateChecksum="Calculate file checksum."
MSG_HELP_ogCheckFs="Check a filesystem."
MSG_HELP_ogCheckSyncImage="Displays the contents of the image to check it."
+MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo."
MSG_HELP_ogCompareChecksumFiles="Compare if the checksums match."
MSG_HELP_ogCopyFile="Copy a file to other storage."
MSG_HELP_ogCreateCache="Reserve space for the cache partition at the end of disc 1."
@@ -141,7 +144,11 @@ MSG_HELP_ogGetPath="Return the file full path."
MSG_HELP_ogGetRegistryValue="Return a data value from the Windows registry."
MSG_HELP_ogGetRepoIp="Return the IP address of an OpenGnsys Repository."
MSG_HELP_ogGetServerIp="Return the main OpenGnSys Server IP address."
+MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido."
MSG_HELP_ogGetWindowsName="Return the client name saved in the Windows registry."
+MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys."
+MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion."
+MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando."
MSG_HELP_ogHelp="Show the help menssages for functions."
MSG_HELP_ogHidePartition="Hide a Windows partition."
MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición."
@@ -198,6 +205,7 @@ MSG_HELP_ogUnmountAll="Unmount all filesystems."
MSG_HELP_ogUnmountCache="Unmount the cache filesystem."
MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount
MSG_HELP_ogUnmountImage="Desmonta la imagen"
+MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local."
MSG_HELP_ogUpdatePartitionTable="Update info about disk partition table "
MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen en el servidor."
diff --git a/client/shared/etc/lang.es_ES.conf b/client/shared/etc/lang.es_ES.conf
index 9b4afdfd..b3c5b761 100644
--- a/client/shared/etc/lang.es_ES.conf
+++ b/client/shared/etc/lang.es_ES.conf
@@ -10,7 +10,7 @@ MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo"
MSG_ERR_CACHE="Error en partición de caché local"
MSG_ERR_NOGPT="El disco indicado no contiene una partición GPT"
MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar"
-MSG_ERR_NOTOS="Sistema operativo no instalado o no detectado"
+MSG_ERR_NOTOS="Sistema operativo no detectado o no se puede iniciar"
MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema"
MSG_ERR_NOTEXEC="Programa o función no ejecutable"
MSG_ERR_NOTWRITE="No hay acceso de escritura"
@@ -31,6 +31,7 @@ MSG_ERR_MCASTRECEIVERFILE="Error en la recepción Multicast de un fichero"
MSG_ERR_MCASTSENDPARTITION="Error en envío Multicast de una partición"
MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepción Multicast de un fichero"
MSG_ERR_PROTOCOLJOINMASTER="Error en la conexión de una sesión Unicast|Multicast con el Master"
+MSG_ERR_DONTFORMAT="Error al formatear"
MSG_ERR_DONTMOUNT_IMAGE="Error al montar/reducir la imagen"
MSG_ERR_DONTUNMOUNT_IMAGE="Error al desmontar la imagen"
MSG_ERR_DONTSYNC_IMAGE="Imagen no sincronizable"
@@ -40,6 +41,7 @@ MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restaurac
# Mensajes de avisos.
MSG_DONTMOUNT="Sistema de archivos no montado"
MSG_DONTUNMOUNT="El sistema de archivos no se puede desmontar o no está montado"
+MSG_MOUNT="Sistema de archivos montado"
# Mensajes complementarios para las ayudas.
MSG_64BIT="64 bits"
@@ -90,6 +92,7 @@ MSG_HELP_ogBoot="Arranca un sistema operativo instalado."
MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero."
MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos."
MSG_HELP_ogCheckSyncImage="Muestra el contenido de la imagen para comprobarla."
+MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo."
MSG_HELP_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros."
MSG_HELP_ogCopyFile="Copia un fichero a otro almacenamiento."
MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final del disco 1."
@@ -119,7 +122,7 @@ MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser r
MSG_HELP_ogGetDiskSize="Devuelve el tamaño del disco."
MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos."
MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos."
-MSG_HELP_ogGetGroupDir="Devuelve el cmaino del directorio por defecto para el grupo del cliente."
+MSG_HELP_ogGetGroupDir="Devuelve el camino del directorio por defecto para el grupo del cliente."
MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente."
MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows."
MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local."
@@ -141,7 +144,11 @@ MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnS
MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows."
MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos."
MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal."
+MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido."
MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows."
+MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys."
+MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion."
+MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando."
MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones."
MSG_HELP_ogHidePartition="Oculta una partición de Windows."
MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición."
@@ -198,6 +205,7 @@ MSG_HELP_ogUnmountAll="Desmonta todos los sistemas de archivos."
MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local."
MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount
MSG_HELP_ogUnmountImage="Desmonta la imagen"
+MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local."
MSG_HELP_ogUpdatePartitionTable="Actualiza información de la tabla de particiones del disco"
MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen en el servidor."
@@ -205,6 +213,7 @@ MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen
MSG_HELP_configureOs="Post-configura de arranque del sistema"
MSG_HELP_createBaseImage="Genera imagen básica de la partición"
MSG_HELP_createDiffImage="Genera imagen diferencial de la partición respecto a la imagen básica"
+MSG_HELP_installOfflineMode="Prepara el equipo cliente para el modo offline."
MSG_HELP_partclone2sync="Convierte imagen de partclone en imagen sincronizable."
MSG_HELP_restoreBaseImage="Restaura una imagen básica en una partición"
MSG_HELP_restoreDiffImage="Restaura una imagen diferencial en una partición"
@@ -228,7 +237,7 @@ MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: "
MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: "
# Script updateCache.
-MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobar si actualización -existe una imagen con igual nombre pero distinto sum-"
+MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobar si es necesario actualizar el fichero imagen "
MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la caché es mayor que el fichero a descargar."
# Script updateCache: para las imágenes sincronizadas tipo dir.
MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calcular el tamaño de la imagen."
diff --git a/client/shared/etc/preinit/default.sh b/client/shared/etc/preinit/default.sh
index 0c697b65..2624edc4 100755
--- a/client/shared/etc/preinit/default.sh
+++ b/client/shared/etc/preinit/default.sh
@@ -5,7 +5,7 @@ set -a
source /opt/opengnsys/etc/preinit/loadenviron.sh
# Scripts de inicio.
-for f in fileslinks loadmodules mountrepo poweroff otherservices; do
+for f in fileslinks loadmodules metadevs mountrepo poweroff otherservices; do
$OGETC/preinit/$f.sh
done
unset f
diff --git a/client/shared/etc/preinit/loadenviron.sh b/client/shared/etc/preinit/loadenviron.sh
index f5f45628..b165ecfd 100755
--- a/client/shared/etc/preinit/loadenviron.sh
+++ b/client/shared/etc/preinit/loadenviron.sh
@@ -119,6 +119,7 @@ export OG_ERR_NOGPT=22 # El disco indicado no contiene una particion GPT
export OG_ERR_IMGSIZEPARTITION=30 # Error al restaurar partición más pequeña que la imagen
export OG_ERR_UPDATECACHE=31 # Error al realizar el comando updateCache
+export OG_ERR_DONTFORMAT=32 # Error al formatear
export OG_ERR_GENERIC=40 # Error imprevisto no definido
export OG_ERR_UCASTSYNTAXT=50 # Error en la generación de sintaxis de transferenica UNICAST
export OG_ERR_UCASTSENDPARTITION=51 # Error en envío UNICAST de partición
@@ -137,3 +138,4 @@ export OG_ERR_DONTSYNC_IMAGE=71 # Imagen no sincronizable (es monolitica)
export OG_ERR_DONTUNMOUNT_IMAGE=72 # Error al desmontar la imagen
export OG_ERR_NOTDIFFERENT=73 # No se detectan diferencias entre la imagen basica y la particion.
export OG_ERR_SYNCHRONIZING=74 # Error al sincronizar, puede afectar la creacion/restauracion de la imagen
+
diff --git a/client/shared/etc/preinit/loadmodules.sh b/client/shared/etc/preinit/loadmodules.sh
index 3d03b247..ded35393 100755
--- a/client/shared/etc/preinit/loadmodules.sh
+++ b/client/shared/etc/preinit/loadmodules.sh
@@ -5,6 +5,9 @@
#@version 1.0
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010-01-26
+#@version 1.0.5 - Cargar módulos específicos para el cliente.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2013-11-11
#*/
@@ -13,4 +16,8 @@ echo "${MSG_LOADMODULES:-.}"
# Módulo del ratón.
modprobe psmouse 2>/dev/null
+# Cargar módulos específicos del kernel del cliente.
+for m in $OGLIB/modules/$(uname -r)/*.ko; do
+ [ -r $m ] && insmod $m &>/dev/null
+done
diff --git a/client/shared/etc/preinit/metadevs.sh b/client/shared/etc/preinit/metadevs.sh
new file mode 100755
index 00000000..d9b12d45
--- /dev/null
+++ b/client/shared/etc/preinit/metadevs.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+#/**
+#@file metadevs.sh
+#@brief Script de inicio para detectar metadispositivos LVM y RAID.
+#@note Desglose del script "loadenviron.sh".
+#@warning License: GNU GPLv3+
+#@version 0.9
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2009-10-10
+#@version 0.9.4
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2010-04-19
+#*/
+
+
+# Si está configurado OpenGNSys ...
+if [ -n "$OPENGNSYS" ]; then
+ echo "$MSG_DETECTLVMRAID"
+ # Detectar metadispositivos LVM.
+ vgchange -ay &>/dev/null
+ # Detectar metadispositivos RAID.
+ dmraid -ay &>/dev/null
+else
+ # FIXME Error: entorno de OpenGNSys no configurado.
+ echo "Error: OpenGNSys environment is not configured." # FIXME: definir mensaje.
+ exit 1
+fi
+
diff --git a/client/shared/etc/preinit/mountrepo.sh b/client/shared/etc/preinit/mountrepo.sh
index 9b0aebaa..62b1107e 100755
--- a/client/shared/etc/preinit/mountrepo.sh
+++ b/client/shared/etc/preinit/mountrepo.sh
@@ -12,7 +12,7 @@ OGIMG=${OGIMG:-/opt/opengnsys/images}
ROOTREPO=${ROOTREPO:-"$ROOTSERVER"}
# TODO Revisar proceso de arranque para no montar 2 veces el repositorio.
-if [ $ogactiveadmin == "true" ]; then
+if [ "$ogactiveadmin" == "true" ]; then
export boot=admin # ATENCIÓN: siempre en modo "admin".
umount $OGIMG 2>/dev/null
@@ -25,6 +25,29 @@ if [ $ogactiveadmin == "true" ]; then
PASS=${PASS:-"og"}
mount.cifs //${ROOTREPO}/ogimages $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS
;;
+ local) # TODO: hacer funcion dentro de este script que monte smb
+ # Comprobamos que estatus sea online.
+ if [ "$ogstatus" == "offline" -o "$SERVER" == "" ]; then
+ # Si estatus es offline buscamos un dispositivo con etiqueta repo
+ # y si no existe montamos la cache como repo (si existe).
+ TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \")
+ if [ "$TYPE" == "" ]; then
+ [ -d $OGCAC/$OGIMG ] && mount --bind $OGCAC/$OGIMG $OGIMG
+ else
+ mount -t $TYPE LABEL=REPO $OGIMG &>/dev/null
+ fi
+ else
+ # Comprobamos que existe un servicio de samba.
+ smbclient -L $SERVER -N &>/dev/null
+ if [ $? -eq 0 ]; then
+ PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \
+ sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/')
+ PASS=${PASS:-"og"}
+ mount.cifs //${ROOTREPO}/ogimages $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS
+ fi
+ # TODO: buscar condicion para NFS
+ fi
+ ;;
esac
fi
diff --git a/client/shared/scripts/cloneRemoteFromMaster b/client/shared/scripts/cloneRemoteFromMaster
index 64f511d6..9aedefde 100755
--- a/client/shared/scripts/cloneRemoteFromMaster
+++ b/client/shared/scripts/cloneRemoteFromMaster
@@ -54,6 +54,9 @@
#@version 1.0.3 - Habilita el uso de la variable OGWINREDUCE=TRUE|TRUE para reducir el sistema de archivos a enviar
#@author Antonio J. Doblas Viso. Universidad de Malaga.
#@date 2011/12/22
+#@version 1.0.6 - Uso de la funcion ogExecuteAndLog
+#@author Antonio J. Doblas Viso. Universidad de Malaga.
+#@date 2012/02/12
#*/ ##
#test 1. cliente sin particiones. Detectado TODO: crear estrucutras de particiones
@@ -63,25 +66,35 @@
#test 5. master sin origen particion.
#test 6. master sin origen fichero.
-#Carga del configurador del engine
-[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
-
+TIME1=$SECONDS
+PROG="$(basename $0)"
trap "pkill faucet; exit 1" 0 1 2 3 6 9 14 15
-TIME1=$SECONDS
-PROG="$(basename $0)"
+#AYUDA
if [ $# -lt 1 -o "$1" == "help" ]; then
- echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp"
- exit 1
+ echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp"
+ exit 1
fi
-if [ $# -lt 6 ]; then
- ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ipMaster SOURCE_disco SOURCE_particion [MULTICAT|UNICAST] SESSION TARGER_disck TARGET_partition"
+#ERROR
+if [ $# -lt 6 ]; then
+ ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ipMaster SOURCE_disco SOURCE_particion [MULTICAST|UNICAST] SESSION TARGET_disk TARGET_partition"
exit $?
fi
-# Obtener información de los parámetros de entrada.
+#Load engine configurator from engine.cfg file.
+#Carga el configurador del engine desde el fichero engine.cfg
+# Valores por defecto: #IMGPROG="partclone" ; #IMGCOMP="lzop" ; #IMGEXT="img" #IMGREDUCE="TRUE"
+[ -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 seguimiento para httpdlog
+echo " " > $OGLOGCOMMAND
+
+ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*"
+
+# Procesar parámetros de entrada
HOSTIP=`ogGetIpAddress`
if [ -z "$HOSTIP" ]
then
@@ -115,7 +128,7 @@ pkill faucet
# Preparando Instrucción según sea Master o Client
case $MASTERIP in
$HOSTIP)
- echo "[1] Equipo Master preparando el origen de los datos a enviar"
+ ogEcho log session "[1] Equipo Master preparando el origen de los datos a enviar"
ogGetPath $2 $3.img &>/dev/null; RC=$?;
ogDiskToDev $2 $3 &>/dev/null; RETVAL=$?;
@@ -168,15 +181,13 @@ case $MASTERIP in
fi
case "${PROTOCOL^^}" in
MULTICAST)
- ogEcho log session "[29] Transferencia Multicast"
- ogEcho log "ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR"
- ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR || RETVAL=$?
+ ogEcho log session "[29] Transferencia Multicast: ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR "
+ ogExecAndLog session "ogMcastSendPartition" "$DISKSOURCE" "$PARTSOURCE" "$SESSIONMCASTSERVER" "$TOOLCLONE" "$COMPRESOR" || RETVAL=$?
;;
UNICAST)
sleep 60
- ogEcho log session "[29] Transferencia Unicast"
- ogEcho log "ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR"
- ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR || RETVAL=$?
+ ogEcho log session "[29] Transferencia Unicast: ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR"
+ ogExecAndLog session "ogUcastSendPartition" "$DISKSOURCE" "$PARTSOURCE" "$SESSIONUCASTSERVER" "$TOOLCLONE" "$COMPRESOR" || RETVAL=$?
;;
esac
@@ -264,8 +275,8 @@ case $MASTERIP in
SIZEIMAGE=$(echo $INFOEXTRA | awk '{print $4}')
ogEcho log "$INFOEXTRA = herramienta= $TOOLCLONE compresor= $COMPRESOR size= $SIZEIMAGE"
ogMount $DISKTARGET $PARTTARGET || ogFormat $DISKTARGET $PARTTARGET
- SIZEPARTTARGET=$(parted `ogDiskToDev $DISKTARGET $PARTTARGET` unit kB print | grep Disk | awk -F" " '{print $3}' | tr -d kB);
-
+ #SIZEPARTTARGET=$(parted `ogDiskToDev $DISKTARGET $PARTTARGET` unit kB print | grep Disk | awk -F" " '{print $3}' | tr -d kB);
+ SIZEPARTTARGET=$(ogGetPartitionSize $DISKTARGET $PARTTARGET )
ogEcho log session "[28] comprobando que el tamaño de la imagen $SIZEIMAGE es menor que el de la particion destino $SIZEPARTTARGET"
# comprobamos que el tamaño de a imagen es menor que la del cliente.
if [ "$SIZEIMAGE" -lt "$SIZEPARTTARGET" ]
@@ -274,15 +285,23 @@ case $MASTERIP in
case "${PROTOCOL^^}" in
MULTICAST)
ogEcho log session "ogMcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONMCASTCLIENT $TOOLCLONE $COMPRESOR"
- ogMcastReceiverPartition "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_MCASTRECEIVERPARTITION " l251 "; echo $?)
+ ogExecAndLog command "ogMcastReceiverPartition" "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_MCASTRECEIVERPARTITION " l251 "; echo $?)
;;
UNICAST)
ogEcho log session "ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR"
- ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR || exit $(ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " l230 "; echo $?)
+ ogExecAndLog command "ogUcastReceiverPartition" "$DISKTARGET" "$PARTTARGET" "$SESSIONUCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " l230 "; echo $?)
;;
esac
- ogEcho log session "[90] llamando a configureOS $DISKTARGET $PARTTARGET"
- configureOs $DISKTARGET $PARTTARGET
+ if which configureOsCustom &>/dev/null; then
+ ogEcho log session "[90] configureOsCustom $DISKTARGET $PARTTARGET"
+ # Si $2 = num_disk las varibles REPO IMGNAME estan vacias
+ ! [[ $2 =~ ^[0-9]+$ ]] && REPO="$2" && IMGNAME="$3"
+ configureOsCustom $DISKTARGET $PARTTARGET $REPO $IMGNAME
+ else
+ ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE $DISKTARGET $PARTTARGET"
+ configureOs $DISKTARGET $PARTTARGET
+ fi
+
else
# Si el tamaño de los datos recibidos es más grande que la particion destino
ogRaiseError $OG_ERR_IMGSIZEPARTITION "ERROR tamanio particion= $SIZEPARTTARGET menor que la imagen= $SIZEIMAGE"; exit $?
diff --git a/client/shared/scripts/configureOs b/client/shared/scripts/configureOs
index ba5ee735..2aa5288d 100755
--- a/client/shared/scripts/configureOs
+++ b/client/shared/scripts/configureOs
@@ -23,6 +23,9 @@
#@version 1.0.4 - Inyecta el cliente para gestión del sistema operativo.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2012-04-11
+#@version 1.0.5 - Postconfiguración para Mac OS X.
+#@author Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2013-10-11
# Carga el configurador del engine y los parámetros de red.
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
@@ -32,20 +35,29 @@
PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $?
FSSIZE=$(ogGetFsSize $1 $2)
if [ $FSSIZE -lt $PARTSIZE ]; then
- echo "Extender sistema de archivos."
- ogExtendFs $1 $2
+ echo "Extender sistema de archivos."
+ ogExtendFs $1 $2
fi
# Si no existe partición activa, activar este sistema.
FLAGACTIVE=$(ogGetPartitionActive $1)
[ -z $FLAGACTIVE ] && ogSetPartitionActive $1 $2
+# Si el sistema de archivos es de solo lectura, no hacer la post-configuración.
+MNTDIR=$(ogMount $1 $2)
+if ! ogIsWritable $1 $2; then
+ echo "AVISO: sistema de archivos de solo lectura, no se ejecuta postconfiguración."
+ exit
+fi
+
+# Nombre del cliente.
+HOST="$(ogGetHostname)"
+
# Post-configuración personalizada para cada tipo de sistema operativo.
OSTYPE="$(ogGetOsType $1 $2)"
case "$OSTYPE" in
- Windows)
+ Windows) # Postconfiguración de Windows.
# Cambiar nombre en sistemas Windows.
- HOST=$(ogGetHostname)
HOST=${HOST:-"pc"}
ogSetWindowsName $1 $2 "$HOST"
# Descomentar la siguiente línea para cambiar usuario de inicio.
@@ -57,15 +69,99 @@ case "$OSTYPE" in
# Registrar en Windows que la partición indicada es su nueva unidad C:\
ogWindowsRegisterPartition $1 $2 C $1 $2
#ogLoadHiveWindows $1 $2; ogSetWindowsChkdisk $OGWINCHKDISK; ogUpdateHiveWindows
- # Instalar cliente para Windows (no activar en sistema en produccion ver ticket 604).
- ogInstallMiniSetup $1 $2 postconf.cmd
- ogInstallWindowsClient $1 $2 postconf.cmd
+ # Instalar cliente para Windows si se indica en la variable INSTALLOSCLIENT.
+ if [ "${INSTALLOSCLIENT^^}" == "TRUE" ]; then
+ ogInstallMiniSetup $1 $2 postconf.cmd
+ ogInstallWindowsClient $1 $2 postconf.cmd
+ fi
;;
- Linux)
+ Linux) # Postconfiguración de GNU/Linux.
## Install and Configure Grub based on OS installed and Grub 1st stage location.
ogGrubInstallPartition $1 $2
- # Instalar cliente para Linux.
- ogInstallLinuxClient $1 $2
+ # Instalar cliente para GNU/Linux si se indica en la variable INSTALLOSCLIENT.
+ if [ "${INSTALLOSCLIENT^^}" == "TRUE" ]; then
+ ogInstallLinuxClient $1 $2
+ fi
+ ;;
+ MacOS) # Postconfiguración de Mac OS X.
+ # Fichero indicador de activación de postconfiguración.
+ touch $MNTDIR/osxpostconf
+
+ # Crear fichero de configuración del servicio de arranque.
+ cat << EOT >$MNTDIR/Library/LaunchDaemons/es.opengnsys.postconfd.plist
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+ <dict>
+ <key>Label</key>
+ <string>es.opengnsys.postconfd.sh</string>
+ <key>ProgramArguments</key>
+ <array>
+ <string>/var/root/postconfd.sh</string>
+ </array>
+ <key>RunAtLoad</key>
+ <true/>
+ <key>StandardOutPath</key>
+ <string>/var/log/postconfd.log</string>
+ <key>StandardErrorPath</key>
+ <string>/var/log/postconfd.err</string>
+ <key>Debug</key>
+ <true/>
+ </dict>
+</plist>
+EOT
+
+ # Programa de inicio que será ejecutado en el arranque de Mac OS X.
+ cat << EOT >$MNTDIR/var/root/postconfd.sh
+#!/bin/bash
+# postconfd - ejecución de scripts de inicio.
+
+# Ejecutar postconfiguración si existe el fichero indicador.
+if [ -e /osxpostconf ]; then
+ ### NOTA: descomentar las opciones deseadas.
+ # Activar Journaling en HFS+ (no usar si el cliente continua en OpenGnsys).
+ #diskutil enableJournal disk$[$1-1]s$2
+ # Pedir usuario y clave en pantalla de conexión.
+ #defaults write /Library/Preferences/com.apple.loginwindow SHOWFULLNAME -bool yes
+ # No mostrar botón de cambio rápido de usuario.
+ #defaults write /Library/Preferences/.GlobalPreferences MultipleSessionEnabled -bool NO
+ # Bloquear escritorio, fondo, dock, etc del usuario "usuario".
+ #chflags uchange /Users/usuario/Library/Preferences/com.apple.desktop.plist
+ #chflags uchange /Users/usuario/Library/Preferences/com.apple.dock.plist
+ #chflags uchange /Users/usuario/Desktop
+ # Añadir usuario "usuario" a la lista de desarrolladores de Xcode.
+ #DevToolsSecurity --enable
+ #dscl . -append /Groups/_developer GroupMembership usuario
+ # Bajar volumen (valor entre 0 y 7).
+ #osascript -e 'set volume 1'
+ # Tomar nombre del equipo.
+ HOST="$HOST"
+ if [ -z "\$HOST" ]; then
+ # Si no hay nombre asociado, activar la red para obtener datos del DHCP.
+ source /etc/rc.common
+ CheckForNetwork
+ while [ "\$NETWORKUP" != "-YES-" ]; do
+ sleep 5
+ NETWORKUP=
+ CheckForNetwork
+ done
+ # Componer nombre del equipo a partir de datos del DHCP.
+ IP=\$(ifconfig en0 inet | awk '{if (\$1=="inet") print \$2}')
+ HOST="mac-\$(echo \${IP//./-} | cut -f3-4 -d-)"
+ fi
+ # Asignar nombre del equipo.
+ scutil --set ComputerName "\$HOST"
+ scutil --set LocalHostName "\$HOST"
+ scutil --set HostName "\$HOST"
+ hostname "\$HOST"
+ # Descromprimir ficheros de versión para obtener inventario de aplicaciones.
+ find /Applications -type d -name "*.app" -prune -exec \
+ ditto --nopreserveHFSCompression "{}/Contents/version.plist" "{}/Contents/version.plist.uncompress"
+ # Borrar fichero indicador de psotconfiguración
+ rm -f /osxpostconf
+fi
+EOT
+ # Dar permiso de ejecución.
+ chmod 700 $MNTDIR/var/root/postconfd.sh
;;
esac
diff --git a/client/shared/scripts/configureOsCustom.template b/client/shared/scripts/configureOsCustom.template
index a9573cae..691b95b9 100644
--- a/client/shared/scripts/configureOsCustom.template
+++ b/client/shared/scripts/configureOsCustom.template
@@ -1,12 +1,30 @@
#!/bin/bash
-# configureOsCustom.template
-# Plantilla para fichero de configuración del cliente tras restaurar una imagen.
-# Recibe los mismos parámetros que el script "configureOsCustom".
-# Nota: para usar este fichero, renombrar como "createImageCustomPost".
+#/**
+# configureOsCustom
+#@brief Plantilla para scirpt de configuracion personalizada de sistema operativo restaurado.
+#@param $1 nº de disco
+#@param $2 nº de partición
+#@param $3 Repositorio: CACHE, REPO o dirección IP (opcional)
+#@param $4 Nombre canónico de la imagen sin extensión (opcional)
+#@warning Renombrar este fichero como "configureOsCustom" para sustituir al script estándar "configureOs".
+#@note Los parámetros disco y partición son obligatorios y opcionalmente puede recibir también el repositorio y la imagen usada para en el despliegue.
+#**/
# Control de parámetros.
-[ $# -ne 4 ] || exit
+[ $# -eq 2 -o $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: configureOsCustom int_ndisc int_npart [str_repo str_imgname]" || exit $?
+# Parámetros obligatorios.
+DISK="$1" # Nº de disco.
+PART="$2" # Nº de partición.
+# Parámetros opcionales.
+REPO="${3^^}" # Repositorio (en mayúsculas).
+IMGNAME="$4" # Nombre canónico de imagen (sin extensión).
+
+
+# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
+
+# Paso 1: Añadir aquí el código personalizado de postconfiguración.
+# Nota: puede llamarse al script estandar "configureOs", pero el orden de aplicación de los comandos puede ser importante.
diff --git a/client/shared/scripts/createBaseImage b/client/shared/scripts/createBaseImage
index b9a3c557..ed9255b4 100755
--- a/client/shared/scripts/createBaseImage
+++ b/client/shared/scripts/createBaseImage
@@ -40,19 +40,6 @@ TIME1=$SECONDS
#Carga el configurador del engine desde el fichero engine.cfg
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
-# Factor de calculo de Time out al crear imagen: valor por defecto en engine.cfg
-CREATESPEED=${CREATESPEED:-"100000*4"}
-
-# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
-KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
-[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS="BTRFS"
-
-# % de compresion para estimacion tamaño imagen IMGFS="EXT4"
-ZSYNC=${ZSYNC:-"120"}
-
-# Si IMGFS="BTRFS" la compresion es mayor.
-[ $IMGFS == "BTRFS" ] && let ZSYNC=$ZSYNC-30
-
PROG="$(basename $0)"
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
@@ -66,12 +53,12 @@ fi
# Limpiamos fichero de log
echo " " > $OGLOGCOMMAND
-[ "$(ogGetCaller)" == "RestaurarImagenBasica" ] || echo -n ""> $OGLOGSESSION
+[ "$(ogGetCaller)" == "CrearImagenBasica" ] || echo -n ""> $OGLOGSESSION
ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*"
# Valores por defecto en etc/engine.cfg
-IMGEXT="img"
+IMGEXT=${IMGEXT:-"img"}
REPOIP=$(ogGetRepoIp)
@@ -97,29 +84,14 @@ ogCheckFs $1 $2 &> $OGLOGCOMMAND || exit $(ogRaiseError session $OG_ERR_PARTITIO
ORIG=$(ogMount $1 $2) || exit $(ogRaiseError session $OG_ERR_PARTITION "$1 $2" ; echo $?)
# Borramos ficheros de paginacion y configuracion
-case "$(ogGetFsType $1 $2)" in
- EXT[234])
- ogCleanLinuxDevices $1 $2
- rm -rf $ORIG/tmp/*
- ;;
- NTFS)
- [ $(ogGetPath $1 $2 pagefile.sys) ] && ogDeleteFile $1 $2 pagefile.sys
- [ $(ogGetPath $1 $2 hiberfil.sys) ] && ogDeleteFile $1 $2 hiberfil.sys
- [ $(ogGetPath $1 $2 swapfile.sys) ] && ogDeleteFile $1 $2 swapfile.sys
- ;;
-esac
+ogCleanOs $1 $2
#Comprobar espacio que requerira la imagen para ser almacenada
-SIZEDATA=$(df -k | grep $PART | awk '{print $3}')
-#Aplicar factor de compresion
-let SIZEREQUIRED=$SIZEDATA*$ZSYNC/100
-# El tamaño mínimo del sistema de ficheros btrfs es 250M, ponemos 300
-[ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000
-#Comprobar espacio libre en el contenedor.
-[ "$3" == "CACHE" -o "$3" == "cache" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`)
-[ "$3" == "REPO" -o "$3" == "repo" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}')
-ogEcho log session " $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED $SIZEFREE"
-[ $SIZEREQUIRED -gt $SIZEFREE ] && exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?)
+read SIZEDATA SIZEREQUIRED ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$3" SYNC)
+
+ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED"
+[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?)
+
IMGDIR="$(ogGetParentPath "$3" "/$4")"
IMGFILE=${IMGDIR[$3]}/$(basename "/$4").$IMGEXT
@@ -128,9 +100,11 @@ echo " " > $OGLOGCOMMAND
TIME2=$SECONDS
ogEcho log session "[40] $MSG_HELP_ogCreateImage $1 $2 $3 $4 "
+
# Si existe el fichero de la imagen se hace copia de seguridad y se redimensiona, si no existe se crea.
+# Bloqueo la imagen. Si esta en modo lectura dara error y nos salimos
ogEcho log session "[50] $MSG_HELP_ogCreateFileImage."
-ogLockImage "$3" "/$4.$IMGEXT"
+ogLockImage "$3" "/$4.$IMGEXT" || exit $?
ogCreateFileImage $3 "$4" $IMGEXT $SIZEREQUIRED
# Creamos la lista del contenido y lo situamos en la particion a copiar.
diff --git a/client/shared/scripts/createDiffImage b/client/shared/scripts/createDiffImage
index 32784012..862c05c8 100755
--- a/client/shared/scripts/createDiffImage
+++ b/client/shared/scripts/createDiffImage
@@ -43,16 +43,6 @@ function onexit() {
#Carga el configurador del engine desde el fichero engine.cfg
[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
-# Factor de calculo de Time out al crear imagen: valor por defecto en engine.cfg
-CREATESPEED=${CREATESPEED:-"100000*4"}
-# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision
-KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}')
-[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS="BTRFS"
-# % de compresion para estimacion tamaño imagen IMGFS="EXT4"
-ZSYNC=${ZSYNC:-"120"}
-# Si IMGFS="BTRFS" la compresion es mayor.
-[ $IMGFS == "BTRFS" ] && let ZSYNC=$ZSYNC-30
-
TIME1=$SECONDS
PROG="$(basename $0)"
@@ -105,8 +95,9 @@ ORIG=$(ogMount $1 $2) || exit $(ogRaiseError session $OG_ERR_PARTITION "$1 $2"
DIFFDIR="$(ogGetParentPath "$3" "/$5")"
DIFFFILE="$DIFFDIR/$5.$DIFFEXT"
-ogLockImage "$3" "/$4.$IMGEXT"
-ogLockImage "$3" "/$5.$DIFFEXT"
+# Bloqueo las imagenes -> Si no hay acceso de escritura dara error y nos saldremos.
+ogLockImage "$3" "/$4.$IMGEXT" || exit $?
+ogLockImage "$3" "/$5.$DIFFEXT" || exit $?
# Comprobar consistencia del sistema de archivos.
echo " " > $OGLOGCOMMAND
@@ -116,18 +107,7 @@ ogUnmount $1 $2
ogCheckFs $1 $2 >$OGLOGCOMMAND || exit $(ogRaiseError session $OG_ERR_PARTITION "ogCheckFs $1 $2" ; echo $?)
# Borramos ficheros de paginacion y configuracion
-FSTYPE=$(ogGetFsType $1 $2)
-case "$FSTYPE" in
- EXT[234])
- ogCleanLinuxDevices $1 $2
- rm -rf $ORIG/tmp/*
- ;;
- NTFS)
- [ $(ogGetPath $1 $2 pagefile.sys) ] && ogDeleteFile $1 $2 pagefile.sys
- [ $(ogGetPath $1 $2 hiberfil.sys) ] && ogDeleteFile $1 $2 hiberfil.sys
- [ $(ogGetPath $1 $2 swapfile.sys) ] && ogDeleteFile $1 $2 swapfile.sys
- ;;
-esac
+ogCleanOs $1 $2
# Crear la imagen.
echo " " > $OGLOGCOMMAND
@@ -142,36 +122,23 @@ ogMountImage $3 "$4" $IMGEXT >/dev/null
ogWaitSyncImage $3 "$4" $IMGEXT "mounted" || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$3 $4 $IMGEXT: time_out."; echo $?)
# Creamos la informacion de la imagen.
-ogEcho log session "[50] $MSG_HELP_ogCreateInfoImage "
+ogEcho log session "[45] $MSG_HELP_ogCreateInfoImage "
ogCreateInfoImage $1 $2 $3 "$4" "${DIFFTYPE}"
[ $? -eq $OG_ERR_NOTDIFFERENT ] && exit $(ogRaiseError session $OG_ERR_NOTDIFFERENT; echo $?)
+#Comprobar espacio que requerira la imagen para ser almacenada
+read SIZEDATA SIZEREQUIRED ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$3" DIFF)
+
+ogEcho log session "[50] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED"
+[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?)
+
#Calculamos el tamaño de la imagen:
ogMount $1 $2 >/dev/null
ogLock $1 $2
-ogEcho log session " $MSG_SCRIPTS_CREATE_SIZE"
-cd $ORIG
-SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1)
-let SIZEREQUIRED=$SIZEDATA*$ZSYNC/100
-# Tamaño minimo fichero imagen 300000
-[ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000
-
-# Comprueba que quepa en el repositorio
-[ "$3" == "CACHE" -o "$3" == "cache" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) && ogMountCache >/dev/null
-[ "$3" == "REPO" -o "$3" == "repo" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}')
-ogEcho log session " $SIZEREQUIRED $SIZEFREE"
-[ $SIZEREQUIRED -gt $SIZEFREE ] && exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?)
TIMEAUX3=$[SECONDS-TIME2]
ogEcho log session " $MSG_SCRIPTS_TASK_END $MSG_SCRIPTS_TIME_PARTIAL: $[TIMEAUX3/60]m $[TIMEAUX3%60]s"
-# Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial
-if [ "$FSTYPE" == "NTFS" ]; then
- ogEcho log session "[55] $MSG_HELP_ogAclFilter "
- ogAclFilter
- TIMEAUX4=$[SECONDS-TIMEAUX3]
- ogEcho log session " $MSG_SCRIPTS_TASK_END $MSG_SCRIPTS_TIME_PARTIAL: $[TIMEAUX4/60]m $[TIMEAUX4%60]s"
-fi
TIMEAUX5=$[SECONDS-TIMEAUX3]
# Configuro la informacion del tamaño de los datos en /tmp/ogimg.info
@@ -202,7 +169,6 @@ ogWaitSyncImage "$3" "$5" $DIFFTYPE "reduced" $SIZEREQUIRED || exit $(ogRaiseErr
echo " " > $OGLOGCOMMAND
# Comprobamos que la imagen esta bien
ogEcho log session "[95] $MSG_HELP_ogCheckSyncImage"
-sleep 10
ogCheckSyncImage $3 "$5" diff || exit $(ogRaiseError session $OG_ERR_IMAGE "$3 $5 diff"; echo $?)
#resumen de la operacion
diff --git a/client/shared/scripts/createImage b/client/shared/scripts/createImage
index df98ec5b..7c6ed5bb 100755
--- a/client/shared/scripts/createImage
+++ b/client/shared/scripts/createImage
@@ -53,7 +53,7 @@ TIME1=$SECONDS
# Valores por defecto en etc/engine.cfg
#IMGPROG="partclone"
#IMGCOMP="lzop"
-#IMGEXT="img"
+IMGEXT=${IMGEXT:-"img"}
#IMGREDUCE="TRUE"
# Clear temporary file used as log track by httpdlog
@@ -63,7 +63,7 @@ echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.t
ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*"
# Si el repositorio es CACHE comprobamos que exista
-if [ "$3" == "CACHE" -o "$3" == "cache" ]; then
+if [ "${3^^}" == "CACHE" ]; then
! ogFindCache >/dev/null && exit $(ogRaiseError $OG_ERR_NOTCACHE "CACHE "; echo $?)
fi
@@ -89,32 +89,18 @@ if [ -f "$IMGFILE" ]; then
mv "$IMGFILE" "$IMGFILE.ant"
mv "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null
mv "$IMGFILE.sum" "$IMGFILE.sum.ant" 2>/dev/null
+ mv "$IMGFILE.full.sum" "$IMGFILE.full.sum.ant" 2>/dev/null
fi
-#Comprobar espacio que requerira la imagen para ser almacenada
echo " " > $OGLOGCOMMAND
-if ogMount $1 $2 &>/dev/null
-then
- SIZEDATA=$(df -k | grep $PART | awk '{print $3}')
- #Aplicar factor de compresion
- FACTORGZIP=55/100
- FACTORLZOP=65/100
- let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP
- #Comprobar espacio libre en el contenedor.
- [ "$3" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`)
- [ "$3" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}')
-else
- ogRaiseError $OG_ERR_PARTITION "$1 $2"
- exit $?
-fi
+# Borramos ficheros de paginacion y configuracion
+ogCleanOs $1 $2
-ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED $SIZEFREE"
-[ "$SIZEREQUIRED" -gt "$SIZEFREE" ] && exit $(ogRaiseError $OG_ERR_CACHESIZE "$3" || echo $?)
+#Comprobar espacio que requerira la imagen para ser almacenada
+read SIZEDATA SIZEREQUIRED ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$3")
-# Ejecuta script personalizado de preconfiguración del sistema operativo modelo.
-if which createImageCustomPre &>/dev/null; then
- createImageCustomPre "$1" "$2" "$3" "$4"
-fi
+ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED"
+[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?)
# Comprobar consistencia del sistema de archivos.
echo " " > $OGLOGCOMMAND
@@ -154,16 +140,11 @@ ogEcho log session " $MSG_HELP_ogExtendFs $NEWSIZEFS -> $SIZEFS = $SIZEFS
#TODO que hacer si error al extender sistemade archivos
#resumen de la operacion
-IMGSIZE=$(ls -s `ogGetPath $3 /$4.img`| cut -f1 -d" ")
-IMGOS=$(ogGetImageInfo `ogGetPath $3 /$4.img`)
+IMGSIZE=$(ls -s `ogGetPath $3 /$4.$IMGEXT`| cut -f1 -d" ")
+IMGOS=$(ogGetImageInfo `ogGetPath $3 /$4.$IMGEXT`)
TIME=$[SECONDS-TIME1]
ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s"
ogEcho log session " FileSystem $PART with $NEWSIZEFS KB data created onto file-image as $4 and used $IMGSIZE KB across DFS $ogprotocol"
ogEcho log session " Image-file $4 metada: $IMGOS"
-# Ejecuta scripts personalizado de postconfiguracion del sistema operativo modelo.
-if which createImageCustomPost &>/dev/null; then
- createImageCustomPost "$1" "$2" "$3" "$4"
-fi
-
diff --git a/client/shared/scripts/createImageCustom.template b/client/shared/scripts/createImageCustom.template
new file mode 100644
index 00000000..73269d1b
--- /dev/null
+++ b/client/shared/scripts/createImageCustom.template
@@ -0,0 +1,35 @@
+#!/bin/bash
+#/**
+# createImageCustom
+#@brief Plantilla para scirpt de creación personalizada de imagen.
+#@param $1 nº de disco
+#@param $2 nº de partición
+#@param $3 Repositorio: CACHE, REPO o dirección IP
+#@param $4 Nombre canónico de la imagen sin extensión
+#@warning Renombrar este fichero como "createImageCustom" para sustituir al script estándar "createImage".
+#**/
+
+
+# Control de parámetros.
+[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: createImageCustom int_ndisc int_npart str_repo str_imgname" || exit $?
+
+# Toma de parámetros.
+DISK="$1" # Nº de disco.
+PART="$2" # Nº de partición.
+REPO="${3^^}" # Repositorio (en mayúsculas).
+IMGNAME="$4" # Nombre canónico de imagen (sin extensión).
+
+
+# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
+
+
+# Paso 1: Añadir aquí el código para el proceso previo antes de la creación de la imagen en el equipo modelo (opcional).
+
+
+# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de creación de imagen por código personalizado.
+createImage "$@"
+
+
+# Paso 3: Añadir aquí el código para el proceso posterior tras la creación de la imagen (opcional).
+
+
diff --git a/client/shared/scripts/createImageCustomPost.template b/client/shared/scripts/createImageCustomPost.template
deleted file mode 100644
index 1cec03f6..00000000
--- a/client/shared/scripts/createImageCustomPost.template
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-# createImageCustomPost.template
-# Plantilla para fichero de postconfiguración del cliente modelo tras crear una imagen.
-# Recibe los mismos parámetros que el script "createImage".
-# Nota: para usar este fichero, renombrar como "createImageCustomPost".
-
-
-# Control de parámetros.
-[ $# -ne 4 ] || exit
-
-
-
diff --git a/client/shared/scripts/createImageCustomPre.template b/client/shared/scripts/createImageCustomPre.template
deleted file mode 100644
index 9c58bcab..00000000
--- a/client/shared/scripts/createImageCustomPre.template
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-# createImageCustomPre.template
-# Plantilla para fichero de preconfiguración del cliente modelo antes de crear una imagen.
-# Recibe los mismos parámetros que el script "createImage".
-# Nota: para usar este fichero, renombrar como "createImageCustomPre".
-
-
-# Control de parámetros.
-[ $# -le 4 ] || exit
-
-
diff --git a/client/shared/scripts/deployImage b/client/shared/scripts/deployImage
index 1b2973e9..3be16e92 100755
--- a/client/shared/scripts/deployImage
+++ b/client/shared/scripts/deployImage
@@ -14,6 +14,8 @@
#@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación.
#@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema.
#@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen.
+#@exception OG_ERR_NOTCACHE No existe cache -15-
+#@exception OG_ERR_CACHESIZE Tamaño de la paticion menor al archivo a descargar -16-
#@version 1.0.1 - Separación en protocolos de transferencia y postconfiguracion
#@author Antonio J. Doblas Viso. Universidad de Málaga
#@date 2011-05-11
@@ -26,21 +28,22 @@
#@version 1.0.5 - Renominación del script como "deployImage".
#@author Antonio J. Doblas Viso y Ramón M. Gómez.
#@date 2013-12-04
+#@version 1.0.6 - Se añade la gestión de errores de la CACHE cuando en el engine.cfg se define RESTOREPROTOCOLNOCACHE=NONE.
+#@author Antonio J. Doblas Viso.
+#@date 2015-02-23
#**/
#Descripcion:
-# La interfaz detecta:
-# Si Repositorio es el global (REPO) realiza un deploy.
-# Si Repositorio es local (CACHE) realiza un restoreImage CACHE
-# El deploy, si detecta que el cliente no tiene una cache con espacio suficiente
-# -- reazlia un ogRestore REPO
+# Si Repositorio es el global (REPO) realiza un deploy.
+# Si Repositorio es local (CACHE) realiza un restoreImage CACHE
+# El deploy, si detecta que el cliente no tiene una CACHE o no tiene espacio suficiente consulta el engine.cfg RESTOREPROTOCOLNOCACHE
PROG="$(basename $0)"
if [ $# -lt 4 ]; then
- ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco nparticion [ UNICAST|UNICAST-CACHE|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]"
+ ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]"
exit $?
fi
@@ -111,17 +114,35 @@ case "$REPO" in
NEXTOPERATION=CACHE
;;
15|16)
+ # no se permite usar la cache (no existe(15) o no espacio sufiente (16). Se consulta engine.cfg para RESTOREPROTOCOLNOCACHE [ multicast unicast none ]
ogEcho log session "[50] $MSG_ERR_NOTCACHE ; $MSG_ERR_CACHESIZE "
- ogEcho log session "[50] $MSG_SCRIPTS_CHECK_ENGINE "
- if [ "$RESTOREPROTOCOLNOCACHE" == "MULTICAST" ]; then
- case "$PROTO" in
- MULTICAST) NEXTOPERATION=MULTICAST ;;
- TORRENT) NEXTOPERATION=UNICAST ;;
- UNICAST) NEXTOPERATION=UNICAST ;;
- esac
- else
- NEXTOPERATION=UNICAST
- fi
+ ogEcho log session "[50] $MSG_SCRIPTS_CHECK_ENGINE: RESTOREPROTOCOLNOTCACHE=$RESTOREPROTOCOLNOTCACHE "
+ case "$RESTOREPROTOCOLNOTCACHE" in
+ MULTICAST)
+ case "$PROTO" in
+ MULTICAST) NEXTOPERATION=MULTICAST ;;
+ TORRENT) NEXTOPERATION=UNICAST ;;
+ UNICAST) NEXTOPERATION=UNICAST ;;
+ esac
+ ;;
+ UNICAST)
+ NEXTOPERATION=UNICAST
+ ;;
+ NONE)
+ case $RETVAL in
+ 15)
+ ogEcho log session "[100] $MSG_ERR_NOTCACHE"
+ ogRaiseError session $OG_ERR_NOTCACHE "NOT CACHE"
+ exit $?
+ ;;
+ 16)
+ ogEcho log session "[100] $MSG_ERR_CACHESIZE "
+ ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL"
+ exit $?
+ ;;
+ esac # del segundo RETAVAL
+ ;;
+ esac # del RESTOREPROTOCOLNOTCACHE
;;
esac
;;
@@ -139,23 +160,27 @@ esac
TIME3=$SECONDS
+# Obtener parámetros de restauración.
case "$NEXTOPERATION" in
CACHE)
- ogEcho log session "[55] $MSG_HELP_ogRestoreImage : restoreImage CACHE $IMGNAME $DISK $PART UNICAST"
- restoreImage CACHE "$IMGNAME" "$DISK" "$PART"
- RETVAL=$?
- ;;
+ PARAMS="CACHE $IMGNAME $DISK $PART" ;;
UNICAST)
- ogEcho log session "[55] $MSG_HELP_ogRestoreImage : restoreImage REPO $IMGNAME $DISK $PART UNICAST"
- restoreImage REPO "$IMGNAME" "$DISK" "$PART"
- RETVAL=$?
- ;;
+ PARAMS="REPO $IMGNAME $DISK $PART" ;;
MULTICAST)
- ogEcho log session "[55] $MSG_HELP_ogRestoreImage : restoreImage REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT"
- restoreImage REPO "$IMGNAME" "$DISK" "$PART" $PROTO $PROTOOPT
- RETVAL=$?
- ;;
+ PARAMS="REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT" ;;
esac
+
+# Si existe, ejecuta script personalizado "restoreImageCustom"; si no, llama al genérico "restoreImage".
+if which restoreImageCustom &>/dev/null; then
+ ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImageCustom $PARAMS"
+ restoreImageCustom $PARAMS
+else
+ ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImage $PARAMS"
+ restoreImage $PARAMS
+fi
+RETVAL=$?
+
+# Mostrar resultados.
RESUMERESTOREIMAGE=$(grep -m 1 "Total Time:" $OGLOGCOMMAND)
ogEcho log session " [ ] $RESUMERESTOREIMAGE "
# Si la transferencia ha dado error me salgo.
@@ -168,9 +193,10 @@ fi
TIME3=$[SECONDS-TIME3]
ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL : $[TIME3/60]m $[TIME3%60]s"
+# Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs".
if which configureOsCustom &>/dev/null; then
ogEcho log session "[90] configureOsCustom"
- configureOsCustom "$DISK" "$PART"
+ configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME"
else
ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE "
configureOs "$DISK" "$PART"
diff --git a/client/shared/scripts/generateMenuDefault b/client/shared/scripts/generateMenuDefault
index 7a9abd6e..09e4300f 100755
--- a/client/shared/scripts/generateMenuDefault
+++ b/client/shared/scripts/generateMenuDefault
@@ -9,7 +9,7 @@ source /tmp/net-$DEVICE.conf
FILEINFOHTML=$OGLOG/`ogGetIpAddress`.info.html
FILEINFOCACHE=$OGLOG/`ogGetIpAddress`.cache.txt
ogMountCache 2>/dev/null
-CACHECONTENIDO=`ls -m $OGCAC/$OGIMG 2>/dev/null`
+CACHECONTENIDO="ls -m $OGCAC/$OGIMG 2>/dev/null"
SPEED=$(LANG=C ethtool $DEVICE 2>/dev/null | awk '$1~/Speed/ {print $2}')
case "${SPEED,,}" in
@@ -23,8 +23,13 @@ case "${DUPLEX,,}" in
full) ;;
*) DUPLEX="<font color=\"red\">$DUPLEX</font>"
esac
+
CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`)
-expr $CACHESIZEFREE / 1024 > $FILEINFOCACHE 2>/dev/null && echo '.MB,' >> $FILEINFOCACHE
+if [ $CACHESIZEFREE == 0 ]; then
+ echo '0.MB,' > $FILEINFOCACHE
+else
+ expr $CACHESIZEFREE / 1024 > $FILEINFOCACHE 2>/dev/null && echo '.MB,' >> $FILEINFOCACHE
+fi
# Crear menú por defecto.
cat > $FILEINFOHTML << EOT
@@ -72,7 +77,5 @@ cat >> $FILEINFOHTML << EOT
EOT
# Crear contenido de la caché.
-cat >> $FILEINFOCACHE << EOT
-$CACHECONTENIDO
-EOT
+eval $CACHECONTENIDO >> $FILEINFOCACHE
diff --git a/client/shared/scripts/initCache b/client/shared/scripts/initCache
index 908ce85b..d5fba1e7 100755
--- a/client/shared/scripts/initCache
+++ b/client/shared/scripts/initCache
@@ -50,7 +50,7 @@ else
PART=${FINDCACHE#* }
# Si la CACHE actual esta definida en otro disco, se elimina
- if [ "$NDISK" != "$CACHEDISK" ]
+ if [ -n "$CACHEDISK" -a "$NDISK" != "$CACHEDISK" ]
then
echo "[10] Detectada cache en otro disco, eliminarla"
ogUnmountCache 2>/dev/null
diff --git a/client/shared/scripts/installOfflineMode b/client/shared/scripts/installOfflineMode
new file mode 100755
index 00000000..d9ff2459
--- /dev/null
+++ b/client/shared/scripts/installOfflineMode
@@ -0,0 +1,60 @@
+#!/bin/bash
+
+#/**
+# installOfflineMode
+#@brief Prepara el equipo cliente para el modo offline.
+#@param no
+#@return
+#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado.
+#@exception OG_ERR_NOTCACHE No existe cache.
+#@author Irina Gomez. ETSII. Universidad de Sevilla
+#@date 2013/12/5
+#*/ ##
+
+PROG="$(basename $0)"
+if [ "$*" == "help" ]; then
+ ogHelp "$PROG $MSG_HELP_installOfflineMode" \
+ "$PROG [ no param ]"
+ exit 0
+fi
+
+ogEcho log session "$MSG_HELP_installOfflineMode"
+# Cargamos las variables de entorno.
+[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg
+DIRTFTP="/opt/oglive/tftpboot"
+DIROGCLIENT="$DIRTFTP/ogclient"
+# Comprobamos que el DIROGCLIENT esta montado desde repo
+df |grep "$(ogGetRepoIp).*$DIRTFTP" &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "REPO OGclient" || exit $?
+
+# Copiamos el kernel y el initrd.
+ogEcho log session " [10] updateBootCache"
+updateBootCache || ogRaiseError $OG_ERR_NOTCACHE || exit $?
+
+# Creamos los dir necesarios.
+ogEcho log session " [40] mkdir -p $OGCAC/{ogclient, menus, log}."
+[ -d $OGCAC/menus/images/iconos ] || mkdir -p $OGCAC/menus/images/iconos
+[ -d $OGCAC/ogclient ] || mkdir -p $OGCAC/ogclient
+[ -d $OGCAC/log ] || mkdir -p $OGCAC/log
+[ -d $OGCAC/opt/opengnsys/images ] || mkdir -p $OGCAC/opt/opengnsys/images
+
+# Comparamos el cliente en el server y en cache
+ogEcho log session " [60] cp $DIROGCLIENT/ogclient.sqfs $OGCAC/ogclient/"
+SERVEROGCLIENT=$(cat $DIROGCLIENT/ogclient.sqfs.sum 2>/dev/null)
+CACHEOGCLIENT=$(cat $OGCAC/ogclient/ogclient.sqfs.sum 2>/dev/null)
+
+if [ "$CACHEOGCLIENT" != "$SERVEROGCLIENT" ]; then
+ cp $DIROGCLIENT/ogclient.sqfs $OGCAC/ogclient/
+ cp $DIROGCLIENT/ogclient.sqfs.sum $OGCAC/ogclient/
+fi
+
+# Si se ha generado el menu de inicio lo copiamos a cache.
+IPCLIENT=$(ogGetIpAddress)
+MENU=$OGLOG/$IPCLIENT.info.html
+ICONO="images/iconos/logoopengnsys.png"
+[ -f $MENU ] || generateMenuDefault
+ogEcho log session " [90] cp $MENU $OGCAC/menus/$IPCLIENT.html"
+cp $MENU $OGCAC/menus/$IPCLIENT.html
+sed -i s/"..\/images"/"images"/g $OGCAC/menus/$IPCLIENT.html
+wget --no-check-certificate https://$(ogGetRepoIp)/opengnsys/$ICONO -O $OGCAC/menus/$ICONO
+
+
diff --git a/client/shared/scripts/ogRestaurarImagenBasica b/client/shared/scripts/ogRestaurarImagenBasica
index 4be8e49d..d045f831 100755
--- a/client/shared/scripts/ogRestaurarImagenBasica
+++ b/client/shared/scripts/ogRestaurarImagenBasica
@@ -186,7 +186,14 @@
fi
echo "Ejecutando configure OS" | tee -a $OGLOGSESSION $OGLOGFILE
- configureOs $DISCO $NPART
+ if which configureOsCustom &>/dev/null; then
+ ogEcho log session "[90] configureOsCustom"
+ configureOsCustom "$DISCO" "$NPART" "$IPREPOSITORIO" "$NOMBREIMG"
+ else
+ ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE "
+ configureOs "$DISCO" "$NPART"
+ fi
+
echo "!!! Finaliza correctamente !!! restauracion imagen basica $NOMBREIMG desde cache local" | tee -a $OGLOGSESSION $OGLOGFILE
#___________________________________________________________________
diff --git a/client/shared/scripts/poweroff b/client/shared/scripts/poweroff
index 9af4d669..c108e08e 100755
--- a/client/shared/scripts/poweroff
+++ b/client/shared/scripts/poweroff
@@ -21,7 +21,7 @@ BUSYBOX=${BUSYBOX:-"busybox"}
# Retardo para dar lugar al registro en cola de acciones.
sleep 5
# Parar Browser para evitar "cuelgues".
-pkill browser
+[ "$ogstatus" == "offline" ] || pkill browser
# Apagar.
$BUSYBOX poweroff
diff --git a/client/shared/scripts/reboot b/client/shared/scripts/reboot
index 87df09d0..87e30e21 100755
--- a/client/shared/scripts/reboot
+++ b/client/shared/scripts/reboot
@@ -34,7 +34,8 @@ BUSYBOX=${BUSYBOX:-"busybox"}
# Retardo para dar lugar al registro en cola de acciones.
sleep $TIME
# Parar Browser para evitar "cuelgues".
-pkill browser
+[ "$ogstatus" == "offline" ] || pkill browser
# Reiniciar.
$BUSYBOX reboot
+
diff --git a/client/shared/scripts/restoreBaseImage b/client/shared/scripts/restoreBaseImage
index 318e7c6f..c4e87ba4 100755
--- a/client/shared/scripts/restoreBaseImage
+++ b/client/shared/scripts/restoreBaseImage
@@ -65,13 +65,13 @@ ogIsSyncImage REPO "$2" $IMGEXT || exit $(ogRaiseError session $OG_ERR_DONTSYN
IMGEXT="img"
# Comprobamos si la imagen o la particion estan bloqueada:
-ogIsImageLocked "$1" "$2.$IMGEXT" && exit $(ogRaiseError session $OG_ERR_LOCKED "$1 $2.$IMGEXT"; echo $?)
+ogIsImageLocked "REPO" "$2.$IMGEXT" && exit $(ogRaiseError session $OG_ERR_LOCKED "$1 $2.$IMGEXT"; echo $?)
ogIsLocked "$3" "$4" && exit $(ogRaiseError session $OG_ERR_LOCKED "$3 $4"; echo $?)
# Detectamos el sistema de ficheros de la imagen
# TODO ogGetImageInfo
-DIRMOUNT=$(ogMountImage "$1" "$2")
-ogWaitSyncImage "$1" "$2" "$IMGEXT" "mounted" || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $IMGEXT: time_out."; echo $?)
+DIRMOUNT=$(ogMountImage "REPO" "$2")
+ogWaitSyncImage "REPO" "$2" "$IMGEXT" "mounted" || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $IMGEXT: time_out."; echo $?)
IMGFSTYPE=$(head -1 $DIRMOUNT/ogimg.info |cut -d: -f3)
# Comprobamos si el sistema de ficheros se puede montar
@@ -132,14 +132,22 @@ ogUnmountImage "$1" "$2" "$IMGEXT"
# Restableciendo acl
ogUnlock $3 $4
ogEcho log session "[70] $MSG_HELP_ogRestoreInfoImage"
-ogRestoreInfoImage $3 $4 2>&1 | tee -a $OGLOGCOMMAND
+ogExecAndLog command ogRestoreInfoImage $3 $4
# Llamar al script de post-configuración del sistema operativo.
# Si a este script lo ha llamado el script restoreDiffImage no post-configuramos
if [ "$(ogGetCaller)" != "restoreDiffImage" ];then
+ ogExecAndLog command ogRestoreAclImage $3 $4
+ if which configureOsCustom &>/dev/null; then
+ ogEcho log session "[90] configureOsCustom"
+ configureOsCustom "$3" "$4" "$1" "$2"
+ else
ogEcho log session "[90] $MSG_HELP_configureOs"
configureOs $3 $4
+ fi
fi
+TIMEAUX3=$[SECONDS-TIMEAUX2]
+ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX3/60]m $[TIMEAUX3%60]s"
TIME=$[SECONDS-TIME1]
ogEcho log session "[100] $MSG_SCRIPTS_END $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
diff --git a/client/shared/scripts/restoreDiffImage b/client/shared/scripts/restoreDiffImage
index 9af1064f..6bd7b1df 100755
--- a/client/shared/scripts/restoreDiffImage
+++ b/client/shared/scripts/restoreDiffImage
@@ -1,15 +1,15 @@
#!/bin/bash
#/**
-# restoreiDiffSquash
+# restoreDiffImage
#@brief Script de ejemplo para restaurar una imagen diferencial.
#@brief (puede usarse como base para el programa de restauración de imágenes usado por OpenGNSys Admin).
#@param 1 REPO|CACHE
#@param 2 imagen basica
-#@param 2 imagen diferencial
-#@param 3 disco
-#@param 4 particion
-#@param 5 protocolo
-#@param 6 opciones protocolo
+#@param 3 imagen diferencial
+#@param 4 disco
+#@param 5 particion
+#@param 6 protocolo
+#@param 7 opciones protocolo
#@return
#@exception OG_ERR_FORMAT # 1 formato incorrecto.
#@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado
@@ -121,15 +121,21 @@ ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[T
# creando enlaces y restableciendo ACL (en windows)
ogEcho log session "[70] $MSG_HELP_ogRestoreInfoImage"
-ogRestoreInfoImage "$4" "$5" 2>&1 | tee -a $OGLOGCOMMAND
+ogExecAndLog command ogRestoreInfoImage "$4" "$5"
+ogExecAndLog command ogRestoreAclImage "$4" "$5"
+TIMEAUX3=$[SECONDS-TIMEAUX2]
+ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX3/60]m $[TIMEAUX3%60]s"
# Llamar al script de post-configuración del sistema operativo.
-ogEcho log session "[90] $MSG_HELP_configureOs."
-configureOs $4 $5
-
+if which configureOsCustom &>/dev/null; then
+ ogEcho log session "[90] configureOsCustom"
+ configureOsCustom "$4" "$5" "$1" "$2"
+else
+ ogEcho log session "[90] $MSG_HELP_configureOs."
+ configureOs $4 $5
+fi
TIME=$[SECONDS-TIME1]
ogEcho log session "[100] $MSG_SCRIPTS_END $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s"
# Si ha habido problema al sincronizar nos salimos con error
[ $RETVAL == 0 ] || exit $OG_ERR_SYNCHRONIZING
-
diff --git a/client/shared/scripts/restoreImage b/client/shared/scripts/restoreImage
index b701b82a..6d5198aa 100755
--- a/client/shared/scripts/restoreImage
+++ b/client/shared/scripts/restoreImage
@@ -43,8 +43,8 @@ case "$PROTO" in
UNICAST|UNICAST-DIRECT)
# Restaurar la imagen.
ogEcho log session "[40] ogRestoreImage $REPO $IMGNAME $DISK $PART UNICAST"
- ogRestoreImage "$REPO" "$IMGNAME" "$DISK" "$PART" 2>&1 | tee -a $OGLOGCOMMAND
- RETVAL=${PIPESTATUS[0]}
+ ogExecAndLog command ogRestoreImage "$REPO" "$IMGNAME" "$DISK" "$PART"
+ RETVAL=$?
;;
MULTICAST|MULTICAST-DIRECT)
PORT=$(echo $PROTOOPT | cut -f1 -d":")
@@ -53,8 +53,8 @@ case "$PROTO" in
#TODO comprobar parametros anteriores
ogEcho log session "[40] ogMcastReceiverPartition $DISK $PART $PORT $TOOL $COMPRESS"
ogMcastRequest "$IMGNAME.img" "$PROTOOPT"
- ogMcastReceiverPartition "$DISK" "$PART" "$PORT" "$TOOL" "$COMPRESS" 2>&1 | tee -a $OGLOGCOMMAND
- RETVAL=${PIPESTATUS[0]}
+ ogExecAndLog command ogMcastReceiverPartition "$DISK" "$PART" "$PORT" "$TOOL" "$COMPRESS"
+ RETVAL=$?
;;
*) # Protocolo desconocido.
ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST opciones ]"
diff --git a/client/shared/scripts/restoreImageCustom.template b/client/shared/scripts/restoreImageCustom.template
new file mode 100644
index 00000000..da32779c
--- /dev/null
+++ b/client/shared/scripts/restoreImageCustom.template
@@ -0,0 +1,34 @@
+#!/bin/bash
+#/**
+# restoreImageCustom
+#@brief Plantilla para scirpt de rastauración personalizada de imagen.
+#@param $1 nº de disco
+#@param $2 nº de partición
+#@param $3 Repositorio: CACHE, REPO o dirección IP
+#@param $4 Nombre canónico de la imagen sin extensión
+#@warning Renombrar este fichero como "restoreImageCustom" para sustituir al script estándar "restoreImage".
+#**/
+
+
+# Control de parámetros.
+[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: createImageCustom int_ndisc int_npart str_repo str_imgname" || exit $?
+
+# Toma de parámetros.
+DISK="$1" # Nº de disco.
+PART="$2" # Nº de partición.
+REPO="${3^^}" # Repositorio (en mayúsculas).
+IMGNAME="$4" # Nombre canónico de imagen (sin extensión).
+
+
+# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado).
+
+
+# Paso 1: Añadir aquí el código para el proceso previo antes de la restauración de la imagen en los equipos (opcional).
+
+
+# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de restauración de imagen por código personalizado.
+restoreImage "$@"
+
+
+# Aviso: editar la plantilla "configureOsCustom" para añadir el código personalizado para el proceso de postconfiguración de los clientes (no incluir aquí dicho código).
+
diff --git a/client/shared/scripts/updateCache b/client/shared/scripts/updateCache
index a0670fe6..8760ddd2 100755
--- a/client/shared/scripts/updateCache
+++ b/client/shared/scripts/updateCache
@@ -25,6 +25,9 @@
#@date 2011-05-10
#@version 2.0.1 - Imagenes sincronizadas
#@date 2013-02-20
+#@version 1.0.5 - uso de md5 full para las transferencias torrent, en la llamada => ogUpdateCacheIsNecesary
+#@date 2014-07-09
+
#*/ ##
PROG="$(basename $0)"
@@ -72,8 +75,7 @@ else
# Si la imagen es monolitica y ha elegido protocolo = RSYNC salimos con error.
[ $PROTOCOLO == "RSYNC" ] && exit $(ogRaiseError session $OG_ERR_DONTSYNC_IMAGE "REPO $2"; echo $?)
IMGSYNC=FALSE
- #TODO: ogUpdateCacheIsNecesary debe borrar la imagen que tenga igual nombre pero distinto sum-
- ogUpdateCacheIsNecesary $1 $2
+ ogUpdateCacheIsNecesary "$1" "$2" "$PROTOCOLO"
RETVAL=$?
fi
# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1
@@ -112,7 +114,7 @@ else
SIZEREQUIRED=$FILESIZE
fi
-#ERROR CACHESIZE 16
+#ERROR CACHESIZE 16 (tamanyo de la CACHE insuficiente)
if [ "$SIZEREQUIRED" -ge "$CACHESIZE" ]
then
ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $SIZEREQUIRED > CACHE = $CACHESIZE"
@@ -120,14 +122,16 @@ then
exit $?
fi
-ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO"
-#ERROR CACHESIZE 16
+
+#ERROR CACHESIZE 16 (Espacio libre en CACHE insuficiente)
if [ "$SIZEREQUIRED" -ge "$CACHESIZEFREE" ]
then
- # ogEcho log session "[ ] No hay espacio sufiente en la CACHE, detectar que hacer con engine.cfg"
+ ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO: ACTIONCACHEFULL=$ACTIONCACHEFULL"
case "$ACTIONCACHEFULL" in
NONE)
- NEXTOPERATION=UNICAST
+ ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $SIZEREQUIRED > FREE SPACE CACHE = $CACHESIZEFREE"
+ ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL, NO SPACE FREE"
+ exit $?
;;
FORMAT)
ogEcho log session "[51] $MSG_HELP_ogFormatCache "
@@ -150,7 +154,7 @@ then
fi
# Comprobamos que imagen cache igual a la del repo. Si sincronizada no podemos comprobar.
-[ "$IMGSYNC" == "TRUE" ] || ogUpdateCacheIsNecesary $REPOSITORIO "$2"
+[ "$IMGSYNC" == "TRUE" ] || ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO"
RETVAL=$?
# si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1
[ "$RETVAL" == "1" ] && exit 0
@@ -173,7 +177,7 @@ case "$PROTOCOLO" in
ogEcho log session "ogCopyFile $1 $2.torrent absolute $OGCAC/$OGIMG"
# tiempos
timewait=$(expr $(printf '%d\n' 0x$(ogGetMacAddress | awk -F: '{print $5$6}')) \* 120 / 65535)
- ogCopyFile $REPOSITORIO "$2.torrent" "$IMGDIR" 2>&1 | tee -a $OGLOGCOMMAND
+ ogExecAndLog command ogCopyFile $REPOSITORIO "$2.torrent" "$IMGDIR"
#TODO: comprobar que el tracker definido en el fichero es correcto.
#TODO comprobar que el fichero torrent está en cache
# retardamos el inicio -aleatorio de 0 a 120 segundos- al tracker para gestionar mas de +-40 equipos
@@ -181,11 +185,11 @@ case "$PROTOCOLO" in
ogEcho log session " [ ] $MSG_SCRIPTS_TASK_SLEEP : $P2PWAIT seconds ogTorrentStart CACHE $2.torrent $4"
sleep $P2PWAIT
ogEcho log session " [ ] $MSG_SCRIPTS_TASK_START: ogTorrentStart CACHE $2.torrent $4"
- ogTorrentStart CACHE "$2.torrent" $4 2>&1 | tee -a $OGLOGCOMMAND
+ ogExecAndLog command ogTorrentStart CACHE "$2.torrent" $4
RESUMEUPDATECACHE=$(grep -m 1 -B1 "Download" $OGLOGCOMMAND)
RESUMEUPDATECACHEbf=$(grep -m 1 "Download" $OGLOGCOMMAND)
if [ "$RESUMEUPDATECACHEbf" == "Download complete." ]; then
- rm $IMGDIR$2".torrent.bf" 2>&1 | tee -a $OGLOGCOMMAND
+ rm -f $IMGDIR$2".torrent.bf"
fi
;;
MULTICAST)
@@ -198,7 +202,7 @@ case "$PROTOCOLO" in
#FIN TODO
if (nmap -n -sU -p $PORTAUX $REPOIP | grep open)
then
- ogMcastReceiverFile $PORT CACHE "$2" 2>&1 | tee -a $OGLOGCOMMAND
+ ogExecAndLog command ogMcastReceiverFile $PORT CACHE "$2"
else
# TODO ticket 379 Realizar la petición basada en identificador de operacion
@@ -208,7 +212,7 @@ case "$PROTOCOLO" in
sleep 10
if (nmap -n -sU -p $PORTAUX $REPOIP | grep open)
then
- ogMcastReceiverFile $PORT CACHE "$2" 2>&1 | tee -a $OGLOGCOMMAND
+ ogExecAndLog command ogMcastReceiverFile $PORT CACHE "$2"
else
ogEcho log session "$MSG_SCRIPTS_TASK_ERR : hose $REPOIP 2009 --out sh -c echo -ne START_MULTICAST $2 $OPTPROTOCOLO"
exit $OG_ERR_UPDATECACHE
@@ -221,7 +225,7 @@ case "$PROTOCOLO" in
;;
UNICAST)
#ogEcho log session "unicast"
- ogCopyFile $REPOSITORIO "$2" "$IMGDIR" 2>&1 | tee -a $OGLOGCOMMAND
+ ogExecAndLog command ogCopyFile $REPOSITORIO "$2" "$IMGDIR"
sleep 5
RESUMEUPDATECACHE=$(grep -m 1 "100%" $OGLOGCOMMAND.tmp)
;;
@@ -262,7 +266,7 @@ case "$PROTOCOLO" in
ogMountImage CACHE "${IMGNAME#\/}" $IMGTYPE || exit $?
ogMountImage REPO "${IMGNAME#\/}" $IMGTYPE
# Esperamos que se monte la imagen en el servidor
- ogWaitMountImage REPO "$IMGNAME" $IMGTYPE || exit $?
+ ogWaitSyncImage REPO "$IMGNAME" $IMGTYPE "mounted" || exit $?
ogEcho log session " rsync -aHAX$OPTRSYNC $USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/ $DIRLOCAL"
rsync -aHAX$OPTRSYNC $PASSWORD "$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/" "$DIRLOCAL" 2>>$OGLOGCOMMAND | egrep "^sent|^sending|^total|%" >> $OGLOGCOMMAND
# RETVAL="1" -> OK RETVAL="2" -> error # valores igual que ogUpdateCacheIsNecesary
@@ -285,7 +289,7 @@ if [ "$IMGSYNC" == "TRUE" ]; then
# RETVAL="1" -> OK RETVAL="2" -> error # valores igual que ogUpdateCacheIsNecesary
[ $PROTOCOLO == "RSYNC" ] || RETVAL=1
else
- ogUpdateCacheIsNecesary $REPOSITORIO "$2"
+ ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO"
RETVAL=$?
fi
if [ "$(ogGetCaller)" != "deployImage" ]; then