lmc 0.14.0 → 0.15.0

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: e239ac693f1144e6391c0aad69e68657ad5498ae51e3b0c92dcc9e163abb15de
4
- data.tar.gz: d98d01d4b424db42dc6fb581d763f4b60e20d4e283a87f1b771bd786c8c1a34e
3
+ metadata.gz: 96d4cb0e5c48a388b0fcaed6aa9bbbfe43275dfa4e5f8de31ed9f22973cd002d
4
+ data.tar.gz: fcb70677fc2ef666fc28d5e1dd6ca69d6de053fbe9f1a8fbd825d973d32643c4
5
5
  SHA512:
6
- metadata.gz: abb83a783cfe4247cb3952cdd10df18fd36c4d9ad91d4196783e90aaf5bb39f5be51ee6b65ee1b11c4421077d3479e16f7c10359b83e39e361e90e586c3aee7c
7
- data.tar.gz: 778005cf105deaf7fbd4bfd9ba60bb595ffb747e14e924a89dc1e56c5e8790518c9f386770ad36c3876280ed72f08e61bc6f081f0e15fbd8123fd570d4fc9b7b
6
+ metadata.gz: f94290c326379b14fb128e595a27713af19d14cbcb5eeb9cc59abd193ad6cd5894a85debcf7b22812b6c1ca570a6af0e49bbd0745c5708805b202ca47836c324
7
+ data.tar.gz: 79751ea5bdbd51b6d1cf9fa76ad0fdadd1c8b070fda7a68b3a7b683b82ddd18f49b006ef0c862526e09ef60286169df6459be55eaedc40bf45728027481e0beb
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": 92.33
3
+ "covered_percent": 92.44
4
4
  }
5
5
  }
data/lib/lmc/Cloud.rb CHANGED
@@ -30,7 +30,7 @@ module LMC
30
30
  @logger ||= ::LMC::Logger.new(STDOUT) if Cloud.debug
31
31
  @logger.cloud = self if Cloud.debug
32
32
  RestClient.log = @logger if Cloud.debug
33
- authorize if auth
33
+ login if auth
34
34
  end
35
35
 
36
36
  # hide secret fields from being displayed in dumps
@@ -74,9 +74,9 @@ module LMC
74
74
  prepared_headers = headers
75
75
  prepared_headers[:params] = params
76
76
  args = {
77
- :method => :get,
78
- :url => build_url(path),
79
- :headers => prepared_headers
77
+ :method => :get,
78
+ :url => build_url(path),
79
+ :headers => prepared_headers
80
80
  }
81
81
  execute_request args
82
82
  end
@@ -85,22 +85,22 @@ module LMC
85
85
  prepared_headers = headers
86
86
  prepared_headers[:params] = params
87
87
  args = {
88
- :method => :put,
89
- :url => build_url(path),
90
- :payload => body_object.to_json,
91
- :headers => prepared_headers
88
+ :method => :put,
89
+ :url => build_url(path),
90
+ :payload => body_object.to_json,
91
+ :headers => prepared_headers
92
92
  }
93
93
  execute_request args
94
94
  end
95
95
 
96
- def post(path, body_object, params=nil )
96
+ def post(path, body_object, params = nil)
97
97
  prepared_headers = headers
98
98
  prepared_headers[:params] = params
99
99
  args = {
100
- :method => :post,
101
- :url => build_url(path),
102
- :payload => body_object.to_json,
103
- :headers => prepared_headers
100
+ :method => :post,
101
+ :url => build_url(path),
102
+ :payload => body_object.to_json,
103
+ :headers => prepared_headers
104
104
  }
105
105
  execute_request args
106
106
  end
@@ -109,9 +109,9 @@ module LMC
109
109
  prepared_headers = headers
110
110
  prepared_headers[:params] = params
111
111
  args = {
112
- :method => :delete,
113
- :url => build_url(path),
114
- :headers => prepared_headers
112
+ :method => :delete,
113
+ :url => build_url(path),
114
+ :headers => prepared_headers
115
115
  }
116
116
  execute_request args
117
117
  end
@@ -145,7 +145,7 @@ module LMC
145
145
 
146
146
  private
147
147
 
148
- def authorize(accounts = [], tos = [])
148
+ def authorize(accounts = [])
149
149
  account_ids = accounts.map { |a|
150
150
  if a.respond_to? :id
151
151
  a.id
@@ -160,20 +160,34 @@ module LMC
160
160
  password: @password,
161
161
  code: @code,
162
162
  accountIds: account_ids,
163
- termsOfUse: tos)
163
+ )
164
164
  @last_authorized_account_ids = account_ids
165
165
  @auth_token = reply
166
166
  @auth_ok = true
167
- rescue ::RestClient::ExceptionWithResponse => e
168
- response = JSON.parse(e.response.body)
169
- if response['code'] == 100
170
- raise LMC::OutdatedTermsOfUseException.new(response)
171
- end
172
- raise e
173
167
  end
174
168
  end
175
169
  end
176
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
+
177
191
  def auth_bearer
178
192
  "Bearer #{session_token}"
179
193
  end
@@ -206,7 +220,7 @@ module LMC
206
220
  puts 'EX.response: ' + e.response.to_s
207
221
  puts JSON.parse(e.response)['message']
208
222
  end
209
- raise e
223
+ raise ResponseException.new e.response
210
224
  end
211
225
  end
212
226
  end
data/lib/lmc/Response.rb CHANGED
@@ -52,7 +52,7 @@ module LMC
52
52
  end
53
53
 
54
54
  def to_s
55
- "Response: Code: #{@code}, Body: #{@body_object.to_s}"
55
+ "Response: Code: #{@code}, Body: #{@body_object}"
56
56
  end
57
57
 
58
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,12 +22,7 @@ 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
@@ -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
@@ -32,7 +32,6 @@ module LMC
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
 
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.14.0'
4
+ VERSION = '0.15.0'
5
5
  end
6
6
 
data/lmc.gemspec CHANGED
@@ -33,13 +33,13 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency 'bundler', '~> 2.0'
34
34
  spec.add_development_dependency 'minitest', '~> 5.11'
35
35
  spec.add_development_dependency 'minitest-reporters', '~> 1'
36
+ spec.add_development_dependency 'pry-nav', '~> 0.2.4'
36
37
  spec.add_development_dependency 'rake', '~> 12.0'
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 'rest-client', '~> 2.0'
43
42
  spec.add_runtime_dependency 'recursive-open-struct', '~> 1.1'
43
+ spec.add_runtime_dependency 'rest-client', '~> 2.0'
44
44
  end
45
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.14.0
4
+ version: 0.15.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - erpel
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-06 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,61 +53,61 @@ 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: simplecov
70
+ name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.15'
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: '0.15'
82
+ version: '12.0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: pry-nav
84
+ name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.2.4
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.2.4
96
+ version: '1.14'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rubocop
98
+ name: simplecov
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.58.1
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.58.1
110
+ version: '0.15'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: json
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -123,33 +123,33 @@ dependencies:
123
123
  - !ruby/object:Gem::Version
124
124
  version: '2.3'
125
125
  - !ruby/object:Gem::Dependency
126
- name: rest-client
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.0'
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.0'
138
+ version: '1.1'
139
139
  - !ruby/object:Gem::Dependency
140
- name: recursive-open-struct
140
+ name: rest-client
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '1.1'
145
+ version: '2.0'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '1.1'
152
+ version: '2.0'
153
153
  description:
154
154
  email:
155
155
  - philipp@copythat.de
@@ -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