Projet

Général

Profil

Paste
Télécharger au format
Statistiques
| Branche: | Révision:

root / plugins / lxc / lxc_net @ 17f78427

Historique | Voir | Annoter | Télécharger (3,57 ko)

1
#!/bin/sh
2

    
3
: << =cut
4

    
5
=head1 NAME
6

    
7
lxc_net - Munin plugin to graph traffic of active LXC containers.
8

    
9
=head1 APPLICABLE SYSTEMS
10

    
11
LXC container with "lxc.network.type=veth" and "lxc.network.veth.pair" settings.
12

    
13
=head1 CONFIGURATION
14

    
15
env.lxcpath - Set the path where LXC containers are stored, default: /var/lib/lxc
16
env.exclude - Removing containers from graphs, default: empty
17

    
18
  [lxc_net]
19
    env.lxcpath /var/lib/lxc
20
    env.exclude container1 container2
21

    
22
=head1 INTERPRETATION
23

    
24
This plugin reads a "lxc.network.veth.pair" setting from "config" file of each container,
25
because lxc-start command creates a random named veth device without the setting.
26

    
27
If your xen config (/var/lib/lxc/GUEST_NAME/config does not contain this parameter,
28
then you have to fill it, because if every guest restart generate new device name, then the graph will be useless
29
( example config : lxc.network.veth.pair = vethsamba )
30

    
31
=head1 AUTHOR
32

    
33
mitty   mitty@mitty.jp
34

    
35
=head1 LICENSE
36

    
37
2-clause BSD License
38

    
39
=head1 MAGIC MARKERS
40

    
41
 #%# familiy=auto
42
 #%# capabilities=autoconf
43

    
44
=cut
45

    
46
. $MUNIN_LIBDIR/plugins/plugin.sh
47

    
48
lxcpath=${lxcpath:-/var/lib/lxc}
49

    
50
if [ "$1" = "autoconf" ]; then
51
    if [ ! -r /proc/net/dev ]; then
52
        echo "no (/proc/net/dev cannot be read)"
53
        exit 0
54
    fi
55
    if [ ! -e "$lxcpath" ]; then
56
        echo "no ($lxcdir is not present)"
57
        exit 0
58
    fi
59

    
60
    echo yes
61
fi
62

    
63
actives=""
64
for guest in `ls $lxcpath`; do
65
    if [ `echo $exclude | grep -c "\b$guest\b"` -eq 1 ]; then
66
        continue;
67
    fi
68
    if [ -f "$lxcpath/$guest/config" ]; then
69
        devices=`grep '^lxc\.network\.veth\.pair[ \t]*=[ \t]*' $lxcpath/$guest/config | \
70
            awk '{ split($0, a, /=/); gsub(/[ \t]/, "", a[2]); print a[2]; }'`
71
        if [ -n "$devices" ]; then
72
            for device in $devices; do
73
                device_re=`echo $device | sed -e 's/\./\\\\./g'`
74
                if [ `grep -c "^ *$device_re:" /proc/net/dev` -eq 1 ]; then
75
                    actives="$actives $guest"
76
                    eval "dev_$(clean_fieldname $guest)=$device"
77
                fi
78
            done
79
        fi
80
    fi
81
done
82

    
83
if [ "$1" = "config" ]; then
84
    echo "graph_title Network traffic"
85
    echo "graph_args --base 1000"
86
    echo "graph_vlabel bits in (-) / out (+) per ${graph_period}"
87
    echo "graph_category network"
88
    echo "graph_info This graph shows the traffic of active LXC containers."
89

    
90
    for guestname in $actives; do
91
        guest=$(clean_fieldname $guestname)
92
        device=$(eval 'echo $dev_'$guest)
93
        bps="U"
94
        if [ -r /sys/class/net/$device/speed ]; then
95
            bps=$(cat /sys/class/net/$device/speed)
96
            bps=$(($bps * 1000 * 1000))
97
        fi
98

    
99
        echo "${guest}_down.label $guestname"
100
        echo "${guest}_down.type DERIVE"
101
        echo "${guest}_down.graph no"
102
        echo "${guest}_down.cdef ${guest}_down,8,*"
103
        echo "${guest}_down.min 0"
104
        echo "${guest}_down.max $bps"
105
        echo "${guest}_up.label $guestname"
106
        echo "${guest}_up.type DERIVE"
107
        echo "${guest}_up.negative ${guest}_down"
108
        echo "${guest}_up.cdef ${guest}_up,8,*"
109
        echo "${guest}_up.min 0"
110
        echo "${guest}_up.max $bps"
111
   done
112
   exit 0
113
fi
114

    
115

    
116
for guest in $actives; do
117
    guest=$(clean_fieldname $guest)
118
    device=$(eval 'echo $dev_'$guest)
119
    device_re=`echo $device | sed -e 's/\./\\\\./g'`
120
    line=`grep "^ *$device_re:" /proc/net/dev`
121
    echo -n "${guest}_down.value "
122
    echo $line | awk '{
123
            split($0, a, /: */);
124
            print  $2;
125
    }'
126
    echo -n "${guest}_up.value "
127
    echo $line | awk '{
128
            split($0, a, /: */);
129
            print  $10;
130
        }'
131
done