208 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/bash
 | 
						|
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | 
						|
 | 
						|
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"
 | 
						|
}
 | 
						|
 | 
						|
source "$(dirname "$0")/ulib/ulib" &&
 | 
						|
urequire DEFAULTS ||
 | 
						|
exit 1
 | 
						|
 | 
						|
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
 |