Projet

Général

Profil

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

root / plugins / bsd / netstat_bsd_m_ @ bb4d6c64

Historique | Voir | Annoter | Télécharger (2,16 ko)

1 580c41ea Artem Sheremet
#!/usr/bin/env ruby
2
3 85419c53 Artem Sheremet
# netstat_bsd_m revision 1 (Feb 2012)
4 580c41ea Artem Sheremet
#
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 85419c53 Artem Sheremet
PLUGIN_NAME = 'netstat_bsd_m_'
21 580c41ea Artem Sheremet
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 85419c53 Artem Sheremet
def netstat_m(filter = nil)
35 580c41ea Artem Sheremet
	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 85419c53 Artem Sheremet
	puts netstat_m.keys.map(&:escape).join $/
56 580c41ea Artem Sheremet
when 'config'
57 85419c53 Artem Sheremet
	data = netstat_m(stat_name)
58 580c41ea Artem Sheremet
	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 81db94e2 Gabriele Pohl
graph_category network
67 c8148539 Diego Elio Pettenò
graph_vlabel current
68 580c41ea Artem Sheremet
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 85419c53 Artem Sheremet
	data = netstat_m(stat_name)
88 580c41ea Artem Sheremet
	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 7c8df226 Artem Sheremet
	warn "unrecognized argument <#{ARGV.first}>"
96 580c41ea Artem Sheremet
end