copian 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README +83 -0
- data/Rakefile +45 -0
- data/VERSION.yml +4 -0
- data/lib/copian.rb +23 -0
- data/lib/copian/collector/abstract_collector.rb +12 -0
- data/lib/copian/collector/addresses_collector.rb +18 -0
- data/lib/copian/collector/bandwidth_collector.rb +52 -0
- data/lib/copian/collector/cisco.rb +40 -0
- data/lib/copian/collector/cisco/addresses.rb +20 -0
- data/lib/copian/collector/cisco/ports.rb +56 -0
- data/lib/copian/collector/cisco/vlans.rb +19 -0
- data/lib/copian/collector/dell.rb +31 -0
- data/lib/copian/collector/dell/ports.rb +25 -0
- data/lib/copian/collector/dell/vlans.rb +23 -0
- data/lib/copian/collector/description_collector.rb +14 -0
- data/lib/copian/collector/generic.rb +71 -0
- data/lib/copian/collector/hp.rb +33 -0
- data/lib/copian/collector/hp/ports.rb +25 -0
- data/lib/copian/collector/hp/vlans.rb +18 -0
- data/lib/copian/collector/port_stats_collector.rb +45 -0
- data/lib/copian/collector/ports_collector.rb +12 -0
- data/test/copian_test.rb +7 -0
- data/test/test_helper.rb +10 -0
- metadata +90 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Geoff Garside
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
= Copian
|
2
|
+
|
3
|
+
Copian is a suite of SNMP network device collectors. It provides an easy way of gathering information from SNMP enabled network devices. As of the current version it supports the following
|
4
|
+
|
5
|
+
- Network Interface Stats
|
6
|
+
- MTU size
|
7
|
+
- Connection speed (in bits)
|
8
|
+
- Admin and Oper status indicating UP/DOWN
|
9
|
+
- Network Interface Bandwidth, including 64 bit counter support.
|
10
|
+
- Switch port to IP Address mapping
|
11
|
+
- Switch port to MAC Addresses
|
12
|
+
- VLAN listings
|
13
|
+
|
14
|
+
== Examples
|
15
|
+
Collecting the status of all the network interfaces on a Cisco Router
|
16
|
+
|
17
|
+
require 'copian'
|
18
|
+
collector = Copian::Collector::Cisco.new('192.168.1.1', 'public')
|
19
|
+
collector.port_stats do |ifindex, ifname, mtu, speed, admin_status, oper_status|
|
20
|
+
puts "Port #{ifname} is #{oper_status} @ #{speed} bps. mtu (#{mtu})"
|
21
|
+
end
|
22
|
+
# Port 1/e1 is 1 @ 100000000. mtu(1500)
|
23
|
+
# ...
|
24
|
+
|
25
|
+
presently the admin_status and oper_status are not interpreted, but equate to
|
26
|
+
|
27
|
+
1. up
|
28
|
+
2. down
|
29
|
+
3. testing
|
30
|
+
|
31
|
+
== History
|
32
|
+
|
33
|
+
=== 1.3.2 - 2009/10/06
|
34
|
+
|
35
|
+
- 1 major correction
|
36
|
+
- BandwidthCollector fixed, it was incredibly buggy
|
37
|
+
|
38
|
+
=== 1.3.1 - 2009/10/06
|
39
|
+
|
40
|
+
- 1 patch
|
41
|
+
- Fix symbol reference for the bandwidth collector from :64bit -> :b64
|
42
|
+
|
43
|
+
=== 1.3.0 - 2009/10/05
|
44
|
+
|
45
|
+
- 1 major enhancement
|
46
|
+
- Added generic Bandwidth collector with support for 32 and 64bit counters
|
47
|
+
to use the 64 bit counters {:64bit => true} needs to be passed to the
|
48
|
+
bandwidth method on the collector.
|
49
|
+
|
50
|
+
=== 1.2.0 - 2009/02/04
|
51
|
+
|
52
|
+
- 2 major enhancements
|
53
|
+
- Added VLAN collector to Dell collector
|
54
|
+
- Added VLAN collector to HP collector
|
55
|
+
|
56
|
+
=== 1.1.1 - 2009/02/04
|
57
|
+
|
58
|
+
- 1 bug fix
|
59
|
+
- Fixed HP ports collector incorrectly stripping information from
|
60
|
+
returned ObjectID resulting in invalid MAC addresses
|
61
|
+
|
62
|
+
=== 1.1.0 - 2009/02/04
|
63
|
+
|
64
|
+
- 3 major enhancement
|
65
|
+
- Dell collector with ports support
|
66
|
+
- HP collector with ports support
|
67
|
+
- Port stats, ifMtu, ifSpeed, ifAdminStatus and ifOperStatus
|
68
|
+
- 1 extensibility enhancement
|
69
|
+
- Introduced Generic Collector from which the others descend
|
70
|
+
|
71
|
+
=== 1.0.0 - 2009/02/03
|
72
|
+
|
73
|
+
- 1 major enhancement
|
74
|
+
- Cisco collector supports Ports, VLANs and Addresses
|
75
|
+
|
76
|
+
=== 0.0.1 - 2009/02/02
|
77
|
+
|
78
|
+
- 1 major enhancement
|
79
|
+
- initial creation
|
80
|
+
|
81
|
+
== COPYRIGHT
|
82
|
+
|
83
|
+
Copyright (c) 2009 Geoff Garside. See LICENSE[link:files/LICENSE.html] for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |s|
|
8
|
+
s.name = "copian"
|
9
|
+
s.summary = %Q{Suite of SNMP collectors for different types of network devices}
|
10
|
+
s.email = "geoff@geoffgarside.co.uk"
|
11
|
+
s.homepage = "http://github.com/geoffgarside/copian"
|
12
|
+
s.description = "Suite of SNMP collectors for different types of network devices"
|
13
|
+
s.authors = ["Geoff Garside"]
|
14
|
+
s.add_dependency('snmp', '>= 1.0.2')
|
15
|
+
end
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
18
|
+
end
|
19
|
+
|
20
|
+
Rake::TestTask.new do |t|
|
21
|
+
t.libs << 'lib'
|
22
|
+
t.pattern = 'test/**/*_test.rb'
|
23
|
+
t.verbose = false
|
24
|
+
end
|
25
|
+
|
26
|
+
Rake::RDocTask.new do |rdoc|
|
27
|
+
rdoc.rdoc_dir = 'rdoc'
|
28
|
+
rdoc.title = 'copian'
|
29
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
30
|
+
rdoc.rdoc_files.include('README*')
|
31
|
+
rdoc.rdoc_files.include('LICENSE')
|
32
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
33
|
+
end
|
34
|
+
|
35
|
+
begin
|
36
|
+
require 'rcov/rcovtask'
|
37
|
+
Rcov::RcovTask.new do |t|
|
38
|
+
t.libs << 'test'
|
39
|
+
t.test_files = FileList['test/**/*_test.rb']
|
40
|
+
t.verbose = true
|
41
|
+
end
|
42
|
+
rescue LoadError
|
43
|
+
end
|
44
|
+
|
45
|
+
task :default => :test
|
data/VERSION.yml
ADDED
data/lib/copian.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'copian/collector/abstract_collector'
|
2
|
+
require 'copian/collector/addresses_collector'
|
3
|
+
require 'copian/collector/bandwidth_collector'
|
4
|
+
require 'copian/collector/description_collector'
|
5
|
+
require 'copian/collector/ports_collector'
|
6
|
+
require 'copian/collector/port_stats_collector'
|
7
|
+
require 'copian/collector/generic'
|
8
|
+
require 'copian/collector/cisco'
|
9
|
+
require 'copian/collector/dell'
|
10
|
+
require 'copian/collector/hp'
|
11
|
+
|
12
|
+
require 'snmp'
|
13
|
+
|
14
|
+
# :stopdoc:
|
15
|
+
class SNMP::Manager
|
16
|
+
attr_reader :host, :community, :version
|
17
|
+
end
|
18
|
+
# :startdoc:
|
19
|
+
|
20
|
+
module Copian # :nodoc:
|
21
|
+
module Collector # :nodoc:
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class AddressesCollector < AbstractCollector # :nodoc:
|
4
|
+
protected
|
5
|
+
def append_mac_and_ip(mac, ip)
|
6
|
+
@map ||= Hash.new
|
7
|
+
@map[mac] ||= Array.new
|
8
|
+
@map[mac] << ip
|
9
|
+
end
|
10
|
+
def value_to_mac_address(value)
|
11
|
+
value.unpack('H2' * 6).join(':')
|
12
|
+
end
|
13
|
+
def name_to_ip_address(name, oid)
|
14
|
+
name.index(oid).to_s.gsub(/^[0-9]+\./, '')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class BandwidthCollector < AbstractCollector # :nodoc:
|
4
|
+
def initialize(manager)
|
5
|
+
super(manager)
|
6
|
+
@interfaces = Hash.new
|
7
|
+
end
|
8
|
+
def collect
|
9
|
+
load_inoctets
|
10
|
+
load_outoctets
|
11
|
+
|
12
|
+
@interfaces.each do |ifindex, stats|
|
13
|
+
yield ifindex, stats[:inoctets], stats[:outoctets]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
def collect64
|
17
|
+
load_inoctets64
|
18
|
+
load_outoctets64
|
19
|
+
|
20
|
+
@interfaces.each do |ifindex, stats|
|
21
|
+
yield ifindex, stats[:inoctets64], stats[:outoctets64]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
protected
|
25
|
+
def load_inoctets
|
26
|
+
load_property(:inoctets, SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.10'))
|
27
|
+
end
|
28
|
+
def load_outoctets
|
29
|
+
load_property(:outoctets, SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.16'))
|
30
|
+
end
|
31
|
+
def load_inoctets64
|
32
|
+
load_property(:inoctets64, SNMP::ObjectId.new('1.3.6.1.2.1.31.1.1.1.6'))
|
33
|
+
end
|
34
|
+
def load_outoctets64
|
35
|
+
load_property(:outoctets64, SNMP::ObjectId.new('1.3.6.1.2.1.31.1.1.1.10'))
|
36
|
+
end
|
37
|
+
def load_property(property, oid)
|
38
|
+
@manager.walk(oid) do |r|
|
39
|
+
r.each do |varbind|
|
40
|
+
append_property(varbind.name.index(oid), property,
|
41
|
+
varbind.value.to_i)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
def append_property(index, property, value)
|
46
|
+
@interfaces[index.to_s.to_i] ||= Hash.new
|
47
|
+
@interfaces[index.to_s.to_i][property] = value
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/cisco/addresses')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/cisco/ports')
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + '/cisco/vlans')
|
4
|
+
|
5
|
+
module Copian
|
6
|
+
module Collector
|
7
|
+
class Cisco < Generic
|
8
|
+
def vlans # :yields: id, ifindex, name
|
9
|
+
load_ifnames
|
10
|
+
|
11
|
+
vlans_collector.collect do |vlan_id, vlan_index|
|
12
|
+
yield vlan_id, vlan_index, @ifnames[vlan_index]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
def addresses # :yields: mac_address, ip_addresses_array
|
16
|
+
addresses_collector.collect do |mac, ips|
|
17
|
+
yield mac, ips
|
18
|
+
end
|
19
|
+
end
|
20
|
+
def ports # :yields: ifindex, ifname, addresses_array
|
21
|
+
load_ifnames
|
22
|
+
|
23
|
+
ports_collector.collect do |port_ifindex, port_addresses|
|
24
|
+
yield port_ifindex, @ifnames[port_ifindex], port_addresses
|
25
|
+
end
|
26
|
+
end
|
27
|
+
private
|
28
|
+
def vlans_collector
|
29
|
+
@vlans_collector ||= CiscoVlansCollector.new(@manager)
|
30
|
+
end
|
31
|
+
def addresses_collector
|
32
|
+
@addresses_collector ||= CiscoAddressesCollector.new(@manager)
|
33
|
+
end
|
34
|
+
def ports_collector
|
35
|
+
@ports_collector ||=
|
36
|
+
CiscoPortsCollector.new(@manager, vlans_collector)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class CiscoAddressesCollector < AddressesCollector # :nodoc:
|
4
|
+
def collect
|
5
|
+
oid = SNMP::ObjectId.new('1.3.6.1.2.1.4.22.1.2')
|
6
|
+
@manager.walk(oid) do |r|
|
7
|
+
r.each do |varbind|
|
8
|
+
mac_addr = value_to_mac_address(varbind.value)
|
9
|
+
ip_addr = name_to_ip_address(varbind.name, oid)
|
10
|
+
append_mac_and_ip(mac_addr, ip_addr)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
@map.each do |mac, ips|
|
15
|
+
yield mac.dup, ips if block_given?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class CiscoPortsCollector < PortsCollector # :nodoc:
|
4
|
+
def initialize(manager, vlans_collector)
|
5
|
+
super(manager)
|
6
|
+
@vlans_collector = vlans_collector
|
7
|
+
end
|
8
|
+
def collect
|
9
|
+
each_vlan do |manager|
|
10
|
+
mac_bridge_ports = gather_mac_bridge_ports(manager)
|
11
|
+
bridge_port_iface = gather_bridge_port_ifaces(manager)
|
12
|
+
|
13
|
+
# Now we stitch the two lists together
|
14
|
+
mac_bridge_ports.each do |bridge_port, addresses|
|
15
|
+
yield bridge_port_iface[bridge_port], addresses
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
private
|
20
|
+
def each_vlan
|
21
|
+
@vlans_collector.collect do |vlan_id, vlan_index|
|
22
|
+
yield SNMP::Manager.new(:Host => @manager.host,
|
23
|
+
:Version => @manager.version,
|
24
|
+
:Community => "#{@manager.community}@#{vlan_id}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
def gather_mac_bridge_ports(manager)
|
28
|
+
oid = SNMP::ObjectId.new('1.3.6.1.2.1.17.4.3.1.2')
|
29
|
+
mac_bridge_ports = Hash.new
|
30
|
+
|
31
|
+
manager.walk(oid) do |r|
|
32
|
+
r.each do |varbind|
|
33
|
+
mac_bridge_ports[varbind.value.to_i] ||= Array.new
|
34
|
+
mac_bridge_ports[varbind.value.to_i] <<
|
35
|
+
suboid_to_mac(varbind.name.index(oid))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
mac_bridge_ports
|
40
|
+
end
|
41
|
+
def gather_bridge_port_ifaces(manager)
|
42
|
+
oid = SNMP::ObjectId.new('1.3.6.1.2.1.17.1.4.1.2')
|
43
|
+
bridge_port_ifaces = Hash.new
|
44
|
+
|
45
|
+
manager.walk(oid) do |r|
|
46
|
+
r.each do |varbind|
|
47
|
+
bridge_port_ifaces[varbind.name.index(oid).to_s.to_i] =
|
48
|
+
varbind.value.to_i
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
bridge_port_ifaces
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class CiscoVlansCollector < AbstractCollector # :nodoc:
|
4
|
+
def collect
|
5
|
+
oid = SNMP::ObjectId.new('1.3.6.1.4.1.9.9.46.1.3.1.1.18.1')
|
6
|
+
@manager.walk(oid) do |r|
|
7
|
+
r.each do |varbind|
|
8
|
+
vlan_id = varbind.name.index(oid).to_s.to_i
|
9
|
+
vlan_ifindex = varbind.value.to_i
|
10
|
+
|
11
|
+
# NOTE: Ignore ids between 1002 and 1005 they are seemingly fake
|
12
|
+
next if vlan_id.between?(1002, 1005)
|
13
|
+
yield vlan_id, vlan_ifindex
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/dell/ports')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/dell/vlans')
|
3
|
+
|
4
|
+
module Copian
|
5
|
+
module Collector
|
6
|
+
class Dell < Generic
|
7
|
+
def vlans # :yields: id, ifindex, name
|
8
|
+
load_ifnames
|
9
|
+
|
10
|
+
vlans_collector.collect do |vlan_id, vlan_index|
|
11
|
+
yield vlan_id, vlan_index, @ifnames[vlan_index]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
def ports # :yields: ifindex, ifname, addresses_array
|
15
|
+
load_ifnames
|
16
|
+
|
17
|
+
ports_collector.collect do |port_ifindex, port_addresses|
|
18
|
+
yield port_ifindex, @ifnames[port_ifindex], port_addresses
|
19
|
+
end
|
20
|
+
end
|
21
|
+
private
|
22
|
+
def vlans_collector
|
23
|
+
@vlans_collector ||= DellVlansCollector.new(@manager)
|
24
|
+
end
|
25
|
+
def ports_collector
|
26
|
+
@ports_collector ||=
|
27
|
+
DellPortsCollector.new(@manager)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class DellPortsCollector < PortsCollector # :nodoc:
|
4
|
+
def collect
|
5
|
+
oid = SNMP::ObjectId.new('1.3.6.1.2.1.17.7.1.2.2.1.2')
|
6
|
+
results = Hash.new
|
7
|
+
|
8
|
+
manager.walk(oid) do |r|
|
9
|
+
r.each do |varbind|
|
10
|
+
results[varbind.value.to_i] ||= Array.new
|
11
|
+
results[varbind.value.to_i] << suboid_to_mac(varbind.name.index(oid))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
results.each do |if_index, addresses|
|
16
|
+
yield if_index, addresses
|
17
|
+
end
|
18
|
+
end
|
19
|
+
protected
|
20
|
+
def suboid_to_mac(oid)
|
21
|
+
super(oid.to_s.gsub(/^[0-9]+\./, ''))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class DellVlansCollector < AbstractCollector # :nodoc:
|
4
|
+
# ---
|
5
|
+
# Dell switches assign VLANs ifIndex values equal to
|
6
|
+
# the VLAN ID + 100000.
|
7
|
+
# +++
|
8
|
+
def collect
|
9
|
+
oid = SNMP::ObjectID.new('1.3.6.1.2.1.2.2.1.3')
|
10
|
+
@manager.walk(oid) do |r|
|
11
|
+
r.each do |varbind|
|
12
|
+
next unless varbind.value.to_i == 53 # propVirtual type
|
13
|
+
vlan_index = varbind.name.index(oid).to_s.to_i
|
14
|
+
vlan_id = vlan_index - 100000
|
15
|
+
vlan_id = 1 if vlan_id == 0
|
16
|
+
|
17
|
+
yield vlan_id, vlan_index
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class DescriptionCollector < AbstractCollector # :nodoc:
|
4
|
+
def collect
|
5
|
+
oid = SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.2')
|
6
|
+
@manager.walk(oid) do |r|
|
7
|
+
r.each do |varbind|
|
8
|
+
yield varbind.name.index(oid), varbind.value.to_s
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class Generic
|
4
|
+
def inspect
|
5
|
+
"#<#{self.class} #{@manager.host}@#{@manager.community}>"
|
6
|
+
end
|
7
|
+
def initialize(ip_addr, community, version = :SNMPv2c)
|
8
|
+
@manager = SNMP::Manager.new(:Host => ip_addr,
|
9
|
+
:Community => community, :Version => version)
|
10
|
+
end
|
11
|
+
def port_stats # :yields: ifindex, name, mtu, speed, admin_status, oper_status
|
12
|
+
load_ifnames
|
13
|
+
|
14
|
+
port_stats_collector.collect do |ifindex, mtu, speed, admin_status, oper_status|
|
15
|
+
yield ifindex, @ifnames[ifindex], mtu, speed, admin_status, oper_status
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Collect bandwidth statistics
|
20
|
+
#
|
21
|
+
# Arguments:
|
22
|
+
# +options+
|
23
|
+
#
|
24
|
+
# Valid Options
|
25
|
+
# +:b64+ :Set to true to enable b64 bandwidth collection. Default false.
|
26
|
+
def bandwidth(options = {}) # :yields: ifindex, inoctets, outoctets
|
27
|
+
load_ifnames
|
28
|
+
|
29
|
+
collect_method = options[:b64] == true ? :collect64 : :collect
|
30
|
+
bandwidth_collector.send(collect_method) do |ifindex, inoctets, outoctets|
|
31
|
+
yield ifindex, @ifnames[ifindex], inoctets, outoctets
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def descriptions # :yields: ifindex, ifname, ifdescr
|
36
|
+
load_ifnames
|
37
|
+
|
38
|
+
description_collector.collect do |ifindex, ifdescr|
|
39
|
+
yield ifindex, @ifnames[ifindex], ifdescr
|
40
|
+
end
|
41
|
+
end
|
42
|
+
protected
|
43
|
+
# :stopdoc:
|
44
|
+
def load_ifnames
|
45
|
+
return if @loaded_ifnames
|
46
|
+
oid = SNMP::ObjectId.new('1.3.6.1.2.1.31.1.1.1.1')
|
47
|
+
@manager.walk(oid) do |r|
|
48
|
+
r.each do |varbind|
|
49
|
+
append_ifname(varbind.name.index(oid).to_s.to_i,
|
50
|
+
varbind.value.to_s)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
@loaded_ifnames = true
|
54
|
+
end
|
55
|
+
def append_ifname(ifindex, ifname)
|
56
|
+
@ifnames ||= Hash.new
|
57
|
+
@ifnames[ifindex] = ifname
|
58
|
+
end
|
59
|
+
def port_stats_collector
|
60
|
+
@port_stats_collector ||= PortStatsCollector.new(@manager)
|
61
|
+
end
|
62
|
+
def bandwidth_collector
|
63
|
+
@bandwidth_collector ||= BandwidthCollector.new(@manager)
|
64
|
+
end
|
65
|
+
def description_collector
|
66
|
+
@description_collector ||= DescriptionCollector.new(@manager)
|
67
|
+
end
|
68
|
+
# :startdoc:
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/hp/ports')
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + '/hp/vlans')
|
3
|
+
|
4
|
+
module Copian
|
5
|
+
module Collector
|
6
|
+
class Hp < Generic
|
7
|
+
def vlans # :yields: id, ifindex, name
|
8
|
+
load_ifnames
|
9
|
+
|
10
|
+
vlans_collector.collect do |vlan_id, vlan_index|
|
11
|
+
vlan_name = @ifnames[vlan_index]
|
12
|
+
vlan_id = vlan_name.gsub(/[^0-9]/, '').to_i
|
13
|
+
yield vlan_id, vlan_index, vlan_name
|
14
|
+
end
|
15
|
+
end
|
16
|
+
def ports # :yields: ifindex, ifname, addresses_array
|
17
|
+
load_ifnames
|
18
|
+
|
19
|
+
ports_collector.collect do |port_ifindex, port_addresses|
|
20
|
+
yield port_ifindex, @ifnames[port_ifindex], port_addresses
|
21
|
+
end
|
22
|
+
end
|
23
|
+
private
|
24
|
+
def vlans_collector
|
25
|
+
@vlans_collector ||= HpVlansCollector.new(@manager)
|
26
|
+
end
|
27
|
+
def ports_collector
|
28
|
+
@ports_collector ||=
|
29
|
+
HpPortsCollector.new(@manager)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class HpPortsCollector < PortsCollector # :nodoc:
|
4
|
+
def collect
|
5
|
+
oid = SNMP::ObjectId.new('1.3.6.1.4.1.11.2.14.11.5.1.9.4.2.1.1')
|
6
|
+
results = Hash.new
|
7
|
+
|
8
|
+
manager.walk(oid) do |r|
|
9
|
+
r.each do |varbind|
|
10
|
+
results[varbind.value.to_i] ||= Array.new
|
11
|
+
results[varbind.value.to_i] << suboid_to_mac(varbind.name.index(oid))
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
results.each do |if_index, addresses|
|
16
|
+
yield if_index, addresses
|
17
|
+
end
|
18
|
+
end
|
19
|
+
protected
|
20
|
+
def suboid_to_mac(oid)
|
21
|
+
super(oid.to_s.gsub(/^[0-9]+\./, ''))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class HpVlansCollector < AbstractCollector # :nodoc:
|
4
|
+
def collect
|
5
|
+
oid = SNMP::ObjectID.new('1.3.6.1.2.1.2.2.1.3')
|
6
|
+
@manager.walk(oid) do |r|
|
7
|
+
r.each do |varbind|
|
8
|
+
next unless varbind.value.to_i == 53 # propVirtual type
|
9
|
+
vlan_index = varbind.name.index(oid).to_s.to_i
|
10
|
+
# Not sure how to get this vlan ID, ifName sort of has it
|
11
|
+
|
12
|
+
yield nil, vlan_index
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Copian
|
2
|
+
module Collector
|
3
|
+
class PortStatsCollector < AbstractCollector # :nodoc:
|
4
|
+
def initialize(manager)
|
5
|
+
super(manager)
|
6
|
+
@interfaces = Hash.new
|
7
|
+
end
|
8
|
+
def collect
|
9
|
+
load_mtu
|
10
|
+
load_speed
|
11
|
+
load_oper_status
|
12
|
+
load_admin_status
|
13
|
+
|
14
|
+
@interfaces.each do |ifindex, p|
|
15
|
+
yield ifindex, p[:mtu], p[:speed], p[:admin_status], p[:oper_status]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
protected
|
19
|
+
def load_mtu
|
20
|
+
load_property(:mtu, SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.4'))
|
21
|
+
end
|
22
|
+
def load_speed
|
23
|
+
load_property(:speed, SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.5'))
|
24
|
+
end
|
25
|
+
def load_admin_status
|
26
|
+
load_property(:admin_status, SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.7'))
|
27
|
+
end
|
28
|
+
def load_oper_status
|
29
|
+
load_property(:oper_status, SNMP::ObjectId.new('1.3.6.1.2.1.2.2.1.8'))
|
30
|
+
end
|
31
|
+
def load_property(property, oid)
|
32
|
+
@manager.walk(oid) do |r|
|
33
|
+
r.each do |varbind|
|
34
|
+
append_property(varbind.name.index(oid), property,
|
35
|
+
varbind.value.to_i)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
def append_property(index, property, value)
|
40
|
+
@interfaces[index.to_s.to_i] ||= Hash.new
|
41
|
+
@interfaces[index.to_s.to_i][property] = value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/test/copian_test.rb
ADDED
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: copian
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Geoff Garside
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-06 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: snmp
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.0.2
|
24
|
+
version:
|
25
|
+
description: Suite of SNMP collectors for different types of network devices
|
26
|
+
email: geoff@geoffgarside.co.uk
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- LICENSE
|
33
|
+
- README
|
34
|
+
files:
|
35
|
+
- .gitignore
|
36
|
+
- LICENSE
|
37
|
+
- README
|
38
|
+
- Rakefile
|
39
|
+
- VERSION.yml
|
40
|
+
- lib/copian.rb
|
41
|
+
- lib/copian/collector/abstract_collector.rb
|
42
|
+
- lib/copian/collector/addresses_collector.rb
|
43
|
+
- lib/copian/collector/bandwidth_collector.rb
|
44
|
+
- lib/copian/collector/description_collector.rb
|
45
|
+
- lib/copian/collector/cisco.rb
|
46
|
+
- lib/copian/collector/cisco/addresses.rb
|
47
|
+
- lib/copian/collector/cisco/ports.rb
|
48
|
+
- lib/copian/collector/cisco/vlans.rb
|
49
|
+
- lib/copian/collector/dell.rb
|
50
|
+
- lib/copian/collector/dell/ports.rb
|
51
|
+
- lib/copian/collector/dell/vlans.rb
|
52
|
+
- lib/copian/collector/generic.rb
|
53
|
+
- lib/copian/collector/hp.rb
|
54
|
+
- lib/copian/collector/hp/ports.rb
|
55
|
+
- lib/copian/collector/hp/vlans.rb
|
56
|
+
- lib/copian/collector/port_stats_collector.rb
|
57
|
+
- lib/copian/collector/ports_collector.rb
|
58
|
+
- test/copian_test.rb
|
59
|
+
- test/test_helper.rb
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/geoffgarside/copian
|
62
|
+
licenses: []
|
63
|
+
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options:
|
66
|
+
- --charset=UTF-8
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
version:
|
75
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
version:
|
81
|
+
requirements: []
|
82
|
+
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 1.3.5
|
85
|
+
signing_key:
|
86
|
+
specification_version: 3
|
87
|
+
summary: Suite of SNMP collectors for different types of network devices
|
88
|
+
test_files:
|
89
|
+
- test/copian_test.rb
|
90
|
+
- test/test_helper.rb
|