diff options
author | ramon <ramongomez@us.es> | 2014-09-23 11:48:41 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2014-09-23 11:48:41 +0000 |
commit | fd1846fe10d86fdc5df52e97536816c64ac33960 (patch) | |
tree | ecc0bfe90470d054ecd0994fb1fea5942eed45e0 /client | |
parent | 2851a935492a9b29c346f631c1409f0ef81402b9 (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-x | client/engine/Disk.lib | 44 |
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. |