20cecaa77a
On the last awk command, line containing "yes" were printed two times.
68 lines
1.7 KiB
Bash
Executable file
68 lines
1.7 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
set -e
|
|
|
|
usage () {
|
|
echo 'usage: kvmstats [-a] [-u k|m|g]' >&2
|
|
exit 1
|
|
}
|
|
|
|
for DEP in bc virsh
|
|
do
|
|
if [ -z "$(which $DEP)" ]
|
|
then
|
|
echo "kvmstats: $DEP not found in \$PATH" >&2
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
POW=$(echo 1024 ^ 3 | bc)
|
|
while [ $# -ne 0 ] && echo "$1" | grep -q '^-[[:alnum:]]'
|
|
do
|
|
case $1 in
|
|
'-u')
|
|
case $2 in
|
|
'k')
|
|
POW=$(echo 1024 ^ 1 | bc)
|
|
;;
|
|
'm')
|
|
POW=$(echo 1024 ^ 2 | bc)
|
|
;;
|
|
'g')
|
|
POW=$(echo 1024 ^ 3 | bc)
|
|
;;
|
|
*)
|
|
usage
|
|
esac
|
|
;;
|
|
'-a')
|
|
SHOW_AVAIL=y
|
|
;;
|
|
*)
|
|
usage
|
|
esac
|
|
shift
|
|
done
|
|
|
|
for VM in $(virsh list --name --all)
|
|
do
|
|
CPU=$(virsh vcpucount --maximum --current "$VM")
|
|
# libvirt store memoy in KiB, POW must be lowered by 1
|
|
RAM=$(virsh domstats --balloon "$VM" | awk 'BEGIN { FS="=" } /balloon.maximum/ { print $2 / '$((POW / 1024))'}')
|
|
DSK=$(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}') }')
|
|
RUN=$(virsh domstate "$VM" | grep -q '^running$' && echo yes || echo no)
|
|
echo "$VM" "$CPU" "$RAM" "$DSK" "$RUN"
|
|
done | (
|
|
echo vm vcpu ram disk running
|
|
awk '{ print } /yes$/ { vcpu += $2; ram += $3; disk += $4; running++ } END { print "TOTAL(running)", vcpu, ram, disk, running }'
|
|
if [ "$SHOW_AVAIL" ]
|
|
then
|
|
AV_CPU=$(awk '/^processor/ { cpu++ } END { print cpu }' /proc/cpuinfo)
|
|
AV_MEM=$(awk '/^MemTotal:/ { print int($2 / '$((POW / 1024))' ) }' /proc/meminfo)
|
|
echo AVAILABLE "$AV_CPU" "$AV_MEM"
|
|
fi
|
|
) | column -t
|