summaryrefslogtreecommitdiffstats
path: root/client/engine/Cache.lib
diff options
context:
space:
mode:
Diffstat (limited to 'client/engine/Cache.lib')
-rwxr-xr-xclient/engine/Cache.lib103
1 files changed, 70 insertions, 33 deletions
diff --git a/client/engine/Cache.lib b/client/engine/Cache.lib
index 118bc65b..ce1fc38b 100755
--- a/client/engine/Cache.lib
+++ b/client/engine/Cache.lib
@@ -4,14 +4,15 @@
#@brief Librería o clase Cache
#@class Cache
#@brief Funciones para gestión de la caché local de disco.
-#@version 1.0.4
+#@version 1.0.5
#@warning License: GNU GPLv3+
#*/
#/**
-# ogCreateCache int_partsize
+# ogCreateCache [int_ndisk] int_partsize
#@brief Define la caché local en la partición 4 del disco 1
+#@param int_ndisk numero de disco donde crear la cache, si no se indica es el 1 por defecto
#@param int_partsize tamaño de la partición (en KB)
#@return (nada, por determinar)
#@exception OG_ERR_FORMAT formato incorrecto.
@@ -27,37 +28,54 @@
#@version 1.0.4 - Soporte para discos GPT.
#@author Universidad de Huelva
#@date 2012/03/13
+#@version 1.0.5 - Posibilidad de crear la cache en cualquier disco duro
+#@author Universidad de Huelva
+#@date 2012/09/18
#*/ ##
function ogCreateCache ()
{
# Variables locales.
-local FINDCACHE NDSK PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE PTTYPE ID
+local FINDCACHE NDSK SIZECACHE PART DISK START END ENDPREVPART SIZE MINSIZE MAXSIZE PTTYPE ID
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
- ogHelp "$FUNCNAME" "$FUNCNAME int_partsize" "$FUNCNAME 10000000"
+ ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_partsize" "$FUNCNAME 1 10000000"
return
fi
-# Error si no se recibe 1 parámetro que sea un número entero.
-[ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $?
-[[ $1 =~ ([0-9]*) ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
+# Si se recibe un parametro, sera el tamano de la cache
+case $# in
+ 1) # Error, si no es un entero positivo
+ [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
+ NDSK=1
+ SIZECACHE=$1
+ ;;
+ 2) # Error, si no son enteros positivos
+ [[ $1 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$1" || return $?
+ [[ $2 =~ ^[1-9][0-9]*$ ]] || ogRaiseError $OG_ERR_FORMAT "$2" || return $?
+ NDSK=$1
+ SIZECACHE=$2
+ ;;
+ *) ogRaiseError $OG_ERR_FORMAT
+ return $?
+ ;;
+esac
+
+# De momento la cache sigue siendo siempre la cuarta particion
+PART=4
-FINDCACHE="1 4" # Partición de caché (ndisco npart).
-NDSK=${FINDCACHE% *}
-PART=${FINDCACHE#* }
DISK=$(ogDiskToDev $NDSK) || return $?
END=$[$(ogGetLastSector $NDSK 2>/dev/null)] # Sector final del disco.
-SIZE=$[$1*2] # Tamaño en sectores de 512 B.
+SIZE=$[$SIZECACHE*2] # Tamaño en sectores de 512 B.
START=$[END-SIZE+1]
ENDPREVPART=$[$(ogGetLastSector $NDSK $[PART-1] 2>/dev/null)]
# Error si tamaño no está entre límites permitidos o si se solapa con la partición anterior.
-MINSIZE=25000 # Error de formateo si tamaño < 50 MB.
-MAXSIZE=$[END/2] # No permitir tamaño > mitad del disco.
+MINSIZE=25000 # Error de formateo si tamaño < 50 MB.
+MAXSIZE=$END # Para restringir tamaño > mitad del disco: MAXSIZE=$[END/2]
if [ $SIZE -lt $MINSIZE -o $SIZE -gt $MAXSIZE -o $START -le $ENDPREVPART ]; then
ogRaiseError $OG_ERR_FORMAT "$1" || return $?
fi
# Desmontar todos los sistemas de archivos del disco.
-ogUnmountAll 1 2>/dev/null
+ogUnmountAll $NDSK 2>/dev/null
# Definir particiones y notificar al kernel.
# En el caso de ser disco GPT, de momento se borra la particion y se vuelve a crear,
# por lo que se pierden los datos.
@@ -71,7 +89,7 @@ case "$(ogGetPartitionTableType $NDSK)" in
# Si la tabla de particiones no es valida, volver a generarla.
[ ! $(sgdisk -p $DISK 2>&1 >/dev/null) ] || echo -e "2\nw\nY\n" | gdisk $DISK
# Si existe la cache se borra previamente
- [ -n $(ogFindCache) && ogDeleteCache
+ [ -n "$(ogFindCache)" ] && ogDeleteCache
# Capturamos el codigo de particion GPT para cache
ID=$(ogTypeToId CACHE GPT)
sgdisk $DISK -n$PART:$START:$END -c$PART:CACHE -t$PART:$ID 2>/dev/null && partprobe
@@ -148,23 +166,35 @@ rm -f /dev/disk/by-label/CACHE
#@version 0.91 - Adaptacion a la cache local de OpenGnSys.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/16
+#@version 1.0.5 - Obtener caché en discos GPT.
+#@author Alberto García, Universidad de Málaga y Ramon Gomez, ETSII Universidad de Sevilla
+#@date 2014/05/28
#*/ ##
function ogFindCache ()
{
# Variables locales
-local PART
+local DISK PART
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 1 4"
return
fi
-# Obtener el sistema de archivos etiquetado con "CACHE".
-PART=$(realpath /dev/disk/by-label/CACHE 2>/dev/null)
-# Si no, obtener la 1ª partición marcada como de tipo caché.
+# Obtener el dispositivo del sistema de archivos etiquetado como "CACHE".
+PART=$(blkid -L "CACHE")
+
+# Si no se detecta, obtener particiones marcadas de tipo caché en discos MSDOS.
PART=${PART:-$(sfdisk -l 2>/dev/null | awk '$6~/ca|a7/ {print $1}')}
-PART=${PART%% *}
-ogDevToDisk $PART 2>/dev/null
+# Por último revisar todos los discos GPT y obtener las particiones etiquetadas como caché.
+if [ -z "$PART" ]; then
+ for DISK in $(ogDiskToDev); do
+ # Nota: se añade espacio separador solo si existe valor previo.
+ PART="${PART:+"$PART "}$(sgdisk -p $DISK 2>/dev/null | awk -v d=$DISK '$7~/CACHE/ {printf "%s%s",d,$1;}')"
+ done
+fi
+
+# Devolver número de disco y número de partición de la 1ª partición encontrada.
+ogDevToDisk ${PART%% *} 2>/dev/null
}
@@ -192,16 +222,17 @@ if [ "$*" == "help" ]; then
return
fi
-# Error si no hay definida partición de caché.
-DEV=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
-DEV=$(ogDiskToDev $DEV) || return $?
+# Error si no hay definida partición de caché.
+DEV=$(ogFindCache) || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
+DEV=$(ogDiskToDev $DEV) || return $?
-# Formatear sistema de ficheros.
-ogUnmountCache 2>/dev/null
-mkfs.ext4 -q -F $DEV -L "CACHE" -O extent,large_file 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $?
-# Crear estructura básica.
-MNTDIR=$(ogMountCache)
-mkdir -p $MNTDIR/$OGIMG
+# Formatear sistema de ficheros.
+ogUnmountCache 2>/dev/null
+mkfs.ext4 -q -F $DEV -L "CACHE" -O extent,large_file 2>/dev/null || ogRaiseError $OG_ERR_PARTITION "CACHE" || return $?
+
+# Crear estructura básica.
+MNTDIR=$(ogMountCache)
+mkdir -p $MNTDIR/$OGIMG
}
@@ -246,19 +277,25 @@ ogGetPartitionSize $PART
#@version 0.91 - Definicion de cache local.
#@author Ramon Gomez, ETSII Universidad de Sevilla
#@date 2010/03/09
+#@version 1.0.5 - Uso de ogFindCache para detectar disco y particion
+#@author Universidad de Huelva
+#@date 2012/09/18
#*/ ##
function ogGetCacheSpace ()
{
-
# Variables locales.
-local DISK SECTORS CYLS ENDPART3
+local NDISK DISK NPART SECTORS CYLS ENDPART3
# Si se solicita, mostrar ayuda.
if [ "$*" == "help" ]; then
ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 23165386"
return
fi
+# Parche UHU para usar ogFindCache en lugar de 1
+# Error si no se encuentra partición de caché.
+read NDISK NPART <<<"$(ogFindCache)"
+[ -n "$NDISK" -a -n "$NPART" ] || ogRaiseError $OG_ERR_PARTITION "$MSG_NOCACHE" || return $?
+DISK=$(ogDiskToDev $NDISK) || return $?
-DISK=$(ogDiskToDev 1) || return $?
SECTORS=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3*2}}' /proc/partitions)
CYLS=$(sfdisk -g $DISK | cut -f2 -d" ")
SECTORS=$[SECTORS/CYLS*CYLS-1]