summaryrefslogtreecommitdiffstats
path: root/client
diff options
context:
space:
mode:
authorramon <ramongomez@us.es>2014-09-23 11:48:41 +0000
committerramon <ramongomez@us.es>2014-09-23 11:48:41 +0000
commitfd1846fe10d86fdc5df52e97536816c64ac33960 (patch)
treeecc0bfe90470d054ecd0994fb1fea5942eed45e0 /client
parent2851a935492a9b29c346f631c1409f0ef81402b9 (diff)
#51: Integrar código del ticket:51 para detectar metadispositivos (LVM, RAID hardware y Multipath).
git-svn-id: https://opengnsys.es/svn/branches/version1.0@4395 a21b9725-9963-47de-94b9-378ad31fedc9
Diffstat (limited to 'client')
-rwxr-xr-xclient/engine/Disk.lib44
1 files changed, 32 insertions, 12 deletions
diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib
index cf389785..7897fc9c 100755
--- a/client/engine/Disk.lib
+++ b/client/engine/Disk.lib
@@ -430,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
@@ -445,13 +448,23 @@ if [ "$*" == "help" ]; then
return
fi
-# Nota: probar rendimiento del comando lsblk.
-#ALLDISKS=$(lsblk -n | awk '$6~/^disk$/ {gsub(/!/,"/"); printf "/dev/%s ",$1}')
-# Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd) y grupos de volúmenes.
-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.
@@ -472,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.