diff options
author | ramon <ramongomez@us.es> | 2011-02-22 17:43:43 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2011-02-22 17:43:43 +0000 |
commit | 08b941fc516fd39c8ae76b6eb0aa9811e3428a9a (patch) | |
tree | c8d9e9c842efd295aeae8c5ff9862816ed74c0de | |
parent | 697a9eecb6bb4e0ebbd51610a499a0aa21c53060 (diff) |
Gestionar bloqueos de imágenes en la librería {{{Image}}} de la rama trunk.
* Crear funciones de creación, eliminación y comprobación de bloqueos.
* Modificadas funciones de creación y restauración de imágenes con tratamiento de bloqueos de imágenes.
Pequeña mejora en el arranque del cliente Initrd.
Refs #298.
git-svn-id: https://opengnsys.es/svn/trunk@1470 a21b9725-9963-47de-94b9-378ad31fedc9
-rwxr-xr-x | client/engine/Image.lib | 88 | ||||
-rw-r--r-- | client/nfsexport/etc/lang.es_ES.conf | 18 | ||||
-rwxr-xr-x | client/nfsexport/etc/preinit/default.sh | 1 | ||||
-rwxr-xr-x | client/nfsexport/etc/preinit/mount.sh | 45 |
4 files changed, 93 insertions, 59 deletions
diff --git a/client/engine/Image.lib b/client/engine/Image.lib index 3923fa79..8163df3f 100755 --- a/client/engine/Image.lib +++ b/client/engine/Image.lib @@ -37,7 +37,7 @@ function ogCreateImage () { # Variables locales -local PART PROGRAM IMGDIR IMGFILE ERRCODE +local PART PROGRAM IMGDIR IMGFILE IMGTYPE ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -48,19 +48,27 @@ fi # Error si no se reciben 4 parámetros. [ $# -ne 4 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Comprobar que no está bloqueada ni la partición, ni la imagen. PART="$(ogDiskToDev $1 $2)" || return $? if ogIsLocked $1 $2; then - ogRaiseError $OG_ERR_LOCKED "$1,$2" + ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $1, $2" return $? fi +IMGTYPE="pgz" # Partclone / GZip IMGDIR=$(ogGetParentPath "$3" "$4") [ -n "$IMGDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$3 $(dirname $4)" || return $? -IMGFILE="$IMGDIR/$(basename "$4").pgz" +IMGFILE="$IMGDIR/$(basename "$4").$IMGTYPE" +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $3, $4" + return $? +fi +# Desmontar partición, bloquear partición e imagen. ogUnmount $1 $2 2>/dev/null - ogLock $1 $2 || return $? -trap "ogUnlock $1 $2; rm -f $IMGFILE" 1 2 3 6 9 +ogLockImage "$3" "$4.$IMGTYPE" || return $? +# Crear Imagen. +trap "ogUnlock $1 $2; ogUnlockImage "$3" "$4.$IMGTYPE"; rm -f $IMGFILE" 1 2 3 6 9 TYPE="$(ogGetFsType $1 $2)" case "$TYPE" in EXT[234]) @@ -76,15 +84,17 @@ case "$TYPE" in *) ogRaiseError $OG_ERR_PARTITION "$1 $2 $TYPE" return $? ;; esac - $PROGRAM -c -C -F -s $PART | mbuffer -q -m 70% | gzip -c > "$IMGFILE" + # Controlar salida de error y desbloquear partición. ERRCODE=$? if [ $ERRCODE != 0 ]; then ogRaiseError $OG_ERR_IMAGE "$1 $2 $IMGFILE" rm -f "$IMGFILE" fi +# Desbloquear partición e imagen. ogUnlock $1 $2 +ogUnlockImage "$3" "$4.$IMGTYPE" return $ERRCODE } @@ -180,6 +190,63 @@ done echo $IMGTYPE } +# Comprobar si el fichero de bloqueo para una imagen. +function ogIsImageLocked () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "if $FUNCNAME /opt/opengnsys/images/aula1/winxp.img; then ...; fi" \ + "if $FUNCNAME REPO /aula1/winxp.img; then ...; fi" + return +fi +# Comprobar si existe el fichero de bloqueo. +test -n "$(ogGetPath $@.lock)" +} + +# Bloquear imagen para creación. +function ogLockImage () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \ + "$FUNCNAME REPO /aula1/winxp.img" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Comprobar que existe directorio de imagen +IMGDIR=$(ogGetParentPath $@) || return $? +# Crear fichero de bloqueo. +touch $IMGDIR/$(basename "${!#}").lock +} + +# Desbloquear imagen (borrar fichero de bloqueo). +function ogUnlockImage () +{ +# Variables locales +local IMGDIR + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [str_repo] path_image" \ + "$FUNCNAME /opt/opengnsys/images/aula1/winxp.img" \ + "$FUNCNAME REPO /aula1/winxp.img" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 1 -o $# -gt 2 ] && ogRaiseError $OG_ERR_FORMAT && return $? +# Borrar fichero de bloqueo para la imagen. +rm -f $(ogGetPath $@.lock) +} + #/** # ogRestoreImage str_repo path_image int_ndisk int_npartition #@brief Restaura una imagen de sistema de archivos en una partición. @@ -228,11 +295,16 @@ if [ $IMGSIZE -gt $PARTSIZE ]; then return $? fi -# Comprobar el bloqueo de la partición, desmontarla y bloquearla. +# Comprobar el bloqueo de la imagen y de la partición. +if ogIsImageLocked "$IMGFILE"; then + ogRaiseError $OG_ERR_LOCKED "$MSG_IMAGE $1, $2.$IMGTYPE" + return $? +fi if ogIsLocked $3 $4; then - ogRaiseError $OG_ERR_LOCKED "$3,$4" + ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION $3, $4" return $? fi +# Desmontar y bloquear partición. ogUnmount $3 $4 2>/dev/null || return $? ogLock $3 $4 || return $? trap "ogUnlock $3 $4" 1 2 3 6 9 diff --git a/client/nfsexport/etc/lang.es_ES.conf b/client/nfsexport/etc/lang.es_ES.conf index 6766de25..929c1288 100644 --- a/client/nfsexport/etc/lang.es_ES.conf +++ b/client/nfsexport/etc/lang.es_ES.conf @@ -6,7 +6,7 @@ MSG_ERR_FORMAT="Formato de ejecución incorrecto" MSG_ERR_OUTOFLIMIT="Valor fuera de rango o no válido" MSG_ERR_NOTFOUND="Fichero o dispositivo no encontrado" MSG_ERR_PARTITION="Partición errónea o desconocida" -MSG_ERR_LOCKED="Partición bloqueada por operación de uso exclusivo" +MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo" MSG_ERR_CACHE="Error en partición de caché local" MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar" MSG_ERR_NOTOS="Sistema operativo no instalado o no detectado" @@ -23,6 +23,7 @@ MSG_EXAMPLE="Ejemplo" MSG_FORMAT="Formato" MSG_FUNCTION="Función" MSG_HARDWAREINVENTORY="Inventario de hardware de la máquina" +MSG_IMAGE="imagen" MSG_INSTALLED="instalado" MSG_NOCACHE="sin caché local" MSG_NOEXTENDED="sin partición extendida" @@ -48,13 +49,13 @@ 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_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros." -MSG_HELP_ogCopyFile="" +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." MSG_HELP_ogCreateImage="Genera una imagen exacta de un sistema operativo instalado localmente." MSG_HELP_ogCreateMbrImage="Genera una imagen del sector de arranque (MBR)." MSG_HELP_ogCreatePartitions="Define la estructura de particiones de un disco." -MSG_HELP_ogDeleteFile="" -MSG_HELP_ogDeleteTree="" +MSG_HELP_ogDeleteFile="Borra un fichero de un espacio de almacenamiento." +MSG_HELP_ogDeleteTree="Borra un árbol de directorios de un espacio de almacenamiento." MSG_HELP_ogDevToDisk="Devuelve el nº de orden de dicso o de partición correspondiente al camino del fichero de dispositivo." MSG_HELP_ogDiskToDev="Devuelve el camino del fichero de dispositivo correspondiente al nº de orden de dicso o de partición." MSG_HELP_ogEcho="" @@ -85,14 +86,18 @@ MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registr 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." -MSG_HELP_ogIsLocked="Comprueba si una partición está bloqueada para una operación de uso exclusivo." +MSG_HELP_ogIsLocked="Comprueba si una partición está bloqueada por una operación de uso exclusivo." +MSG_HELP_ogIsImageLocked="Comprueba si una imagen está bloqueada por una operación de uso exclusivo." +MSG_HELP_ogIsPartitionLocked=$MSG_HELP_ogIsLocked MSG_HELP_ogIsMounted="Comprueba si un sistema operativo está montado." MSG_HELP_ogIsNewerFile="Comprueba si un fichero es más nuevo (se modificado después) que otro." MSG_HELP_ogIsValidType="Comprueba si el tipo de sistema de archivos es válido para un identificador de partición." MSG_HELP_ogLinuxBootParameters="Devuelve los parámetros de arranque de un sistema operativo Linux instalado." MSG_HELP_ogListHardwareInfo="Lista el inventario de dispositivos del cliente." +MSG_HELP_ogListPartitions="Lista la estructura de particiones de un disco." MSG_HELP_ogListRegistryKeys="Lista los nombres de las claves incluidas en una clave del registro de Windows." -MSG_HELP_ogLock="Bloquea una partición para una operación de uso exclusivo." +MSG_HELP_ogLock="Bloquea una partición para operación de uso exclusivo." +MSG_HELP_ogLockImage="Bloquea una imagen para operación de uso exclusivo." MSG_HELP_ogLockPartition=$MSG_HELP_ogLock MSG_HELP_ogMakeChecksumFile="Almacena la suma de comprobación de un fichero." MSG_HELP_ogMakeDir="Crea un directorio para OpenGnSys." @@ -113,6 +118,7 @@ MSG_HELP_ogSetWinlogonUser="Asigna el nombre de usuario por defecto para el gest MSG_HELP_ogTypeToId="Devuelve el identificador asociado al mnemónico de tipo de partición." MSG_HELP_ogUnhidePartition="Hace visible una partición de Windows." MSG_HELP_ogUnlock="Desbloquea una partición tras finalizar una operación de uso exclusivo." +MSG_HELP_ogUnlockImage="Desbloquea una imagen tras finalizar una operación de uso exclusivo." MSG_HELP_ogUnlockPartition=$MSG_HELP_ogUnlock MSG_HELP_ogUnmount="Desmonta un sistema de archivos." MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local." diff --git a/client/nfsexport/etc/preinit/default.sh b/client/nfsexport/etc/preinit/default.sh index d1a13e88..d16da52a 100755 --- a/client/nfsexport/etc/preinit/default.sh +++ b/client/nfsexport/etc/preinit/default.sh @@ -9,6 +9,7 @@ source /opt/opengnsys/etc/preinit/loadenviron.sh for f in fileslinks.sh loadudeb.sh loadmodules.sh metadevs.sh; do $OGETC/preinit/$f done +unset f if [ -f $OGETC/init/$OG_IP.sh ]; then $OGETC/init/$OG_IP.sh diff --git a/client/nfsexport/etc/preinit/mount.sh b/client/nfsexport/etc/preinit/mount.sh deleted file mode 100755 index 88eb3ac3..00000000 --- a/client/nfsexport/etc/preinit/mount.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -#/** -#@file mount.sh -#@brief Script de inicio para montar repositorio de OpenGNSys por NFS. -#@note Desglose del script "loadenviron.sh". -#@warning Este proceso se integrará en /oginit en versiones futuras. -#@warning License: GNU GPLv3+ -#@version 0.9 -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009-10-10 -#*/ - - -# Si está configurado OpenGNSys ... -if [ -n "$OPENGNSYS" ]; then - # Si arranque por DHCP ... - if grep -q "ip=dhcp" /proc/cmdline; then - # Obtener IP del servidor DHCP/NFS - SERVERIP=$(awk '/dhcp-server-identifier/ {sub(/;/,""); dhcp=$3} - END {print dhcp}' /var/lib/dhcp3/dhclient.leases) - - # Modos de arranque: admin (rw), user (ro). - BOOTMODE=$(awk 'BEGIN {RS=" "; FS="="} $1~/boot/ {print $2}' /proc/cmdline) - BOOTMODE=${BOOTMODE:-"user"} - case "$BOOTMODE" in - admin) MOUNTOPTS="rw,nolock" ;; - user) MOUNTOPTS="ro,nolock" ;; - *) # FIXME: Modo de arranque desconocido - echo "$MSG_ERRBOOTMODE" - MOUNTOPTS="ro,nolock" ;; - esac - # Montamos el resto de cosas necesarias - printf "$MSG_MOUNTREPO\n" $BOOTMODE - mount -t nfs -o nolock $SERVERIP:/opt/opengnsys/log/clients $OGLOG - mount -t nfs -o "$MOUNTOPTS" $SERVERIP:/opt/opengnsys/images $OGIMG - else - # FIXME Modo off-line - echo "$MSG_OFFLINEMODE" - fi -else - # FIXME Error: entorno de OpenGNSys no configurado. - echo "Error: OpenGNSys environment is not configured." # FIXME: definir mensaje. - exit 1 -fi - |