diff options
author | ramon <ramongomez@us.es> | 2015-05-29 07:34:07 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2015-05-29 07:34:07 +0000 |
commit | de687e3ba82883fa561b00bca0dbd0a73b6ee2d5 (patch) | |
tree | 617373349e83966c6914cb4f49980dcc0f90fc88 /client | |
parent | e589e1def0bea3c39e7691283a2ea13e170d84cd (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')
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 Binary files differnew file mode 100755 index 00000000..366204f0 --- /dev/null +++ b/client/shared/bin/rsync-3.1.0 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 |