lmc 0.14.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: 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