summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2011-02-22 17:43:43 +0000
committerramon <ramongomez@us.es>2011-02-22 17:43:43 +0000
commit08b941fc516fd39c8ae76b6eb0aa9811e3428a9a (patch)
treec8d9e9c842efd295aeae8c5ff9862816ed74c0de
parent697a9eecb6bb4e0ebbd51610a499a0aa21c53060 (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-xclient/engine/Image.lib88
-rw-r--r--client/nfsexport/etc/lang.es_ES.conf18
-rwxr-xr-xclient/nfsexport/etc/preinit/default.sh1
-rwxr-xr-xclient/nfsexport/etc/preinit/mount.sh45
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
-