root / plugins / bsd / netstat_bsd_m_ @ b0b39b01
Historique | Voir | Annoter | Télécharger (2,52 ko)
| 1 |
#!/usr/bin/env ruby |
|---|---|
| 2 |
|
| 3 |
=begin |
| 4 |
|
| 5 |
netstat_bsd_m revision 1 (Feb 2012) |
| 6 |
|
| 7 |
This plugin shows various statistics from 'netstat -m' |
| 8 |
|
| 9 |
Required privileges: none |
| 10 |
|
| 11 |
OS: |
| 12 |
Supposed: BSD |
| 13 |
Tested: FreeBSD 8.2 |
| 14 |
|
| 15 |
Author: Artem Sheremet <dot.doom@gmail.com> |
| 16 |
|
| 17 |
|
| 18 |
#%# family=auto |
| 19 |
#%# capabilities=autoconf suggest |
| 20 |
|
| 21 |
=end |
| 22 |
|
| 23 |
|
| 24 |
# original filename |
| 25 |
PLUGIN_NAME = 'netstat_bsd_m_' |
| 26 |
|
| 27 |
class String |
| 28 |
def escape |
| 29 |
self.gsub /[^\w]/, '_' |
| 30 |
end |
| 31 |
|
| 32 |
unless method_defined? :start_with? |
| 33 |
def start_with?(str) |
| 34 |
self[0...str.size] == str |
| 35 |
end |
| 36 |
end |
| 37 |
end |
| 38 |
|
| 39 |
def netstat_m(filter = nil) |
| 40 |
Hash[`netstat -m`.split($/).map { |line|
|
| 41 |
if line =~ /^([\d\/K]+) (.*) \(([\w\/+]+)\)$/ |
| 42 |
# 7891K/22385K/30276K bytes allocated to network (current/cache/total) |
| 43 |
values, desc, names = $1, $2, $3 |
| 44 |
[desc, names.split('/').zip(values.split '/')] if filter.nil? or desc.escape == filter
|
| 45 |
elsif line =~ /^(\d+) (.*)$/ |
| 46 |
# 12327 requests for I/O initiated by sendfile |
| 47 |
value, desc = $1, $2 |
| 48 |
[desc, [[:value, value]]] if filter.nil? or desc.escape == filter |
| 49 |
end |
| 50 |
}.compact] |
| 51 |
end |
| 52 |
|
| 53 |
stat_name = File.basename($0, '.*').escape |
| 54 |
stat_name.slice! 0, PLUGIN_NAME.size if stat_name.start_with? PLUGIN_NAME |
| 55 |
|
| 56 |
case ARGV.first |
| 57 |
when 'autoconf' |
| 58 |
puts `uname -s`.include?('FreeBSD') ? 'yes' : 'no'
|
| 59 |
when 'suggest' |
| 60 |
puts netstat_m.keys.map(&:escape).join $/ |
| 61 |
when 'config' |
| 62 |
data = netstat_m(stat_name) |
| 63 |
if data.empty? |
| 64 |
warn "no data for <#{stat_name}>. Try running with 'suggest'"
|
| 65 |
else |
| 66 |
desc, values = data.first |
| 67 |
stack = values.size > 1 |
| 68 |
first = true |
| 69 |
puts <<~CONFIG |
| 70 |
graph_title Netstat: #{desc}
|
| 71 |
graph_category network |
| 72 |
graph_vlabel current |
| 73 |
graph_order #{values.map { |name, _| name.to_s.escape }.join ' '}
|
| 74 |
CONFIG |
| 75 |
puts values.map { |name, _|
|
| 76 |
esc_name = name.to_s.escape |
| 77 |
"#{esc_name}.draw " + if %w(total max).include? name
|
| 78 |
'LINE' |
| 79 |
elsif stack |
| 80 |
if first |
| 81 |
first = false |
| 82 |
'AREA' |
| 83 |
else |
| 84 |
'STACK' |
| 85 |
end |
| 86 |
else |
| 87 |
'LINE2' |
| 88 |
end + "\n#{esc_name}.label #{name}"
|
| 89 |
}.join $/ |
| 90 |
end |
| 91 |
when nil # fetch |
| 92 |
data = netstat_m(stat_name) |
| 93 |
unless data.empty? |
| 94 |
puts data.first.last.map { |name, value|
|
| 95 |
value = value.to_i * 1024 if value.end_with? 'K' |
| 96 |
"#{name.to_s.escape}.value #{value}"
|
| 97 |
}.join $/ |
| 98 |
end |
| 99 |
else |
| 100 |
warn "unrecognized argument <#{ARGV.first}>"
|
| 101 |
end |
