blob: 20094e0d670eab26d0e777a0b7c69b52f41e560b [file] [log] [blame]
#!/bin/bash
PATH=/sbin:$PATH
DEFAULTS=/etc/defaults/drbd-pretty-status
# for highlighting see console_codes(4)
colorize=false
short=true
# node role: Primary Secondary Unknown
c_pri_1=$'\e[44m' c_pri_0=$'\e[49m'
#c_sec_1=$'\e[7m' c_sec_0=$'\e[27m'
c_sec_1="" c_sec_0=""
c_unk_1=$'\e[43m' c_unk_0=$'\e[49m'
# connection state:
# Unconfigured
#
# StandAlone
c_sta_1=$'\e[34m' c_sta_0=$'\e[39m'
# Disconnecting Unconnected Timeout BrokenPipe NetworkFailure ProtocolError TearDown
c_net_bad_1=$'\e[41m' c_net_bad_0=$'\e[49m'
# WFConnection WFReportParams
c_wfc_1=$'\e[36m' c_wfc_0=$'\e[39m'
# Connected
c_con_1=$'\e[32m' c_con_0=$'\e[39m'
# StartingSyncS StartingSyncT WFBitMapS WFBitMapT WFSyncUUID
c_ssy_1=$'\e[35m' c_ssy_0=$'\e[39m'
# SyncSource PausedSyncS
c_src_1=$'\e[46m' c_src_0=$'\e[49m'
# SyncTarget PausedSyncT
c_tgt_1=$'\e[41m' c_tgt_0=$'\e[49m'
# disk state:
# Attaching Negotiating DUnknown Consistent
# uncolored for now
#
# Diskless Failed Inconsistent
c_dsk_bad_1=$'\e[41m' c_dsk_bad_0=$'\e[49m'
# Outdated
c_out_1=$'\e[43m' c_out_0=$'\e[44m'
# UpToDate
c_u2d_1=$'\e[32m' c_u2d_0=$'\e[39m'
while true; do
case "$1" in
-c) colorize=true; shift;;
-v) short=false; shift;;
*) break;;
esac
done
drbd_pretty_status()
{
if ! $short ||
! type column &> /dev/null ||
! type paste &> /dev/null ||
! type join &> /dev/null ||
! type sed &> /dev/null ||
! type tr &> /dev/null
then
cat /proc/drbd
else
sed -e '2q' < /proc/drbd
sed_script=$(
i=0;
_sh_status_process() {
let i++ ;
stacked=${_stacked_on:+"^^${_stacked_on_minor:-${_stacked_on//[!a-zA-Z0-9_ -]/_}}"}
printf "s|^ *%u:|%6u\t&%s%s|\n" \
$_minor $i \
"${_res_name//[!a-zA-Z0-9_ -]/_}" "$stacked"
};
eval "$(drbdadm sh-status)" )
p() {
sed -e "1,2d" \
-e "$sed_script" \
-e '/^ *[0-9]\+: cs:Unconfigured/d;' \
-e 's/^\(.* cs:.*[^ ]\) \([rs]...\)$/\1 - \2/g' \
-e 's/^\(.* \)cs:\([^ ]* \)st:\([^ ]* \)ds:\([^ ]*\)/\1\2\3\4/' \
-e 's/^\(.* \)cs:\([^ ]* \)ro:\([^ ]* \)ds:\([^ ]*\)/\1\2\3\4/' \
-e 's/^\(.* \)cs:\([^ ]*\)$/\1\2/' \
-e 's/^ *[0-9]\+:/ x &??not-found??/;' \
-e '/^$/d;/ns:.*nr:.*dw:/d;/resync:/d;/act_log:/d;' \
-e 's/^\(.\[.*\)\(sync.ed:\)/... ... \2/;/^.finish:/d;' \
-e 's/^\(.[0-9 %]*oos:\)/... ... \1/' \
< "/proc/drbd" | tr -s '\t ' ' '
}
m() {
join -1 2 -2 1 -o 1.1,2.2,2.3 \
<( ( drbdadm sh-dev all ; drbdadm -S sh-dev all ) | cat -n | sort -k2,2) \
<(sort < /proc/mounts ) |
sort -n | tr -s '\t ' ' ' | sed -e 's/^ *//'
}
# echo "=== p ==="
# p
# echo "=== m ==="
# m
# echo "========="
# join -a1 <(p|sort) <(m|sort)
# echo "========="
(
echo m:res cs ro ds p mounted fstype
join -a1 <(p|sort) <(m|sort) | cut -d' ' -f2-6,8- | sort -k1,1n -k2,2
) | column -t
fi |
if [[ $colorize != true ]]; then
cat
else
c_bold=$'\e[1m' c_norm=$'\e[0m'
sed -e "
s/^??not-found??/$c_dsk_bad_1&$c_dsk_bad_0/g;
s/^[^\t ]\+/$c_bold&$c_norm/;
s/Primary/$c_pri_1&$c_pri_0/g;
s/Secondary/$c_sec_1&$c_sec_0/g;
s/\<Unknown/$c_unk_1&$c_unk_0/;
s/StandAlone/$c_sta_1&$c_sta_0/;
s/\(Disconnecting|Unconnected|Timeout|BrokenPipe|NetworkFailure|ProtocolError|TearDown\)/$c_net_bad_1&$c_net_bad_0/;
s/\(WFConnection|WFReportParams\)/$c_wfc_1&$c_wfc_0/;
s/Connected/$c_con_1&$c_con_0/;
s/\(StartingSync.|WFBitMap.|WFSyncUUID\)/$c_ssy_1&$c_ssy_0/;
s/\(SyncSource|PausedSyncS\)/$c_src_1&$c_src_0/;
s/\(SyncTarget|PausedSyncT\)/$c_tgt_1&$c_tgt_0/;
s/\(SyncTarget|PausedSyncT\)/$c_tgt_1&$c_tgt_0/;
s/\(Diskless|Failed|Inconsistent\)/$c_dsk_bad_1&$c_dsk_bad_0/g;
s/Outdated/$c_out_1&$c_out_0/g;
s/UpToDate/$c_u2d_1&$c_u2d_0/g;
"
fi
}
# and there you can override all highlight definitions again
test -r "$DEFAULTS" && . "$DEFAULTS"
drbd_pretty_status