em-sflow 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +13 -18
- data/lib/em-sflow.rb +2 -0
- data/lib/em-sflow/flow_record.rb +55 -0
- data/lib/em-sflow/packet/datagram.rb +1 -1
- data/lib/em-sflow/packet/expanded_flow_sample.rb +14 -0
- data/lib/em-sflow/packet/flow_sample.rb +2 -44
- data/lib/em-sflow/version.rb +1 -1
- metadata +52 -33
data/README.rdoc
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
== Summary
|
4
4
|
|
5
|
-
This gem collects, parses, and optionally proxies sampled flow records from network switches and routers. For information about sFlow, refer to
|
5
|
+
This gem collects, parses, and optionally proxies sampled flow records from network switches and routers. For information about sFlow, refer to http://www.sflow.org.
|
6
6
|
|
7
7
|
== Features
|
8
8
|
|
@@ -17,31 +17,26 @@ Version 1.0.0
|
|
17
17
|
|
18
18
|
Collector:
|
19
19
|
|
20
|
-
|
21
|
-
c = EventMachine::SFlow::Collector.new(:host => "127.0.0.1")
|
20
|
+
c = EventMachine::SFlow::Collector.new(:host => "127.0.0.1")
|
22
21
|
|
23
|
-
|
24
|
-
|
22
|
+
c.on_sflow do |pkt|
|
23
|
+
puts "Got #{pkt.samples.count} samples"
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
end
|
25
|
+
pkt.samples.each do |sample|
|
26
|
+
sample.records.each do |record|
|
27
|
+
if record.is_a? EM::SFlow::RawPacketHeader
|
28
|
+
puts "Received a sampled packet from #{pkt.agent} of length #{record.header.size}"
|
29
|
+
elsif record.is_a? EM::SFlow::GenericInterfaceCounters
|
30
|
+
puts "Interface #{record.if_index} on #{pkt.agent} has seen #{record.if_in_octets} inbound bytes, #{record.if_out_octets} outbound bytes"
|
33
31
|
end
|
34
32
|
end
|
35
33
|
end
|
36
|
-
|
34
|
+
end
|
37
35
|
|
38
36
|
Proxy:
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
c.proxy_to "192.168.1.1"
|
44
|
-
}
|
38
|
+
c = EventMachine::SFlow::Collector.new(:host => "127.0.0.1")
|
39
|
+
c.proxy_to "192.168.1.1"
|
45
40
|
|
46
41
|
Multiple callbacks and proxy targets can be defined simultaneously
|
47
42
|
|
data/lib/em-sflow.rb
CHANGED
@@ -6,8 +6,10 @@ require "ipaddr"
|
|
6
6
|
require "em-sflow/collector"
|
7
7
|
require "em-sflow/datagram_handler"
|
8
8
|
require "em-sflow/binary_string"
|
9
|
+
require "em-sflow/flow_record"
|
9
10
|
require "em-sflow/packet/datagram"
|
10
11
|
require "em-sflow/packet/flow_sample"
|
12
|
+
require "em-sflow/packet/expanded_flow_sample"
|
11
13
|
require "em-sflow/packet/counter_sample"
|
12
14
|
require "em-sflow/packet/raw_packet_header"
|
13
15
|
require "em-sflow/packet/generic_interface_counters"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module EventMachine
|
2
|
+
module SFlow
|
3
|
+
module FlowRecord
|
4
|
+
def to_flow_records!(record_count)
|
5
|
+
records = []
|
6
|
+
record_count.times do
|
7
|
+
enterprise_format, length = unpack("NN")
|
8
|
+
|
9
|
+
enterprise = enterprise_format >> 12
|
10
|
+
format = enterprise_format & (2 ** 12 - 1)
|
11
|
+
|
12
|
+
self.advance(8)
|
13
|
+
|
14
|
+
record_data = self.advance(length)
|
15
|
+
|
16
|
+
if enterprise == 0 && format == 1
|
17
|
+
records << EM::SFlow::RawPacketHeader.new(record_data)
|
18
|
+
elsif enterprise == 0 && format == 2
|
19
|
+
# records << EM::SFlow::EthernetFrameData.new(record_data)
|
20
|
+
elsif enterprise == 0 && format == 3
|
21
|
+
# records << EM::SFlow::IPv4Data.new(record_data)
|
22
|
+
elsif enterprise == 0 && format == 4
|
23
|
+
# records << EM::SFlow::IPv6Data.new(record_data)
|
24
|
+
elsif enterprise == 0 && format == 1001
|
25
|
+
# records << EM::SFlow::ExtendedSwitchData.new(record_data)
|
26
|
+
elsif enterprise == 0 && format == 1002
|
27
|
+
# records << EM::SFlow::ExtendedRouterData.new(record_data)
|
28
|
+
elsif enterprise == 0 && format == 1003
|
29
|
+
# records << EM::SFlow::ExtendedGatewayData.new(record_data)
|
30
|
+
elsif enterprise == 0 && format == 1004
|
31
|
+
# records << EM::SFlow::ExtendedUserData.new(record_data)
|
32
|
+
elsif enterprise == 0 && format == 1005
|
33
|
+
# records << EM::SFlow::ExtendedUrlData.new(record_data)
|
34
|
+
elsif enterprise == 0 && format == 1006
|
35
|
+
# records << EM::SFlow::ExtendedMplsData.new(record_data)
|
36
|
+
elsif enterprise == 0 && format == 1007
|
37
|
+
# records << EM::SFlow::ExtendedNatData.new(record_data)
|
38
|
+
elsif enterprise == 0 && format == 1008
|
39
|
+
# records << EM::SFlow::ExtendedMplsTunnel.new(record_data)
|
40
|
+
elsif enterprise == 0 && format == 1009
|
41
|
+
# records << EM::SFlow::ExtendedMplsVc.new(record_data)
|
42
|
+
elsif enterprise == 0 && format == 1010
|
43
|
+
# records << EM::SFlow::ExtendedMplsFec.new(record_data)
|
44
|
+
elsif enterprise == 0 && format == 1011
|
45
|
+
# records << EM::SFlow::ExtendedMplsLvpFec.new(record_data)
|
46
|
+
elsif enterprise == 0 && format == 1012
|
47
|
+
# records << EM::SFlow::ExtendedVlanTunnel.new(record_data)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
records
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -37,7 +37,7 @@ class EventMachine::SFlow::Datagram
|
|
37
37
|
elsif enterprise == 0 && format == 2
|
38
38
|
@samples << EM::SFlow::CounterSample.new(sample_data)
|
39
39
|
elsif enterprise == 0 && format == 3
|
40
|
-
|
40
|
+
@samples << EM::SFlow::ExpandedFlowSample.new(sample_data)
|
41
41
|
elsif enterprise == 0 && format == 4
|
42
42
|
# @samples << EM::SFlow::ExpandedCounterSample.new(sample_data)
|
43
43
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class EventMachine::SFlow::ExpandedFlowSample
|
2
|
+
attr_accessor :sequence_number, :source_class, :source_value, :sampling_rate, :sample_pool, :drop_count, :input_type, :input_value, :output_type, :output_value, :records
|
3
|
+
|
4
|
+
def initialize data
|
5
|
+
data.extend EM::SFlow::BinaryString
|
6
|
+
data.extend EM::SFlow::FlowRecord
|
7
|
+
|
8
|
+
@sequence_number, @source_class, @source_value, @sampling_rate, @sample_pool, @drop_count, @input_type, @input_value, @output_type, @output_value, record_count = data.unpack("NNNNNNNNNNN")
|
9
|
+
|
10
|
+
data.advance(44)
|
11
|
+
|
12
|
+
@records = data.to_flow_records!(record_count)
|
13
|
+
end
|
14
|
+
end
|
@@ -3,6 +3,7 @@ class EventMachine::SFlow::FlowSample
|
|
3
3
|
|
4
4
|
def initialize data
|
5
5
|
data.extend EM::SFlow::BinaryString
|
6
|
+
data.extend EM::SFlow::FlowRecord
|
6
7
|
|
7
8
|
@records = []
|
8
9
|
|
@@ -13,49 +14,6 @@ class EventMachine::SFlow::FlowSample
|
|
13
14
|
|
14
15
|
data.advance(32)
|
15
16
|
|
16
|
-
record_count
|
17
|
-
enterprise_format, length = data.unpack("NN")
|
18
|
-
|
19
|
-
enterprise = enterprise_format >> 12
|
20
|
-
format = enterprise_format & (2 ** 12 - 1)
|
21
|
-
|
22
|
-
data.advance(8)
|
23
|
-
|
24
|
-
record_data = data.advance(length)
|
25
|
-
|
26
|
-
if enterprise == 0 && format == 1
|
27
|
-
@records << EM::SFlow::RawPacketHeader.new(record_data)
|
28
|
-
elsif enterprise == 0 && format == 2
|
29
|
-
# @records << EM::SFlow::EthernetFrameData.new(record_data)
|
30
|
-
elsif enterprise == 0 && format == 3
|
31
|
-
# @records << EM::SFlow::IPv4Data.new(record_data)
|
32
|
-
elsif enterprise == 0 && format == 4
|
33
|
-
# @records << EM::SFlow::IPv6Data.new(record_data)
|
34
|
-
elsif enterprise == 0 && format == 1001
|
35
|
-
# @records << EM::SFlow::ExtendedSwitchData.new(record_data)
|
36
|
-
elsif enterprise == 0 && format == 1002
|
37
|
-
# @records << EM::SFlow::ExtendedRouterData.new(record_data)
|
38
|
-
elsif enterprise == 0 && format == 1003
|
39
|
-
# @records << EM::SFlow::ExtendedGatewayData.new(record_data)
|
40
|
-
elsif enterprise == 0 && format == 1004
|
41
|
-
# @records << EM::SFlow::ExtendedUserData.new(record_data)
|
42
|
-
elsif enterprise == 0 && format == 1005
|
43
|
-
# @records << EM::SFlow::ExtendedUrlData.new(record_data)
|
44
|
-
elsif enterprise == 0 && format == 1006
|
45
|
-
# @records << EM::SFlow::ExtendedMplsData.new(record_data)
|
46
|
-
elsif enterprise == 0 && format == 1007
|
47
|
-
# @records << EM::SFlow::ExtendedNatData.new(record_data)
|
48
|
-
elsif enterprise == 0 && format == 1008
|
49
|
-
# @records << EM::SFlow::ExtendedMplsTunnel.new(record_data)
|
50
|
-
elsif enterprise == 0 && format == 1009
|
51
|
-
# @records << EM::SFlow::ExtendedMplsVc.new(record_data)
|
52
|
-
elsif enterprise == 0 && format == 1010
|
53
|
-
# @records << EM::SFlow::ExtendedMplsFec.new(record_data)
|
54
|
-
elsif enterprise == 0 && format == 1011
|
55
|
-
# @records << EM::SFlow::ExtendedMplsLvpFec.new(record_data)
|
56
|
-
elsif enterprise == 0 && format == 1012
|
57
|
-
# @records << EM::SFlow::ExtendedVlanTunnel.new(record_data)
|
58
|
-
end
|
59
|
-
end
|
17
|
+
@records = data.to_flow_records!(record_count)
|
60
18
|
end
|
61
19
|
end
|
data/lib/em-sflow/version.rb
CHANGED
metadata
CHANGED
@@ -1,35 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: em-sflow
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 1.0.2
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- Norman Elton
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2013-04-05 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: eventmachine
|
16
|
-
|
17
|
-
|
18
|
-
requirements:
|
19
|
-
- -
|
20
|
-
- !ruby/object:Gem::Version
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 12
|
30
|
+
- 10
|
21
31
|
version: 0.12.10
|
22
32
|
type: :runtime
|
23
|
-
|
24
|
-
version_requirements: *70342806966360
|
33
|
+
version_requirements: *id001
|
25
34
|
description: EventMachine-powered sFlow Collector
|
26
|
-
email:
|
35
|
+
email:
|
27
36
|
- normelton@gmail.com
|
28
37
|
executables: []
|
38
|
+
|
29
39
|
extensions: []
|
30
|
-
|
40
|
+
|
41
|
+
extra_rdoc_files:
|
31
42
|
- README.rdoc
|
32
|
-
files:
|
43
|
+
files:
|
33
44
|
- .gitignore
|
34
45
|
- Gemfile
|
35
46
|
- LICENSE
|
@@ -40,41 +51,49 @@ files:
|
|
40
51
|
- lib/em-sflow/binary_string.rb
|
41
52
|
- lib/em-sflow/collector.rb
|
42
53
|
- lib/em-sflow/datagram_handler.rb
|
54
|
+
- lib/em-sflow/flow_record.rb
|
43
55
|
- lib/em-sflow/packet/counter_sample.rb
|
44
56
|
- lib/em-sflow/packet/datagram.rb
|
45
57
|
- lib/em-sflow/packet/ethernet_interface_counters.rb
|
58
|
+
- lib/em-sflow/packet/expanded_flow_sample.rb
|
46
59
|
- lib/em-sflow/packet/flow_sample.rb
|
47
60
|
- lib/em-sflow/packet/generic_interface_counters.rb
|
48
61
|
- lib/em-sflow/packet/raw_packet_header.rb
|
49
62
|
- lib/em-sflow/version.rb
|
63
|
+
has_rdoc: true
|
50
64
|
homepage: http://github.com/normelton/em-sflow
|
51
65
|
licenses: []
|
66
|
+
|
52
67
|
post_install_message:
|
53
|
-
rdoc_options:
|
68
|
+
rdoc_options:
|
54
69
|
- --line-numbers
|
55
70
|
- --inline-source
|
56
71
|
- --title
|
57
72
|
- EM-SFLOW
|
58
73
|
- --main
|
59
74
|
- README.rdoc
|
60
|
-
require_paths:
|
75
|
+
require_paths:
|
61
76
|
- lib
|
62
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 0
|
90
|
+
version: "0"
|
74
91
|
requirements: []
|
92
|
+
|
75
93
|
rubyforge_project:
|
76
|
-
rubygems_version: 1.
|
94
|
+
rubygems_version: 1.3.6
|
77
95
|
signing_key:
|
78
96
|
specification_version: 3
|
79
97
|
summary: EventMachine-powered sFlow Collector
|
80
98
|
test_files: []
|
99
|
+
|