lm_rest 1.0.1 → 1.0.5

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.
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.