#!/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