lmcadm 0.12.1 → 0.16.1
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 +4 -4
- data/.gitignore +2 -0
- data/README.md +25 -0
- data/Rakefile +6 -1
- data/dev_lmcadm +4 -0
- data/exe/lmcadm +28 -8
- data/lib/lmcadm.rb +0 -4
- data/lib/lmcadm/account_commands.rb +48 -40
- data/lib/lmcadm/cloud_commands.rb +4 -1
- data/lib/lmcadm/commands/maintenance.rb +18 -2
- data/lib/lmcadm/commands/preferences.rb +31 -0
- data/lib/lmcadm/commands/rights.rb +27 -2
- data/lib/lmcadm/commands/terminal.rb +16 -8
- data/lib/lmcadm/helpers/args_helpers.rb +21 -0
- data/lib/lmcadm/helpers/find_helpers.rb +18 -0
- data/lib/lmcadm/helpers/password_helper.rb +1 -1
- data/lib/lmcadm/helpers/string_helpers.rb +10 -0
- data/lib/lmcadm/version.rb +1 -1
- data/lmcadm.gemspec +1 -1
- data/makeocragemfile.rb +15 -0
- data/ocra.sh +2 -0
- metadata +15 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a453803697879b159426c5b7a1b88c8eacdc8cb8b1913c1a1eb3997133ad21b9
|
4
|
+
data.tar.gz: 48fcd4dddff59446833f468fc93e2d942cdf37b940d9a3c91f466981fa7a9a71
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00d7640ab1100bc653a6717803a0b469950ad930f7b897997da4b778cb4835921c8ee2a5cbc3ca6303c7bd072a41b752aaada5bb91eb96111b2389b058da0fe1
|
7
|
+
data.tar.gz: 6ab293d8bb3a987243d6a57eae982eb1d7ac1bec6d04d6dce0aadb22ae9a1d84779528e49c50a43808a1a0d735af85b597b779fad620bfb3d9ff7eff80b41ddc
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,26 @@ 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
|
+
|
24
|
+
*Unable to load the EventMachine C extension ; To use the pure-ruby reactor, require 'em/pure_ruby'*
|
25
|
+
|
26
|
+
Workaround: Reinstall eventmachine with --platform ruby.
|
27
|
+
|
28
|
+
gem uninstall eventmachine (select all versions if prompted)
|
29
|
+
gem install eventmachine --platform ruby
|
30
|
+
|
11
31
|
## Usage
|
12
32
|
|
13
33
|
The primary usage documentation is in the help output of lmcadm:
|
@@ -26,6 +46,11 @@ Set the environment variable LMCADM\_PATH\_DEP to 1 to use the _lmc_ gem from ..
|
|
26
46
|
Example:
|
27
47
|
$ LMCADM_PATH_DEP=1 bundle exec lmcadm --version
|
28
48
|
|
49
|
+
### Building an exe for windows using ocra
|
50
|
+
|
51
|
+
* Apply workaround reinstalling eventmachine (see above)
|
52
|
+
* run ocra.sh
|
53
|
+
|
29
54
|
## Contributing
|
30
55
|
|
31
56
|
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/lmcadm.
|
data/Rakefile
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
2
|
require "rake/testtask"
|
3
|
+
require 'rdoc/task'
|
3
4
|
|
4
5
|
Rake::TestTask.new(:test) do |t|
|
5
6
|
t.libs << "test"
|
6
7
|
t.libs << "lib"
|
7
8
|
t.test_files = FileList["test/**/*_test.rb"]
|
8
9
|
end
|
9
|
-
|
10
|
+
RDoc::Task.new do |rdoc|
|
11
|
+
rdoc.rdoc_dir = 'doc'
|
12
|
+
#rdoc.main = "README.rdoc"
|
13
|
+
#rdoc.rdoc_files.include("lib/lmcadm/helpers/args_helpers.rb")
|
14
|
+
end
|
10
15
|
task :default => :test
|
data/dev_lmcadm
ADDED
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
|
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 '
|
36
|
+
desc 'LMC host, may include a port number'
|
37
37
|
default_value "cloud.lancom.de"
|
38
|
-
flag :
|
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 "
|
50
|
-
flag :
|
49
|
+
default_value ""
|
50
|
+
flag :user, :U
|
51
51
|
|
52
52
|
desc 'password'
|
53
53
|
default_value ""
|
54
|
-
flag [:
|
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
|
64
|
-
global[:
|
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
|
data/lib/lmcadm.rb
CHANGED
@@ -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.
|
19
|
+
lmcen = LMC::Cloud.instance
|
20
20
|
t.done
|
21
21
|
t = ProgressVisualizer.new "Getting accounts"
|
22
22
|
accounts = lmcen.get_accounts_objects
|
@@ -26,12 +26,12 @@ 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
|
-
puts account
|
32
|
+
puts account.summary
|
33
33
|
else
|
34
|
-
puts
|
34
|
+
puts "\"#{account}\" (#{account["type"]})"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
puts accounts.length.to_s + " Accounts found"
|
@@ -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
|
-
|
87
|
-
|
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,40 @@ module LMCAdm
|
|
256
256
|
update.flag :A, :account, :required => true
|
257
257
|
update.desc 'authority id'
|
258
258
|
update.flag 'add-authority'
|
259
|
-
update.
|
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
|
+
puts "membership class: #{membership.class}"
|
266
|
+
puts "membership.authorities first class: #{membership.authorities.first.class}"
|
267
|
+
|
268
|
+
#real_membership = LMC::Membership.new membership
|
269
|
+
#puts real_membership.inspect
|
270
|
+
|
271
|
+
|
272
|
+
puts membership if global_options[:verbose]
|
273
|
+
authority_ids = membership.authorities.map do |a|
|
274
|
+
a.id
|
275
|
+
end
|
276
|
+
puts "Existing authority ids: #{authority_ids}"
|
263
277
|
if options['add-authority']
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
puts
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
puts
|
273
|
-
authority_ids = authority_ids
|
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
|
278
|
+
add_str = options['add-authority']
|
279
|
+
new_authority = Helpers::find_by_id_or_name membership.authorities, add_str
|
280
|
+
authority_ids = authority_ids.concat [new_authority.id]
|
281
|
+
puts "Adding #{authority_ids}"
|
282
|
+
end
|
283
|
+
if options['remove-authority']
|
284
|
+
remove_str = options['remove-authority']
|
285
|
+
deleting_authority = Helpers.find_by_id_or_name account.authorities, remove_str
|
286
|
+
puts "Removing #{deleting_authority}"
|
287
|
+
authority_ids = authority_ids - [deleting_authority.id]
|
280
288
|
end
|
289
|
+
puts "New authority ids: #{authority_ids}"
|
290
|
+
# POST /accounts/{accountId}/members/{principalId}
|
291
|
+
res = account.cloud.post ['cloud-service-auth', 'accounts', account.id, 'members', membership.id], { 'authorities' => authority_ids }
|
292
|
+
puts res
|
281
293
|
end
|
282
294
|
end
|
283
295
|
|
@@ -288,16 +300,12 @@ module LMCAdm
|
|
288
300
|
children.flag :special
|
289
301
|
children.action do |global_options, options, args|
|
290
302
|
account = LMC::Account.get_by_uuid_or_name args.first
|
291
|
-
cloud = LMC::Cloud.instance
|
292
303
|
|
293
304
|
def recurse_childen account, indent_level
|
294
305
|
children = account.children
|
295
306
|
children.each do |child|
|
296
307
|
puts ' ' * indent_level + child.to_s
|
297
|
-
|
298
|
-
recurse_childen child, indent_level + 1
|
299
|
-
rescue RestClient::Forbidden => e
|
300
|
-
end
|
308
|
+
recurse_childen child, indent_level + 1
|
301
309
|
end
|
302
310
|
end
|
303
311
|
|
@@ -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.
|
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
|
@@ -27,6 +29,7 @@ module LMCAdm
|
|
27
29
|
}}
|
28
30
|
tp backstage_infos
|
29
31
|
puts '---'
|
32
|
+
puts "Base URL: #{cloud.build_url}"
|
30
33
|
puts "Principal: #{LMC::Principal.get_self(cloud)}"
|
31
34
|
|
32
35
|
end
|
@@ -7,7 +7,7 @@ module LMCAdm
|
|
7
7
|
root_account = LMC::Account.get LMC::Account::ROOT_ACCOUNT_UUID
|
8
8
|
cloud = LMC::Cloud.instance
|
9
9
|
cloud.auth_for_account root_account
|
10
|
-
result = cloud.post ['cloud-service-devices', 'maintenance', 'licenses', 'resync'], {
|
10
|
+
result = cloud.post ['cloud-service-devices', 'maintenance', 'licenses', 'resync'], {'accountId' => args[0]}
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
@@ -33,10 +33,11 @@ module LMCAdm
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
maintenance.arg_name 'UUID'
|
36
|
+
maintenance.arg_name 'UUID'
|
37
37
|
maintenance.desc 'Exempt user from brute force blocking'
|
38
38
|
maintenance.command :whitelist do |wl|
|
39
39
|
wl.action do |_g, _o, args|
|
40
|
+
Helpers.ensure_arg args, kind: 'user uuid'
|
40
41
|
cloud = LMC::Cloud.instance
|
41
42
|
root_account = LMC::Account.get LMC::Account::ROOT_ACCOUNT_UUID
|
42
43
|
cloud.auth_for_account root_account
|
@@ -45,5 +46,20 @@ module LMCAdm
|
|
45
46
|
cloud.post url_components, {}
|
46
47
|
end
|
47
48
|
end
|
49
|
+
|
50
|
+
maintenance.arg_name 'UUID', required: true
|
51
|
+
maintenance.desc 'Remove entity from blacklist'
|
52
|
+
maintenance.command :unblacklist do |unbl|
|
53
|
+
unbl.flag 'entity-type', :t, desc: 'Entity type. Choose "principals" or "accounts".', required: true
|
54
|
+
unbl.flag 'process-type', :p, desc: 'Process type', default_value: 'CLAIMING'
|
55
|
+
unbl.action do |_g, o, args|
|
56
|
+
Helpers.ensure_arg args, kind: 'entity uuid'
|
57
|
+
cloud = LMC::Cloud.instance
|
58
|
+
root_account = LMC::Account.get LMC::Account::ROOT_ACCOUNT_UUID
|
59
|
+
cloud.auth_for_account root_account
|
60
|
+
url_components = ['cloud-service-devices', 'accesscontrol', o['process-type'], o['entity-type'], args.first]
|
61
|
+
cloud.delete url_components
|
62
|
+
end
|
63
|
+
end
|
48
64
|
end
|
49
65
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module LMCAdm #:nodoc:
|
4
|
+
desc 'Manipulate preferences'
|
5
|
+
command :preferences do |preferences|
|
6
|
+
preferences.desc 'Get last account data'
|
7
|
+
preferences.arg_name 'accounts'
|
8
|
+
preferences.command :lastaccounts do |la|
|
9
|
+
la.action do |g, _o, args|
|
10
|
+
cloud = LMC::Cloud.instance
|
11
|
+
self_ui = cloud.preferences [:principals, :self, :ui]
|
12
|
+
if args.empty?
|
13
|
+
ids = self_ui.get 'lastAccountIds'
|
14
|
+
accounts = ids.map do |id|
|
15
|
+
LMC::Account.get id
|
16
|
+
end
|
17
|
+
accounts.each { |a|
|
18
|
+
puts a.summary
|
19
|
+
}
|
20
|
+
else
|
21
|
+
account_ids = args.map { |arg|
|
22
|
+
LMC::Account.get_by_uuid_or_name(arg).id
|
23
|
+
}
|
24
|
+
puts account_ids
|
25
|
+
puts self_ui.put 'lastAccountIds', account_ids
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
@@ -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
|
-
|
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
|
@@ -50,8 +50,8 @@ module LMCAdm
|
|
50
50
|
begin
|
51
51
|
EventMachine.epoll
|
52
52
|
EventMachine.run do
|
53
|
-
trap("TERM") { stop g[:debug]}
|
54
|
-
trap("INT") { stop g[:debug]}
|
53
|
+
trap("TERM") { stop g[:debug] }
|
54
|
+
trap("INT") { stop g[:debug] }
|
55
55
|
IO.console.raw!
|
56
56
|
EventMachine.open_keyboard(LMCAdm::KeyboardHandler)
|
57
57
|
@ws = WebSocket::EventMachine::Client.connect({uri: url, headers: headers_hash})
|
@@ -59,19 +59,27 @@ module LMCAdm
|
|
59
59
|
|
60
60
|
@ws.onopen do
|
61
61
|
print "Connected to #{device.name} (#{device.id}):\r\n"
|
62
|
+
remaining_args = args.drop(1)
|
63
|
+
if remaining_args.length > 0
|
64
|
+
@ws.send '1' + remaining_args.join(' ') + "\r", type: 'binary'
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
@ws.onmessage do |msg, type|
|
65
69
|
print "##{msg.length}##{msg.inspect}#" if g[:debug]
|
70
|
+
# respond to custom keepalive
|
71
|
+
if msg.start_with? '0'
|
72
|
+
@ws.send '0', type: 'binary'
|
73
|
+
end
|
66
74
|
if msg.start_with? "1"
|
67
|
-
print msg[1..-1].gsub("\n","\r\n")
|
75
|
+
print msg[1..-1].gsub("\n", "\r\n")
|
68
76
|
else
|
69
77
|
print msg if g[:debug]
|
70
78
|
end
|
71
79
|
print DateTime.now.to_s if g[:debug]
|
72
80
|
if msg.include? "\n\nGoodbye\n\n"
|
73
81
|
stop g[:debug]
|
74
|
-
closing =
|
82
|
+
closing = true
|
75
83
|
end
|
76
84
|
end
|
77
85
|
|
@@ -93,7 +101,7 @@ module LMCAdm
|
|
93
101
|
puts "Received pong: #{msg}" if g[:verbose]
|
94
102
|
end
|
95
103
|
|
96
|
-
def stop(debug=false)
|
104
|
+
def stop(debug = false)
|
97
105
|
print DateTime.now.to_s if debug
|
98
106
|
print "Terminating connection\r\n"
|
99
107
|
EventMachine.stop
|
@@ -102,9 +110,9 @@ module LMCAdm
|
|
102
110
|
ensure
|
103
111
|
IO.console.cooked!
|
104
112
|
end
|
105
|
-
|
106
|
-
|
107
|
-
|
113
|
+
# disabled, getting 401 anyways
|
114
|
+
#account.cloud.auth_for_account account
|
115
|
+
#account.cloud.delete ['cloud-service-devicetunnel', 'accounts', account.id, "terminal?ids=#{sessionInfo.body.first['id']}"]
|
108
116
|
end
|
109
117
|
end
|
110
118
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module LMCAdm
|
3
|
+
module Helpers
|
4
|
+
# Verifies that args contains at least one object.
|
5
|
+
# Raises RuntimeError with either the given message or an error explaining that kind is expected.
|
6
|
+
#
|
7
|
+
# @param [Object] args
|
8
|
+
# @param [String (frozen)] kind optional
|
9
|
+
# @param [Object] message optional
|
10
|
+
def self.ensure_arg(args, kind: 'argument', message: nil)
|
11
|
+
error = ""
|
12
|
+
if args.length < 1
|
13
|
+
error = "Argument missing: No #{kind} specified."
|
14
|
+
error = message if message
|
15
|
+
end
|
16
|
+
raise error unless error.empty?
|
17
|
+
return args
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -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
|
data/lib/lmcadm/version.rb
CHANGED
data/lmcadm.gemspec
CHANGED
@@ -24,7 +24,7 @@ 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.
|
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'
|
data/makeocragemfile.rb
ADDED
@@ -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_.*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
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.
|
4
|
+
version: 0.16.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- erpel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-21 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.
|
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.
|
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,7 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 1.3.0
|
139
|
-
description:
|
139
|
+
description:
|
140
140
|
email:
|
141
141
|
- philipp@copythat.de
|
142
142
|
executables:
|
@@ -155,6 +155,7 @@ files:
|
|
155
155
|
- Rakefile
|
156
156
|
- bin/console
|
157
157
|
- bin/setup
|
158
|
+
- dev_lmcadm
|
158
159
|
- exe/lmcadm
|
159
160
|
- lib/lmcadm.rb
|
160
161
|
- lib/lmcadm/ColoredProgressVisualizer.rb
|
@@ -167,23 +168,28 @@ files:
|
|
167
168
|
- lib/lmcadm/commands/completion.rb
|
168
169
|
- lib/lmcadm/commands/maintenance.rb
|
169
170
|
- lib/lmcadm/commands/monitor.rb
|
171
|
+
- lib/lmcadm/commands/preferences.rb
|
170
172
|
- lib/lmcadm/commands/principal.rb
|
171
173
|
- lib/lmcadm/commands/privatecloud.rb
|
172
174
|
- lib/lmcadm/commands/rights.rb
|
173
175
|
- lib/lmcadm/commands/terminal.rb
|
174
176
|
- lib/lmcadm/config_commands.rb
|
175
177
|
- lib/lmcadm/device_commands.rb
|
178
|
+
- lib/lmcadm/helpers/args_helpers.rb
|
176
179
|
- lib/lmcadm/helpers/device_helpers.rb
|
180
|
+
- lib/lmcadm/helpers/find_helpers.rb
|
177
181
|
- lib/lmcadm/helpers/password_helper.rb
|
178
182
|
- lib/lmcadm/helpers/string_helpers.rb
|
179
183
|
- lib/lmcadm/version.rb
|
180
184
|
- lmcadm
|
181
185
|
- lmcadm.gemspec
|
182
|
-
|
186
|
+
- makeocragemfile.rb
|
187
|
+
- ocra.sh
|
188
|
+
homepage:
|
183
189
|
licenses:
|
184
190
|
- BSD-3-Clause
|
185
191
|
metadata: {}
|
186
|
-
post_install_message:
|
192
|
+
post_install_message:
|
187
193
|
rdoc_options: []
|
188
194
|
require_paths:
|
189
195
|
- lib
|
@@ -199,7 +205,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
205
|
version: '0'
|
200
206
|
requirements: []
|
201
207
|
rubygems_version: 3.1.2
|
202
|
-
signing_key:
|
208
|
+
signing_key:
|
203
209
|
specification_version: 4
|
204
210
|
summary: lmcadm is a command line client for LMC
|
205
211
|
test_files: []
|