lm_rest 1.0.1 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa5d869b3f6a8928f4c7328c79e695ed96b3559abff1cac0daf4da09d0ad6526
4
- data.tar.gz: 183f6cca33109ce03c90d2d43cedba9b52d54b4c93d7143e864abc44c2290760
3
+ metadata.gz: 3c01ece27d96964546705d1d5a610b33e5a5c173d63a44f9a20252846192cb23
4
+ data.tar.gz: 8ab3dc099b5088d46d0d752de09c73a273a662d17b05b2a753363f6f9498ed6b
5
5
  SHA512:
6
- metadata.gz: 220d6193ce97099a9e6af01b5eb5c2ef43cf91d580d626737ca9bf7f0954ebfe7171bb9e04797fbd23317ce75a673a221a48a825dbadc246782a7b15b154c218
7
- data.tar.gz: 574b492b98762c1be1f41acac90039f985852cf585dc9976d7176996e86c276515d0fe75bb0b60be192b191ad08de46956542f566088d36ccdca19c627c017a8
6
+ metadata.gz: c6180a42bdb7fdd738651da70f41c5a4158dd5ecd177e37bc45ce67434f4ec711183743526dea241d0a99ab73c247bfd13d879cf8119c5b89af88250c9f81f35
7
+ data.tar.gz: b9e563ccf97f75174a23dd88e4d58222fa40b58a1078a22ba06d2f199ae8252cd8ed4249b007ee1efbbaa3b73c3c30fe43edde48bd395d962d41e78c6751e005
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # LMRest
2
2
 
3
- A Ruby gem for the LogicMonitor REST API.
3
+ An Unofficial Ruby gem for the LogicMonitor REST API.
4
4
 
5
5
  ## Installation
6
6
 
@@ -20,8 +20,8 @@ Or install it yourself as:
20
20
 
21
21
  ## Supported API Resources
22
22
 
23
- Every API resource defined in the `api.json` file and its associated defined
24
- methods are supported, and you can easily add your own if you can't wait for me
23
+ Every API resource is defined in the `api.json` file and its associated defined
24
+ methods are supported. You can easily add your own if you can't wait for me
25
25
  to update this.
26
26
 
27
27
  Each method (`get_*, add_*, update_*, delete_*`) works the same
@@ -45,21 +45,10 @@ use the gem.
45
45
  ```ruby
46
46
  require 'lm_rest'
47
47
 
48
+ # Create an instance of the API Client, passing in an API token for
49
+ # authentication. Pretend this portal is at `company.logicmonitor.com`:
48
50
 
49
- # Authenticate with an API token (preferred):
50
- credential = {company: 'company',
51
- access_key:'api_access_key',
52
- access_id:'api_access_id'}
53
-
54
-
55
- # Authenticate with Basic Auth (not preferred):
56
- credential = {company: 'company',
57
- user: 'user',
58
- password: 'password'}
59
-
60
- # Create an instance of the API Client
61
- lm = LMRest::APIClient.new(credential)
62
-
51
+ lm = LMRest::APIClient.new('company', 'access_id', 'access_key')
63
52
 
64
53
  # returns array of Resource objects
65
54
  lm.get_datasources
@@ -100,7 +89,6 @@ lm.delete_device(device)
100
89
  lm.add_device(device)
101
90
 
102
91
 
103
-
104
92
  # Get your Santaba version info
105
93
  lm.get_version
106
94
 
@@ -119,12 +107,9 @@ lm.run_report(id)
119
107
 
120
108
  ```
121
109
 
110
+ ## TODO
122
111
 
123
- ## Development
124
-
125
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
126
-
127
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
112
+ * Handle nested stuff, and resource-specific operations
128
113
 
129
114
 
130
115
  ## Contributing
data/api.json CHANGED
@@ -23,7 +23,7 @@
23
23
  ]
24
24
  },
25
25
  "Collector": {
26
- "url": "/setting/collectors",
26
+ "url": "/setting/collector/collectors",
27
27
  "method_names": {
28
28
  "singular": "collector",
29
29
  "plural": "collectors"
@@ -34,6 +34,28 @@
34
34
  "delete"
35
35
  ]
36
36
  },
37
+ "CollectorGroups": {
38
+ "url": "/setting/collector/groups",
39
+ "method_names": {
40
+ "singular": "collector_group",
41
+ "plural": "collector_groups"
42
+ },
43
+ "actions": [
44
+ "get",
45
+ "add",
46
+ "update",
47
+ "delete"
48
+ ]
49
+ },
50
+ "CollectorVersions": {
51
+ "url": "/setting/collector/collectors/versions",
52
+ "method_names": {
53
+ "singular": "collector_versions"
54
+ },
55
+ "actions": [
56
+ "get"
57
+ ]
58
+ },
37
59
  "Datasource": {
38
60
  "url": "/setting/datasources",
39
61
  "method_names": {
@@ -87,7 +109,7 @@
87
109
  "delete"
88
110
  ]
89
111
  },
90
- "Function": {
112
+ "AppliesToFunction": {
91
113
  "url": "/setting/functions",
92
114
  "method_names": {
93
115
  "singular": "function",
@@ -126,11 +148,11 @@
126
148
  "delete"
127
149
  ]
128
150
  },
129
- "Service": {
130
- "url": "/service/services",
151
+ "Website": {
152
+ "url": "/website/websites",
131
153
  "method_names": {
132
- "singular": "service",
133
- "plural": "services"
154
+ "singular": "website",
155
+ "plural": "websites"
134
156
  },
135
157
  "actions": [
136
158
  "get",
@@ -143,7 +165,7 @@
143
165
  ]
144
166
  },
145
167
  "SiteMonitorCheckpoint": {
146
- "url": "/service/smcheckpoints",
168
+ "url": "/website/smcheckpoints",
147
169
  "method_names": {
148
170
  "singular": "smcheckpoint",
149
171
  "plural": "smcheckpoints"
@@ -153,7 +175,7 @@
153
175
  ]
154
176
  },
155
177
  "ServiceGroup": {
156
- "url": "/service/groups",
178
+ "url": "/website/groups",
157
179
  "method_names": {
158
180
  "singular": "service_group",
159
181
  "plural": "service_groups"
@@ -195,7 +217,7 @@
195
217
  ]
196
218
  },
197
219
  "APIToken": {
198
- "url": "/setting/apiTokens",
220
+ "url": "/setting/admin/apitokens",
199
221
  "method_names": {
200
222
  "singular": "api_token",
201
223
  "plural": "api_tokens"
@@ -265,6 +287,19 @@
265
287
  ],
266
288
  "children": []
267
289
  },
290
+ "DashboardGroups": {
291
+ "url": "/dashboard/groups",
292
+ "method_names": {
293
+ "singular": "dashboard_group",
294
+ "plural": "dashboard_groups"
295
+ },
296
+ "actions": [
297
+ "get",
298
+ "add",
299
+ "update",
300
+ "delete"
301
+ ]
302
+ },
268
303
  "Widget": {
269
304
  "url": "/dashboard/widgets",
270
305
  "method_names": {
@@ -279,6 +314,17 @@
279
314
  ],
280
315
  "children": []
281
316
  },
317
+ "Debug": {
318
+ "url": "/debug",
319
+ "method_names": {
320
+ "singular": "debug"
321
+ },
322
+ "actions": [
323
+ "get",
324
+ "add"
325
+ ],
326
+ "children": []
327
+ },
282
328
  "Report": {
283
329
  "url": "/report/reports",
284
330
  "method_names": {
@@ -374,6 +420,15 @@
374
420
  "get"
375
421
  ]
376
422
  },
423
+ "APIPerfStats": {
424
+ "url": "/apiStats/externalApis",
425
+ "method_names": {
426
+ "singular": "api_perf_stats"
427
+ },
428
+ "actions": [
429
+ "get"
430
+ ]
431
+ },
377
432
  "Version": {
378
433
  "url": "/version",
379
434
  "method_names": {
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ #
4
+ # Based on a script written originally by Matt Dunham
5
+ #
6
+ require 'lm_rest'
7
+
8
+ def usage
9
+ puts "USAGE:\t" + $PROGRAM_NAME + ' account id key applies_to category'
10
+ puts ""
11
+ puts "\taccount - just the beginning of your portal name, like 'hooli'"
12
+ puts "\tid - API key access id"
13
+ puts "\tkey - API key access key"
14
+ puts "\tapplies_to - AppliesTo (in quotes on one line) matching devices you want to scrub"
15
+ puts "\tcategory - The system category value you wish to remove."
16
+ end
17
+
18
+ if ARGV.length ==5
19
+ @account = ARGV[0]
20
+ @id = ARGV[1]
21
+ @key = ARGV[2]
22
+ @at = ARGV[3]
23
+ @category = ARGV[4]
24
+ @lm = LMRest::APIClient.new(@account, @id, @key)
25
+ else
26
+ usage
27
+ fail 'Bad arguments.'
28
+ end
29
+
30
+ request = {
31
+ currentAppliesTo: @at,
32
+ needInheritProps: true,
33
+ originalAppliesTo: @at,
34
+ type: "testAppliesTo"
35
+ }
36
+
37
+ devices = @lm.request(:post, "/functions", request)['originalMatches'].map do |device|
38
+ [device['id'], device['name']]
39
+ end
40
+
41
+ devices.each do |id, name|
42
+ puts "Fetching device id #{id}, #{name}"
43
+ current = @lm.request(:get, "/device/devices/#{id}/properties/system.categories", nil)
44
+ if (@lm.remaining.to_f / @lm.limit.to_f) * 100 <= 10
45
+ puts "sleeping for #{@lm.window} to avoid rate limit violation"
46
+ sleep @lm.window
47
+ end
48
+ if current['value'].split(',').include? @category
49
+ new_string = current['value'].split(',') - [@category]
50
+ new = current
51
+ new['value'] = new_string.join(",")
52
+ @lm.request(:put, "/device/devices/#{id}/properties/system.categories", new)
53
+ puts " Successfully scrubbed!"
54
+ else
55
+ puts " No scrubbing needed."
56
+ end
57
+ end
@@ -17,6 +17,7 @@ module LMRest
17
17
  BASE_URL_SUFFIX = '.logicmonitor.com/santaba/rest'
18
18
 
19
19
  attr_reader :company, :api_url, :access_id
20
+ attr_reader :limit, :remaining, :window
20
21
 
21
22
  def initialize(company = nil, access_id = nil, access_key = nil)
22
23
  APIClient.setup
@@ -38,14 +39,6 @@ module LMRest
38
39
  uri.split("?")[0].split("/").join("/")
39
40
  end
40
41
 
41
- def snakerize(string)
42
- string.gsub(/::/, '/').
43
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
44
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
45
- tr("-", "_").
46
- downcase
47
- end
48
-
49
42
  def sign(method, uri, data = nil)
50
43
 
51
44
  resource_uri = uri_to_resource_uri(uri)
@@ -86,15 +79,20 @@ module LMRest
86
79
 
87
80
  json_params = params.to_json
88
81
 
89
- case method
90
- when :get
91
- response = RestClient.get(url, headers)
92
- when :post
93
- response = RestClient.post(url, json_params, headers)
94
- when :put
95
- response = RestClient.put(url, json_params, headers)
96
- when :delete
97
- response = RestClient.delete(url, headers: headers)
82
+ begin
83
+ case method
84
+ when :get
85
+ response = RestClient.get(url, headers)
86
+ when :post
87
+ response = RestClient.post(url, json_params, headers)
88
+ when :put
89
+ response = RestClient.put(url, json_params, headers)
90
+ when :delete
91
+ response = RestClient.delete(url, headers: headers)
92
+ end
93
+ rescue => e
94
+ puts e.http_body
95
+ raise
98
96
  end
99
97
 
100
98
  if response.code != 200
@@ -102,6 +100,9 @@ module LMRest
102
100
  raise
103
101
  end
104
102
 
103
+ @limit = response.headers['x_rate_limit_limit']
104
+ @remaining = response.headers['x_rate_limit_remaining']
105
+ @window = response.headers['x_rate_limit_window']
105
106
 
106
107
  JSON.parse(response.body)
107
108
  end
@@ -180,76 +181,75 @@ module LMRest
180
181
  end
181
182
  end
182
183
 
183
- def self.process_paths
184
+ def self.define_action_methods(resource_type, attributes)
185
+ singular = attributes['method_names']['singular']
186
+ plural = attributes['method_names']['plural']
184
187
  resource_uri = attributes['url']
185
- @@api_json[paths].keys.each do |path|
186
188
 
187
- path.keys.each do |action|
188
- case action
189
- when 'get'
189
+ attributes['actions'].each do |action|
190
+ case action
191
+ when 'get'
190
192
 
191
- uri = lambda { |params| "#{resource_uri}#{RequestParams.parameterize(params)}"}
192
- method_name = snakerize(@@api_json['paths'][path][action][operationId])
193
+ uri = lambda { |params| "#{resource_uri}#{RequestParams.parameterize(params)}"}
193
194
 
194
- unless plural.nil?
195
- # Define a method to fetch multiple resources with optional params
196
- define_method("get_#{plural}") do |params = {}|
197
- Resource.parse paginate(uri, params)
198
- end
195
+ unless plural.nil?
196
+ # Define a method to fetch multiple resources with optional params
197
+ define_method("get_#{plural}") do |params = {}|
198
+ Resource.parse paginate(uri, params)
199
199
  end
200
+ end
200
201
 
201
- # Define a method to get one resource by it's id number, with optional
202
- # params, thought now that I think about it I'm not sure why you'd pass
203
- # params when grabbing just one resource.
204
-
205
- # Some resources are Singletons
206
- unless singular.nil?
207
- define_method("get_#{singular}") do |*args|
208
- case args.size
209
- when 0
210
- Resource.parse request(:get, "#{resource_uri}", nil)
211
- when 1
212
- Resource.parse request(:get, "#{resource_uri}/#{args[0]}", nil)
213
- when 2
214
- Resource.parse request(:get, "#{resource_uri}/#{args[0]}#{RequestParams.parameterize(args[1])}", nil)
215
- else
216
- raise ArgumentError.new("wrong number for arguments (#{args.count} for 1..2)")
217
- end
202
+ # Define a method to get one resource by it's id number, with optional
203
+ # params, thought now that I think about it I'm not sure why you'd pass
204
+ # params when grabbing just one resource.
205
+
206
+ # Some resources are Singletons
207
+ unless singular.nil?
208
+ define_method("get_#{singular}") do |*args|
209
+ case args.size
210
+ when 0
211
+ Resource.parse request(:get, "#{resource_uri}", nil)
212
+ when 1
213
+ Resource.parse request(:get, "#{resource_uri}/#{args[0]}", nil)
214
+ when 2
215
+ Resource.parse request(:get, "#{resource_uri}/#{args[0]}#{RequestParams.parameterize(args[1])}", nil)
216
+ else
217
+ raise ArgumentError.new("wrong number for arguments (#{args.count} for 1..2)")
218
218
  end
219
219
  end
220
+ end
220
221
 
221
- when 'add'
222
+ when 'add'
222
223
 
223
- # Define a method to add a new resource to the account
224
- define_method("add_#{singular}") do |properties|
225
- if properties.class == LMRest::Resource
226
- Resource.parse request(:post, "#{resource_uri}", properties.to_h)
227
- else
228
- Resource.parse request(:post, "#{resource_uri}", properties)
229
- end
224
+ # Define a method to add a new resource to the account
225
+ define_method("add_#{singular}") do |properties|
226
+ if properties.class == LMRest::Resource
227
+ Resource.parse request(:post, "#{resource_uri}", properties.to_h)
228
+ else
229
+ Resource.parse request(:post, "#{resource_uri}", properties)
230
230
  end
231
+ end
231
232
 
232
- when 'update'
233
+ when 'update'
233
234
 
234
- # Define a method to update a resource
235
- define_method("update_#{singular}") do |id, properties = {}|
236
- if id.class == LMRest::Resource
237
- Resource.parse request(:put, "#{resource_uri}/#{id.id}", id.to_h)
238
- else
239
- Resource.parse request(:put, "#{resource_uri}/#{id}", properties)
240
- end
235
+ # Define a method to update a resource
236
+ define_method("update_#{singular}") do |id, properties = {}|
237
+ if id.class == LMRest::Resource
238
+ Resource.parse request(:put, "#{resource_uri}/#{id.id}", id.to_h)
239
+ else
240
+ Resource.parse request(:put, "#{resource_uri}/#{id}", properties)
241
241
  end
242
+ end
242
243
 
243
- when 'delete'
244
+ when 'delete'
244
245
 
245
- # Define a method to delete the resource
246
- define_method("delete_#{singular}") do |id|
247
- if id.class == LMRest::Resource
248
- id = id.id
249
- Resource.parse request(:delete, "#{resource_uri}/#{id}", nil)
250
- else
251
- Resource.parse request(:delete, "#{resource_uri}/#{id}", nil)
252
- end
246
+ # Define a method to delete the resource
247
+ define_method("delete_#{singular}") do |id|
248
+ if id.class == LMRest::Resource
249
+ id = id.id
250
+ Resource.parse request(:delete, "#{resource_uri}/#{id}", nil)
251
+ else
252
+ Resource.parse request(:delete, "#{resource_uri}/#{id}", nil)
253
253
  end
254
254
  end
255
255
  end
@@ -1,3 +1,3 @@
1
1
  module LMRest
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.5'
3
3
  end
data/lm_rest.gemspec CHANGED
@@ -30,5 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'rake'
31
31
  spec.add_development_dependency 'minitest'
32
32
  spec.add_dependency 'rest-client'
33
- spec.add_dependency 'json', '~> 2.1.0'
33
+ spec.add_dependency 'json', '~> 2.5.1'
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lm_rest
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Rodrigues
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-04 00:00:00.000000000 Z
11
+ date: 2021-08-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 2.1.0
75
+ version: 2.5.1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 2.1.0
82
+ version: 2.5.1
83
83
  description: Interact programmatically with your LogicMonitor account via the REST
84
84
  API.
85
85
  email:
@@ -99,6 +99,7 @@ files:
99
99
  - bin/console
100
100
  - bin/ds_checker.rb
101
101
  - bin/setup
102
+ - bin/system_category_cleaner.rb
102
103
  - lib/lm_rest.rb
103
104
  - lib/lm_rest/api_client.rb
104
105
  - lib/lm_rest/request_params.rb
@@ -124,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
125
  - !ruby/object:Gem::Version
125
126
  version: '0'
126
127
  requirements: []
127
- rubygems_version: 3.0.3
128
+ rubygems_version: 3.2.15
128
129
  signing_key:
129
130
  specification_version: 4
130
131
  summary: API Wrapper for LogicMonitor Rest API v2.