File btrfs.disco.sh of Package zabbix-agent-ite
#!/bin/bash
ZBX_BASE=/opt/zabbix_ite
PRE_DEF="BTRFS"
PATH=$PATH:/usr/sbin
export PATH
function usage() {
cat <<EOF
usage: $0 "Prefix" discover_rootfs|discover_quotas|qgroupdata|devicedata
EOF
}
OPT="-re -F --raw"
## define functions
function get_main_btrfs() {
btrfs fi show |awk ' /Label/ { uuid=$NF }
/devid/ && $2 == 1 { save[uuid]=$NF }
END { for (i in save) { printf "%s|%s\n",i,save[i] } } '
}
function get_qgroup_data() {
for FS in $( mount |awk ' $5 ~ /btrfs/ { print $3 } ' )
do
btrfs qgroup show ${OPT} "${FS}" 2>/dev/null|awk -v fs=$FS ' NR > 2 { printf "%-40s %s\n", fs,$0 } '
done
}
function get_btrfs_roots() {
for FS in $(get_main_btrfs)
do
{ mount ; cat /etc/fstab ;} |sed -e 's/ on / /g'|egrep "$FS"|\
awk ' { n=split($2,info)
if (old_n<n){
save[$2]=n;old_n=n
} else { old_n=n }
} END { for (i in save) { print i }
} '
done
}
function discover_quotas() {
get_qgroup_data |\
awk -v pre="${PRE:=${PRE_DEF}}" ' \
BEGIN {
first=1
}
{
if ($NF != "none") { state="on" } else { state = "off" }
if ( first != 1 ) { printf "\t,\n" }
first = 0
printf "\t{\n"
printf "\t\t\"{#%s.QSTATE}\":\"%s\",\n",pre,state
printf "\t\t\"{#%s.QNAME}\":\"%s\"\n",pre,$1
printf "\t}\n"
}
'
}
function qgroup_data2json() {
#FS qgroupid rfer excl max_rfer max_excl
#/ 0/259 6472282112 444968960 none none
get_qgroup_data |\
awk ' BEGIN {
first=1
}
{
if ( first != 1 ) { printf "\t,\n" }
first = 0
printf "\t{\n"
printf "\t\t\"fsname\":\"%s\",\n",$1
printf "\t\t\"data\": {\n"
printf "\t\t\"rfer\": \"%s\",\n",$3
printf "\t\t\"excl\": \"%s\",\n",$4
printf "\t\t\"max_rfer\": \"%s\",\n",$5
printf "\t\t\"max_excl\": \"%s\"\n",$6
printf "\t\t},\n"
printf "\t\t\"fstype\":\"btrfs\"\n"
printf "\t}\n"
}
'
}
function discover_rootfs() {
get_btrfs_roots |\
awk -v pre="${PRE:=${PRE_DEF}}" ' \
BEGIN {
first=1
}
{
if ( first != 1 ) { printf "\t,\n" }
first = 0
printf "\t{\n"
printf "\t\t\"{#%s.RNAME}\":\"%s\"\n",pre,$1
printf "\t}\n"
}
'
}
function get_device_data() {
for FS in $(get_btrfs_roots)
do
btrfs fi usage --raw "$FS" | awk -v fs="${FS}" '
/Device size:/ { map["device_size"]=$NF }
/Device allocated:/ { map["device_allocated"]=$NF }
/Device unallocated:/ { map["device_unallocated"]=$NF }
NF == 2 && /Used:/ { map["device_used"]=$NF }
END {
printf "%s,",fs
for (i in map) { printf "%s=%s,",i,map[i] }
printf "\n"
} '
done |sed -e 's/,$//g'
#Overall:
# Device size: 104857600
# Device allocated: 14680064
# Device unallocated: 90177536
# Device missing: 0
# Used: 180224
# Free (estimated): 95420416 (min: 95420416)
# Data ratio: 1.00
# Metadata ratio: 1.00
# Global reserve: 3407872 (used: 0)
#
}
function device_data2json() {
get_device_data |\
awk -F"," ' BEGIN {
first=1
}
{
if ( first != 1 ) { printf "\t,\n" }
first = 0
printf "\t{\n"
printf "\t\t\"devname\":\"%s\",\n",$1
printf "\t\t\"data\": {\n"
first2=1
for (i=2;i<=NF;i++) {
if ( first2 != 1 ) { printf ",\n" }
first2 = 0
split($i,info,"=")
printf "\t\t\"%s\": \"%s\"",info[1],info[2]
}
printf "\n\t\t}\n"
printf "\t}\n"
}
'
}
### main
while [ $# -ne 0 ]
do
case $1 in
-h|--help ) usage; exit 0 ;;
discover_rootfs ) CMD=discover_rootfs ; shift;;
discover_quotas ) CMD=discover_quotas ; shift ;;
qgroupdata ) CMD=qgroup_data2json ; shift ;;
devicedata ) CMD=device_data2json ; shift ;;
[A-Z]* ) PRE=$1 ; shift ;;
* ) shift ;;
esac
done
$CMD