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
openSUSE Build Service is sponsored by