Projet

Général

Profil

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

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