lmc 0.12.0 → 0.15.0

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: ec4925e30542f46b5b9c991de79a672a9eabeffda07028620aaa6fa14e62c551
4
- data.tar.gz: 0eb5b5654694a1eb90e920df6d00d67cf4b8dda7c42fa167760d9c329bd88341
3
+ metadata.gz: 96d4cb0e5c48a388b0fcaed6aa9bbbfe43275dfa4e5f8de31ed9f22973cd002d
4
+ data.tar.gz: fcb70677fc2ef666fc28d5e1dd6ca69d6de053fbe9f1a8fbd825d973d32643c4
5
5
  SHA512:
6
- metadata.gz: ebbb8a5bcb4eb5cdaf9f0236394f18572922a70e42f7218b9d942420e4234ff30071549fff0c37e5e6e82ffcf3cce61b8b351921915ca749f7e947a8b33e74f0
7
- data.tar.gz: c4008e578e219956662b9b0239a543c95f921099cee0dca7553b8770cf4a986fd872b3867a506327a2c4ea522244984341e72dfb970193f1837729c71b078601
6
+ metadata.gz: f94290c326379b14fb128e595a27713af19d14cbcb5eeb9cc59abd193ad6cd5894a85debcf7b22812b6c1ca570a6af0e49bbd0745c5708805b202ca47836c324
7
+ data.tar.gz: 79751ea5bdbd51b6d1cf9fa76ad0fdadd1c8b070fda7a68b3a7b683b82ddd18f49b006ef0c862526e09ef60286169df6459be55eaedc40bf45728027481e0beb
data/.idea/vcs.xml CHANGED
@@ -1,6 +1,6 @@
1
1
  <?xml version="1.0" encoding="UTF-8"?>
2
2
  <project version="4">
3
3
  <component name="VcsDirectoryMappings">
4
- <mapping directory="$PROJECT_DIR$" vcs="Git" />
4
+ <mapping directory="" vcs="Git" />
5
5
  </component>
6
6
  </project>
data/.rubocop.yml CHANGED
@@ -5,4 +5,64 @@ Layout/FirstHashElementIndentation:
5
5
  Layout/LineLength:
6
6
  Max: 110
7
7
  Style/IfUnlessModifier:
8
- Enabled: false
8
+ Enabled: false
9
+ Gemspec/DateAssignment: # (new in 1.10)
10
+ Enabled: true
11
+ Layout/SpaceBeforeBrackets: # (new in 1.7)
12
+ Enabled: true
13
+ Lint/AmbiguousAssignment: # (new in 1.7)
14
+ Enabled: true
15
+ Lint/DeprecatedConstants: # (new in 1.8)
16
+ Enabled: true
17
+ Lint/DuplicateBranch: # (new in 1.3)
18
+ Enabled: true
19
+ Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
20
+ Enabled: true
21
+ Lint/EmptyBlock: # (new in 1.1)
22
+ Enabled: true
23
+ Lint/EmptyClass: # (new in 1.3)
24
+ Enabled: true
25
+ Lint/LambdaWithoutLiteralBlock: # (new in 1.8)
26
+ Enabled: true
27
+ Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
28
+ Enabled: true
29
+ Lint/NumberedParameterAssignment: # (new in 1.9)
30
+ Enabled: true
31
+ Lint/OrAssignmentToConstant: # (new in 1.9)
32
+ Enabled: true
33
+ Lint/RedundantDirGlobSort: # (new in 1.8)
34
+ Enabled: true
35
+ Lint/SymbolConversion: # (new in 1.9)
36
+ Enabled: true
37
+ Lint/ToEnumArguments: # (new in 1.1)
38
+ Enabled: true
39
+ Lint/TripleQuotes: # (new in 1.9)
40
+ Enabled: true
41
+ Lint/UnexpectedBlockArity: # (new in 1.5)
42
+ Enabled: true
43
+ Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
44
+ Enabled: true
45
+ Style/ArgumentsForwarding: # (new in 1.1)
46
+ Enabled: true
47
+ Style/CollectionCompact: # (new in 1.2)
48
+ Enabled: true
49
+ Style/DocumentDynamicEvalDefinition: # (new in 1.1)
50
+ Enabled: true
51
+ Style/EndlessMethod: # (new in 1.8)
52
+ Enabled: true
53
+ Style/HashConversion: # (new in 1.10)
54
+ Enabled: true
55
+ Style/HashExcept: # (new in 1.7)
56
+ Enabled: true
57
+ Style/IfWithBooleanLiteralBranches: # (new in 1.9)
58
+ Enabled: true
59
+ Style/NegatedIfElseCondition: # (new in 1.2)
60
+ Enabled: true
61
+ Style/NilLambda: # (new in 1.3)
62
+ Enabled: true
63
+ Style/RedundantArgument: # (new in 1.4)
64
+ Enabled: true
65
+ Style/StringChars: # (new in 1.12)
66
+ Enabled: true
67
+ Style/SwapValues: # (new in 1.1)
68
+ Enabled: true
data/Rakefile CHANGED
@@ -13,23 +13,28 @@ end
13
13
 
14
14
  RuboCop::RakeTask.new(:autocop) do |t|
15
15
  autofix = [
16
+ 'Gemspec/OrderedDependencies',
17
+ 'Layout/EmptyLineBetweenDefs',
16
18
  'Layout/EmptyLines',
17
19
  'Layout/EmptyLinesAroundClassBody',
20
+ 'Layout/EmptyLinesAroundMethodBody',
18
21
  'Layout/EmptyLinesAroundModuleBody',
19
- 'Layout/EmptyLineBetweenDefs',
20
22
  'Layout/LeadingCommentSpace',
23
+ 'Layout/SpaceAfterComma',
21
24
  'Layout/SpaceAroundOperators',
22
25
  'Layout/SpaceInsideBlockBraces',
23
26
  'Layout/SpaceInsideHashLiteralBraces',
24
27
  'Layout/TrailingEmptyLines',
28
+ 'Lint/RedundantStringCoercion',
29
+ 'Lint/UnusedBlockArgument',
25
30
  'Style/CommentAnnotation',
26
31
  'Style/FrozenStringLiteralComment',
27
32
  'Style/MethodDefParentheses',
28
- 'Style/RedundantSelf',
29
33
  'Style/RedundantReturn',
30
- 'Style/StringLiterals',
31
- 'Style/StringLiteralsInInterpolation',
34
+ 'Style/RedundantSelf',
32
35
  'Style/StabbyLambdaParentheses',
36
+ 'Style/StringLiterals',
37
+ 'Style/StringLiteralsInInterpolation'
33
38
  ]
34
39
  t.options = ['--only', autofix.join(','), '--auto-correct', 'lib', 'test', 'Rakefile', 'lmc.gemspec']
35
40
  end
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "result": {
3
- "covered_percent": 91.53
3
+ "covered_percent": 92.44
4
4
  }
5
5
  }
data/lib/lmc.rb CHANGED
@@ -5,10 +5,23 @@ require 'restclient'
5
5
 
6
6
  module LMC
7
7
  SERVICELIST = ['cloud-service-auth',
8
+ 'cloud-service-backstage',
9
+ 'cloud-service-config',
8
10
  'cloud-service-devices',
11
+ 'cloud-service-devicetunnel',
12
+ 'cloud-service-dyndns',
13
+ 'cloud-service-fields',
14
+ 'cloud-service-geolocation',
15
+ 'cloud-service-hotspot',
16
+ 'cloud-service-jobs',
9
17
  'cloud-service-monitoring',
10
- 'cloud-service-config',
11
- 'cloud-service-licenses']
18
+ 'cloud-service-messaging',
19
+ 'cloud-service-notification',
20
+ 'cloud-service-licenses',
21
+ 'cloud-service-logging',
22
+ 'cloud-service-preferences',
23
+ 'cloud-service-uf-translator'
24
+ ]
12
25
 
13
26
  def self.useful
14
27
  true
data/lib/lmc/Account.rb CHANGED
@@ -73,13 +73,14 @@ module LMC
73
73
  def members
74
74
  ids = Cloud.instance.get ['cloud-service-auth', 'accounts', @id, 'members'], 'select' => 'id'
75
75
  puts ids.inspect if Cloud.debug
76
- principals = ids.map do |principal_id|
77
- response = Cloud.instance.get ['cloud-service-auth', 'accounts', @id, 'members', principal_id]
78
- principal = response.body
79
- puts principal.inspect if Cloud.debug
80
- principal
76
+ # these are not actual membership objects
77
+ memberships = ids.map do |member_id|
78
+ response = Cloud.instance.get ['cloud-service-auth', 'accounts', @id, 'members', member_id]
79
+ memberships = response.body
80
+ puts memberships.inspect if Cloud.debug
81
+ memberships
81
82
  end
82
- principals
83
+ memberships
83
84
  end
84
85
 
85
86
  def find_member_by_name(name)
@@ -93,10 +94,12 @@ module LMC
93
94
  member
94
95
  end
95
96
 
97
+ #--
96
98
  # def update_member(principal_id, data)
97
99
  # response = @cloud.post ["cloud-service-auth", "accounts", id, 'members', principal_id], data
98
100
  # return response
99
101
  # end
102
+ #++
100
103
 
101
104
  def remove_membership(member_id)
102
105
  @cloud.delete ['cloud-service-auth', 'accounts', id, 'members', member_id]
@@ -123,16 +126,21 @@ module LMC
123
126
  end
124
127
 
125
128
  def children
126
- @cloud.auth_for_accounts([id, ROOT_ACCOUNT_UUID])
127
- response = @cloud.get ['cloud-service-auth', 'accounts', id, 'children']
128
- response.map { |child| Account.new @cloud, child }
129
+ @cloud.auth_for_accounts([ROOT_ACCOUNT_UUID])
130
+ # Projects can not have children, return empty map immediately as optimization
131
+ if type != 'PROJECT'
132
+ response = @cloud.get ['cloud-service-auth', 'accounts', id, 'children']
133
+ response.map { |child| Account.new @cloud, child }
134
+ else
135
+ []
136
+ end
129
137
  end
130
138
 
139
+ # This can only show the most recent page of logs so far
131
140
  def logs
132
- # https://lmctest/cloud-service-logging/accounts/6392b234-b11c-498a-a077-a5f5b23c54a0/logs?lang=DE
133
141
  cloud = Cloud.instance
134
142
  cloud.auth_for_accounts [id]
135
- cloud.get(['cloud-service-logging', 'accounts', id, 'logs?lang=DE']).body
143
+ cloud.get(['cloud-service-logging', 'accounts', id, 'logs', 'paginated?lang=DE']).body.logs
136
144
  end
137
145
 
138
146
  def sites
data/lib/lmc/Cloud.rb CHANGED
@@ -7,31 +7,33 @@ require 'restclient'
7
7
  module LMC
8
8
  class Cloud
9
9
  class << self
10
- attr_accessor :cloud_host, :user, :password, :verbose, :debug, :verify_tls, :use_tls
10
+ attr_accessor :cloud_host, :user, :password, :code, :verbose, :debug, :verify_tls, :use_tls
11
11
  Cloud.use_tls = true
12
12
  Cloud.verify_tls = true
13
+ Cloud.code = nil
13
14
  end
14
15
 
15
16
  def self.instance(opts = { authorize: true })
16
- @@inst ||= new(@cloud_host, @user, @password, opts[:authorize])
17
+ @@inst ||= new(@cloud_host, @user, @password, @code, opts[:authorize])
17
18
  end
18
19
 
19
20
  attr_reader :auth_ok, :cloud_host, :user, :password
20
21
 
21
- def initialize(cloud_host, user, pass, auth = true)
22
+ def initialize(cloud_host, user, password, code = nil, auth = true)
22
23
  @auth_ok = false
23
24
  @cloud_host = cloud_host
24
25
  @user = user
25
- @password = pass
26
+ @password = password
27
+ @code = code
26
28
  @verify_tls = Cloud.verify_tls
27
29
  @last_authorized_account_ids = nil
28
30
  @logger ||= ::LMC::Logger.new(STDOUT) if Cloud.debug
29
31
  @logger.cloud = self if Cloud.debug
30
32
  RestClient.log = @logger if Cloud.debug
31
- authorize if auth
33
+ login if auth
32
34
  end
33
35
 
34
- # hide password from dumps
36
+ # hide secret fields from being displayed in dumps
35
37
  def inspect
36
38
  "#<Cloud:#{object_id}, #{build_url}>"
37
39
  end
@@ -72,9 +74,9 @@ module LMC
72
74
  prepared_headers = headers
73
75
  prepared_headers[:params] = params
74
76
  args = {
75
- :method => :get,
76
- :url => build_url(path),
77
- :headers => prepared_headers
77
+ :method => :get,
78
+ :url => build_url(path),
79
+ :headers => prepared_headers
78
80
  }
79
81
  execute_request args
80
82
  end
@@ -83,22 +85,22 @@ module LMC
83
85
  prepared_headers = headers
84
86
  prepared_headers[:params] = params
85
87
  args = {
86
- :method => :put,
87
- :url => build_url(path),
88
- :payload => body_object.to_json,
89
- :headers => prepared_headers
88
+ :method => :put,
89
+ :url => build_url(path),
90
+ :payload => body_object.to_json,
91
+ :headers => prepared_headers
90
92
  }
91
93
  execute_request args
92
94
  end
93
95
 
94
- def post(path, body_object, params=nil )
96
+ def post(path, body_object, params = nil)
95
97
  prepared_headers = headers
96
98
  prepared_headers[:params] = params
97
99
  args = {
98
- :method => :post,
99
- :url => build_url(path),
100
- :payload => body_object.to_json,
101
- :headers => prepared_headers
100
+ :method => :post,
101
+ :url => build_url(path),
102
+ :payload => body_object.to_json,
103
+ :headers => prepared_headers
102
104
  }
103
105
  execute_request args
104
106
  end
@@ -107,9 +109,9 @@ module LMC
107
109
  prepared_headers = headers
108
110
  prepared_headers[:params] = params
109
111
  args = {
110
- :method => :delete,
111
- :url => build_url(path),
112
- :headers => prepared_headers
112
+ :method => :delete,
113
+ :url => build_url(path),
114
+ :headers => prepared_headers
113
115
  }
114
116
  execute_request args
115
117
  end
@@ -143,7 +145,7 @@ module LMC
143
145
 
144
146
  private
145
147
 
146
- def authorize(accounts = [], tos = [])
148
+ def authorize(accounts = [])
147
149
  account_ids = accounts.map { |a|
148
150
  if a.respond_to? :id
149
151
  a.id
@@ -153,19 +155,39 @@ module LMC
153
155
  }
154
156
  if account_ids != @last_authorized_account_ids
155
157
  begin
156
- reply = post(['cloud-service-auth', 'auth'], name: @user, password: @password, accountIds: account_ids, termsOfUse: tos)
158
+ reply = post(['cloud-service-auth', 'auth'],
159
+ name: @user,
160
+ password: @password,
161
+ code: @code,
162
+ accountIds: account_ids,
163
+ )
157
164
  @last_authorized_account_ids = account_ids
158
165
  @auth_token = reply
159
166
  @auth_ok = true
160
- rescue ::RestClient::ExceptionWithResponse => e
161
- response = JSON.parse(e.response.body)
162
- if response['code'] == 100
163
- raise LMC::OutdatedTermsOfUseException.new(response)
164
- end
165
167
  end
166
168
  end
167
169
  end
168
170
 
171
+ def login(tos = [])
172
+ begin
173
+ reply = post(['cloud-service-auth', 'userlogin'],
174
+ name: @user,
175
+ password: @password,
176
+ code: @code,
177
+ termsOfUse: tos)
178
+ @auth_token = reply
179
+ @auth_ok = true
180
+ rescue ResponseException => e
181
+ if e.response['code'] == 104
182
+ raise LMC::MissingCodeException.new e.response
183
+ end
184
+ if e.response['code'] == 100
185
+ raise LMC::OutdatedTermsOfUseException.new e.response
186
+ end
187
+ raise e
188
+ end
189
+ end
190
+
169
191
  def auth_bearer
170
192
  "Bearer #{session_token}"
171
193
  end
@@ -198,7 +220,7 @@ module LMC
198
220
  puts 'EX.response: ' + e.response.to_s
199
221
  puts JSON.parse(e.response)['message']
200
222
  end
201
- raise e
223
+ raise ResponseException.new e.response
202
224
  end
203
225
  end
204
226
  end
data/lib/lmc/Response.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'ostruct'
4
+ require 'recursive-open-struct'
4
5
  module LMC
5
6
  class LMCResponse
6
7
  attr_reader :body, :code, :headers
@@ -13,12 +14,12 @@ module LMC
13
14
  if @body_object.class == Array
14
15
  @body = @body_object.map { |elem|
15
16
  if elem.is_a? Hash then
16
- OpenStruct.new(elem)
17
+ RecursiveOpenStruct.new(elem, recurse_over_arrays: true)
17
18
  else
18
19
  elem
19
20
  end}
20
21
  elsif @body_object.class == Hash
21
- @body = OpenStruct.new(@body_object)
22
+ @body = RecursiveOpenStruct.new(@body_object, recurse_over_arrays: true)
22
23
  elsif @body_object.class == TrueClass || @body_object.class == FalseClass
23
24
  @body = @body_object
24
25
  else
@@ -51,7 +52,7 @@ module LMC
51
52
  end
52
53
 
53
54
  def to_s
54
- "Response: Code: #{@code}, Body: #{@body_object.to_s}"
55
+ "Response: Code: #{@code}, Body: #{@body_object}"
55
56
  end
56
57
 
57
58
  def empty?
data/lib/lmc/Site.rb CHANGED
@@ -14,7 +14,6 @@ module LMC
14
14
  @id = data['id']
15
15
  @name = data['name']
16
16
  @subnet_group_id = data['subnetGroupId']
17
-
18
17
  end
19
18
 
20
19
  def to_s
data/lib/lmc/User.rb CHANGED
@@ -22,18 +22,14 @@ module LMC
22
22
 
23
23
  def update(old_pw)
24
24
  cloud = Cloud.instance
25
- begin
26
- cloud.post ['cloud-service-auth', 'users', 'self', 'password'], 'password' => @password, 'verification' => old_pw
27
- rescue RestClient::BadRequest => e
28
- response_body = JSON.parse(e.response)
29
- raise "#{e.message} - #{response_body['message']}"
30
- end
25
+ cloud.post ['cloud-service-auth', 'users', 'self', 'password'], 'password' => @password, 'verification' => old_pw
31
26
  end
32
27
 
33
28
  def request_pw_reset
34
29
  action = AuthAction.new Cloud.instance
35
30
  action.type = 'PASSWORD_RESET'
36
31
  action.name = @email
32
+ action.data = nil
37
33
  action.post
38
34
  end
39
35
  end
data/lib/lmc/authority.rb CHANGED
@@ -5,8 +5,7 @@ module LMC
5
5
  attr_accessor :account, :id, :name, :visibility, :type
6
6
 
7
7
  def initialize(data, account)
8
- # TODO: Use cloud object from account
9
- @cloud = Cloud.instance
8
+ @cloud = account.cloud
10
9
  apply_data(data)
11
10
  @account = account
12
11
  end
@@ -54,7 +54,7 @@ module LMC
54
54
  def descriptive_confighash
55
55
  item_map = dscui.item_by_id_map
56
56
  confighash.map { |k, v|
57
- [item_map[k].description, v]
57
+ [item_map[k.to_s].description, v]
58
58
  }.to_h
59
59
  end
60
60
 
@@ -75,12 +75,12 @@ module LMC
75
75
 
76
76
  result = ''
77
77
  result += lcf_header
78
- items.each do |key, value|
78
+ items.to_h.each do |key, value|
79
79
  if value.instance_of? String
80
80
  result += "#{key} = #{value}\n"
81
81
  elsif value.instance_of? Hash
82
- rows = value['rows']
83
- col_ids = value['colIds']
82
+ rows = value[:rows]
83
+ col_ids = value[:colIds]
84
84
  if rows.length > 0
85
85
  result += "<#{key}>\n"
86
86
  rows.each_with_index { |row, index|
@@ -92,7 +92,7 @@ module LMC
92
92
  raise 'Unexpected value in config items: ' + value.class.to_s
93
93
  end
94
94
  end
95
- result += lcf_footer
95
+ result + lcf_footer
96
96
  end
97
97
 
98
98
  def current_device_type
@@ -127,6 +127,7 @@ module LMC
127
127
  # @return [String]
128
128
  def lcf_feature_id_string
129
129
  hex_features = current_device_type.features.map { |feature| feature.to_s 16 }
130
+ hex_features << '80000800' # Magic feature to cause lanconfig to show the password
130
131
  "IDs:#{hex_features.join(',')}"
131
132
  end
132
133
 
@@ -161,7 +162,8 @@ module LMC
161
162
  end
162
163
 
163
164
  def fetch_result
164
- response_or_ticket = @cloud.get(url_configbuilder).body
165
+ # TODO: Make parameters settable
166
+ response_or_ticket = @cloud.get(url_configbuilder, { includePasswords: 'TRUE', includeSmartApps: 'FALSE' }).body
165
167
  if response_or_ticket.respond_to? 'ticketId'
166
168
  @ticket_id = response_or_ticket.ticketId
167
169
  redeem_ticket 5
@@ -172,16 +174,17 @@ module LMC
172
174
  end
173
175
 
174
176
  def redeem_ticket(tries)
177
+ wait_seconds = 0.5
175
178
  attempts = 1
176
179
  until @response
177
- raise 'Too many attempts' if attempts > tries
180
+ raise "Timeout waiting for config (#{attempts * wait_seconds}s)" if attempts > tries
178
181
  attempts += 1
179
182
  body = @cloud.get(url_ticket).body
180
183
  unless body.respond_to? :ticketId
181
184
  @ticket_id = nil
182
185
  @response = body
183
186
  end
184
- sleep 0.5
187
+ sleep wait_seconds * attempts
185
188
  end
186
189
  end
187
190
 
@@ -28,11 +28,10 @@ module LMC
28
28
  attr_reader :version_string, :sections
29
29
 
30
30
  def initialize(v_hash)
31
- keys = v_hash.keys
31
+ keys = v_hash.to_h.keys
32
32
  raise('More than one version key contained in dscui.') if keys.length > 1
33
33
  @version_string = keys.first
34
34
  @sections = v_hash[@version_string].map { |section_wrapper| Section.new section_wrapper }
35
-
36
35
  end
37
36
 
38
37
  def items
@@ -54,7 +53,6 @@ module LMC
54
53
  @groups = members.map { |group_wrapper|
55
54
  Group.new group_wrapper unless group_wrapper['group'].nil?
56
55
  }.compact
57
-
58
56
  end
59
57
  end
60
58
 
@@ -76,7 +74,7 @@ module LMC
76
74
  end
77
75
 
78
76
  def initialize(item_wrapper)
79
- keys = item_wrapper.keys
77
+ keys = item_wrapper.to_h.keys
80
78
  raise('More than one key contained in item wrapper') if keys.length > 1
81
79
  @type = keys.first
82
80
  item = item_wrapper[@type]
data/lib/lmc/entity.rb CHANGED
@@ -6,7 +6,7 @@ module LMC
6
6
  raise 'Missing argument' if term.nil?
7
7
  begin
8
8
  get_by_uuid term
9
- rescue RestClient::BadRequest, URI::InvalidURIError
9
+ rescue RestClient::BadRequest, URI::InvalidURIError, LMC::ResponseException
10
10
  get_by_name term
11
11
  end
12
12
  end
@@ -1,11 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LMC
4
- class OutdatedTermsOfUseException < Exception
5
- def initialize(response = {})
6
- @response = response
7
- end
8
-
4
+ class OutdatedTermsOfUseException < ResponseException
9
5
  def response
10
6
  r = "Terms of use must be accepted before using this LMC instance:\n"
11
7
  missing.each do |tos|
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LMC
4
+ # Exception representing a missing 2FA code. (2fa enabled but code not sent)
5
+ class MissingCodeException < ResponseException
6
+ end
7
+ end
8
+
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ module LMC
3
+ class ResponseException < RuntimeError
4
+ attr_reader :response
5
+
6
+ # Initialize a ResponseException.
7
+ #
8
+ # @param [Object] response restclient Response
9
+ def initialize(response)
10
+ if response.is_a? LMCResponse
11
+ @response = response
12
+ else
13
+ @response = LMCResponse.new response
14
+ end
15
+ end
16
+
17
+ def message
18
+ cause.message
19
+ end
20
+ end
21
+ end
22
+
data/lib/lmc/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LMC
4
- VERSION = '0.12.0'
4
+ VERSION = '0.15.0'
5
5
  end
6
6
 
data/lmc.gemspec CHANGED
@@ -10,6 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.authors = ['erpel']
11
11
  spec.email = ['philipp@copythat.de']
12
12
 
13
+ spec.required_ruby_version = '~> 2.0'
13
14
  spec.summary = %q{Library for interacting with LMC cloud instances}
14
15
  spec.license = 'BSD-3-Clause'
15
16
 
@@ -32,13 +33,13 @@ Gem::Specification.new do |spec|
32
33
  spec.add_development_dependency 'bundler', '~> 2.0'
33
34
  spec.add_development_dependency 'minitest', '~> 5.11'
34
35
  spec.add_development_dependency 'minitest-reporters', '~> 1'
36
+ spec.add_development_dependency 'pry-nav', '~> 0.2.4'
35
37
  spec.add_development_dependency 'rake', '~> 12.0'
36
- spec.add_development_dependency 'recursive-open-struct', '~> 1.1'
38
+ spec.add_development_dependency 'rubocop', '~> 1.14'
37
39
  spec.add_development_dependency 'simplecov', '~> 0.15'
38
- spec.add_development_dependency 'pry-nav', '~> 0.2.4'
39
- spec.add_development_dependency 'rubocop', '~> 0.58.1'
40
40
 
41
41
  spec.add_runtime_dependency 'json', '~> 2.3'
42
+ spec.add_runtime_dependency 'recursive-open-struct', '~> 1.1'
42
43
  spec.add_runtime_dependency 'rest-client', '~> 2.0'
43
44
  end
44
45
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lmc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - erpel
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-06-20 00:00:00.000000000 Z
11
+ date: 2021-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,89 +53,89 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rake
56
+ name: pry-nav
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '12.0'
61
+ version: 0.2.4
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '12.0'
68
+ version: 0.2.4
69
69
  - !ruby/object:Gem::Dependency
70
- name: recursive-open-struct
70
+ name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.1'
75
+ version: '12.0'
76
76
  type: :development
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: '1.1'
82
+ version: '12.0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: simplecov
84
+ name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.15'
89
+ version: '1.14'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0.15'
96
+ version: '1.14'
97
97
  - !ruby/object:Gem::Dependency
98
- name: pry-nav
98
+ name: simplecov
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.2.4
103
+ version: '0.15'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 0.2.4
110
+ version: '0.15'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rubocop
112
+ name: json
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.58.1
118
- type: :development
117
+ version: '2.3'
118
+ type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.58.1
124
+ version: '2.3'
125
125
  - !ruby/object:Gem::Dependency
126
- name: json
126
+ name: recursive-open-struct
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '2.3'
131
+ version: '1.1'
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: '2.3'
138
+ version: '1.1'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rest-client
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -150,7 +150,7 @@ dependencies:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '2.0'
153
- description:
153
+ description:
154
154
  email:
155
155
  - philipp@copythat.de
156
156
  executables: []
@@ -190,6 +190,8 @@ files:
190
190
  - lib/lmc/device_config_state.rb
191
191
  - lib/lmc/entity.rb
192
192
  - lib/lmc/exceptions/lmc_outdated_terms_of_use_exception.rb
193
+ - lib/lmc/exceptions/lmc_two_factor_required_exception.rb
194
+ - lib/lmc/exceptions/response_exception.rb
193
195
  - lib/lmc/logger.rb
194
196
  - lib/lmc/membership.rb
195
197
  - lib/lmc/mixins/json_able.rb
@@ -201,19 +203,19 @@ files:
201
203
  - lib/lmc/version.rb
202
204
  - lmc.gemspec
203
205
  - misc/debug_log_experiment.rb
204
- homepage:
206
+ homepage:
205
207
  licenses:
206
208
  - BSD-3-Clause
207
209
  metadata: {}
208
- post_install_message:
210
+ post_install_message:
209
211
  rdoc_options: []
210
212
  require_paths:
211
213
  - lib
212
214
  required_ruby_version: !ruby/object:Gem::Requirement
213
215
  requirements:
214
- - - ">="
216
+ - - "~>"
215
217
  - !ruby/object:Gem::Version
216
- version: '0'
218
+ version: '2.0'
217
219
  required_rubygems_version: !ruby/object:Gem::Requirement
218
220
  requirements:
219
221
  - - ">="
@@ -221,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
223
  version: '0'
222
224
  requirements: []
223
225
  rubygems_version: 3.1.2
224
- signing_key:
226
+ signing_key:
225
227
  specification_version: 4
226
228
  summary: Library for interacting with LMC cloud instances
227
229
  test_files: []