| 1 |
#!/usr/bin/perl -w |
|---|
| 2 |
# -*- perl -*- |
|---|
| 3 |
# Wildcard plugin to monitor QoS queues. |
|---|
| 4 |
# |
|---|
| 5 |
# Requirements: |
|---|
| 6 |
# - tc program installed and in path |
|---|
| 7 |
# |
|---|
| 8 |
# Parameters supported: |
|---|
| 9 |
# |
|---|
| 10 |
# config |
|---|
| 11 |
# autoconf |
|---|
| 12 |
# suggest |
|---|
| 13 |
# |
|---|
| 14 |
# Configurable variables |
|---|
| 15 |
# |
|---|
| 16 |
# tc - Override default program |
|---|
| 17 |
# ignore_queue<n> - Queue with handle <n> (ex ignore_queue0 for root queue) not be plotted |
|---|
| 18 |
# label_name<n> - Queue with handle <n> as define label |
|---|
| 19 |
# |
|---|
| 20 |
# $Log$ |
|---|
| 21 |
# Revision 1.1 2006/03/05 17:11:36 fra519 |
|---|
| 22 |
# |
|---|
| 23 |
# |
|---|
| 24 |
# Magic markers: |
|---|
| 25 |
#%# family=manual |
|---|
| 26 |
#%# capabilities=autoconf suggest |
|---|
| 27 |
|
|---|
| 28 |
use strict; |
|---|
| 29 |
|
|---|
| 30 |
my $TC = $ENV{'tc'} || 'tc'; |
|---|
| 31 |
|
|---|
| 32 |
if ($ARGV[0] and $ARGV[0] eq 'suggest') { |
|---|
| 33 |
my $text = `egrep '^ *(eth|wlan|ath|ra)[0-9]+:' /proc/net/dev | cut -f1 -d:`; |
|---|
| 34 |
print $text; |
|---|
| 35 |
exit; |
|---|
| 36 |
} |
|---|
| 37 |
|
|---|
| 38 |
$0 =~ /qos_(.+)*$/; |
|---|
| 39 |
my $IFACE = $1; |
|---|
| 40 |
exit 2 unless defined $IFACE; |
|---|
| 41 |
|
|---|
| 42 |
if ( exists $ARGV[0] and $ARGV[0] eq 'autoconf' ) { |
|---|
| 43 |
# Now see if "tc" can run |
|---|
| 44 |
my $text = `$TC qdisc show dev $IFACE`; |
|---|
| 45 |
if ($?) { |
|---|
| 46 |
if ($? == -1) { |
|---|
| 47 |
print "no (program $TC not found)\n"; |
|---|
| 48 |
} else { |
|---|
| 49 |
print "no (program $TC died)\n"; |
|---|
| 50 |
} |
|---|
| 51 |
exit 1; |
|---|
| 52 |
} |
|---|
| 53 |
print "yes\n"; |
|---|
| 54 |
exit 0; |
|---|
| 55 |
} |
|---|
| 56 |
|
|---|
| 57 |
my %queues; |
|---|
| 58 |
my $qdisc; |
|---|
| 59 |
my $queue; |
|---|
| 60 |
my $handle; |
|---|
| 61 |
my $one; |
|---|
| 62 |
my $sent; |
|---|
| 63 |
|
|---|
| 64 |
open(TEXT, "$TC -s qdisc show dev $IFACE|"); |
|---|
| 65 |
while (! eof(TEXT)) { |
|---|
| 66 |
$qdisc = ""; |
|---|
| 67 |
while ($qdisc ne "qdisc" and ! eof(TEXT)) { |
|---|
| 68 |
($qdisc, $queue, $handle) = split(" ", <TEXT>); |
|---|
| 69 |
} |
|---|
| 70 |
if (! eof(TEXT)) { |
|---|
| 71 |
($one, $sent) = split(" ", <TEXT>); |
|---|
| 72 |
$handle =~ s/://; |
|---|
| 73 |
$queues{$handle} = { |
|---|
| 74 |
queue => $queue, |
|---|
| 75 |
handle => $handle, |
|---|
| 76 |
sent => $sent |
|---|
| 77 |
}; |
|---|
| 78 |
} |
|---|
| 79 |
} |
|---|
| 80 |
|
|---|
| 81 |
if ( exists $ARGV[0] and $ARGV[0] eq 'config' ) { |
|---|
| 82 |
print "graph_title QoS queue on $IFACE\n"; |
|---|
| 83 |
print "graph_args --base 1000\n"; |
|---|
| 84 |
print "graph_vlabel bits per \${graph_period}\n"; |
|---|
| 85 |
print "graph_category network\n"; |
|---|
| 86 |
print "graph_info This graph shows the QoS queue of the $IFACE network interface.\n"; |
|---|
| 87 |
print "graph_order "; |
|---|
| 88 |
foreach my $key (sort by_handle keys %queues) { |
|---|
| 89 |
print $queues{$key}->{queue},$queues{$key}->{handle}, " "; |
|---|
| 90 |
} |
|---|
| 91 |
print "\n"; |
|---|
| 92 |
foreach my $key (sort by_handle keys %queues) { |
|---|
| 93 |
print $queues{$key}->{queue},$queues{$key}->{handle}, ".label "; |
|---|
| 94 |
if (exists $ENV{"label_name$queues{$key}->{handle}"}) { |
|---|
| 95 |
print $ENV{"label_name$queues{$key}->{handle}"}; |
|---|
| 96 |
} else { |
|---|
| 97 |
print $queues{$key}->{queue},$queues{$key}->{handle}; |
|---|
| 98 |
} |
|---|
| 99 |
print "\n"; |
|---|
| 100 |
print $queues{$key}->{queue},$queues{$key}->{handle}, ".type COUNTER\n"; |
|---|
| 101 |
print $queues{$key}->{queue},$queues{$key}->{handle}, ".graph no\n" if exists $ENV{"ignore_queue$queues{$key}->{handle}"}; |
|---|
| 102 |
print $queues{$key}->{queue},$queues{$key}->{handle}, ".cdef ", $queues{$key}->{queue},$queues{$key}->{handle}, ",8,*\n"; |
|---|
| 103 |
} |
|---|
| 104 |
exit 0; |
|---|
| 105 |
} |
|---|
| 106 |
|
|---|
| 107 |
sub by_handle { |
|---|
| 108 |
return $a cmp $b; |
|---|
| 109 |
} |
|---|
| 110 |
|
|---|
| 111 |
foreach my $key (sort by_handle keys %queues) { |
|---|
| 112 |
print $queues{$key}->{queue},$queues{$key}->{handle}, ".value ",$queues{$key}->{sent}, "\n"; |
|---|
| 113 |
} |
|---|
| 114 |
# |
|---|
| 115 |
# vim:syntax=perl |
|---|