root / plugins / bsd / netstat_bsd_m_ @ b0b39b01
Historique | Voir | Annoter | Télécharger (2,52 ko)
| 1 | 580c41ea | Artem Sheremet | #!/usr/bin/env ruby |
|---|---|---|---|
| 2 | |||
| 3 | b0b39b01 | Lars Kruse | =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 | 580c41ea | Artem Sheremet | |
| 18 | #%# family=auto |
||
| 19 | #%# capabilities=autoconf suggest |
||
| 20 | |||
| 21 | b0b39b01 | Lars Kruse | =end |
| 22 | |||
| 23 | |||
| 24 | 580c41ea | Artem Sheremet | # original filename |
| 25 | 85419c53 | Artem Sheremet | PLUGIN_NAME = 'netstat_bsd_m_' |
| 26 | 580c41ea | Artem Sheremet | |
| 27 | class String |
||
| 28 | b0b39b01 | Lars Kruse | 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 | 580c41ea | Artem Sheremet | end |
| 38 | |||
| 39 | 85419c53 | Artem Sheremet | def netstat_m(filter = nil) |
| 40 | b0b39b01 | Lars Kruse | 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 | 580c41ea | Artem Sheremet | 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 | b0b39b01 | Lars Kruse | puts `uname -s`.include?('FreeBSD') ? 'yes' : 'no'
|
| 59 | 580c41ea | Artem Sheremet | when 'suggest' |
| 60 | b0b39b01 | Lars Kruse | puts netstat_m.keys.map(&:escape).join $/ |
| 61 | 580c41ea | Artem Sheremet | when 'config' |
| 62 | b0b39b01 | Lars Kruse | 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 | 580c41ea | Artem Sheremet | when nil # fetch |
| 92 | b0b39b01 | Lars Kruse | 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 | 580c41ea | Artem Sheremet | else |
| 100 | b0b39b01 | Lars Kruse | warn "unrecognized argument <#{ARGV.first}>"
|
| 101 | 580c41ea | Artem Sheremet | end |
