author | Mahlon E. Smith <mahlon@martini.nu> |
Wed, 04 Apr 2018 12:44:20 -0700 | |
changeset 9 | 10bf910a379c |
parent 8 | e0b7c95a154f |
child 14 | d5cb8bd33170 |
permissions | -rw-r--r-- |
0 | 1 |
# -*- ruby -*- |
2 |
# vim: set noet nosta sw=4 ts=4 : |
|
3 |
#encoding: utf-8 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
4 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
5 |
require 'arborist/monitor' unless defined?( Arborist::Monitor ) |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
6 |
require 'net-snmp2' |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
7 |
|
0 | 8 |
# SNMP checks for Arborist. Requires an SNMP agent to be installed |
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
9 |
# on target machine, and the various "pieces" enabled for your platform. |
0 | 10 |
# |
11 |
# For example, for disk monitoring with Net-SNMP, you'll want to set |
|
12 |
# 'includeAllDisks' in the snmpd.conf. bsnmpd on FreeBSD benefits from |
|
13 |
# the 'bsnmp-ucd' package. Etc. |
|
14 |
# |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
15 |
module Arborist::Monitor::SNMP |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
16 |
using Arborist::TimeRefinements |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
17 |
extend Configurability, Loggability |
0 | 18 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
19 |
# Loggability API |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
20 |
log_to :arborist_snmp |
0 | 21 |
|
7
4548e58c8c66
Use the new #node_properties method, convery from .rvmrc
Mahlon E. Smith <mahlon@martini.nu>
parents:
4
diff
changeset
|
22 |
# Always request the node addresses and any config. |
4548e58c8c66
Use the new #node_properties method, convery from .rvmrc
Mahlon E. Smith <mahlon@martini.nu>
parents:
4
diff
changeset
|
23 |
USED_PROPERTIES = [ :addresses, :config ].freeze |
4548e58c8c66
Use the new #node_properties method, convery from .rvmrc
Mahlon E. Smith <mahlon@martini.nu>
parents:
4
diff
changeset
|
24 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
25 |
# The OID that returns the system environment. |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
26 |
IDENTIFICATION_OID = '1.3.6.1.2.1.1.1.0' |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
27 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
28 |
# Global defaults for instances of this monitor |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
29 |
# |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
30 |
configurability( 'arborist.snmp' ) do |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
31 |
setting :timeout, default: 2 |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
32 |
setting :retries, default: 1 |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
33 |
setting :community, default: 'public' |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
34 |
setting :version, default: '2c' |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
35 |
setting :port, default: 161 |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
36 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
37 |
# How many hosts to check simultaneously |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
38 |
setting :batchsize, default: 25 |
7
4548e58c8c66
Use the new #node_properties method, convery from .rvmrc
Mahlon E. Smith <mahlon@martini.nu>
parents:
4
diff
changeset
|
39 |
end |
4548e58c8c66
Use the new #node_properties method, convery from .rvmrc
Mahlon E. Smith <mahlon@martini.nu>
parents:
4
diff
changeset
|
40 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
41 |
# Indicate to FFI that we're using threads. |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
42 |
Net::SNMP.thread_safe = true |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
43 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
44 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
45 |
# The system type, as advertised. |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
46 |
attr_reader :system |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
47 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
48 |
# The mapping of addresses back to node identifiers. |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
49 |
attr_reader :identifiers |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
50 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
51 |
# The results hash that is sent back to the manager. |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
52 |
attr_reader :results |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
53 |
|
0 | 54 |
|
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
55 |
### Connect to the SNMP daemon and yield. |
0 | 56 |
### |
57 |
def run( nodes ) |
|
58 |
||
1
8446f55f7e58
Allow local node "config" to override SNMP instanced globals. Add mount point includes and excludes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
0
diff
changeset
|
59 |
# Create mapping of addresses back to node identifiers, |
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
60 |
# and retain any custom (overrides) config per node. |
0 | 61 |
# |
1
8446f55f7e58
Allow local node "config" to override SNMP instanced globals. Add mount point includes and excludes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
0
diff
changeset
|
62 |
@identifiers = {} |
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
63 |
@results = {} |
1
8446f55f7e58
Allow local node "config" to override SNMP instanced globals. Add mount point includes and excludes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
0
diff
changeset
|
64 |
nodes.each_pair do |(identifier, props)| |
0 | 65 |
next unless props.key?( 'addresses' ) |
66 |
address = props[ 'addresses' ].first |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
67 |
self.identifiers[ address ] = [ identifier, props['config'] ] |
0 | 68 |
end |
69 |
||
70 |
# Perform the work! |
|
71 |
# |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
72 |
mainstart = Time.now |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
73 |
threads = ThreadGroup.new |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
74 |
batchcount = nodes.size / Arborist::Monitor::SNMP.batchsize |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
75 |
self.log.debug "Starting SNMP run for %d nodes" % [ nodes.size ] |
1
8446f55f7e58
Allow local node "config" to override SNMP instanced globals. Add mount point includes and excludes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
0
diff
changeset
|
76 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
77 |
self.identifiers.keys.each_slice( Arborist::Monitor::SNMP.batchsize ).each_with_index do |slice, batch| |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
78 |
slicestart = Time.now |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
79 |
self.log.debug " %d hosts (batch %d of %d)" % [ |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
80 |
slice.size, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
81 |
batch + 1, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
82 |
batchcount + 1 |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
83 |
] |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
84 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
85 |
slice.each do |host| |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
86 |
thr = Thread.new do |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
87 |
config = self.identifiers[ host ].last || {} |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
88 |
opts = { |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
89 |
peername: host, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
90 |
port: config[ 'port' ] || Arborist::Monitor::SNMP.port, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
91 |
version: config[ 'version' ] || Arborist::Monitor::SNMP.version, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
92 |
community: config[ 'community' ] || Arborist::Monitor::SNMP.community, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
93 |
timeout: config[ 'timeout' ] || Arborist::Monitor::SNMP.timeout, |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
94 |
retries: config[ 'retries' ] || Arborist::Monitor::SNMP.retries |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
95 |
} |
0 | 96 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
97 |
snmp = Net::SNMP::Session.open( opts ) |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
98 |
begin |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
99 |
@system = snmp.get( IDENTIFICATION_OID ).varbinds.first.value |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
100 |
yield( host, snmp ) |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
101 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
102 |
rescue Net::SNMP::TimeoutError, Net::SNMP::Error => err |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
103 |
self.log.error "%s: %s %s" % [ host, err.message, snmp.error_message ] |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
104 |
self.results[ host ] = { |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
105 |
error: "%s" % [ snmp.error_message ] |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
106 |
} |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
107 |
rescue => err |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
108 |
self.results[ host ] = { |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
109 |
error: "Uncaught exception. (%s: %s)" % [ err.class.name, err.message ] |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
110 |
} |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
111 |
ensure |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
112 |
snmp.close |
0 | 113 |
end |
114 |
end |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
115 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
116 |
threads.add( thr ) |
0 | 117 |
end |
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
118 |
|
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
119 |
# Wait for thread completions |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
120 |
threads.list.map( &:join ) |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
121 |
self.log.debug " finished after %0.1f seconds." % [ Time.now - slicestart ] |
0 | 122 |
end |
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
123 |
self.log.debug "Completed SNMP run for %d nodes after %0.1f seconds." % [ nodes.size, Time.now - mainstart ] |
0 | 124 |
|
125 |
# Map everything back to identifier -> attribute(s), and send to the manager. |
|
126 |
# |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
127 |
reply = self.results.each_with_object({}) do |(address, results), hash| |
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
128 |
identifier = self.identifiers[ address ] or next |
3
d46ca2b52efe
Put the nil check back when building the results hash.
Mahlon E. Smith <mahlon@martini.nu>
parents:
1
diff
changeset
|
129 |
hash[ identifier.first ] = results |
0 | 130 |
end |
131 |
return reply |
|
132 |
||
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
133 |
ensure |
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
134 |
@identifiers = {} |
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
135 |
@results = {} |
0 | 136 |
end |
137 |
||
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
138 |
end # Arborist::Monitor::SNMP |
0 | 139 |
|
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
140 |
require 'arborist/monitor/snmp/cpu' |
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
141 |
require 'arborist/monitor/snmp/disk' |
8
e0b7c95a154f
Refactor for real world usage and latest Arborist behaviors.
Mahlon E. Smith <mahlon@martini.nu>
parents:
7
diff
changeset
|
142 |
require 'arborist/monitor/snmp/process' |
4
e6eb11b1e00d
Refactor. Move all SNMP "sections" to their own classes.
Mahlon E. Smith <mahlon@martini.nu>
parents:
3
diff
changeset
|
143 |
require 'arborist/monitor/snmp/memory' |
0 | 144 |