diff options
Diffstat (limited to 'client/engine/Cache.lib')
-rwxr-xr-x | client/engine/Cache.lib | 103 |
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] |