205 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			205 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
 | |
| source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
 | |
| 
 | |
| 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
 |