zenoss_client 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +6 -12
- data/VERSION +1 -1
- data/lib/model/devices/device.rb +1 -0
- data/lib/model/devices/device_class.rb +12 -2
- data/lib/model/event_view.rb +7 -8
- data/lib/model/model.rb +1 -0
- data/lib/model/rrd/rrd_data_point.rb +56 -0
- data/lib/model/rrd_view.rb +46 -0
- data/lib/zenoss.rb +67 -3
- metadata +5 -3
data/README.rdoc
CHANGED
@@ -16,19 +16,13 @@ Gems:
|
|
16
16
|
* tzinfo: For Python DateTime to Ruby DateTime conversion
|
17
17
|
|
18
18
|
|
19
|
-
|
19
|
+
== UNSUPPORTED REST METHODS:
|
20
|
+
Some methods within Zope are unsupported due to type conversion issues.
|
21
|
+
I have created a work-around but you must add a custom Python script
|
22
|
+
to Zope in order to do this. Please see this blog post for information
|
23
|
+
on how add the custom script:
|
20
24
|
|
21
|
-
|
22
|
-
following patch. The methods Zenoss::Model::EventView#get_status_img_src and
|
23
|
-
EventView#get_status_css_class depend on the 'status' parameter being an
|
24
|
-
integer. When the call is unmarshalled on the Zenoss side it is always a
|
25
|
-
string unless you apply this patch:
|
26
|
-
|
27
|
-
http://gist.github.com/328414
|
28
|
-
|
29
|
-
This has been reported and is filed as a product defect:
|
30
|
-
|
31
|
-
http://dev.zenoss.com/trac/ticket/6282
|
25
|
+
http://distributed-frostbite.blogspot.com/2010/04/using-ruby-with-zenoss-part-1.html
|
32
26
|
|
33
27
|
|
34
28
|
== TO USE:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/lib/model/devices/device.rb
CHANGED
@@ -55,13 +55,23 @@ module Zenoss
|
|
55
55
|
|
56
56
|
# Name of the device in Zenoss. This method will return the first
|
57
57
|
# match if the device_name is not fully qualified.
|
58
|
+
#
|
59
|
+
# @param [String] device_name the hostname of the device
|
60
|
+
# @return [Device,nil] Device object of passed hostname or nil if the device doesn't exist
|
58
61
|
def find_device_path(device_name)
|
59
62
|
devpath = rest("findDevicePath?devicename=#{device_name}")
|
60
|
-
|
63
|
+
devpath.nil? ? nil : Device.new(devpath)
|
61
64
|
end
|
62
65
|
|
66
|
+
# @return [Array<Device>] an Array of Devices (or some Device subclass)
|
63
67
|
def get_sub_devices
|
64
|
-
plist_to_array( rest('getSubDevices') )
|
68
|
+
(plist_to_array( rest('getSubDevices') )).map do |dstr|
|
69
|
+
# I'm using this regex here so some day we can generate
|
70
|
+
# Devices and sub Device types with an eval like so:
|
71
|
+
# eval "#{$1}.new(#{$2})"
|
72
|
+
dev = dstr.sub(/^<([\w]+)\s+at\s+(.*)>$/,'\2')
|
73
|
+
Device.new(dev)
|
74
|
+
end
|
65
75
|
end
|
66
76
|
|
67
77
|
|
data/lib/model/event_view.rb
CHANGED
@@ -1,23 +1,22 @@
|
|
1
1
|
#############################################################################
|
2
|
-
# Copyright ©
|
2
|
+
# Copyright © 2010 Dan Wanek <dwanek@nd.gov>
|
3
3
|
#
|
4
4
|
#
|
5
|
-
# This file is part of
|
5
|
+
# This file is part of zenoss_client.
|
6
6
|
#
|
7
|
-
#
|
7
|
+
# zenoss_client is free software: you can redistribute it and/or
|
8
8
|
# modify it under the terms of the GNU General Public License as published
|
9
9
|
# by the Free Software Foundation, either version 3 of the License, or (at
|
10
10
|
# your option) any later version.
|
11
11
|
#
|
12
|
-
#
|
12
|
+
# zenoss_client is distributed in the hope that it will be useful,
|
13
13
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
14
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
15
15
|
# Public License for more details.
|
16
16
|
#
|
17
17
|
# You should have received a copy of the GNU General Public License along
|
18
|
-
# with
|
18
|
+
# with zenoss_client. If not, see <http://www.gnu.org/licenses/>.
|
19
19
|
#############################################################################
|
20
|
-
|
21
20
|
module Zenoss
|
22
21
|
module Model
|
23
22
|
module EventView
|
@@ -40,7 +39,7 @@ module Zenoss
|
|
40
39
|
# need to apply this patch to Zenoss:
|
41
40
|
# http://gist.github.com/328414
|
42
41
|
def get_status_img_src(status_number)
|
43
|
-
|
42
|
+
custom_rest("getStatusImgSrc?status=#{status_number}")
|
44
43
|
end
|
45
44
|
|
46
45
|
# Fetches the css class for this status number. This is usually the
|
@@ -48,7 +47,7 @@ module Zenoss
|
|
48
47
|
# need to apply this patch to Zenoss:
|
49
48
|
# http://gist.github.com/328414
|
50
49
|
def get_status_css_class(status_number)
|
51
|
-
|
50
|
+
custom_rest("getStatusCssClass?status=#{status_number}")
|
52
51
|
end
|
53
52
|
|
54
53
|
end # EventView
|
data/lib/model/model.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
#############################################################################
|
2
|
+
# Copyright © 2010 Dan Wanek <dwanek@nd.gov>
|
3
|
+
#
|
4
|
+
#
|
5
|
+
# This file is part of zenoss_client.
|
6
|
+
#
|
7
|
+
# zenoss_client is free software: you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU General Public License as published
|
9
|
+
# by the Free Software Foundation, either version 3 of the License, or (at
|
10
|
+
# your option) any later version.
|
11
|
+
#
|
12
|
+
# zenoss_client is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
15
|
+
# Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU General Public License along
|
18
|
+
# with zenoss_client. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#############################################################################
|
20
|
+
module Zenoss
|
21
|
+
module Model
|
22
|
+
class RRDDataPoint
|
23
|
+
include Zenoss
|
24
|
+
include Zenoss::Model
|
25
|
+
|
26
|
+
def initialize(datapoint_path)
|
27
|
+
@path = datapoint_path
|
28
|
+
|
29
|
+
# Initialize common things from Model
|
30
|
+
model_init
|
31
|
+
end
|
32
|
+
|
33
|
+
# ------------------------- Utility Methods ------------------------- #
|
34
|
+
# These are methods that do not exist as part of the official Zenoss
|
35
|
+
# API, but from an object model they seem to make sense to me.
|
36
|
+
# ------------------------------------------------------------------- #
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
# --------------------------- REST Methods -------------------------- #
|
41
|
+
|
42
|
+
# @return [String] Name of the data source
|
43
|
+
def name
|
44
|
+
@cache_vars[:name] ||= rest('name')
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def rest(method, path = "#{@path}")
|
51
|
+
super("#{path}/#{method}")
|
52
|
+
end
|
53
|
+
|
54
|
+
end # DeviceClass
|
55
|
+
end # Model
|
56
|
+
end # Zenoss
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#############################################################################
|
2
|
+
# Copyright © 2010 Dan Wanek <dwanek@nd.gov>
|
3
|
+
#
|
4
|
+
#
|
5
|
+
# This file is part of zenoss_client.
|
6
|
+
#
|
7
|
+
# zenoss_client is free software: you can redistribute it and/or
|
8
|
+
# modify it under the terms of the GNU General Public License as published
|
9
|
+
# by the Free Software Foundation, either version 3 of the License, or (at
|
10
|
+
# your option) any later version.
|
11
|
+
#
|
12
|
+
# zenoss_client is distributed in the hope that it will be useful,
|
13
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
15
|
+
# Public License for more details.
|
16
|
+
#
|
17
|
+
# You should have received a copy of the GNU General Public License along
|
18
|
+
# with zenoss_client. If not, see <http://www.gnu.org/licenses/>.
|
19
|
+
#############################################################################
|
20
|
+
module Zenoss
|
21
|
+
module Model
|
22
|
+
module RRDView
|
23
|
+
include Zenoss::Model
|
24
|
+
|
25
|
+
# @return [Array] of datapoints
|
26
|
+
def get_rrd_data_points
|
27
|
+
(plist_to_array( custom_rest('getRRDDataPoints') )).map do |dstr|
|
28
|
+
dp = dstr.sub(/^<([\w]+)\s+at\s+(.*)>$/,'\2')
|
29
|
+
RRDDataPoint.new(dp)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Get key/value pairs of RRD Values for the passed data source names.
|
34
|
+
#
|
35
|
+
# @param [Array <String>] dsnames data source names from RRDDataPoint#name
|
36
|
+
# @return [Hash] key/value pairs of data source name and data source values
|
37
|
+
def get_rrd_values(dsnames)
|
38
|
+
pdict_to_hash(custom_rest("getRRDValues?dsnames=[#{dsnames.join(',')}]"))
|
39
|
+
end
|
40
|
+
|
41
|
+
end # RRDView
|
42
|
+
end # Model
|
43
|
+
end # Zenoss
|
44
|
+
|
45
|
+
# Load the RRD related files
|
46
|
+
require 'model/rrd/rrd_data_point'
|
data/lib/zenoss.rb
CHANGED
@@ -25,6 +25,9 @@ require 'uri'
|
|
25
25
|
module Zenoss
|
26
26
|
|
27
27
|
# Set the Base URI of the Zenoss server
|
28
|
+
#
|
29
|
+
# @param [URI, String] uri is the URL we use to connect to the Zenoss server
|
30
|
+
# @return [URI] the URI that was parsed and used as our base connection
|
28
31
|
def Zenoss.uri(uri)
|
29
32
|
if(uri.kind_of?(URI))
|
30
33
|
uri.path << '/' unless(uri.path.index /\/$/)
|
@@ -35,23 +38,26 @@ module Zenoss
|
|
35
38
|
end
|
36
39
|
end
|
37
40
|
|
41
|
+
# @param [String] user
|
42
|
+
# @param [String] pass
|
43
|
+
# @return [Boolean]
|
38
44
|
def Zenoss.set_auth(user, pass)
|
39
45
|
const_set(:USER, user)
|
40
46
|
const_set(:PASS, pass)
|
41
47
|
true
|
42
48
|
end
|
43
49
|
|
44
|
-
#
|
50
|
+
# @return [Model::DeviceClass] the base DeviceClass /zport/dmd/Devices
|
45
51
|
def Zenoss.devices
|
46
52
|
Model::DeviceClass.new('/zport/dmd/Devices')
|
47
53
|
end
|
48
54
|
|
49
|
-
#
|
55
|
+
# @return [Model::ServiceOrganizer] the base ServiceOrganizer /zport/dmd/Services
|
50
56
|
def Zenoss.services
|
51
57
|
Model::ServiceOrganizer.new('/zport/dmd/Services')
|
52
58
|
end
|
53
59
|
|
54
|
-
#
|
60
|
+
# @return [Model::System] the base System /zport/dmd/Systems
|
55
61
|
def Zenoss.systems
|
56
62
|
Model::System.new('/zport/dmd/Systems')
|
57
63
|
end
|
@@ -61,25 +67,75 @@ module Zenoss
|
|
61
67
|
private
|
62
68
|
|
63
69
|
# Prepend the appropriate path and call the REST method on the URL set with Zenoss#uri
|
70
|
+
#
|
71
|
+
# @param [String] req_path the request path of the REST method
|
72
|
+
# @return [String] the response body of the REST call
|
64
73
|
def rest(req_path)
|
65
74
|
Net::HTTP.start(Zenoss::BASE_URI.host,Zenoss::BASE_URI.port) {|http|
|
66
75
|
req = Net::HTTP::Get.new("#{BASE_URI.path}#{req_path}")
|
67
76
|
req.basic_auth USER, PASS if USER
|
68
77
|
response = http.request(req)
|
78
|
+
response.body.chomp! unless response.body.nil?
|
69
79
|
return(response.body)
|
70
80
|
}
|
71
81
|
end
|
72
82
|
|
83
|
+
# Call a custom Zope method to work around some issues of unsupported or bad behaving
|
84
|
+
# REST methods.
|
85
|
+
# @see http://gist.github.com/343627 for more info.
|
86
|
+
#
|
87
|
+
# @param [String] req_path the request path of the REST method ( as if it wasn't misbehaving )
|
88
|
+
# @example req_path
|
89
|
+
# getRRDValues?dsnames=['ProcessorTotalUserTime_ProcessorTotalUserTime','MemoryPagesOutputSec_MemoryPagesOutputSec']
|
90
|
+
# @return [String] the response body of the REST call
|
91
|
+
def custom_rest(req_path)
|
92
|
+
meth,args = req_path.split('?')
|
93
|
+
meth = "callZenossMethod?methodName=#{meth}"
|
94
|
+
unless args.nil?
|
95
|
+
meth << '&args=['
|
96
|
+
# Remove the named parameters because we can't dynamically call named parameters in Python.
|
97
|
+
# This method uses positional parameters via the passed Array (Python List).
|
98
|
+
args.split('&').inject(nil) do |delim,arg|
|
99
|
+
meth << "#{delim}#{arg.split('=').last}"
|
100
|
+
delim = ',' if delim.nil?
|
101
|
+
end
|
102
|
+
meth << ']'
|
103
|
+
end
|
104
|
+
rest(meth)
|
105
|
+
end
|
106
|
+
|
73
107
|
# Some of the REST methods return Strings that are formated like a Python list.
|
74
108
|
# This method turns that String into a Ruby Array.
|
75
109
|
# If the list parameter is nil the return value is also nil.
|
110
|
+
#
|
111
|
+
# @param [String] list a Python formatted list
|
112
|
+
# @return [Array,nil] a bonafide Ruby Array
|
76
113
|
def plist_to_array(list)
|
77
114
|
return nil if list.nil?
|
115
|
+
list = sanitize_str(list)
|
78
116
|
(list.gsub /[\[\]]/,'').split /,\s+/
|
79
117
|
end
|
80
118
|
|
119
|
+
# Converts a String formatted like a Python Dictionary to a Ruby Hash.
|
120
|
+
#
|
121
|
+
# @param [String] dict a Python dictionary
|
122
|
+
# @return [Hash,nil] a Ruby Hash
|
123
|
+
def pdict_to_hash(dict)
|
124
|
+
return nil if dict.nil?
|
125
|
+
puts "Dict: #{dict}"
|
126
|
+
dict = sanitize_str(dict)
|
127
|
+
puts "New Dict: #{dict}"
|
128
|
+
dict = dict.sub(/^\{(.*)\}$/,'\1').split(/[,:]/).map do |str|
|
129
|
+
str.strip
|
130
|
+
end
|
131
|
+
Hash[*dict]
|
132
|
+
end
|
133
|
+
|
81
134
|
# Converts a String in Python's DateTime format to Ruby's DateTime format
|
82
135
|
# If the pdt parameter is nil the return value is also nil.
|
136
|
+
#
|
137
|
+
# @param [String] pdt a String formatted in Python's DateTime format
|
138
|
+
# @return [DateTime] a bonafide Ruby DateTime object
|
83
139
|
def pdatetime_to_datetime(pdt)
|
84
140
|
return nil if pdt.nil?
|
85
141
|
pdt = pdt.split(/\s+/)
|
@@ -87,6 +143,14 @@ module Zenoss
|
|
87
143
|
DateTime.strptime("#{pdt[0]} #{pdt[1]} #{tz.current_period.abbreviation.to_s}", '%Y/%m/%d %H:%M:%S.%N %Z')
|
88
144
|
end
|
89
145
|
|
146
|
+
# Do some clean-up on the string returned from REST calls. Removes some
|
147
|
+
# quote characters embedded in the string and other misc.
|
148
|
+
#
|
149
|
+
# @param [String] str string returned from REST call
|
150
|
+
# @return [String] sanitized string
|
151
|
+
def sanitize_str(str)
|
152
|
+
str.gsub(/['"]/,'')
|
153
|
+
end
|
90
154
|
|
91
155
|
end # Zenoss
|
92
156
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 4
|
9
|
+
version: 0.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Dan Wanek
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-04-07 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -54,6 +54,8 @@ files:
|
|
54
54
|
- lib/model/manufacturers/manufacturers.rb
|
55
55
|
- lib/model/model.rb
|
56
56
|
- lib/model/processes/os_process_organizer.rb
|
57
|
+
- lib/model/rrd/rrd_data_point.rb
|
58
|
+
- lib/model/rrd_view.rb
|
57
59
|
- lib/model/services.rb
|
58
60
|
- lib/model/services/ip_service.rb
|
59
61
|
- lib/model/services/service.rb
|