confz

git mirror of https://ccx.te2000.cz/bzr/confz
git clone https://ccx.te2000.cz/git/confz
Log | Files | Refs

commit 45d27cef8a83d9cb10fc8d74d8001369af6f6a0d
parent 8e300faa6cb881bbd3031a2badf488d4985133b7
Author: Jan Pobrislo <ccx@webprojekty.cz>
Date:   Wed, 22 Nov 2017 22:02:00 +0100

Compare md array components by raw device numbers
Diffstat:
Mzsh-functions/confz_fs_init | 17++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/zsh-functions/confz_fs_init b/zsh-functions/confz_fs_init @@ -4,8 +4,10 @@ # confz functions for dealing with filesystem and mounting # -# smartctl -i /dev/sda | while IFS=':' read foo bar; do P '***' ${${foo:l}// /_} ${bar/# #}; done +# load the zstat builtin and keep stat external +zmodload -F zsh/stat b:zstat +# helper for finding disk drives by their metadata fs_smartctl_probe() { (($+smartctl_probed)) && (($smartctl_probed)) && return 0 local dev item val rest @@ -323,7 +325,7 @@ confz_swapon_check() { # set up /dev/md* device confz_mdraid_check() { local line level out seen_level seen_header devices all_empty - local -a seen_devices devices + local -a seen_devices devices device_numbers local -A level_map checkvars md_device raid_devices level @@ -355,6 +357,11 @@ confz_mdraid_check() { ) level=${level_map[${vars[level]}]} + for device in $devices; do + [[ -b $device ]] || die "$0: not a block device: ${(qqq)device}" + device_numbers+=( zstat +rdev $device ) || die "$0: could not stat ${(qqq)device}" + done + if [[ -b $vars[md_device] ]]; then out=$( mdadm --detail $vars[md_device] ) || \ die "$0: mdadm --detail ${(qqq)vars[md_device]} returned $?" @@ -368,7 +375,7 @@ confz_mdraid_check() { seen_header=1;; esac else - seen_devices+=( ${${=line}[-1]} ) + seen_devices+=( $(( ${${=line}[2]} << 8 + ${${=line}[3]} )) ) fi done <<<$out @@ -376,9 +383,9 @@ confz_mdraid_check() { die "$0: raid level mismatch." \ "expected: ${(q)level} got: ${(q)seen_level}" - [[ ${(o)vars[raid_devices]} == ${(o)seen_devices} ]] || \ + [[ ${(o)devices} == ${(o)seen_devices} ]] || \ die $0$': raid device mismatch\nexpected:' \ - ${(oqqq)vars[raid_devices]}$'\ngot:' \ + ${(oqqq)devices}$'\ngot:' \ ${(oqqq)seen_devices} return 0