206 lines
5.1 KiB
Bash
206 lines
5.1 KiB
Bash
#!/bin/bash
|
|
|
|
function convert_to_bytes() {
|
|
awk '
|
|
{
|
|
val=$0
|
|
num=val
|
|
sub(/[KMGT]$/, "", num)
|
|
|
|
unit=substr(val, length(val), 1)
|
|
mul=1
|
|
if (unit=="K") mul=1024
|
|
else if (unit=="M") mul=1024^2
|
|
else if (unit=="G") mul=1024^3
|
|
else if (unit=="T") mul=1024^4
|
|
|
|
printf "%.0f\n", num * mul
|
|
}' <<< "$1"
|
|
}
|
|
|
|
function ensure_comma() {
|
|
if [[ $FIRST -eq 1 ]]
|
|
then
|
|
FIRST=
|
|
else
|
|
echo -n ,
|
|
fi
|
|
}
|
|
|
|
FSPATH="/mnt"
|
|
|
|
PARSER_STATE=0
|
|
while IFS= read -r line; do
|
|
case $PARSER_STATE in
|
|
0)
|
|
if [[ $line =~ ^Filesystem:[[:space:]]+([^[:space:]]+)$ ]]
|
|
then
|
|
uuid="${BASH_REMATCH[1]}"
|
|
elif [[ $line == Data\ type* ]]
|
|
then
|
|
PARSER_STATE=1
|
|
elif [[ $line == "Compression:" ]]
|
|
then
|
|
echo -n "bcachefs_compression,fspath=\"$FSPATH\",uuid=\"$uuid\" "
|
|
FIRST=1
|
|
PARSER_STATE=2
|
|
elif [[ $line == "Btree usage:" ]]
|
|
then
|
|
echo -n "bcachefs_btree_usage,fspath=\"$FSPATH\",uuid=\"$uuid\" "
|
|
FIRST=1
|
|
PARSER_STATE=3
|
|
elif [[ $line =~ ^Pending\ reconcile: ]]
|
|
then
|
|
echo -n "bcachefs_reconcile,fspath=\"$FSPATH\",uuid=\"$uuid\" "
|
|
FIRST=1
|
|
PARSER_STATE=4
|
|
REMAINING=(replicas checksum erasure_code compression target high_priority pending)
|
|
elif [[ $line =~ ^([^ ]+)\ \(device\ ([0-9]+)\):[[:space:]]+([^[:space:]]+)[[:space:]]+([^[:space:]]+)[[:space:]]+([0-9]+)%$ ]]
|
|
then
|
|
blockdev="${BASH_REMATCH[3]}"
|
|
if [[ ! $blockdev == /dev/* ]]
|
|
then
|
|
blockdev="/dev/$blockdev"
|
|
fi
|
|
echo -n "bcachefs_devices,fspath=\"$FSPATH\",uuid=\"$uuid\",devlabel=\"${BASH_REMATCH[1]}\",devid=${BASH_REMATCH[2]},blockdev=\"$blockdev\" mode=\"${BASH_REMATCH[4]}\",usage=${BASH_REMATCH[5]}"
|
|
|
|
PARSER_STATE=5
|
|
#else
|
|
#echo unknown?
|
|
fi
|
|
;;
|
|
1)
|
|
if [[ "$line" == "" ]]
|
|
then
|
|
PARSER_STATE=0
|
|
fi
|
|
;;
|
|
2)
|
|
if [[ "$line" == "" ]]
|
|
then
|
|
echo
|
|
PARSER_STATE=0
|
|
elif [[ $line =~ ^([^[:space:]]+)[[:space:]]*(.*)$ ]]
|
|
then
|
|
field="${BASH_REMATCH[1]// /_}"
|
|
rest="${BASH_REMATCH[2]}"
|
|
|
|
read -r val1 val2 val3 <<<"$rest"
|
|
val1="$(convert_to_bytes "$val1")"
|
|
|
|
ensure_comma
|
|
|
|
echo -n "${field}_compressed=$val1"
|
|
if [[ ! -z "$val2" ]]
|
|
then
|
|
val2="$(convert_to_bytes "$val2")"
|
|
echo -n ",${field}_uncompressed=$val2"
|
|
fi
|
|
if [[ ! -z "$val3" ]]
|
|
then
|
|
val3="$(convert_to_bytes "$val3")"
|
|
echo -n ",${field}_avgextsize=$val3"
|
|
fi
|
|
#else
|
|
#echo unknown?
|
|
fi
|
|
;;
|
|
3)
|
|
if [[ "$line" == "" ]]
|
|
then
|
|
echo
|
|
PARSER_STATE=0
|
|
elif [[ $line =~ ^([^:]+)[:space:]+(.*)$ ]]
|
|
then
|
|
field="${BASH_REMATCH[1]// /_}"
|
|
val="${BASH_REMATCH[2]}"
|
|
val="$(convert_to_bytes "$val")"
|
|
|
|
ensure_comma
|
|
|
|
echo -n "$field=$val"
|
|
#else
|
|
#echo unknown?
|
|
fi
|
|
;;
|
|
4)
|
|
if [[ "$line" == "" ]]
|
|
then
|
|
for field in "${REMAINING[@]}"
|
|
do
|
|
ensure_comma
|
|
echo -n "${field}_data=0,${field}_metadata=0"
|
|
done
|
|
|
|
echo
|
|
PARSER_STATE=0
|
|
elif [[ $line =~ ^([^:]+):[[:space:]]*(.*)$ ]]
|
|
then
|
|
field="${BASH_REMATCH[1]// /_}"
|
|
rest="${BASH_REMATCH[2]}"
|
|
|
|
read -r val1 val2 <<<"$rest"
|
|
val1="$(convert_to_bytes "$val1")"
|
|
val2="$(convert_to_bytes "$val2")"
|
|
|
|
ensure_comma
|
|
|
|
echo -n "${field}_data=$val1,${field}_metadata=$val2"
|
|
|
|
REMAINING=( "${REMAINING[@]/$field}" )
|
|
#else
|
|
#echo unknown?
|
|
fi
|
|
;;
|
|
5)
|
|
if [[ "$line" == "" ]]
|
|
then
|
|
echo
|
|
PARSER_STATE=0
|
|
elif [[ $line =~ ^[[:space:]]*([^:]+):[[:space:]]*(.*)$ ]]
|
|
then
|
|
field="${BASH_REMATCH[1]// /_}"
|
|
rest="${BASH_REMATCH[2]}"
|
|
|
|
read -r val1 val2 val3 <<<"$rest"
|
|
val1="$(convert_to_bytes "$val1")"
|
|
|
|
echo -n ",${field}_data=$val1"
|
|
if [[ ! -z "$val2" ]]
|
|
then
|
|
echo -n ",${field}_buckets=$val2"
|
|
fi
|
|
if [[ ! -z "$val3" ]]
|
|
then
|
|
val3="$(convert_to_bytes "$val3")"
|
|
echo -n ",${field}_fragmented=$val3"
|
|
fi
|
|
#else
|
|
#echo unknown?
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
#if [[ $PARSER_STATE -ne 1 ]]
|
|
#then
|
|
# echo "Got line: $line"
|
|
#fi
|
|
done < <(sudo bcachefs fs usage -a "$FSPATH")
|
|
|
|
cd "/sys/fs/bcachefs/${uuid}/options" || exit 1
|
|
echo -n "bcachefs_options,fspath=\"$FSPATH\",uuid=\"$uuid\" "
|
|
FIRST=1
|
|
for i in *
|
|
do
|
|
if [[ $FIRST == 1 ]]
|
|
then
|
|
FIRST=
|
|
else
|
|
echo -n ,
|
|
fi
|
|
|
|
echo -n "${i}=\"$(cat "$i")\""
|
|
done
|
|
|
|
echo
|