dtk-client 0.5.10 → 0.5.12
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 +8 -8
- data/bin/dtk +2 -3
- data/bin/dtk-shell +2 -3
- data/dtk-client.gemspec +1 -1
- data/lib/auxiliary.rb +32 -0
- data/lib/command_helpers/service_importer.rb +46 -6
- data/lib/commands/common/thor/action_result_handler.rb +52 -0
- data/lib/commands/common/thor/assembly_workspace.rb +21 -12
- data/lib/commands/common/thor/common.rb +17 -0
- data/lib/commands/common/thor/list_diffs.rb +1 -1
- data/lib/commands/common/thor/pull_from_remote.rb +39 -32
- data/lib/commands/common/thor/push_to_remote.rb +22 -20
- data/lib/commands/thor/account.rb +10 -19
- data/lib/commands/thor/component.rb +2 -1
- data/lib/commands/thor/component_module.rb +36 -48
- data/lib/commands/thor/developer.rb +1 -1
- data/lib/commands/thor/node.rb +31 -15
- data/lib/commands/thor/node_template.rb +4 -4
- data/lib/commands/thor/provider.rb +4 -4
- data/lib/commands/thor/service.rb +64 -64
- data/lib/commands/thor/service_module.rb +33 -54
- data/lib/commands/thor/workspace.rb +2 -1
- data/lib/configurator.rb +6 -1
- data/lib/core.rb +5 -5
- data/lib/domain/git_error_handler.rb +2 -0
- data/lib/domain/response.rb +2 -1
- data/lib/dtk-client/version.rb +1 -1
- data/lib/parser/adapters/thor.rb +1 -2
- data/lib/shell/domain.rb +8 -1
- data/lib/shell/help_monkey_patch.rb +33 -15
- data/lib/util/console.rb +2 -1
- data/lib/util/os_util.rb +1 -0
- data/lib/util/ssh_util.rb +76 -0
- metadata +7 -6
- data/lib/command_helpers/ssh_processing.rb +0 -43
@@ -1,6 +1,5 @@
|
|
1
1
|
#TODO: putting in version as hidden coption that can be enabled when code ready
|
2
2
|
#TODO: may be consistent on whether service module id or service module name used as params
|
3
|
-
dtk_require_from_base('command_helpers/ssh_processing')
|
4
3
|
dtk_require_from_base('command_helpers/service_importer')
|
5
4
|
dtk_require_common_commands('thor/clone')
|
6
5
|
dtk_require_common_commands('thor/push_to_remote')
|
@@ -14,6 +13,7 @@ dtk_require_from_base("commands/thor/assembly")
|
|
14
13
|
dtk_require_common_commands('thor/task_status')
|
15
14
|
dtk_require_common_commands('thor/set_required_params')
|
16
15
|
dtk_require_common_commands('thor/purge_clone')
|
16
|
+
dtk_require_common_commands('thor/common')
|
17
17
|
|
18
18
|
module DTK::Client
|
19
19
|
class ServiceModule < CommandBaseThor
|
@@ -49,8 +49,8 @@ module DTK::Client
|
|
49
49
|
PPColumns.get(:service_module)
|
50
50
|
end
|
51
51
|
|
52
|
-
def self.
|
53
|
-
|
52
|
+
def self.validation_list(context_params)
|
53
|
+
get_cached_response(:service_module, "service_module/list", {})
|
54
54
|
end
|
55
55
|
|
56
56
|
def self.override_allowed_methods()
|
@@ -84,7 +84,6 @@ module DTK::Client
|
|
84
84
|
##MERGE-QUESTION: need to add options of what info is about
|
85
85
|
desc "SERVICE-MODULE-NAME/ID info", "Provides information about specified service module"
|
86
86
|
def info(context_params)
|
87
|
-
#TODO Aldin
|
88
87
|
if context_params.is_there_identifier?(:assembly)
|
89
88
|
response = DTK::Client::ContextRouter.routeTask("assembly", "info", context_params, @conn)
|
90
89
|
else
|
@@ -131,8 +130,7 @@ module DTK::Client
|
|
131
130
|
# If user is on service level, list task can't have about value set
|
132
131
|
if (context_params.last_entity_name == :"service-module") and about.nil?
|
133
132
|
action = options.remote? ? "list_remote" : "list"
|
134
|
-
|
135
|
-
post_body = (options.remote? ? { :rsa_pub_key => SshProcessing.rsa_pub_key_content() } : {:detail_to_include => ["remotes"]})
|
133
|
+
post_body = (options.remote? ? { :rsa_pub_key => SSHUtil.rsa_pub_key_content() } : {:detail_to_include => ["remotes"]})
|
136
134
|
post_body[:diff] = options.diff? ? options.diff : {}
|
137
135
|
|
138
136
|
response = post rest_url("service_module/#{action}"), post_body
|
@@ -180,7 +178,7 @@ module DTK::Client
|
|
180
178
|
# post_body = {
|
181
179
|
# :service_module_id => service_module_id,
|
182
180
|
# :detail_to_include => ["remotes"],
|
183
|
-
# :rsa_pub_key =>
|
181
|
+
# :rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
184
182
|
# }
|
185
183
|
# response = post rest_url("service_module/versions"), post_body
|
186
184
|
|
@@ -207,7 +205,7 @@ module DTK::Client
|
|
207
205
|
post_body = {
|
208
206
|
:remote_module_name => remote_module_name,
|
209
207
|
:local_module_name => local_module_name,
|
210
|
-
:rsa_pub_key =>
|
208
|
+
:rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
211
209
|
}
|
212
210
|
|
213
211
|
response = post rest_url("service_module/import"), post_body
|
@@ -216,8 +214,10 @@ module DTK::Client
|
|
216
214
|
if (response.ok? && (missing_components = response.data(:missing_module_components)))
|
217
215
|
opts = {:do_not_raise=>true}
|
218
216
|
module_opts = ignore_component_error ? opts.merge(:ignore_component_error => true) : opts.merge(:additional_message=>true)
|
219
|
-
trigger_module_component_import(missing_components,module_opts)
|
220
|
-
|
217
|
+
continue = trigger_module_component_import(missing_components,module_opts)
|
218
|
+
return unless continue
|
219
|
+
|
220
|
+
puts "Resuming DTK Network import for service module '#{remote_module_name}' ..."
|
221
221
|
# repeat import call for service
|
222
222
|
post_body.merge!(opts)
|
223
223
|
response = post rest_url("service_module/import"), post_body
|
@@ -289,7 +289,7 @@ module DTK::Client
|
|
289
289
|
# post_body = {
|
290
290
|
# :service_module_id => service_module_id,
|
291
291
|
# :remote_component_name => input_remote_name,
|
292
|
-
# :rsa_pub_key =>
|
292
|
+
# :rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
293
293
|
# }
|
294
294
|
|
295
295
|
# post rest_url("service_module/export"), post_body
|
@@ -302,7 +302,7 @@ module DTK::Client
|
|
302
302
|
post_body = {
|
303
303
|
:service_module_id => service_module_id,
|
304
304
|
:remote_component_name => input_remote_name,
|
305
|
-
:rsa_pub_key =>
|
305
|
+
:rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
306
306
|
}
|
307
307
|
|
308
308
|
post rest_url("service_module/export"), post_body
|
@@ -347,34 +347,13 @@ module DTK::Client
|
|
347
347
|
# push_to_remote_aux(:service_module, service_module_id, service_module_name, options["namespace"], options["version"])
|
348
348
|
# end
|
349
349
|
|
350
|
-
# desc "SERVICE-MODULE-NAME/ID pull-from-dtkn [-v VERSION]", "Update local service module from remote repository."
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
# response = pull_from_remote_aux(:service_module,service_module_id,version)
|
358
|
-
# return response unless response.ok?
|
359
|
-
|
360
|
-
# if service_module_name.to_s =~ /^[0-9]+$/
|
361
|
-
# service_module_id = service_module_name
|
362
|
-
# service_module_name = get_service_module_name(service_module_id)
|
363
|
-
# end
|
364
|
-
|
365
|
-
# modules_path = OsUtil.service_clone_location()
|
366
|
-
# module_location = "#{modules_path}/#{service_module_name}#{version && "-#{version}"}"
|
367
|
-
|
368
|
-
# # server repo needs to be sync with local clone, so we will use push-clone-changes when pull changes from remote to local
|
369
|
-
# # to automatically sync local with server repo
|
370
|
-
# push_clone_changes_aux(:service_module,service_module_id,version,nil,true) if File.directory?(module_location)
|
371
|
-
# Response::Ok.new()
|
372
|
-
# end
|
373
|
-
|
374
|
-
# desc "SERVICE-MODULE-NAME/ID pull dtkn", "Update local service module from remote repository."
|
375
|
-
desc "SERVICE-MODULE-NAME/ID pull-dtkn", "Update local service module from remote repository."
|
350
|
+
# desc "SERVICE-MODULE-NAME/ID pull-from-dtkn [-n NAMESPACE] [-v VERSION]", "Update local service module from remote repository."
|
351
|
+
desc "SERVICE-MODULE-NAME/ID pull-dtkn [-n NAMESPACE]", "Update local service module from remote repository."
|
352
|
+
method_option "namespace",:aliases => "-n",
|
353
|
+
:type => :string,
|
354
|
+
:banner => "NAMESPACE",
|
355
|
+
:desc => "Remote namespace"
|
376
356
|
def pull_dtkn(context_params)
|
377
|
-
# service_module_id, service_module_name, catalog = context_params.retrieve_arguments([:service_module_id!,:service_module_name, :option_1],method_argument_names)
|
378
357
|
service_module_id, service_module_name = context_params.retrieve_arguments([:service_module_id!,:service_module_name],method_argument_names)
|
379
358
|
catalog = 'dtkn'
|
380
359
|
version = options["version"]
|
@@ -382,7 +361,8 @@ module DTK::Client
|
|
382
361
|
raise DtkValidationError, "You have to provide valid catalog to pull changes from! Valid catalogs: #{PullCatalogs}" unless catalog
|
383
362
|
|
384
363
|
if catalog.to_s.eql?("dtkn")
|
385
|
-
|
364
|
+
opts = {:version => version, :remote_namespace => options.namespace}
|
365
|
+
response = pull_from_remote_aux(:service_module,service_module_id,opts)
|
386
366
|
return response unless response.ok?
|
387
367
|
|
388
368
|
if service_module_name.to_s =~ /^[0-9]+$/
|
@@ -453,7 +433,7 @@ module DTK::Client
|
|
453
433
|
# service_module_id,version = context_params.retrieve_arguments([:service_module_id!,:option_1!],method_argument_names)
|
454
434
|
# post_body = {
|
455
435
|
# :service_module_id => service_module_id,
|
456
|
-
# :rsa_pub_key =>
|
436
|
+
# :rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
457
437
|
# }
|
458
438
|
# response = post rest_url("service_module/versions"), post_body
|
459
439
|
# return response unless response.ok?
|
@@ -632,24 +612,23 @@ module DTK::Client
|
|
632
612
|
modules_path = OsUtil.service_clone_location()
|
633
613
|
module_location = "#{modules_path}/#{service_module_name}#{version && "-#{version}"}"
|
634
614
|
reparse_aux(module_location) unless internal_trigger
|
615
|
+
|
635
616
|
if catalog.to_s.eql?("dtkn")
|
617
|
+
remote_module_info = get_remote_module_info_aux(:service_module, service_module_id, options["namespace"], version)
|
618
|
+
return remote_module_info unless remote_module_info.ok?
|
619
|
+
|
636
620
|
unless File.directory?(module_location)
|
637
|
-
|
638
|
-
response = clone_aux(:service_module,service_module_id,version,false)
|
639
|
-
|
640
|
-
if(response.nil? || response.ok?)
|
641
|
-
reparse_aux(module_location)
|
642
|
-
push_to_remote_aux(:service_module, service_module_id, service_module_name, options["namespace"], version) if Console.confirmation_prompt("Would you like to push changes to remote"+'?')
|
643
|
-
end
|
621
|
+
response = clone_aux(:service_module, service_module_id, version, true, true)
|
644
622
|
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
return
|
623
|
+
if(response.nil? || response.ok?)
|
624
|
+
reparse_aux(module_location)
|
625
|
+
response = push_to_remote_aux(remote_module_info, :service_module)
|
649
626
|
end
|
627
|
+
|
628
|
+
return response
|
650
629
|
end
|
651
630
|
|
652
|
-
push_to_remote_aux(:service_module
|
631
|
+
push_to_remote_aux(remote_module_info, :service_module)
|
653
632
|
else
|
654
633
|
raise DtkValidationError, "You have to provide valid catalog to push changes to!"
|
655
634
|
end
|
@@ -719,7 +698,7 @@ module DTK::Client
|
|
719
698
|
|
720
699
|
post_body = {
|
721
700
|
:remote_service_name => remote_service_name,
|
722
|
-
:rsa_pub_key =>
|
701
|
+
:rsa_pub_key => SSHUtil.rsa_pub_key_content()
|
723
702
|
}
|
724
703
|
response = post rest_url("service_module/delete_remote"), post_body
|
725
704
|
@@invalidate_map << :module_service
|
@@ -134,8 +134,9 @@ module DTK::Client
|
|
134
134
|
['set-attribute',"set-attribute ATTRIBUTE-NAME [VALUE] [-u]","# (Un)Set attribute value. The option -u will unset the attribute's value."],
|
135
135
|
['start', "start", "# Start node instance."],
|
136
136
|
['stop', "stop", "# Stop node instance."],
|
137
|
-
['ssh', "ssh [--keypair
|
137
|
+
['ssh', "ssh REMOTE-USER [--keypair PATH-TO-PEM]", "# SSH into node, optional parameters are path to keypair and remote user."]
|
138
138
|
],
|
139
|
+
|
139
140
|
:component => [
|
140
141
|
['info',"info","# Return info about component instance belonging to given node."],
|
141
142
|
['edit',"edit","# Edit component module related to given component."],
|
data/lib/configurator.rb
CHANGED
@@ -22,15 +22,20 @@ module DTK
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def self.check_config_exists
|
25
|
+
exists = true
|
25
26
|
if !File.exists?(CONFIG_FILE)
|
26
27
|
puts "", "Please enter the DTK server address (example: dtk.r8network.com)"
|
27
28
|
header = File.read(File.expand_path('../lib/config/client.conf.header', File.dirname(__FILE__)))
|
28
29
|
generate_conf_file(CONFIG_FILE, [['server_host', 'Server address']], header)
|
30
|
+
exists = false
|
29
31
|
end
|
30
32
|
if !File.exists?(CRED_FILE)
|
31
33
|
puts "", "Please enter your DTK login details"
|
32
34
|
generate_conf_file(CRED_FILE, [['username', 'Username'], ['password', 'Password']], '')
|
35
|
+
exists = false
|
33
36
|
end
|
37
|
+
|
38
|
+
exists
|
34
39
|
end
|
35
40
|
|
36
41
|
def self.check_git
|
@@ -45,7 +50,7 @@ module DTK
|
|
45
50
|
# return true/false, .add_direct_access file location and ssk key file location
|
46
51
|
def self.check_direct_access
|
47
52
|
username_exists = check_for_username_entry(client_username())
|
48
|
-
ssh_key_path =
|
53
|
+
ssh_key_path = SSHUtil.default_rsa_pub_key_path()
|
49
54
|
|
50
55
|
{:username_exists => username_exists, :file_path => DIRECT_ACCESS, :ssh_key_path => ssh_key_path}
|
51
56
|
end
|
data/lib/core.rb
CHANGED
@@ -11,6 +11,7 @@ require 'pp'
|
|
11
11
|
|
12
12
|
dtk_require_from_base('domain/response')
|
13
13
|
dtk_require_from_base('util/os_util')
|
14
|
+
dtk_require_from_base('util/ssh_util')
|
14
15
|
dtk_require("config/configuration")
|
15
16
|
|
16
17
|
def top_level_execute(entity_name, method_name, context_params=nil, options_args=nil, shell_execute=false)
|
@@ -111,15 +112,15 @@ def validate_connection(connection)
|
|
111
112
|
end
|
112
113
|
|
113
114
|
# check if .add_direct_access file exists, if not then add direct access and create .add_direct_access file
|
114
|
-
def resolve_direct_access(params)
|
115
|
+
def resolve_direct_access(params, config_exists=nil)
|
115
116
|
return if params[:username_exists]
|
116
117
|
|
117
|
-
puts "
|
118
|
+
puts "Processing..." if config_exists
|
118
119
|
# response = DTK::Client::Account.add_access(params[:ssh_key_path])
|
119
120
|
response, matched_pub_key, matched_username = DTK::Client::Account.add_key(params[:ssh_key_path])
|
120
121
|
|
121
122
|
if !response.ok?
|
122
|
-
DTK::Client::OsUtil.print("We were not able to add
|
123
|
+
DTK::Client::OsUtil.print("We were not able to add access for current user. #{response.error_message}. In order to properly use dtk-shell you will have to add access manually ('dtk account add-ssh-key').\n", :yellow)
|
123
124
|
elsif matched_pub_key
|
124
125
|
# message will be displayed by add key # TODO: Refactor this flow
|
125
126
|
DTK::Client::OsUtil.print("Provided SSH PUB key has already been added.", :yellow)
|
@@ -405,8 +406,7 @@ module DTK
|
|
405
406
|
response = post_raw rest_url("user/process_login"),creds
|
406
407
|
errors = response['errors']
|
407
408
|
|
408
|
-
if response.kind_of?(Common::Response) and not response.ok?
|
409
|
-
puts errors.first['code']
|
409
|
+
if response.kind_of?(Common::Response) and not response.ok?
|
410
410
|
if (errors && errors.first['code']=="pg_error")
|
411
411
|
DTK::Client::OsUtil.print(errors.first['message'].gsub!("403 Forbidden", "[PG_ERROR]"), :red)
|
412
412
|
exit
|
data/lib/domain/response.rb
CHANGED
data/lib/dtk-client/version.rb
CHANGED
data/lib/parser/adapters/thor.rb
CHANGED
@@ -39,8 +39,7 @@ module DTK
|
|
39
39
|
|
40
40
|
def self.execute_from_cli(conn,method_name,context_params,thor_options,shell_execution=false)
|
41
41
|
@@shell_execution = shell_execution
|
42
|
-
|
43
|
-
# I am sorry!
|
42
|
+
|
44
43
|
if method_name == 'help'
|
45
44
|
ret = start([method_name] + context_params.method_arguments,:conn => conn)
|
46
45
|
else
|
data/lib/shell/domain.rb
CHANGED
@@ -332,6 +332,14 @@ module DTK
|
|
332
332
|
@context_list.size > 2
|
333
333
|
end
|
334
334
|
|
335
|
+
def is_base_context?
|
336
|
+
@context_list.size == 1
|
337
|
+
end
|
338
|
+
|
339
|
+
def is_root_context?
|
340
|
+
@context_list.size == 0
|
341
|
+
end
|
342
|
+
|
335
343
|
def current_command?
|
336
344
|
return @context_list.empty? ? true : @context_list.last.is_command?
|
337
345
|
end
|
@@ -388,7 +396,6 @@ module DTK
|
|
388
396
|
def last_context()
|
389
397
|
return @context_list.empty? ? nil : @context_list.last
|
390
398
|
end
|
391
|
-
|
392
399
|
end
|
393
400
|
|
394
401
|
class CachedTasks < Hash
|
@@ -67,13 +67,15 @@ class Thor
|
|
67
67
|
if @@shell_context
|
68
68
|
unless @@shell_context.root?
|
69
69
|
|
70
|
+
active_context = @@shell_context.active_context
|
71
|
+
|
70
72
|
# first command we are using:
|
71
73
|
# e.g. dtk:\assembly\assembly1\node\node123> => command would be :assembly
|
72
|
-
command =
|
74
|
+
command = active_context.first_command_name.upcase
|
73
75
|
|
74
76
|
# is there identifier for given commands (first)
|
75
77
|
# e.g. dtk:\assembly\assembly1\node\node123> => identifier here would be 'assembly1'
|
76
|
-
is_there_identifier =
|
78
|
+
is_there_identifier = active_context.is_there_identifier_for_first_context?
|
77
79
|
|
78
80
|
# alternative providers
|
79
81
|
alt_identifiers = get_alternative_identifiers(command)
|
@@ -100,7 +102,7 @@ class Thor
|
|
100
102
|
# e.g. dtk:\assembly\assembly1\node\node123> THIS IS N-LEVEL CONTEXT
|
101
103
|
# e.g. dtk:\assembly\assembly1> THIS IS NOT N-LEVEL CONTEXT
|
102
104
|
#
|
103
|
-
if (
|
105
|
+
if (!active_context.is_n_context? || active_context.current_identifier?)
|
104
106
|
|
105
107
|
list.each do |help_item|
|
106
108
|
help_item.first.gsub!("^^", '') if help_item.first.include?("^^")
|
@@ -127,12 +129,12 @@ class Thor
|
|
127
129
|
else
|
128
130
|
# Adding alt identifiers here
|
129
131
|
if alt_matched_data
|
130
|
-
if
|
132
|
+
if active_context.current_alt_identifier?
|
131
133
|
help_item.first.gsub!(matched_data[0],'') unless help_item.nil?
|
132
134
|
filtered_list << overriden_help(override_tasks_obj, help_item, false)
|
133
135
|
end
|
134
136
|
else
|
135
|
-
unless
|
137
|
+
unless active_context.current_alt_identifier?
|
136
138
|
help_item.first.gsub!(matched_data[0],'') unless help_item.nil?
|
137
139
|
filtered_list << overriden_help(override_tasks_obj, help_item, false)
|
138
140
|
end
|
@@ -144,8 +146,8 @@ class Thor
|
|
144
146
|
|
145
147
|
# This will return commands that have identifiers
|
146
148
|
# e.g. dtk:\assembly\assembly1\node\node123> => ['assembly','node']
|
147
|
-
commands_that_have_identifiers =
|
148
|
-
is_n_level_context =
|
149
|
+
commands_that_have_identifiers = active_context.commands_that_have_identifiers()
|
150
|
+
is_n_level_context = active_context.command_list.size > 1
|
149
151
|
|
150
152
|
# first one does not count
|
151
153
|
if is_n_level_context
|
@@ -166,12 +168,12 @@ class Thor
|
|
166
168
|
end
|
167
169
|
|
168
170
|
if override_tasks_obj && is_n_level_context
|
169
|
-
last_entity_name =
|
171
|
+
last_entity_name = active_context.last_context_entity_name.to_sym
|
170
172
|
|
171
173
|
# we get commands task, and identifier tasks for given entity (e.g. :assembly)
|
172
174
|
command_o_tasks, identifier_o_tasks = override_tasks_obj.get_all_tasks(last_entity_name)
|
173
175
|
|
174
|
-
if
|
176
|
+
if active_context.current_identifier?
|
175
177
|
identifier_o_tasks.each do |o_task|
|
176
178
|
n_filter_list << [o_task[1],o_task[2]]
|
177
179
|
end
|
@@ -216,14 +218,30 @@ class Thor
|
|
216
218
|
shell.print_table(list, :indent => 2, :truncate => true)
|
217
219
|
shell.say
|
218
220
|
|
221
|
+
|
219
222
|
# print sub context information
|
220
|
-
|
221
|
-
|
222
|
-
#
|
223
|
+
sub_children = []
|
224
|
+
|
225
|
+
# current active context clazz
|
226
|
+
if @@shell_context
|
227
|
+
last_command_name = @@shell_context.active_context.last_command_name
|
228
|
+
command_clazz = DTK::Shell::Context.get_command_class(last_command_name)
|
229
|
+
|
230
|
+
if @@shell_context && @@shell_context.active_context.current_identifier?
|
231
|
+
sub_children += command_clazz.valid_children() if command_clazz.respond_to?(:valid_children)
|
232
|
+
sub_children += command_clazz.invisible_context_list()
|
233
|
+
else
|
234
|
+
if command_clazz.respond_to?(:validation_list)
|
235
|
+
sub_children += ["#{last_command_name}-identifier"]
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
unless sub_children.empty?
|
240
|
+
shell.say(" Change context (cc) to: #{sub_children.join(', ')}", :BOLD)
|
241
|
+
shell.say
|
242
|
+
end
|
243
|
+
end
|
223
244
|
|
224
|
-
# shell.say(" Change context (cc) to: #{sub_children.join(', ')}", :BOLD) unless sub_children.empty?
|
225
|
-
# shell.say
|
226
|
-
# end
|
227
245
|
|
228
246
|
class_options_help(shell)
|
229
247
|
end
|
data/lib/util/console.rb
CHANGED
@@ -120,7 +120,8 @@ module DTK::Client
|
|
120
120
|
reparse_aux(path)
|
121
121
|
push_clone_changes_aux(module_type, module_id, version, commit_msg)
|
122
122
|
else
|
123
|
-
|
123
|
+
# we are sending stderr to stdout
|
124
|
+
system("#{line} 2>&1")
|
124
125
|
end
|
125
126
|
rescue Exception => e
|
126
127
|
DtkLogger.instance.error_pp(e.message, e.backtrace)
|
data/lib/util/os_util.rb
CHANGED
@@ -233,6 +233,7 @@ module DTK
|
|
233
233
|
def dev_reload_shell()
|
234
234
|
suspend_output do
|
235
235
|
load File.expand_path('../../lib/util/os_util.rb', File.dirname(__FILE__))
|
236
|
+
load File.expand_path('../../lib/util/ssh_util.rb', File.dirname(__FILE__))
|
236
237
|
load File.expand_path('../../lib/shell/help_monkey_patch.rb', File.dirname(__FILE__))
|
237
238
|
load File.expand_path('../../lib/shell/domain.rb', File.dirname(__FILE__))
|
238
239
|
load File.expand_path('../../lib/domain/git_adapter.rb', File.dirname(__FILE__))
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module DTK
|
2
|
+
module Client
|
3
|
+
module SSHUtil
|
4
|
+
|
5
|
+
def self.read_and_validate_pub_key(path_to_pub_key)
|
6
|
+
is_ssh_key_path_valid?(path_to_pub_key)
|
7
|
+
rsa_pub_key = File.open(path_to_pub_key) { |f| f.read }
|
8
|
+
is_ssh_key_content_valid?(rsa_pub_key)
|
9
|
+
rsa_pub_key
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.update_ssh_known_hosts(server_dns,server_fingerprint)
|
13
|
+
known_hosts_path = ssh_known_hosts_path()
|
14
|
+
if File.file?(known_hosts_path)
|
15
|
+
`ssh-keygen -f #{known_hosts_path} -R #{server_dns} 2> /dev/null`
|
16
|
+
File.open(known_hosts_path,"a"){|f|f << server_fingerprint}
|
17
|
+
else
|
18
|
+
ssh_base_dir = ssh_base_dir()
|
19
|
+
unless File.directory?(ssh_base_dir)
|
20
|
+
Dir.mkdir(ssh_base_dir)
|
21
|
+
end
|
22
|
+
File.open(known_hosts_path,"w"){|f|f << server_fingerprint}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.default_rsa_pub_key_path()
|
27
|
+
"#{ssh_base_dir()}/id_rsa.pub"
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.rsa_pub_key_content()
|
31
|
+
path_to_key = self.default_rsa_pub_key_path()
|
32
|
+
unless File.file?(path_to_key)
|
33
|
+
raise DtkError,"No File found at (#{path_to_key}). Path is wrong or it is necessary to generate the public rsa key (e.g., run ssh-keygen -t rsa)"
|
34
|
+
end
|
35
|
+
|
36
|
+
content = File.open(path_to_key){ |f| f.read }
|
37
|
+
content.chomp
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.ssh_reachable?(user, server, timeout = 3)
|
41
|
+
output = `ssh -o ConnectTimeout=#{timeout} -o \"StrictHostKeyChecking no\" -o \"UserKnownHostsFile /dev/null\" -q #{user}@#{server} exit; echo $?`
|
42
|
+
|
43
|
+
# if response 0 than it is able to connect
|
44
|
+
"0".eql?(output.strip())
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def self.ssh_base_dir()
|
51
|
+
"#{ENV['HOME']}/.ssh" #TODO: very brittle
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.ssh_known_hosts_path()
|
55
|
+
"#{ssh_base_dir()}/known_hosts"
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.is_ssh_key_path_valid?(path_to_key)
|
59
|
+
unless path_to_key.include?(".pub")
|
60
|
+
raise DtkError, "[ERROR] Invalid public key file path (#{path_to_key}). Please provide valid path and try again."
|
61
|
+
end
|
62
|
+
|
63
|
+
unless File.exists?(path_to_key)
|
64
|
+
raise DtkError, "[ERROR] Not able to find provided key (#{path_to_key}). Please provide valid path and try again."
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.is_ssh_key_content_valid?(rsa_pub_key)
|
69
|
+
if(rsa_pub_key.empty? || !rsa_pub_key.include?("AAAAB3NzaC1yc2EA"))
|
70
|
+
raise DtkError, "[ERROR] SSH public key (#{path_to_key}) does not have valid content. Please check your key and try again."
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtk-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rich PELAVIN
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.5.
|
117
|
+
version: 0.5.10
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - ~>
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.5.
|
124
|
+
version: 0.5.10
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: git
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -202,7 +202,7 @@ files:
|
|
202
202
|
- lib/command_helpers/jenkins_client.rb
|
203
203
|
- lib/command_helpers/service_importer.rb
|
204
204
|
- lib/command_helpers/service_link.rb
|
205
|
-
- lib/
|
205
|
+
- lib/commands/common/thor/action_result_handler.rb
|
206
206
|
- lib/commands/common/thor/assembly_workspace.rb
|
207
207
|
- lib/commands/common/thor/clone.rb
|
208
208
|
- lib/commands/common/thor/common.rb
|
@@ -273,6 +273,7 @@ files:
|
|
273
273
|
- lib/util/console.rb
|
274
274
|
- lib/util/dtk_puppet.rb
|
275
275
|
- lib/util/os_util.rb
|
276
|
+
- lib/util/ssh_util.rb
|
276
277
|
- lib/view_processor/augmented_simple_list.rb
|
277
278
|
- lib/view_processor/hash_pretty_print.rb
|
278
279
|
- lib/view_processor/simple_list.rb
|
@@ -326,7 +327,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
326
327
|
version: '0'
|
327
328
|
requirements: []
|
328
329
|
rubyforge_project:
|
329
|
-
rubygems_version: 2.1.
|
330
|
+
rubygems_version: 2.1.9
|
330
331
|
signing_key:
|
331
332
|
specification_version: 4
|
332
333
|
summary: DTK CLI client for DTK server interaction.
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module DTK; module Client
|
2
|
-
class SshProcessing
|
3
|
-
def self.update_ssh_known_hosts(server_dns,server_fingerprint)
|
4
|
-
known_hosts_path = ssh_known_hosts_path()
|
5
|
-
if File.file?(known_hosts_path)
|
6
|
-
`ssh-keygen -f #{known_hosts_path} -R #{server_dns} 2> /dev/null`
|
7
|
-
File.open(known_hosts_path,"a"){|f|f << server_fingerprint}
|
8
|
-
else
|
9
|
-
ssh_base_dir = ssh_base_dir()
|
10
|
-
unless File.directory?(ssh_base_dir)
|
11
|
-
Dir.mkdir(ssh_base_dir)
|
12
|
-
end
|
13
|
-
File.open(known_hosts_path,"w"){|f|f << server_fingerprint}
|
14
|
-
end
|
15
|
-
end
|
16
|
-
def self.default_rsa_pub_key_path()
|
17
|
-
"#{ssh_base_dir()}/id_rsa.pub"
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.rsa_pub_key_content()
|
21
|
-
path_to_key = self.default_rsa_pub_key_path()
|
22
|
-
unless File.file?(path_to_key)
|
23
|
-
raise DtkError,"No File found at (#{path_to_key}). Path is wrong or it is necessary to generate the public rsa key (e.g., run ssh-keygen -t rsa)"
|
24
|
-
end
|
25
|
-
|
26
|
-
content = File.open(path_to_key){ |f| f.read }
|
27
|
-
content.chomp
|
28
|
-
end
|
29
|
-
|
30
|
-
|
31
|
-
private
|
32
|
-
def self.ssh_base_dir()
|
33
|
-
"#{ENV['HOME']}/.ssh" #TODO: very brittle
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.ssh_known_hosts_path()
|
37
|
-
"#{ssh_base_dir()}/known_hosts"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end; end
|
41
|
-
|
42
|
-
|
43
|
-
|