e179979d23
Some checks reported errors
continuous-integration/drone/push Build encountered an error
This option control the output of the script. Possible output are human (same as usual), html and csv. This commit also does some minor syntax changes.
94 lines
2.1 KiB
Bash
Executable file
94 lines
2.1 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
error () {
|
|
echo "$0": "$@" >&2
|
|
exit 1
|
|
}
|
|
|
|
usage () {
|
|
echo 'usage: kvmstats [-a] [-u k|m|g] [-o h|human|html|csv]' >&2
|
|
exit 1
|
|
}
|
|
|
|
for DEP in bc virsh
|
|
do
|
|
command -v $DEP > /dev/null || error $DEP command not found
|
|
done
|
|
|
|
POW=$(echo 1024 ^ 3 | bc)
|
|
FMT=human
|
|
while [ $# -ne 0 ] && echo "$1" | grep -q '^-[[:alnum:]]'
|
|
do
|
|
case $1 in
|
|
'-a')
|
|
SHOW_AVAIL=y
|
|
;;
|
|
'-o')
|
|
case $2 in
|
|
'h' | 'human')
|
|
FMT=human
|
|
;;
|
|
'html')
|
|
FMT=html
|
|
;;
|
|
'csv')
|
|
FMT=csv
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|
|
;;
|
|
'-u')
|
|
case $2 in
|
|
'k')
|
|
POW=$(echo 1024 ^ 1 | bc)
|
|
;;
|
|
'm')
|
|
POW=$(echo 1024 ^ 2 | bc)
|
|
;;
|
|
'g')
|
|
POW=$(echo 1024 ^ 3 | bc)
|
|
;;
|
|
*)
|
|
usage
|
|
esac
|
|
;;
|
|
*)
|
|
usage
|
|
esac
|
|
shift
|
|
done
|
|
|
|
for VM in $(virsh list --name --all)
|
|
do
|
|
echo "$VM"
|
|
virsh vcpucount --maximum --current "$VM"
|
|
# libvirt store memory in KiB, POW must be lowered by 1
|
|
virsh domstats --balloon "$VM" | awk -F= '/balloon.maximum/ { print $2 / '$((POW / 1024))'}'
|
|
for BLK in $(virsh domblklist "$VM" | sed '1,2d;/-$/d;/^$/d' | cut -d\ -f1)
|
|
do
|
|
virsh domblkinfo "$VM" "$BLK"
|
|
done | awk '/Physical:/ { size += $2 } END { print int(size / '${POW}') }'
|
|
virsh domstate "$VM" | grep -q '^running$' && echo yes || echo no
|
|
done | xargs -n5 | {
|
|
echo vm vcpu ram disk running
|
|
awk '{ print } /yes$/ { vcpu += $2; ram += $3; disk += $4; running++ } END { print "TOTAL(running)", vcpu, ram, disk, running }'
|
|
test "$SHOW_AVAIL" && {
|
|
nproc
|
|
awk '/^MemTotal:/ { print int($2 / '$((POW / 1024))' ) }' /proc/meminfo
|
|
} | xargs printf 'AVAILABLE %s %s\n'
|
|
} | case $FMT in
|
|
'human')
|
|
column -t
|
|
;;
|
|
'html')
|
|
awk 'BEGIN{print "<html><body><table>"}{printf "<tr>";for(i=1;i<=NF;i++)printf "<td>%s</td>", $i;print "</tr>"}END{print "</table></body></html>"}'
|
|
;;
|
|
'csv')
|
|
tr ' ' ','
|
|
;;
|
|
esac
|