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