Projet

Général

Profil

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

root / plugins / network / netstat_bsd_ @ 580c41ea

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

1
#!/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