lmcadm 0.12.1 → 0.16.1
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|