lmcadm 0.14.0 → 0.17.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: '0925f20d360b3e8e6740c298a99c12b67474ae9d8d0c1ff6a426109cc9810ef7'
4
- data.tar.gz: a3be3188b433d777bce80b5807c497ca41d15c9fa65037eaec5421abd2c6490b
3
+ metadata.gz: 38c8fafe1ca6ada1a72b6d9e77d3c356c2ebfe59951494ce39df0264551493d9
4
+ data.tar.gz: 25c529b60448aabcab330df1b6827179a914cbf51e23e91dbdd70c8df6221413
5
5
  SHA512:
6
- metadata.gz: 1958b20290dcad4adcddfbb87de3e0352f9e6efa8f5ddd8e343bf1bb3ac5b757ec6cffb61081402fdff986a7d454210ad64d1662f4ac8519e3b9c406e53b5a08
7
- data.tar.gz: 3398cb285de12bb7a2211a609fea72cd7f421827e45133c751482f072fa370509d860707c94a7ff1042d2a243ebe0553086cb09da316e24b837b4a46e3a80b15
6
+ metadata.gz: df4eeae40e1204dcb9cf34974db6f5ee96ea39929a4bb6f0a8991f968d937def265ce304a6398ed78b007594726cf60307304d0098e7ca0ac3d6c1d98793cef3
7
+ data.tar.gz: 5ac6a4adc086263d8d06fe8e76c7c200b5c4ca65a53df89d003bfca74d74ddf53f94806e7590ba789a1625bd86158f3aec989f7c2120104a4b5179808d941777
@@ -0,0 +1,35 @@
1
+ name: build-win
2
+ on:
3
+ release:
4
+ types:
5
+ - published
6
+
7
+ # push:
8
+ # tags:
9
+ # - 'v*.*.*'
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: windows-latest
14
+ steps:
15
+ - uses: actions/checkout@v2
16
+ - uses: ruby/setup-ruby@v1
17
+ - run: gem install eventmachine --platform ruby
18
+ - run: gem install ocra lmcadm
19
+ - run: ruby makeocragemfile.rb
20
+ - run: ocra --gemfile ocra_gemfile --gem-full exe/lmcadm
21
+ - name: Setup tmate session
22
+ uses: mxschmitt/action-tmate@v3
23
+ if: false
24
+ - run: ./lmcadm.exe --version
25
+ - uses: papeloto/action-zip@v1
26
+ with:
27
+ files: lmcadm.exe LICENSE.txt
28
+ dest: ${{ github.event.release.tag_name }}-win.zip
29
+ - name: Release
30
+ uses: softprops/action-gh-release@v1
31
+ with:
32
+ files: ${{ github.event.release.tag_name }}-win.zip
33
+ env:
34
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
35
+
data/.gitignore CHANGED
@@ -15,3 +15,5 @@
15
15
  /.idea/modules.xml
16
16
  /Gemfile.lock
17
17
  /lmcadm-*.gem
18
+ ocra_gemfile
19
+ lmcadm*.exe
data/README.md CHANGED
@@ -8,6 +8,31 @@ Install via rubygems:
8
8
 
9
9
  $ gem install lmcadm
10
10
 
11
+ ### Requirements
12
+ Building native extensions for certain dependencies require ruby headers or source code to be present.
13
+ These can usually be installed the same way ruby was installed.
14
+
15
+ On Ubuntu for example, installing the `ruby-dev` via the package manager is sufficient.
16
+
17
+ ### Windows
18
+
19
+ Lmcadm works with https://rubyinstaller.org/downloads/, use the recommended version with Devkit and choose the default options during install.
20
+ Installation can continue with rubygems.
21
+
22
+ #### Known issues
23
+ *Installing lmcadm fails with `ERROR: Failed to build gem native extension.`*
24
+
25
+ Ruby headers and some tools to build software (C compiler, make) are needed.
26
+ On Ubuntu for example, the packages `ruby-dev` and `build-essential` should be enough.
27
+ apt install ruby-dev build-essential
28
+
29
+ *Unable to load the EventMachine C extension ; To use the pure-ruby reactor, require 'em/pure_ruby'*
30
+
31
+ Workaround: Reinstall eventmachine with --platform ruby.
32
+
33
+ gem uninstall eventmachine (select all versions if prompted)
34
+ gem install eventmachine --platform ruby
35
+
11
36
  ## Usage
12
37
 
13
38
  The primary usage documentation is in the help output of lmcadm:
@@ -26,6 +51,11 @@ Set the environment variable LMCADM\_PATH\_DEP to 1 to use the _lmc_ gem from ..
26
51
  Example:
27
52
  $ LMCADM_PATH_DEP=1 bundle exec lmcadm --version
28
53
 
54
+ ### Building an exe for windows using ocra
55
+
56
+ * Apply workaround reinstalling eventmachine (see above)
57
+ * run ocra.sh
58
+
29
59
  ## Contributing
30
60
 
31
61
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/lmcadm.
@@ -34,3 +64,35 @@ The sentence above is patently wrong currently.
34
64
  ## License
35
65
 
36
66
  The gem is available as open source under the terms of the BSD 3-Clause License.
67
+
68
+ # Advanced usage or experimental features
69
+
70
+ ## Using lmcadm to query monitoring data
71
+
72
+ Example use:
73
+
74
+ lmcadm monitor -A "ExampleProject" raw device_info cloud_rtt 42adf60b-0fe7-4187-af4f-9ee97669bfb0
75
+
76
+ ### --type scalar (default)
77
+
78
+ When specifying a period longer than MINUTE1, the name must be suffixed with a dot, followed by an aggregation type.
79
+ Available types are
80
+ * .min
81
+ * .max
82
+ * .avg
83
+
84
+
85
+ lmcadm monitor -A "ExampleProject" raw --type scalar --period MINUTE10 \
86
+ device_info cloud_rtt.max 3e19ada7-86fa-4809-a14e-7174b018603d
87
+
88
+
89
+ ### --type json
90
+
91
+ This dumps the raw values response as json.
92
+ To further extract data, use something that can parse json, like `jq`[1].
93
+
94
+ lmcadm monitor -A "SDN-DEMO (LANCOM Visitor)" raw --type json --period MINUTE1 \
95
+ wan_info_json interfaces a6871a81-84f3-4c57-a20e-c3410b47e895 | jq ' .[]["DSL-CH-1"].rxRate'
96
+
97
+ # Footnotes
98
+ [1] https://stedolan.github.io/jq/manual/
data/exe/lmcadm CHANGED
@@ -25,7 +25,7 @@ module LMCAdm
25
25
  commands_from "lmcadm/commands"
26
26
 
27
27
  desc 'Be verbose'
28
- switch [:v, :verbose]
28
+ switch :verbose, :v
29
29
 
30
30
  desc 'debug'
31
31
  switch [:debug]
@@ -33,9 +33,9 @@ module LMCAdm
33
33
  desc 'Measure time taken for operations'
34
34
  switch "take-time"
35
35
 
36
- desc 'cloud host'
36
+ desc 'LMC host, may include a port number'
37
37
  default_value "cloud.lancom.de"
38
- flag :C, :cloud_host
38
+ flag :cloud_host, :C
39
39
 
40
40
  desc 'Use encrypted connection'
41
41
  default_value true
@@ -46,13 +46,16 @@ module LMCAdm
46
46
  switch "verify-tls"
47
47
 
48
48
  desc 'username'
49
- default_value "admin"
50
- flag :U, :user
49
+ default_value ""
50
+ flag :user, :U
51
51
 
52
52
  desc 'password'
53
53
  default_value ""
54
- flag [:P, :password], :mask => true
54
+ flag [:password, :P], :mask => true
55
55
 
56
+ desc 'Use 2FA code'
57
+ default_value false
58
+ switch [:code, 'F']
56
59
 
57
60
  pre do |global, command, options, args|
58
61
  # Pre logic here
@@ -60,17 +63,31 @@ module LMCAdm
60
63
  # chosen command
61
64
  # Use skips_pre before a command to skip this block
62
65
  # on that command only
63
- if command.name != :completion && global[:password] == ""
64
- global[:password] = Helpers::read_pw "Enter password for #{global[:user]}:"
66
+ if command.name != :completion
67
+ if global[:user] == ""
68
+ print "Enter user:"
69
+ global[:user] = STDIN.gets.chomp
70
+ end
71
+ if global[:password] == ""
72
+ global[:password] = Helpers::read_pw "Enter password for #{global[:user]}:"
73
+ end
74
+ twofactor_code = nil
75
+ if global[:code]
76
+ twofactor_code = Helpers::read_pw "Enter 2FA code:"
77
+ end
65
78
  end
66
79
  ::LMC::Cloud.cloud_host = global[:cloud_host]
67
80
  ::LMC::Cloud.user = global[:user]
68
81
  ::LMC::Cloud.password = global[:password]
82
+ ::LMC::Cloud.code = twofactor_code
69
83
  ::LMC::Cloud.verbose = global[:verbose]
70
84
  ::LMC::Cloud.debug = global[:debug]
71
85
  ::LMC::Cloud.verify_tls = global["verify-tls"]
72
86
  ::LMC::Cloud.use_tls = global["use-tls"]
73
87
  LMCAdm::ProgressVisualizer.take_time = global["take-time"]
88
+ # let table_print print wide columns
89
+ tp.set :max_width, 50
90
+
74
91
  true
75
92
  end
76
93
 
@@ -92,5 +109,8 @@ module LMCAdm
92
109
  true
93
110
  end
94
111
 
112
+ if Encoding.find('locale') != 'UTF-8'
113
+ STDIN.set_encoding(Encoding.find('locale'),'UTF-8')
114
+ end
95
115
  exit run(ARGV)
96
116
  end
@@ -16,7 +16,7 @@ module LMCAdm
16
16
  account_list.switch :l, :long
17
17
  account_list.action do |global_options, options, args|
18
18
  t = ProgressVisualizer.new "Cloud login"
19
- lmcen = LMC::Cloud.new(global_options[:cloud_host], global_options[:user], global_options[:password])
19
+ lmcen = LMC::Cloud.instance
20
20
  t.done
21
21
  t = ProgressVisualizer.new "Getting accounts"
22
22
  accounts = lmcen.get_accounts_objects
@@ -26,7 +26,7 @@ module LMCAdm
26
26
  a["type"] == options[:account_type]
27
27
  end
28
28
  end
29
- accounts.sort {|a, b| a["name"] <=> b["name"]}.each do |account|
29
+ accounts.sort { |a, b| a["name"] <=> b["name"] }.each do |account|
30
30
  puts account.inspect if global_options[:v]
31
31
  if options[:l]
32
32
  puts account.summary
@@ -82,9 +82,9 @@ module LMCAdm
82
82
  account_create.action do |global_options, options, args|
83
83
  parent = LMC::Account.get_by_uuid_or_name options[:p]
84
84
  t = ProgressVisualizer.new "Creating object"
85
- a = LMC::Account.new(LMC::Cloud.instance, {"name" => args.first,
86
- "type" => options[GLI::Command::PARENT][:account_type],
87
- "parent" => parent.id})
85
+ a = LMC::Account.new(LMC::Cloud.instance, { "name" => args.first,
86
+ "type" => options[GLI::Command::PARENT][:account_type],
87
+ "parent" => parent.id })
88
88
  t.done
89
89
  t = ProgressVisualizer.new "Saving #{a.name}"
90
90
  result = a.save
@@ -106,13 +106,13 @@ module LMCAdm
106
106
  t = ProgressVisualizer.new "Getting accounts"
107
107
  if options[:e]
108
108
  accounts = LMC::Cloud.instance.get_accounts_objects
109
- matched_accounts = accounts.select {|account| /#{args.first}/.match(account.name)}
109
+ matched_accounts = accounts.select { |account| /#{args.first}/.match(account.name) }
110
110
  else
111
111
  matched_accounts = [LMC::Account.get_by_uuid_or_name(args.first)]
112
112
  end
113
113
  t.done
114
114
  puts 'Accounts to delete:'
115
- puts matched_accounts.map {|a| "#{a.id} - #{a.name}"}.join("\n")
115
+ puts matched_accounts.map { |a| "#{a.id} - #{a.name}" }.join("\n")
116
116
  print('Type yes to confirm: ')
117
117
  exit unless STDIN.gets.chomp == 'yes'
118
118
  t = ProgressVisualizer.new "Deleting accounts"
@@ -159,12 +159,12 @@ module LMCAdm
159
159
  memberlist.action do |global_options, options, args|
160
160
  account = LMC::Account.get_by_uuid_or_name args.first
161
161
  members = account.members
162
- tp members, [{:id => {:width => 36}}, :name, :type, :state, :invitationState, :principalState,
163
- :authorities => {:display_method => lambda {|m|
164
- m.authorities.map {|a|
162
+ tp members, [{ :id => { :width => 36 } }, :name, :type, :state, :invitationState, :principalState,
163
+ :authorities => { :display_method => lambda { |m|
164
+ m.authorities.map { |a|
165
165
  a['name']
166
166
  }.join(',')
167
- }, :width => 128}]
167
+ }, :width => 128 }]
168
168
  end
169
169
  end
170
170
 
@@ -174,8 +174,8 @@ module LMCAdm
174
174
  auth.action do |_g, _o, args|
175
175
  account = LMC::Account.get_by_uuid_or_name args.first
176
176
  authorities = account.authorities
177
- max = Helpers::longest_in_collection(authorities.map {|a| a.name})
178
- tp authorities, [{:id => {:width => 36}}, {:name => {:width => max}}, :visibility, :type]
177
+ max = Helpers::longest_in_collection(authorities.map { |a| a.name })
178
+ tp authorities, [{ :id => { :width => 36 } }, { :name => { :width => max } }, :visibility, :type]
179
179
  end
180
180
  end
181
181
 
@@ -187,7 +187,7 @@ module LMCAdm
187
187
  create.flag :A, :required => true
188
188
  create.action do |_global_options, options, _args|
189
189
  account = LMC::Account.get_by_uuid_or_name options[:A]
190
- auth = LMC::Authority.new({'name' => _args.first, 'visibility' => 'PRIVATE'}, account)
190
+ auth = LMC::Authority.new({ 'name' => _args.first, 'visibility' => 'PRIVATE' }, account)
191
191
  puts auth.save
192
192
  end
193
193
  end
@@ -202,7 +202,7 @@ module LMCAdm
202
202
  account_invite.action do |global_options, options, args|
203
203
  account = LMC::Account.get_by_uuid_or_name options[:account]
204
204
  cloud = LMC::Cloud.instance
205
- chosen_authorities = account.authorities.select {|auth| auth.name == options[:role]}
205
+ chosen_authorities = account.authorities.select { |auth| auth.name == options[:role] }
206
206
  args.each do |email|
207
207
  cloud.invite_user_to_account email, account.id, options[:type], chosen_authorities
208
208
  end
@@ -256,28 +256,37 @@ module LMCAdm
256
256
  update.flag :A, :account, :required => true
257
257
  update.desc 'authority id'
258
258
  update.flag 'add-authority'
259
- update.action do |_global_options, options, args|
259
+ update.desc 'authority name|id'
260
+ update.flag 'remove-authority'
261
+ update.action do |global_options, options, args|
260
262
  account = LMC::Account.get_by_uuid_or_name(options[:account])
263
+ account.cloud.auth_for_account account
261
264
  membership = account.find_member_by_name args.first
262
- puts membership
265
+ if global_options[:verbose]
266
+ puts "membership class: #{membership.class}"
267
+ puts "membership.authorities first class: #{membership.authorities.first.class}"
268
+ puts membership
269
+ end
270
+ authority_ids = membership.authorities.map do |a|
271
+ a.id
272
+ end
273
+ puts "Existing authority ids: #{authority_ids}"
263
274
  if options['add-authority']
264
- # new_authority = account.authorities.find do |a|
265
- # a.name == options['add-authority']
266
- # end
267
- puts membership.class
268
- puts membership.authorities.class
269
- authority_ids = membership.authorities.map do |a|
270
- a['id']
271
- end
272
- puts authority_ids
273
- authority_ids = authority_ids.concat [options['add-authority']]
274
- puts authority_ids
275
- # POST /accounts/{accountId}/members/{principalId}
276
- cloud = LMC::Cloud.instance
277
- cloud.auth_for_account account
278
- res = cloud.post ['cloud-service-auth', 'accounts', account.id, 'members', membership.id], {'authorities' => authority_ids}
279
- puts res
275
+ add_str = options['add-authority']
276
+ new_authority = Helpers::find_by_id_or_name account.authorities, add_str
277
+ authority_ids = authority_ids.concat [new_authority.id]
278
+ puts "Adding #{authority_ids}"
280
279
  end
280
+ if options['remove-authority']
281
+ remove_str = options['remove-authority']
282
+ deleting_authority = Helpers.find_by_id_or_name account.authorities, remove_str
283
+ puts "Removing #{deleting_authority}"
284
+ authority_ids = authority_ids - [deleting_authority.id]
285
+ end
286
+ puts "New authority ids: #{authority_ids}"
287
+ # POST /accounts/{accountId}/members/{principalId}
288
+ res = account.cloud.post ['cloud-service-auth', 'accounts', account.id, 'members', membership.id], { 'authorities' => authority_ids }
289
+ puts res
281
290
  end
282
291
  end
283
292
 
@@ -288,16 +297,12 @@ module LMCAdm
288
297
  children.flag :special
289
298
  children.action do |global_options, options, args|
290
299
  account = LMC::Account.get_by_uuid_or_name args.first
291
- cloud = LMC::Cloud.instance
292
300
 
293
301
  def recurse_childen account, indent_level
294
302
  children = account.children
295
303
  children.each do |child|
296
304
  puts ' ' * indent_level + child.to_s
297
- begin
298
- recurse_childen child, indent_level + 1
299
- rescue RestClient::Forbidden => e
300
- end
305
+ recurse_childen child, indent_level + 1
301
306
  end
302
307
  end
303
308
 
@@ -8,13 +8,15 @@ module LMCAdm
8
8
  command :cloud do |c|
9
9
  c.desc 'Check cloud connectivity'
10
10
  c.action do |global_options|
11
- lmcen = LMC::Cloud.new(global_options[:cloud_host], global_options[:user], global_options[:password])
11
+ lmcen = LMC::Cloud.instance
12
12
  puts "Base URL: #{lmcen.build_url}"
13
13
  puts "Cloud connection OK" if lmcen.auth_ok
14
14
  if global_options[:v]
15
15
  puts "authentication token: " + lmcen.session_token
16
16
  end
17
17
  end
18
+
19
+ c.desc 'Display cloud version information'
18
20
  c.command :about do |cloud_about|
19
21
  cloud_about.action do |global_options|
20
22
  cloud = LMC::Cloud.instance
@@ -84,6 +86,7 @@ module LMCAdm
84
86
  accounts = args.map { |a|
85
87
  LMC::Account.get_by_uuid_or_name a
86
88
  }
89
+ puts LMC::Cloud.instance.session_token if accounts.empty?
87
90
  accounts.each { |a|
88
91
  a.cloud.auth_for_account a
89
92
  puts a.cloud.session_token
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'chronic'
2
3
 
3
4
  module LMCAdm #:nodoc:
4
5
  desc 'Retrieve montoring data'
@@ -15,7 +16,7 @@ module LMCAdm #:nodoc:
15
16
  monitor_device.action do |_g, options, args|
16
17
  record_name = args.shift
17
18
  account = LMC::Account.get_by_uuid_or_name options[GLI::Command::PARENT][:account]
18
- device = account.devices.find {|d| d.name == options[:device]}
19
+ device = account.devices.find { |d| d.name == options[:device] }
19
20
  record = device.record record_name
20
21
 
21
22
  options[:scalar].each do |datapoint|
@@ -48,5 +49,50 @@ module LMCAdm #:nodoc:
48
49
  end
49
50
  end
50
51
  end
52
+
53
+ monitor.desc 'Make raw monitoring requests'
54
+ monitor.arg_name '<record> <name> <id>'
55
+ monitor.command :raw do |raw|
56
+ raw.flag :t, :type, default_value: 'scalar'
57
+ raw.flag :g, :group, default_value: 'DEVICE'
58
+ raw.flag :p, :period, default_value: 'MINUTE1'
59
+ raw.desc 'Start time'
60
+ raw.flag :start, default_value: 'one hour ago'
61
+ raw.flag :end, default_value: 'now'
62
+ raw.action do |_g, options, args|
63
+ record = args.shift
64
+ name = args.shift
65
+ groupId = args.shift
66
+ account = LMC::Account.get_by_uuid_or_name options[GLI::Command::PARENT][:account]
67
+ account.cloud.auth_for_account account
68
+
69
+ startTime = Chronic.parse(options[:start])
70
+ puts "Start time: #{startTime}" if _g[:verbose]
71
+ endTime = Chronic.parse(options[:end])
72
+ puts "End time: #{endTime}" if _g[:verbose]
73
+
74
+ # https://cloud.lancom.de/cloud-service-monitoring/accounts/399bc33a-7f53-4757-a6bd-cac3cbb6ebdd/records/wlan_info_json?type=scalar&name=stations&group=ACCOUNT&groupId=399bc33a-7f53-4757-a6bd-cac3cbb6ebdd&period=MINUTE1&start=1623417748&end=1623421348
75
+ # https://cloud.lancom.de/cloud-service-monitoring/accounts/399bc33a-7f53-4757-a6bd-cac3cbb6ebdd/records/device_info?type=scalar&name=cloud_rtt&group=DEVICE&groupId=efec12e1-ac4d-459d-bb5d-a9b6c1410eb5&period=MINUTE1&start=1623419874&end=1623423474
76
+ # https://cloud.lancom.de/cloud-service-monitoring/accounts/399bc33a-7f53-4757-a6bd-cac3cbb6ebdd/records/device_info?type=scalar&name=cloud_rtt&group=DEVICE&group_id=efec12e1-ac4d-459d-bb5d-a9b6c1410eb5&period=MINUTE1&start=1623419874&end=1623423474
77
+ result = account.cloud.get ['cloud-service-monitoring', 'accounts', account.id, 'records', record], {
78
+ type: options[:type],
79
+ name: name,
80
+ group: options[:group],
81
+ groupId: groupId,
82
+ period: options[:period],
83
+ start: startTime.to_i,
84
+ end: endTime.to_i,
85
+ }
86
+ monitordata = result.body.items[name]
87
+ puts result.body.inspect if _g[:debug]
88
+ if options[:type] == "scalar"
89
+ puts monitordata.values
90
+ elsif options[:type] == "json"
91
+ puts JSON.pretty_generate monitordata.to_h[:values]
92
+ end
93
+ end
94
+
95
+ end
96
+
51
97
  end
52
98
  end
@@ -7,7 +7,7 @@ module LMCAdm #:nodoc:
7
7
  preferences.arg_name 'accounts'
8
8
  preferences.command :lastaccounts do |la|
9
9
  la.action do |g, _o, args|
10
- cloud = LMC::Cloud.new(g[:cloud_host], g[:user], g[:password])
10
+ cloud = LMC::Cloud.instance
11
11
  self_ui = cloud.preferences [:principals, :self, :ui]
12
12
  if args.empty?
13
13
  ids = self_ui.get 'lastAccountIds'
@@ -15,7 +15,7 @@ module LMCAdm
15
15
  end
16
16
  rights.arg_name "rights"
17
17
  rights.command :assign do |assign|
18
- assign.flag :A
18
+ assign.flag :A, :account
19
19
  assign.flag :authority
20
20
  assign.flag :service
21
21
  assign.action do |_g, o, a |
@@ -23,9 +23,34 @@ module LMCAdm
23
23
  account = LMC::Account.get_by_uuid_or_name o[:A]
24
24
  c = LMC::Cloud.instance
25
25
  c.auth_for_account account
26
- c.post [o[:service], "accounts", account.id, 'authorities', o[:authority], 'rights' ], a
26
+ service_name = Helpers.complete_service_name o[:service]
27
+ c.post [service_name, "accounts", account.id, 'authorities', o[:authority], 'rights' ], a
27
28
 
28
29
  end
29
30
  end
31
+ rights.arg_name 'servicename account'
32
+ rights.desc 'example: lmcadm rights authorities messaging myproject'
33
+ rights.command :authorities do |authorities|
34
+ authorities.action do |_g, _o, a |
35
+ account = LMC::Account.get_by_uuid_or_name a[1]
36
+ account.cloud.auth_for_account account
37
+ authorities = account.cloud.get [Helpers.complete_service_name(a[0]), 'accounts', account.id, 'authorities']
38
+ tp authorities.body, [:name , :visibility, :type, :id]
39
+ end
40
+ end
41
+
42
+ rights.arg_name '<servicename> <account> <authority_id>'
43
+ rights.desc 'example: lmcadm rights show service-messaging myproject 5c244078-c937-4ff9-bb33-351f5253fe53'
44
+ rights.command :show do |show|
45
+ show.action do |_g, _o, a|
46
+ account = LMC::Account.get_by_uuid_or_name a[1]
47
+ account.cloud.auth_for_account account
48
+ service_name = Helpers.complete_service_name a[0]
49
+ authority = account.cloud.get([service_name, 'accounts', account.id, 'authorities', a[2]]).body
50
+ puts authority.to_h.to_s
51
+ rights = account.cloud.get([service_name, 'accounts', account.id, 'authorities', a[2], 'rights']).body
52
+ puts rights
53
+ end
54
+ end
30
55
  end
31
56
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ module LMCAdm
3
+ module Helpers
4
+ def self.find_by_id_or_name(list, search)
5
+ found = []
6
+ found += list.select do |item|
7
+ item.id == search
8
+ end
9
+ found += list.select do |item|
10
+ item.name == search
11
+ end
12
+ puts "More than one item found for: #{search}" if found.length > 1
13
+ raise "Not found: #{search}" if found.length < 1
14
+ return found.first
15
+ end
16
+ end
17
+ end
18
+
@@ -7,5 +7,15 @@ module LMCAdm
7
7
  end
8
8
  return max
9
9
  end
10
+
11
+ def self.complete_service_name(name)
12
+ if name.start_with? 'cloud-service-'
13
+ return name
14
+ end
15
+ if name.start_with? 'service-'
16
+ return 'cloud-' + name
17
+ end
18
+ return'cloud-service-' + name
19
+ end
10
20
  end
11
21
  end
@@ -1,3 +1,3 @@
1
1
  module LMCAdm
2
- VERSION = '0.14.0'
2
+ VERSION = '0.17.0'
3
3
  end
data/lmcadm.gemspec CHANGED
@@ -24,9 +24,10 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency "minitest", "~> 5.0"
25
25
  spec.add_development_dependency "pry-nav", "0.2.4"
26
26
 
27
- spec.add_runtime_dependency 'lmc', '~> 0.12.0'
27
+ spec.add_runtime_dependency 'lmc', '~> 0.14.0'
28
28
  spec.add_runtime_dependency 'gli', '~> 2.17'
29
29
  spec.add_runtime_dependency 'table_print', '~> 1.5'
30
30
  spec.add_runtime_dependency 'colorize', '~> 0.8'
31
31
  spec.add_runtime_dependency 'websocket-eventmachine-client', '~> 1.3.0'
32
+ spec.add_runtime_dependency 'chronic', '~> 0.10.2'
32
33
  end
@@ -0,0 +1,15 @@
1
+ # Temporary gemfile to be used by OCRA.
2
+ GEMFILE = 'ocra_gemfile'
3
+
4
+ # Add gems from gemspec.
5
+ ocra_gemfile = File.new(GEMFILE, 'w')
6
+ File.open("lmcadm.gemspec",'r') do |file|
7
+ file.each { |line| ocra_gemfile.write "gem #{$1}\n" if line =~ /spec.add_runtime_dependency (.+)/ }
8
+ end
9
+ ocra_gemfile.close
10
+
11
+ # Execute OCRA
12
+ #system("ocra --gemfile #{GEMFILE} --console script_name")
13
+
14
+ # Cleanup
15
+ #FileUtils.rm Dir.glob(GEMFILE)
data/ocra.sh ADDED
@@ -0,0 +1,2 @@
1
+ ruby makeocragemfile.rb
2
+ ocra --gemfile ocra_gemfile --gem-full exe/lmcadm
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lmcadm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.17.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-06-17 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: 0.12.0
75
+ version: 0.14.0
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: 0.12.0
82
+ version: 0.14.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: gli
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +136,21 @@ dependencies:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: 1.3.0
139
- description:
139
+ - !ruby/object:Gem::Dependency
140
+ name: chronic
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 0.10.2
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 0.10.2
153
+ description:
140
154
  email:
141
155
  - philipp@copythat.de
142
156
  executables:
@@ -144,6 +158,7 @@ executables:
144
158
  extensions: []
145
159
  extra_rdoc_files: []
146
160
  files:
161
+ - ".github/workflows/build-win.yaml"
147
162
  - ".gitignore"
148
163
  - ".idea/encodings.xml"
149
164
  - ".idea/inspectionProfiles/Project_Default.xml"
@@ -177,16 +192,19 @@ files:
177
192
  - lib/lmcadm/device_commands.rb
178
193
  - lib/lmcadm/helpers/args_helpers.rb
179
194
  - lib/lmcadm/helpers/device_helpers.rb
195
+ - lib/lmcadm/helpers/find_helpers.rb
180
196
  - lib/lmcadm/helpers/password_helper.rb
181
197
  - lib/lmcadm/helpers/string_helpers.rb
182
198
  - lib/lmcadm/version.rb
183
199
  - lmcadm
184
200
  - lmcadm.gemspec
185
- homepage:
201
+ - makeocragemfile.rb
202
+ - ocra.sh
203
+ homepage:
186
204
  licenses:
187
205
  - BSD-3-Clause
188
206
  metadata: {}
189
- post_install_message:
207
+ post_install_message:
190
208
  rdoc_options: []
191
209
  require_paths:
192
210
  - lib
@@ -202,7 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
220
  version: '0'
203
221
  requirements: []
204
222
  rubygems_version: 3.1.2
205
- signing_key:
223
+ signing_key:
206
224
  specification_version: 4
207
225
  summary: lmcadm is a command line client for LMC
208
226
  test_files: []