#!/bin/bash . /etc/print-status.conf pin_md() { while read -r md rest; do md_new="${md}" if [ -z "${md_new##*:}" ]; then md_new="${md_new%:}" fi; if [ -z "${md_new%%md*}" ] && [ -b "/dev/${md_new}" ]; then uuid=$( mdadm --detail "/dev/${md_new}" \ | awk '$1 == "UUID" {print $3}' ); if [ -n "${uuid}" ]; then md_new=$( sed ' / UUID='"${uuid}"'$/ !d s@^ARRAY\s\+/dev/\(md[0-9]\+\)\s\+.*$@\1@ t d ' /etc/mdadm.conf ) fi fi if [ -z "${md_new}" ]; then md_new="${md%:}" fi printf '%s %s' "${md_new}" "${md}" if [ -n "${rest}" ]; then printf ' %s' "${rest}" fi printf '\n' done } { find /dev/mapper -mindepth 1 -maxdepth 1 \( -name 'leg*' -o -name 'foot*' \) -printf '%f\n' \ | sort -u \ | xargs -rn1 cryptsetup status \ | grep -v '^\s\+device:' sed -n ' /^Personalities/d /^\S/ { N s/^\(\S\+\)\s*:.*\n\s*\([0-9]\)/\1: \2/ T p } ' /proc/mdstat \ | pin_md \ | sed 's@^md\([0-9]\+\) @\1 \0@' \ | sort -k1n,1 \ | sed 's@^\S\+ \(\S\+\) \S\+ @\1: @' find /sys/block/ -mindepth 1 -maxdepth 1 -name 'md*' -printf '%f\n' \ | pin_md \ | sed 's@^md@@' \ | sort -n \ | while read -r md_p md; do printf 'md%s: %s' \ "${md_p}" \ "$( sed ' s/^clean$\|^write-pending$\|^active-idle$/active/ ' "/sys/block/${md}/md/array_state" \ | tr -d '\n' )" if [ -f "/sys/block/${md}/md/mismatch_cnt" ]; then printf ' ' cat "/sys/block/${md}/md/mismatch_cnt" else printf '\n' fi done if command -v ssacli >/dev/null 2>&1; then ssacli ctrl slot=1 ld all show \ | grep -v '^\s*$' fi } | \ if mountpoint -q "${http_dir}"; then sponge "${http_dir}/status" date +%s > "${http_dir}/status.time" else cat fi