nutools/vzusage

206 lines
5.3 KiB
Plaintext
Raw Normal View History

2013-08-27 15:14:44 +04:00
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
2014-07-07 22:06:38 +04:00
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS
2013-08-27 15:14:44 +04:00
function display_help() {
uecho "$scriptname: afficher des informations sur une machine virtuelle OpenVZ
USAGE
$scriptname [options] [params...]d
OPTIONS
-b Afficher les informations de /proc/user_beancounters
-f N'afficher que les valeurs pour lesquelles failcnt > 0.
Implique -b
-z coef
Afficher les instructions à utiliser pour augmenter de coef% les
valeurs pour lesquelles failcnt > 0. Implique -f
-c config|veid
Afficher les informations du fichier de configuration plutôt que les
beancounters"
}
default=1
bc=
show_failed=
coef=
conf=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-b '$bc=1;default=' \
-f '$show_failed=1;default=' \
-z: '$set@ coef;default=' \
-c: '$set@ conf;default=' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
[ -n "$default" ] && bc=1
[ -n "$coef" ] && show_failed=1
[ -n "$show_failed" ] && bc=1
is_root || run_as_root ${bc:+-b} ${show_failed:+-f} ${coef:+-z "$coef"}${conf:+-c "$conf"} "$@"
# Faire la fonction de filtre
params=
count=0
for param in "$@"; do
params="${params:+$params\\|}$param"
count=$(($count + 1))
done
if [ $count -gt 1 ]; then
params="\\($params\\)"
fi
function nocomments() {
grep -v "^#" | grep -v "^$"
}
if [ -n "$show_failed" ]; then
function show_failed_maybe() {
awk '$6 > 0 { print }'
}
else
function show_failed_maybe() {
cat
}
fi
if [ -n "$params" ]; then
function filter() {
nocomments | grep -i "$params"
}
else
function filter() {
nocomments
}
fi
# Fonctions awk partagées
awk_functions=\
'function pad(s, size) {
while (length(s) < size) {
s = s " "
}
return s
}
function sizeOrInf(size, mult) {
if (mult == null) mult = 1
if (size == "2147483647") return "+INF"
else return size * mult
}
function format_size(size, unit) {
if (size == "+INF") return size
if (size == 0) unit = null
while (size > 1023) {
if (unit == "G") break
if (size > 10239) size = int(size / 1024)
else size = int(size / 1024 * 10) / 10
if (unit == null) unit = "k"
else if (unit == "k") unit = "M"
else if (unit == "M" ) unit = "G"
}
return size unit
}
function format(r, count) {
r = tolower(r)
if (r ~ /pages$/) return format_size(sizeOrInf(count, 4), "k")
if (r ~ /size$/) return format_size(sizeOrInf(count))
if (r == "diskspace") return format_size(sizeOrInf(count), "k")
if (r ~ /buf$/) return format_size(sizeOrInf(count))
return sizeOrInf(count)
}'
# Parser un fichier de config
if [ -n "$conf" ]; then
function show_conf() { awk "$awk_functions"'
BEGIN {
print "resource\tbarrier\tlimit"
}
{
if ($0 ~ /[A-Z]*="[0-9]*:[0-9]*"/) {
match($0, /^[A-Z]*/)
r = substr($0, RSTART, RLENGTH);
match($0, /"[0-9]*/)
barrier = substr($0, RSTART + 1, RLENGTH - 1)
match($0, /:[0-9]*/)
limit = substr($0, RSTART + 1, RLENGTH - 1)
print pad(r, 10) "\t" format(r, barrier) "\t" format(r, limit)
}
}
'
}
vzdir=/etc/vz
confdir="$vzdir/conf"
namedir="$vzdir/names"
if [ ! -f "$conf" ]; then
if [ -f "$confdir/$conf" ]; then
conf="$confdir/$conf"
elif [ -f "$confdir/$conf.conf" ]; then
conf="$confdir/$conf.conf"
elif [ -f "$confdir/ve-$conf.conf-sample" ]; then
conf="$confdir/ve-$conf.conf-sample"
elif [ -f "$namedir/$conf" ]; then
conf="$namedir/$conf"
else
die "Configuration non trouvée: $conf"
fi
fi
cat "$conf" |
filter |
show_conf
fi
# Parser les bean counters
if [ -n "$bc" ]; then
[ -f /proc/user_beancounters ] || die "Pas de fichier /proc/user_beancounters (OpenVZ est-il installé?)"
function show_beancounters() { awk "$awk_functions"'
BEGIN {
print "resource\theld\tmaxheld\tbarrier\tlimit\tfailcnt"
}
{
r = $1
held = $2
maxheld = $3
barrier = $4
limit = $5
failcnt = $6
print pad(r, 10) "\t" format(r, held) "\t" format(r, maxheld) "\t" format(r, barrier) "\t" format(r, limit) "\t" failcnt
}
'
}
function show_ctls() { awkrun coef="$1" "$awk_functions"'
{
r = $1
barrier = sizeOrInf($4)
limit = sizeOrInf($5)
print "# Actuellement, " r "=" barrier ":" limit ", soit " format(r, barrier) ":" format(r, limit)
if (barrier != "+INF") barrier = int(barrier * (100 + coef) / 100)
if (limit != "+INF" ) limit = int(limit * (100 + coef) / 100)
print "# Nous voulons " r "=" barrier ":" limit ", soit " format(r, barrier) ":" format(r, limit)
print "vzctl $VEID set --" r "=" barrier ":" limit " --save"
}
'
}
ac_set_tmpfile tmpfile
cat /proc/user_beancounters |
sed '/^Version:/d; /[ ]*uid[ ]*resource[ ]*held[ ]*maxheld[ ]*barrier[ ]*limit[ ]*failcnt/d; s/[0-9]*://g' |
filter |
show_failed_maybe >"$tmpfile"
show_beancounters <"$tmpfile"
if [ -n "$coef" ]; then
etitle -s "Augmenter les resources"
enote "Pour augmenter les resources de $coef %, configuration sur l'hôte:"
show_ctls "$coef" <"$tmpfile"
eend
fi
fi