govuk-connect 0.1.0 → 0.3.3
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/lib/govuk_connect/cli.rb +261 -158
- data/lib/govuk_connect/version.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a1b3a80c3eec55973d5a21f131f0a12d836578d702488f9eed8cf20acf1042d
|
4
|
+
data.tar.gz: d91a53b4f152ba3609e71b4e4bdbe0918bb8090443b950ddefd3811dc19cbe6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff8f442e71c562b001119fb5c5eb92958d3e1b2a1da7dd31f9ca2d6483e693a62ca383797ced30d2130662ef1ce94a8aa3c5d6e890124066bbc914edfdcef52e
|
7
|
+
data.tar.gz: fa0ecc08631861e15aa2cfd6dacb3299e1783df665b2e3e4b0b9eec9c45019819fbb40c7e9a491fc66bf03a72b44da1bb88428efebadbe5955f58676e2cbd69c
|
data/lib/govuk_connect/cli.rb
CHANGED
@@ -15,37 +15,41 @@ class GovukConnect::CLI
|
|
15
15
|
self.class.bold(string)
|
16
16
|
end
|
17
17
|
|
18
|
-
USAGE_BANNER = "Usage: govuk
|
18
|
+
USAGE_BANNER = "Usage: gds govuk connect TYPE TARGET [options]".freeze
|
19
19
|
|
20
20
|
EXAMPLES = <<-EXAMPLES.freeze
|
21
|
-
govuk
|
21
|
+
gds govuk connect ssh --environment integration backend
|
22
22
|
|
23
|
-
govuk
|
23
|
+
gds govuk connect scp-push --environment integration backend filename.txt /tmp/
|
24
24
|
|
25
|
-
govuk
|
25
|
+
gds govuk connect scp-pull --environment integration backend /tmp/filename.txt ~/Downloads/
|
26
26
|
|
27
|
-
govuk
|
27
|
+
gds govuk connect app-console --environment staging publishing-api
|
28
28
|
|
29
|
-
govuk
|
29
|
+
gds govuk connect app-dbconsole -e integration whitehall_backend/whitehall
|
30
|
+
|
31
|
+
gds govuk connect rabbitmq -e staging aws/rabbitmq
|
32
|
+
|
33
|
+
gds govuk connect sidekiq-monitoring -e integration
|
30
34
|
EXAMPLES
|
31
35
|
|
32
36
|
MACHINE_TARGET_DESCRIPTION = <<-DOCS.freeze
|
33
|
-
The ssh, rabbitmq and sidekiq-monitoring connection types target
|
37
|
+
The ssh, scp-*, rabbitmq and sidekiq-monitoring connection types target
|
34
38
|
machines.
|
35
39
|
|
36
40
|
The machine can be specified by name, for example:
|
37
41
|
|
38
|
-
govuk
|
42
|
+
gds govuk connect ssh -e integration #{bold('backend')}
|
39
43
|
|
40
44
|
If the hosting provider is ambiguous, you'll need to specify it prior
|
41
45
|
to the name, for example:
|
42
46
|
|
43
|
-
govuk
|
47
|
+
gds govuk connect ssh -e staging #{bold('aws/')}backend
|
44
48
|
|
45
49
|
If you want to connect to a specific machine, you can specify a number
|
46
50
|
after the name, for example:
|
47
51
|
|
48
|
-
govuk
|
52
|
+
gds govuk connect ssh -e integration backend#{bold(':2')}
|
49
53
|
DOCS
|
50
54
|
|
51
55
|
APP_TARGET_DESCRIPTION = <<-DOCS.freeze
|
@@ -54,17 +58,17 @@ class GovukConnect::CLI
|
|
54
58
|
|
55
59
|
The application is specified by name, for example:
|
56
60
|
|
57
|
-
govuk
|
61
|
+
gds govuk connect app-console -e integration #{bold('publishing-api')}
|
58
62
|
|
59
63
|
If the node class is ambiguous, you'll need to specify it prior to
|
60
64
|
the name, for example:
|
61
65
|
|
62
|
-
govuk
|
66
|
+
gds govuk connect app-console -e integration #{bold('whitehall_backend/')}whitehall
|
63
67
|
|
64
68
|
If you want to connect to a specific machine, you can specify a
|
65
69
|
number after the name, for example:
|
66
70
|
|
67
|
-
govuk
|
71
|
+
gds govuk connect app-console -e integration publishing-api#{bold(':2')}
|
68
72
|
DOCS
|
69
73
|
|
70
74
|
CONNECTION_TYPE_DESCRIPTIONS = {
|
@@ -75,10 +79,13 @@ class GovukConnect::CLI
|
|
75
79
|
"sidekiq-monitoring" => "Setup port forwarding to the Sidekiq Monitoring application.",
|
76
80
|
}.freeze
|
77
81
|
|
78
|
-
RABBITMQ_PORT =
|
82
|
+
RABBITMQ_PORT = 15_672
|
79
83
|
SIDEKIQ_MONITORING_PORT = 3211
|
80
84
|
|
81
85
|
JUMPBOXES = {
|
86
|
+
test: {
|
87
|
+
aws: "jumpbox.pink.test.govuk.digital",
|
88
|
+
},
|
82
89
|
ci: {
|
83
90
|
carrenza: "ci-jumpbox.integration.publishing.service.gov.uk",
|
84
91
|
},
|
@@ -96,7 +103,7 @@ class GovukConnect::CLI
|
|
96
103
|
}.freeze
|
97
104
|
|
98
105
|
def log(message)
|
99
|
-
warn message if
|
106
|
+
warn message if @verbose
|
100
107
|
end
|
101
108
|
|
102
109
|
def print_empty_line
|
@@ -125,10 +132,12 @@ class GovukConnect::CLI
|
|
125
132
|
costs[0] = i
|
126
133
|
nw = i - 1 # j == 0; nw is lev(i-1, j)
|
127
134
|
(1..string2.length).each do |j|
|
128
|
-
costs[j]
|
129
|
-
costs[j] + 1,
|
130
|
-
|
131
|
-
|
135
|
+
costs[j] = [
|
136
|
+
costs[j] + 1,
|
137
|
+
costs[j - 1] + 1,
|
138
|
+
string1[i - 1] == string2[j - 1] ? nw : nw + 1,
|
139
|
+
].min
|
140
|
+
nw = costs[j]
|
132
141
|
end
|
133
142
|
end
|
134
143
|
costs[string2.length]
|
@@ -176,7 +185,7 @@ class GovukConnect::CLI
|
|
176
185
|
tries = 0
|
177
186
|
|
178
187
|
while tries <= 10
|
179
|
-
port = rand(
|
188
|
+
port = rand(32_768...61_000)
|
180
189
|
|
181
190
|
return port if port_free? port
|
182
191
|
|
@@ -228,7 +237,7 @@ class GovukConnect::CLI
|
|
228
237
|
def ssh_username
|
229
238
|
@ssh_username ||= begin
|
230
239
|
if File.exist? config_file
|
231
|
-
config_ssh_username = YAML
|
240
|
+
config_ssh_username = YAML.load_file(config_file)["ssh_username"]
|
232
241
|
end
|
233
242
|
|
234
243
|
config_ssh_username || ENV["USER"]
|
@@ -237,7 +246,7 @@ class GovukConnect::CLI
|
|
237
246
|
|
238
247
|
def ssh_identity_file
|
239
248
|
@ssh_identity_file ||= begin
|
240
|
-
YAML
|
249
|
+
YAML.load_file(config_file)["ssh_identity_file"] if File.exist? config_file
|
241
250
|
end
|
242
251
|
end
|
243
252
|
|
@@ -257,13 +266,14 @@ class GovukConnect::CLI
|
|
257
266
|
log "debug: looking up classes in #{hosting}/#{environment}"
|
258
267
|
command = [
|
259
268
|
"ssh",
|
260
|
-
"-o",
|
269
|
+
"-o",
|
270
|
+
"ConnectTimeout=2", # Show a failure quickly
|
261
271
|
*ssh_identity_arguments,
|
262
272
|
user_at_host(
|
263
273
|
ssh_username,
|
264
274
|
jumpbox_for_environment_and_hosting(environment, hosting),
|
265
275
|
),
|
266
|
-
"govuk_node_list --classes"
|
276
|
+
"govuk_node_list --classes",
|
267
277
|
].join(" ")
|
268
278
|
|
269
279
|
log "debug: running command: #{command}"
|
@@ -287,13 +297,14 @@ class GovukConnect::CLI
|
|
287
297
|
def get_domains_for_node_class(target, environment, hosting, ssh_username)
|
288
298
|
command = [
|
289
299
|
"ssh",
|
290
|
-
"-o",
|
300
|
+
"-o",
|
301
|
+
"ConnectTimeout=2", # Show a failure quickly
|
291
302
|
*ssh_identity_arguments,
|
292
303
|
user_at_host(
|
293
304
|
ssh_username,
|
294
305
|
jumpbox_for_environment_and_hosting(environment, hosting),
|
295
306
|
),
|
296
|
-
"govuk_node_list -c #{target}"
|
307
|
+
"govuk_node_list -c #{target}",
|
297
308
|
].join(" ")
|
298
309
|
|
299
310
|
output, status = Open3.capture2(command)
|
@@ -305,7 +316,11 @@ class GovukConnect::CLI
|
|
305
316
|
exit 1
|
306
317
|
end
|
307
318
|
|
308
|
-
|
319
|
+
if hosting == :aws
|
320
|
+
output.split("\n")
|
321
|
+
else
|
322
|
+
output.split("\n").sort
|
323
|
+
end
|
309
324
|
end
|
310
325
|
|
311
326
|
def govuk_directory
|
@@ -327,12 +342,12 @@ class GovukConnect::CLI
|
|
327
342
|
hieradata_file = File.join(local_hieradata_root, "#{environment}.yaml")
|
328
343
|
log "debug: reading #{hieradata_file}"
|
329
344
|
|
330
|
-
environment_specific_hieradata = YAML
|
345
|
+
environment_specific_hieradata = YAML.load_file(hieradata_file)
|
331
346
|
|
332
347
|
if environment_specific_hieradata["node_class"]
|
333
348
|
environment_specific_hieradata["node_class"]
|
334
349
|
else
|
335
|
-
common_hieradata = YAML
|
350
|
+
common_hieradata = YAML.load_file(
|
336
351
|
File.join(local_hieradata_root, "common.yaml"),
|
337
352
|
)
|
338
353
|
|
@@ -390,7 +405,7 @@ class GovukConnect::CLI
|
|
390
405
|
print_empty_line
|
391
406
|
info "specify the node class and application mame, for example: "
|
392
407
|
node_classes.each do |node_class|
|
393
|
-
info "\n govuk
|
408
|
+
info "\n gds govuk connect app-console -e #{environment} #{node_class}/#{app_name}"
|
394
409
|
end
|
395
410
|
print_empty_line
|
396
411
|
|
@@ -434,7 +449,7 @@ class GovukConnect::CLI
|
|
434
449
|
print_empty_line
|
435
450
|
info "specify the hosting provider and node type, for example: "
|
436
451
|
hosting_providers.each do |hosting_provider|
|
437
|
-
info "\n govuk
|
452
|
+
info "\n gds govuk connect ssh #{bold(hosting_provider)}/#{node_type}"
|
438
453
|
end
|
439
454
|
info "\n"
|
440
455
|
|
@@ -511,7 +526,7 @@ class GovukConnect::CLI
|
|
511
526
|
app_name,
|
512
527
|
environment,
|
513
528
|
hosting,
|
514
|
-
|
529
|
+
)
|
515
530
|
|
516
531
|
unless node_class
|
517
532
|
error "error: application '#{app_name}' not found."
|
@@ -551,90 +566,27 @@ class GovukConnect::CLI
|
|
551
566
|
|
552
567
|
def ssh(
|
553
568
|
target,
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
569
|
+
environment,
|
570
|
+
command: false,
|
571
|
+
port_forward: false,
|
572
|
+
additional_arguments: []
|
573
|
+
)
|
559
574
|
log "debug: ssh to #{target} in #{environment}"
|
560
575
|
|
561
|
-
|
562
|
-
hosting, name, number = parse_hosting_name_and_number(target)
|
563
|
-
|
564
|
-
if name.end_with? ".internal"
|
565
|
-
ssh_target = name
|
566
|
-
hosting = :aws
|
567
|
-
elsif name.end_with? ".gov.uk"
|
568
|
-
ssh_target = name
|
569
|
-
hosting = :carrenza
|
570
|
-
else
|
571
|
-
# The hosting might not have been provided, so check if necessary
|
572
|
-
hosting ||= hosting_for_target_and_environment(target, environment)
|
573
|
-
|
574
|
-
domains = get_domains_for_node_class(
|
575
|
-
name,
|
576
|
-
environment,
|
577
|
-
hosting,
|
578
|
-
ssh_username,
|
579
|
-
)
|
580
|
-
|
581
|
-
if domains.length.zero?
|
582
|
-
error "error: couldn't find #{name} in #{hosting}/#{environment}"
|
583
|
-
|
584
|
-
node_types = govuk_node_list_classes(environment, hosting)
|
585
|
-
|
586
|
-
similar_node_types = strings_similar_to(name, node_types)
|
587
|
-
|
588
|
-
if similar_node_types.any?
|
589
|
-
info "\ndid you mean:"
|
590
|
-
similar_node_types.each { |s| info " - #{s}" }
|
591
|
-
else
|
592
|
-
info "\nall node types:"
|
593
|
-
node_types.each { |s| info " - #{s}" }
|
594
|
-
end
|
595
|
-
|
596
|
-
exit 1
|
597
|
-
elsif domains.length == 1
|
598
|
-
ssh_target = domains.first
|
599
|
-
|
600
|
-
info "There is #{bold('one machine')} to connect to"
|
601
|
-
else
|
602
|
-
n_machines = bold("#{domains.length} machines")
|
603
|
-
info "There are #{n_machines} of this class"
|
604
|
-
|
605
|
-
if number
|
606
|
-
unless number.positive?
|
607
|
-
print_empty_line
|
608
|
-
error "error: invalid machine number '#{number}', it must be > 0"
|
609
|
-
exit 1
|
610
|
-
end
|
611
|
-
|
612
|
-
unless number <= domains.length
|
613
|
-
print_empty_line
|
614
|
-
error "error: cannot connect to machine number: #{number}"
|
615
|
-
exit 1
|
616
|
-
end
|
617
|
-
|
618
|
-
ssh_target = domains[number - 1]
|
619
|
-
info "Connecting to number #{number}"
|
620
|
-
else
|
621
|
-
ssh_target = domains.sample
|
622
|
-
info "Connecting to a random machine (number #{domains.find_index(ssh_target) + 1})"
|
623
|
-
end
|
624
|
-
end
|
625
|
-
end
|
576
|
+
target, hosting = ssh_target(target, environment)
|
626
577
|
|
627
578
|
ssh_command = [
|
628
579
|
"ssh",
|
629
580
|
*ssh_identity_arguments,
|
630
|
-
"-J",
|
581
|
+
"-J",
|
582
|
+
user_at_host(
|
631
583
|
ssh_username,
|
632
584
|
jumpbox_for_environment_and_hosting(environment, hosting),
|
633
585
|
),
|
634
586
|
user_at_host(
|
635
587
|
ssh_username,
|
636
|
-
|
637
|
-
)
|
588
|
+
target,
|
589
|
+
),
|
638
590
|
]
|
639
591
|
|
640
592
|
if command
|
@@ -647,7 +599,8 @@ class GovukConnect::CLI
|
|
647
599
|
|
648
600
|
ssh_command += [
|
649
601
|
"-N",
|
650
|
-
"-L",
|
602
|
+
"-L",
|
603
|
+
"#{localhost_port}:127.0.0.1:#{port_forward}",
|
651
604
|
]
|
652
605
|
|
653
606
|
info "Port forwarding setup, access:\n\n http://127.0.0.1:#{localhost_port}/\n\n"
|
@@ -660,6 +613,44 @@ class GovukConnect::CLI
|
|
660
613
|
exec(*ssh_command)
|
661
614
|
end
|
662
615
|
|
616
|
+
def scp(
|
617
|
+
target,
|
618
|
+
environment,
|
619
|
+
files,
|
620
|
+
push: false,
|
621
|
+
additional_arguments: []
|
622
|
+
)
|
623
|
+
log "debug: scp #{push ? 'push' : 'pull'} to #{target} in #{environment}"
|
624
|
+
|
625
|
+
target, hosting = ssh_target(target, environment)
|
626
|
+
|
627
|
+
sources = files[0, files.length - 1]
|
628
|
+
destination = files[-1]
|
629
|
+
|
630
|
+
if push
|
631
|
+
destination = "#{target}:#{destination}"
|
632
|
+
else
|
633
|
+
sources = sources.map { |source| "#{target}:#{source}" }
|
634
|
+
end
|
635
|
+
|
636
|
+
scp_command = [
|
637
|
+
"scp",
|
638
|
+
*ssh_identity_arguments,
|
639
|
+
"-o",
|
640
|
+
"ProxyJump=#{user_at_host(ssh_username, jumpbox_for_environment_and_hosting(environment, hosting))}",
|
641
|
+
"-o",
|
642
|
+
"User=#{ssh_username}",
|
643
|
+
*additional_arguments,
|
644
|
+
"--",
|
645
|
+
*sources,
|
646
|
+
destination,
|
647
|
+
]
|
648
|
+
|
649
|
+
info "\n#{bold('Running command:')} #{scp_command.join(' ')}\n\n"
|
650
|
+
|
651
|
+
exec(*scp_command)
|
652
|
+
end
|
653
|
+
|
663
654
|
def rabbitmq_root_password_command(hosting, environment)
|
664
655
|
hieradata_directory = {
|
665
656
|
aws: "puppet_aws",
|
@@ -679,14 +670,14 @@ class GovukConnect::CLI
|
|
679
670
|
uri = URI(url)
|
680
671
|
|
681
672
|
host_to_hosting_and_environment = {
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
673
|
+
"ci-alert.integration.publishing.service.gov.uk" => %i[carrenza ci],
|
674
|
+
"alert.integration.publishing.service.gov.uk" => %i[aws integration],
|
675
|
+
"alert.staging.govuk.digital" => %i[aws staging],
|
676
|
+
"alert.blue.staging.govuk.digital" => %i[aws staging],
|
677
|
+
"alert.staging.publishing.service.gov.uk" => %i[carrenza staging],
|
678
|
+
"alert.production.govuk.digital" => %i[aws production],
|
679
|
+
"alert.blue.production.govuk.digital" => %i[aws production],
|
680
|
+
"alert.publishing.service.gov.uk" => %i[carrenza production],
|
690
681
|
}
|
691
682
|
|
692
683
|
unless host_to_hosting_and_environment.key? uri.host
|
@@ -699,8 +690,6 @@ class GovukConnect::CLI
|
|
699
690
|
|
700
691
|
def parse_options(argv)
|
701
692
|
options = {}
|
702
|
-
|
703
|
-
# rubocop:disable Metrics/BlockLength
|
704
693
|
@option_parser = OptionParser.new do |opts|
|
705
694
|
opts.banner = USAGE_BANNER
|
706
695
|
|
@@ -723,12 +712,15 @@ class GovukConnect::CLI
|
|
723
712
|
options[:port_forward] = o
|
724
713
|
end
|
725
714
|
opts.on("-v", "--verbose", "Enable more detailed logging") do
|
726
|
-
|
715
|
+
@verbose = true
|
727
716
|
end
|
728
717
|
|
729
|
-
opts.on("-h", "--help", "Prints usage
|
718
|
+
opts.on("-h", "--help", "Prints usage examples and information") do
|
730
719
|
info opts
|
731
720
|
print_empty_line
|
721
|
+
info bold("EXAMPLES")
|
722
|
+
info EXAMPLES
|
723
|
+
print_empty_line
|
732
724
|
info bold("CONNECTION TYPES")
|
733
725
|
types.keys.each do |x|
|
734
726
|
info " #{x}"
|
@@ -741,9 +733,6 @@ class GovukConnect::CLI
|
|
741
733
|
print_empty_line
|
742
734
|
info bold("APPLICATION TARGET")
|
743
735
|
info APP_TARGET_DESCRIPTION
|
744
|
-
print_empty_line
|
745
|
-
info bold("EXAMPLES")
|
746
|
-
info EXAMPLES
|
747
736
|
exit
|
748
737
|
end
|
749
738
|
opts.on("-V", "--version", "Prints version information") do
|
@@ -751,7 +740,6 @@ class GovukConnect::CLI
|
|
751
740
|
exit
|
752
741
|
end
|
753
742
|
end
|
754
|
-
# rubocop:enable Metrics/BlockLength
|
755
743
|
|
756
744
|
@option_parser.parse!(argv)
|
757
745
|
|
@@ -823,6 +811,94 @@ class GovukConnect::CLI
|
|
823
811
|
[node_class, app_name, number]
|
824
812
|
end
|
825
813
|
|
814
|
+
def target_from_options(target, options)
|
815
|
+
if options.key? :hosting
|
816
|
+
hosting, name, number = parse_hosting_name_and_number(target)
|
817
|
+
if hosting
|
818
|
+
error "error: hosting specified twice"
|
819
|
+
exit 1
|
820
|
+
end
|
821
|
+
|
822
|
+
{
|
823
|
+
hosting: options[:hosting],
|
824
|
+
name: name,
|
825
|
+
number: number,
|
826
|
+
}
|
827
|
+
else
|
828
|
+
target
|
829
|
+
end
|
830
|
+
end
|
831
|
+
|
832
|
+
def ssh_target(target, environment)
|
833
|
+
# Split something like aws/backend:2 in to :aws, 'backend', 2
|
834
|
+
hosting, name, number = parse_hosting_name_and_number(target)
|
835
|
+
|
836
|
+
if name.end_with? ".internal"
|
837
|
+
target = name
|
838
|
+
hosting = :aws
|
839
|
+
elsif name.end_with? ".gov.uk"
|
840
|
+
target = name
|
841
|
+
hosting = :carrenza
|
842
|
+
else
|
843
|
+
# The hosting might not have been provided, so check if necessary
|
844
|
+
hosting ||= hosting_for_target_and_environment(target, environment)
|
845
|
+
|
846
|
+
domains = get_domains_for_node_class(
|
847
|
+
name,
|
848
|
+
environment,
|
849
|
+
hosting,
|
850
|
+
ssh_username,
|
851
|
+
)
|
852
|
+
|
853
|
+
if domains.length.zero?
|
854
|
+
error "error: couldn't find #{name} in #{hosting}/#{environment}"
|
855
|
+
|
856
|
+
node_types = govuk_node_list_classes(environment, hosting)
|
857
|
+
|
858
|
+
similar_node_types = strings_similar_to(name, node_types)
|
859
|
+
|
860
|
+
if similar_node_types.any?
|
861
|
+
info "\ndid you mean:"
|
862
|
+
similar_node_types.each { |s| info " - #{s}" }
|
863
|
+
else
|
864
|
+
info "\nall node types:"
|
865
|
+
node_types.each { |s| info " - #{s}" }
|
866
|
+
end
|
867
|
+
|
868
|
+
exit 1
|
869
|
+
elsif domains.length == 1
|
870
|
+
target = domains.first
|
871
|
+
|
872
|
+
info "There is #{bold('one machine')} to connect to"
|
873
|
+
else
|
874
|
+
n_machines = bold("#{domains.length} machines")
|
875
|
+
info "There are #{n_machines} of this class"
|
876
|
+
|
877
|
+
if number
|
878
|
+
unless number.positive?
|
879
|
+
print_empty_line
|
880
|
+
error "error: invalid machine number '#{number}', it must be > 0"
|
881
|
+
exit 1
|
882
|
+
end
|
883
|
+
|
884
|
+
unless number <= domains.length
|
885
|
+
print_empty_line
|
886
|
+
error "error: cannot connect to machine number: #{number}"
|
887
|
+
exit 1
|
888
|
+
end
|
889
|
+
|
890
|
+
target = domains[number - 1]
|
891
|
+
info "Connecting to number #{number}"
|
892
|
+
else
|
893
|
+
target = domains.sample
|
894
|
+
info "Connecting to a random machine (number #{domains.find_index(target) + 1})"
|
895
|
+
end
|
896
|
+
end
|
897
|
+
end
|
898
|
+
|
899
|
+
[target, hosting]
|
900
|
+
end
|
901
|
+
|
826
902
|
def check_for_target(target)
|
827
903
|
unless target
|
828
904
|
error "error: you must specify the target\n"
|
@@ -842,20 +918,23 @@ class GovukConnect::CLI
|
|
842
918
|
|
843
919
|
def types
|
844
920
|
@types ||= {
|
845
|
-
"app-console" =>
|
921
|
+
"app-console" => proc do |target, environment, args, extra_args, _options|
|
846
922
|
check_for_target(target)
|
847
923
|
check_for_additional_arguments("app-console", args)
|
924
|
+
check_for_additional_arguments("app-console", extra_args)
|
848
925
|
govuk_app_command(target, environment, "console")
|
849
926
|
end,
|
850
927
|
|
851
|
-
"app-dbconsole" =>
|
928
|
+
"app-dbconsole" => proc do |target, environment, args, extra_args, _options|
|
852
929
|
check_for_target(target)
|
853
930
|
check_for_additional_arguments("app-dbconsole", args)
|
931
|
+
check_for_additional_arguments("app-dbconsole", extra_args)
|
854
932
|
govuk_app_command(target, environment, "dbconsole")
|
855
933
|
end,
|
856
934
|
|
857
|
-
"rabbitmq" =>
|
935
|
+
"rabbitmq" => proc do |target, environment, args, extra_args, _options|
|
858
936
|
check_for_additional_arguments("rabbitmq", args)
|
937
|
+
check_for_additional_arguments("rabbitmq", extra_args)
|
859
938
|
|
860
939
|
target ||= "rabbitmq"
|
861
940
|
|
@@ -876,8 +955,9 @@ class GovukConnect::CLI
|
|
876
955
|
)
|
877
956
|
end,
|
878
957
|
|
879
|
-
"sidekiq-monitoring" =>
|
958
|
+
"sidekiq-monitoring" => proc do |target, environment, args, extra_args, _options|
|
880
959
|
check_for_additional_arguments("sidekiq-monitoring", args)
|
960
|
+
check_for_additional_arguments("sidekiq-monitoring", extra_args)
|
881
961
|
ssh(
|
882
962
|
target || "backend",
|
883
963
|
environment,
|
@@ -885,28 +965,50 @@ class GovukConnect::CLI
|
|
885
965
|
)
|
886
966
|
end,
|
887
967
|
|
888
|
-
"ssh" =>
|
968
|
+
"ssh" => proc do |target, environment, args, extra_args, options|
|
889
969
|
check_for_target(target)
|
970
|
+
target = target_from_options(target, options)
|
890
971
|
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
972
|
+
ssh(
|
973
|
+
target,
|
974
|
+
environment,
|
975
|
+
port_forward: options[:port_forward],
|
976
|
+
additional_arguments: [args, extra_args].flatten,
|
977
|
+
)
|
978
|
+
end,
|
979
|
+
|
980
|
+
"scp-pull" => proc do |target, environment, args, extra_args, options|
|
981
|
+
check_for_target(target)
|
982
|
+
target = target_from_options(target, options)
|
897
983
|
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
number: number,
|
902
|
-
}
|
984
|
+
if args.length < 2
|
985
|
+
error "error: need at least two filenames"
|
986
|
+
exit 1
|
903
987
|
end
|
904
988
|
|
905
|
-
|
989
|
+
scp(
|
906
990
|
target,
|
907
991
|
environment,
|
908
|
-
|
909
|
-
additional_arguments:
|
992
|
+
args,
|
993
|
+
additional_arguments: extra_args,
|
994
|
+
)
|
995
|
+
end,
|
996
|
+
|
997
|
+
"scp-push" => proc do |target, environment, args, extra_args, options|
|
998
|
+
check_for_target(target)
|
999
|
+
target = target_from_options(target, options)
|
1000
|
+
|
1001
|
+
if args.length < 2
|
1002
|
+
error "error: need at least two filenames"
|
1003
|
+
exit 1
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
scp(
|
1007
|
+
target,
|
1008
|
+
environment,
|
1009
|
+
args,
|
1010
|
+
push: true,
|
1011
|
+
additional_arguments: extra_args,
|
910
1012
|
)
|
911
1013
|
end,
|
912
1014
|
}
|
@@ -915,26 +1017,21 @@ class GovukConnect::CLI
|
|
915
1017
|
def main(argv)
|
916
1018
|
check_ruby_version_greater_than(required_major: 2, required_minor: 0)
|
917
1019
|
|
1020
|
+
extra_arguments_after_double_dash = []
|
1021
|
+
|
918
1022
|
double_dash_index = argv.index "--"
|
919
1023
|
if double_dash_index
|
920
|
-
# This is used in the case of passing extra options to ssh
|
921
|
-
# acts as a separator, so to avoid optparse
|
922
|
-
# options, split argv around -- before
|
923
|
-
|
1024
|
+
# This is used in the case of passing extra options to ssh and
|
1025
|
+
# scp, the -- acts as a separator, so to avoid optparse
|
1026
|
+
# interpreting those as options, split argv around -- before
|
1027
|
+
# parsing the options
|
1028
|
+
extra_arguments_after_double_dash = argv[double_dash_index + 1, argv.length]
|
924
1029
|
argv = argv[0, double_dash_index]
|
925
|
-
|
926
|
-
argv.clear
|
927
|
-
argv.concat argv
|
928
|
-
|
929
|
-
options = parse_options(argv)
|
930
|
-
|
931
|
-
type, target = argv
|
932
|
-
else
|
933
|
-
options = parse_options(argv)
|
934
|
-
|
935
|
-
type, target, *rest = argv
|
936
1030
|
end
|
937
1031
|
|
1032
|
+
govuk_connect_options = parse_options(argv)
|
1033
|
+
type, target, *extra_arguments_before_double_dash = argv
|
1034
|
+
|
938
1035
|
unless type
|
939
1036
|
error "error: you must specify the connection type\n"
|
940
1037
|
|
@@ -967,7 +1064,7 @@ class GovukConnect::CLI
|
|
967
1064
|
exit 1
|
968
1065
|
end
|
969
1066
|
|
970
|
-
environment =
|
1067
|
+
environment = govuk_connect_options[:environment]&.to_sym
|
971
1068
|
|
972
1069
|
unless environment
|
973
1070
|
error "error: you must specify the environment\n"
|
@@ -983,7 +1080,13 @@ class GovukConnect::CLI
|
|
983
1080
|
exit 1
|
984
1081
|
end
|
985
1082
|
|
986
|
-
handler.call(
|
1083
|
+
handler.call(
|
1084
|
+
target,
|
1085
|
+
environment,
|
1086
|
+
extra_arguments_before_double_dash,
|
1087
|
+
extra_arguments_after_double_dash,
|
1088
|
+
govuk_connect_options,
|
1089
|
+
)
|
987
1090
|
rescue Interrupt
|
988
1091
|
# Handle SIGTERM without printing a stacktrace
|
989
1092
|
exit 1
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk-connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Government Digital Service
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: climate_control
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3.
|
61
|
+
version: 3.17.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 3.
|
68
|
+
version: 3.17.0
|
69
69
|
description: Command line tool to connect to GOV.UK infrastructure
|
70
70
|
email:
|
71
71
|
- govuk-dev@digital.cabinet-office.gov.uk
|
@@ -82,7 +82,7 @@ homepage: https://github.com/alphagov/govuk-connect
|
|
82
82
|
licenses:
|
83
83
|
- MIT
|
84
84
|
metadata: {}
|
85
|
-
post_install_message:
|
85
|
+
post_install_message:
|
86
86
|
rdoc_options: []
|
87
87
|
require_paths:
|
88
88
|
- lib
|
@@ -97,8 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
101
|
-
signing_key:
|
100
|
+
rubygems_version: 3.1.2
|
101
|
+
signing_key:
|
102
102
|
specification_version: 4
|
103
103
|
summary: govuk-connect command line tool
|
104
104
|
test_files: []
|