viaduct-toolkit 0.0.3 → 0.1.0
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/viaduct/toolkit/commands/app_console.rb +20 -81
- data/lib/viaduct/toolkit/commands/app_deployments.rb +6 -6
- data/lib/viaduct/toolkit/commands/app_download.rb +23 -0
- data/lib/viaduct/toolkit/commands/app_env.rb +3 -3
- data/lib/viaduct/toolkit/commands/app_info.rb +10 -9
- data/lib/viaduct/toolkit/commands/app_list.rb +2 -2
- data/lib/viaduct/toolkit/commands/app_logs.rb +60 -0
- data/lib/viaduct/toolkit/commands/app_open.rb +17 -0
- data/lib/viaduct/toolkit/commands/app_public_key.rb +2 -3
- data/lib/viaduct/toolkit/commands/app_status.rb +22 -20
- data/lib/viaduct/toolkit/commands/app_upload.rb +23 -0
- data/lib/viaduct/toolkit/commands/app_visit.rb +17 -0
- data/lib/viaduct/toolkit/commands/db_console.rb +33 -0
- data/lib/viaduct/toolkit/commands/db_list.rb +31 -0
- data/lib/viaduct/toolkit/commands/domain_list.rb +2 -2
- data/lib/viaduct/toolkit/commands/login.rb +16 -25
- data/lib/viaduct/toolkit/commands/ssh_key_add.rb +6 -6
- data/lib/viaduct/toolkit/commands/ssh_key_list.rb +6 -6
- data/lib/viaduct/toolkit/helpers.rb +80 -24
- data/lib/viaduct/toolkit/version.rb +1 -1
- data/lib/viaduct/toolkit.rb +25 -13
- metadata +31 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e74b426a21bcd09ed6d55df3caeccb100ac0e83b
|
4
|
+
data.tar.gz: 659ef1f517c899b2ebf5f69e80f221aecad3af75
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 218b9c6b7bba9286de733666a97bde7c0b4f0d10ab65e23ab28534771db1f402284ede76c7c1621061d038730d4e12561c613575c999c9ce6cbbc64b84509539
|
7
|
+
data.tar.gz: c3ba43711e4928386dfe4fd9fa1d7d1af1f43b601259fffb5e3e71c2c84d0a4133d5b66457fe9fd679a7ddfed399d5d89ce2bf115ca50e3bba5e75dc8c69a646
|
@@ -1,56 +1,19 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "app:console" do |c|
|
2
|
-
|
3
|
-
c.syntax = "app:console
|
4
|
-
c.description = "Start a new
|
2
|
+
|
3
|
+
c.syntax = "app:console"
|
4
|
+
c.description = "Start a new console session"
|
5
5
|
c.option "--disable", "Disable access to the SSH console"
|
6
6
|
c.option "--enable", "Enable access to the SSH console"
|
7
7
|
c.option "--status", "Display the status of the port forward"
|
8
|
-
|
8
|
+
|
9
9
|
c.action do |args, opts|
|
10
10
|
include Commander::Methods
|
11
11
|
ensure_logged_in!
|
12
|
-
if app = find_application
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
if response.data.empty?
|
19
|
-
puts "You haven't uploaded any SSH keys to your Viaduct user account.".red
|
20
|
-
puts "You cannot use SSH console access without them.".red
|
21
|
-
puts
|
22
|
-
puts "Upload your key using the command below".blue
|
23
|
-
puts
|
24
|
-
puts " $ vdt ssh_keys:add".blue
|
25
|
-
puts
|
26
|
-
exit(1)
|
27
|
-
else
|
28
|
-
stdout, stderr, status = run("ssh-add -l")
|
29
|
-
if status == 0
|
30
|
-
remote_fingerprints = response.data.map { |d| d['fingerprint'] }
|
31
|
-
local_fingerprints = stdout.split(/\n/).map { |l| l.split(/\s+/)[1] }
|
32
|
-
unless remote_fingerprints.any? { |f| local_fingerprints.include?(f) }
|
33
|
-
puts "Warning: it doesn't seem as though your SSH key has been uploaded".yellow
|
34
|
-
puts "to your Viaduct account. This session may not succeed. If it doesn't".yellow
|
35
|
-
puts "ensure that you have uploaded to your SSH key to your Viaduct account.".yellow
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
else
|
41
|
-
error "Couldn't verify remote SSH keys. Please try again."
|
42
|
-
end
|
43
|
-
|
44
|
-
# Get the console port forward for the application
|
45
|
-
response = Viaduct::Toolkit.api.port_forwards.all(:application => app['subdomain'])
|
46
|
-
if response.success?
|
47
|
-
unless console = response.data.select { |c| c['mode'] == 'console'}.first
|
48
|
-
error "Console access is not supported by this application. Please contact support."
|
49
|
-
end
|
50
|
-
else
|
51
|
-
error "Couldn't get port forward information from API for application."
|
52
|
-
end
|
53
|
-
|
12
|
+
if app = find_application
|
13
|
+
|
14
|
+
chech_ssh_key_presence
|
15
|
+
console = get_application_console_port_forward(app)
|
16
|
+
|
54
17
|
if opts.status
|
55
18
|
details do
|
56
19
|
heading "SSH console access"
|
@@ -61,13 +24,13 @@ Viaduct::Toolkit.cli.command "app:console" do |c|
|
|
61
24
|
field i == 0 ? 'Allowed IPs' : '', ip
|
62
25
|
end
|
63
26
|
end
|
64
|
-
|
27
|
+
|
65
28
|
elsif opts.disable
|
66
|
-
|
67
|
-
#
|
29
|
+
|
30
|
+
#
|
68
31
|
# Just disable console access
|
69
32
|
#
|
70
|
-
|
33
|
+
|
71
34
|
if console['enabled']
|
72
35
|
response = Viaduct::Toolkit.api.port_forwards.save(:id => console['id'], :enabled => 0)
|
73
36
|
if response.success?
|
@@ -78,13 +41,13 @@ Viaduct::Toolkit.cli.command "app:console" do |c|
|
|
78
41
|
else
|
79
42
|
puts "Console access isn't currently enabled.".yellow
|
80
43
|
end
|
81
|
-
|
44
|
+
|
82
45
|
elsif opts.enable
|
83
|
-
|
46
|
+
|
84
47
|
#
|
85
48
|
# Just enable console access
|
86
49
|
#
|
87
|
-
|
50
|
+
|
88
51
|
if console['enabled']
|
89
52
|
puts "Console is already enabled.".yellow
|
90
53
|
else
|
@@ -100,37 +63,13 @@ Viaduct::Toolkit.cli.command "app:console" do |c|
|
|
100
63
|
error "We couldn't enable console access at this time. Please try later."
|
101
64
|
end
|
102
65
|
end
|
103
|
-
|
66
|
+
|
104
67
|
else
|
105
|
-
|
106
|
-
#
|
107
|
-
# Enable if needed and connect.
|
108
|
-
#
|
109
|
-
unless console['enabled']
|
110
|
-
puts "SSH Console access is not currently enabled for this application.".magenta
|
111
|
-
if enable = agree("Would you like to enable it now?".blue)
|
112
|
-
disable_after_hour = agree("Would you like to disable this again after an hour?".blue)
|
113
|
-
response = Viaduct::Toolkit.api.port_forwards.save(:id => console['id'], :enabled => 1, :auto_disable_at => (disable_after_hour ? "1 hour from now" : nil))
|
114
|
-
unless response.success?
|
115
|
-
puts response.inspect
|
116
|
-
error "We couldn't enable console access at this time. Please try later."
|
117
|
-
end
|
118
|
-
else
|
119
|
-
puts "Unfortunately, unless enabled you cannot use this command.".red
|
120
|
-
exit(1)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
command = "ssh vdt@#{console['ip_address']} -p #{console['port']}"
|
125
|
-
|
126
|
-
exec(command)
|
68
|
+
exec_console_command(console, "ssh vdt@#{console['ip_address']} -p #{console['port']}")
|
127
69
|
end
|
128
|
-
|
129
|
-
|
130
70
|
end
|
131
71
|
end
|
132
|
-
|
133
|
-
end
|
134
72
|
|
73
|
+
end
|
135
74
|
|
136
|
-
Viaduct::Toolkit.cli.alias_command "
|
75
|
+
Viaduct::Toolkit.cli.alias_command "console", "app:console"
|
@@ -1,18 +1,18 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "app:deployments" do |c|
|
2
|
-
|
3
|
-
c.syntax = "app:deployments
|
2
|
+
|
3
|
+
c.syntax = "app:deployments"
|
4
4
|
c.description = "List all deployments for an application"
|
5
5
|
c.option "--page PAGE", Integer, "The page of deployments to return"
|
6
|
-
|
6
|
+
|
7
7
|
c.action do |args, opts|
|
8
8
|
include Commander::Methods
|
9
9
|
ensure_logged_in!
|
10
|
-
if application = find_application
|
10
|
+
if application = find_application
|
11
11
|
response = Viaduct::Toolkit.api.applications.deployments(:application => application['subdomain'], :page => opts.page ? opts.page.to_i : 1)
|
12
12
|
if response.success?
|
13
13
|
|
14
14
|
require 'terminal-table'
|
15
|
-
|
15
|
+
|
16
16
|
colourer = Proc.new do |d, field|
|
17
17
|
if d['status'] == 'deployed'
|
18
18
|
field.to_s.green
|
@@ -22,7 +22,7 @@ Viaduct::Toolkit.cli.command "app:deployments" do |c|
|
|
22
22
|
field
|
23
23
|
end
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
rows = response.data.map do |d|
|
27
27
|
[
|
28
28
|
colourer.call(d, d['number']),
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "app:download" do |c|
|
2
|
+
|
3
|
+
c.syntax = "app:download [REMOTE_PATH] [LOCAL_PATH]"
|
4
|
+
c.description = "Download files from your application"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
if app = find_application
|
10
|
+
|
11
|
+
if args[0].nil?
|
12
|
+
error "must specify path to file to download"
|
13
|
+
end
|
14
|
+
|
15
|
+
chech_ssh_key_presence
|
16
|
+
console = get_application_console_port_forward(app)
|
17
|
+
exec_console_command(console, "scp -r -P #{console['port']} vdt@#{console['ip_address']}:#{args[0]} #{args[1] || './'}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
Viaduct::Toolkit.cli.alias_command "download", "app:download"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "app:env" do |c|
|
2
|
-
|
3
|
-
c.syntax = "app:env
|
2
|
+
|
3
|
+
c.syntax = "app:env"
|
4
4
|
c.description = "Show all environment variables for an application"
|
5
5
|
c.option "--simple", "Return environment variables "
|
6
6
|
c.option "--yaml", "Return environment variables as YAML file"
|
@@ -8,7 +8,7 @@ Viaduct::Toolkit.cli.command "app:env" do |c|
|
|
8
8
|
c.action do |args, opts|
|
9
9
|
include Commander::Methods
|
10
10
|
ensure_logged_in!
|
11
|
-
if application = find_application
|
11
|
+
if application = find_application
|
12
12
|
response = Viaduct::Toolkit.api.applications.environment_variables(:application => application['subdomain'])
|
13
13
|
if response.success?
|
14
14
|
if opts.simple
|
@@ -1,11 +1,11 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "app:info" do |c|
|
2
|
-
|
3
|
-
c.syntax = "app:info
|
2
|
+
|
3
|
+
c.syntax = "app:info"
|
4
4
|
c.description = "Show details of an existing application"
|
5
5
|
c.action do |args, opts|
|
6
6
|
include Commander::Methods
|
7
7
|
ensure_logged_in!
|
8
|
-
if application = find_application
|
8
|
+
if application = find_application
|
9
9
|
details do
|
10
10
|
heading "Application Details"
|
11
11
|
field "Name", application['name']
|
@@ -20,16 +20,17 @@ Viaduct::Toolkit.cli.command "app:info" do |c|
|
|
20
20
|
heading "Repository"
|
21
21
|
field 'URL', application['repository']['repository']['url']
|
22
22
|
field 'Status', application['repository']['repository']['status']
|
23
|
-
field 'Last
|
24
|
-
|
23
|
+
field 'Last updated', application['repository']['repository']['last_updated_at']
|
24
|
+
if application['repository']['repository']['username']
|
25
|
+
field 'Username', application['repository']['repository']['username']
|
26
|
+
end
|
25
27
|
field 'Branch', application['repository']['branch']
|
26
28
|
end
|
27
|
-
|
29
|
+
|
28
30
|
if application['deployment']
|
29
31
|
heading "Active Deployment"
|
30
32
|
field 'Number', application['deployment']['number']
|
31
33
|
field 'Started at', application['deployment']['timing']['created_at']
|
32
|
-
field 'Time', application['deployment']['timing']['time'].round(1).to_s + "s"
|
33
34
|
field 'Description', application['deployment']['version']['description']
|
34
35
|
field 'Source', application['deployment']['triggered_from']
|
35
36
|
if application['deployment']['user']
|
@@ -41,5 +42,5 @@ Viaduct::Toolkit.cli.command "app:info" do |c|
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
44
|
-
|
45
|
-
end
|
45
|
+
|
46
|
+
end
|
@@ -5,7 +5,7 @@ Viaduct::Toolkit.cli.command "app:list" do |c|
|
|
5
5
|
c.action do |args, opts|
|
6
6
|
include Commander::Methods
|
7
7
|
ensure_logged_in!
|
8
|
-
|
8
|
+
|
9
9
|
pages_seen = 0
|
10
10
|
applications = []
|
11
11
|
loop do
|
@@ -31,6 +31,6 @@ Viaduct::Toolkit.cli.command "app:list" do |c|
|
|
31
31
|
end
|
32
32
|
table ['Name', 'Subdomain', 'Status', 'Owner'], rows
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
end
|
36
36
|
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "app:logs" do |c|
|
2
|
+
c.syntax = "app:logs"
|
3
|
+
c.description = "Stream logs from the remote server to your screen"
|
4
|
+
c.option "--process PROCESS_NAME", String, "Only show logs for the given process"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
if app = find_application
|
10
|
+
response = Viaduct::Toolkit.api.applications.status(:application => app['subdomain'])
|
11
|
+
if response.success?
|
12
|
+
|
13
|
+
processes = response.data['processes'].select do |p|
|
14
|
+
if opts.process
|
15
|
+
p['label'] =~ /\A#{opts.process}/
|
16
|
+
else
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
if processes.empty?
|
22
|
+
error "No processes found to stream"
|
23
|
+
end
|
24
|
+
|
25
|
+
process_map = processes.inject({}) do |hash, process|
|
26
|
+
hash[process['id']] = process['label']
|
27
|
+
hash
|
28
|
+
end
|
29
|
+
|
30
|
+
require 'eventmachine'
|
31
|
+
|
32
|
+
begin
|
33
|
+
EM.run do
|
34
|
+
Viaduct::Toolkit.api.push.connected do |event|
|
35
|
+
process_map.keys.each do |process_id|
|
36
|
+
Viaduct::Toolkit.api.push.subscribe :application_process_logs, process_id
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
Viaduct::Toolkit.api.push.receive do |exchange, process_id, data|
|
41
|
+
if exchange == :application_process_logs
|
42
|
+
tag = "#{process_map[process_id.to_i].rjust(15)} ".blue
|
43
|
+
puts "#{tag} #{data['line']}"
|
44
|
+
elsif exchange == :global && data['type'] == 'subscribed'
|
45
|
+
puts "Streaming logs for #{process_map[data['routing_key'].to_i]}...".yellow
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
rescue Interrupt
|
50
|
+
puts "Disconnecting..."
|
51
|
+
end
|
52
|
+
else
|
53
|
+
error "Couldn't get application status to determine process list"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
Viaduct::Toolkit.cli.alias_command "logs", "app:logs"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "app:open" do |c|
|
2
|
+
|
3
|
+
c.syntax = "app:open"
|
4
|
+
c.description = "Open application in the Viaduct web UI"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
if application = find_application
|
10
|
+
require 'launchy'
|
11
|
+
Launchy.open("https://my.viaduct.io/applications/#{application['subdomain']}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
Viaduct::Toolkit.cli.alias_command "open", "app:open"
|
@@ -1,12 +1,11 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "app:public_key" do |c|
|
2
|
-
c.syntax = "app:public_key
|
2
|
+
c.syntax = "app:public_key"
|
3
3
|
c.description = "Return the public key for a given application"
|
4
4
|
c.action do |args, opts|
|
5
5
|
include Commander::Methods
|
6
6
|
ensure_logged_in!
|
7
|
-
if app = find_application
|
7
|
+
if app = find_application
|
8
8
|
puts app['public_key'] + " Viaduct key for #{app['subdomain']}"
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
12
|
-
Viaduct::Toolkit.cli.alias_command "app:pk", "app:public_key"
|
@@ -1,18 +1,17 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "app:status" do |c|
|
2
|
-
c.syntax = "app:status
|
2
|
+
c.syntax = "app:status"
|
3
3
|
c.description = "Return current status of an application"
|
4
4
|
c.option "--process PROCESS_TYPE", String, "A process to show expanded information for"
|
5
5
|
c.option "--database DATABASE_ID", String, "The ID of the database to display further information for"
|
6
|
-
|
6
|
+
|
7
7
|
c.action do |args, opts|
|
8
8
|
include Commander::Methods
|
9
9
|
ensure_logged_in!
|
10
|
-
if app = find_application
|
10
|
+
if app = find_application
|
11
11
|
response = Viaduct::Toolkit.api.applications.status(:application => app['subdomain'])
|
12
12
|
if response.success?
|
13
|
-
|
14
13
|
if opts.process
|
15
|
-
|
14
|
+
|
16
15
|
if process = response.data['processes'].select { |p| p['label'] == opts.process.to_s }.first
|
17
16
|
details do
|
18
17
|
heading "Details"
|
@@ -26,10 +25,10 @@ Viaduct::Toolkit.cli.command "app:status" do |c|
|
|
26
25
|
puts "No process found matching '#{opts.process}'".red
|
27
26
|
exit 1
|
28
27
|
end
|
29
|
-
|
30
|
-
|
28
|
+
|
29
|
+
|
31
30
|
elsif opts.database
|
32
|
-
|
31
|
+
|
33
32
|
if db = response.data['databases'][(opts.database.to_i - 1).abs]
|
34
33
|
details do
|
35
34
|
heading "Database Details"
|
@@ -41,9 +40,9 @@ Viaduct::Toolkit.cli.command "app:status" do |c|
|
|
41
40
|
puts "No database found with ID '#{opts.database}'".red
|
42
41
|
exit 1
|
43
42
|
end
|
44
|
-
|
43
|
+
|
45
44
|
else
|
46
|
-
|
45
|
+
|
47
46
|
puts "Deployment Details".yellow
|
48
47
|
details do
|
49
48
|
puts "+" + '-' * 78 + '+'
|
@@ -51,22 +50,22 @@ Viaduct::Toolkit.cli.command "app:status" do |c|
|
|
51
50
|
field 'Version', response.data['deployment']['version']['id']
|
52
51
|
field "Description", response.data['deployment']['version']['description']
|
53
52
|
field "Source", response.data['deployment']['triggered_from']
|
54
|
-
field "Deployer", response.data['deployment']['user'] ? response.data['deployment']['user']['
|
53
|
+
field "Deployer", response.data['deployment']['user'] ? response.data['deployment']['user']['name'] : response.data['deployment']['triggerer']
|
55
54
|
field "Started", time(response.data['deployment']['timing']['started_at'])
|
56
55
|
end
|
57
|
-
|
56
|
+
|
58
57
|
processes = response.data['processes'].map do |p|
|
59
58
|
memory_used = (p['process']['resources']['memory_usage'] / 1024 / 1024).to_s + "MB"
|
60
59
|
memory_available = (p['process']['resources']['max_memory'] / 1024 / 1024).to_s + "MB"
|
61
60
|
memory = "#{memory_used}/#{memory_available}"
|
62
|
-
|
61
|
+
|
63
62
|
respawns = "#{p['process']['respawning']['current']}/#{p['process']['respawning']['maximum']}"
|
64
63
|
[p['label'], p['process']['status'].capitalize, memory, p['container']['command'], respawns]
|
65
64
|
end
|
66
65
|
puts
|
67
66
|
puts "Processes".yellow
|
68
67
|
table ['Label', 'Status', 'Memory', 'Command', 'Respawns'], processes
|
69
|
-
|
68
|
+
|
70
69
|
count = 0
|
71
70
|
databases = response.data['databases'].map do |d|
|
72
71
|
count += 1
|
@@ -74,7 +73,7 @@ Viaduct::Toolkit.cli.command "app:status" do |c|
|
|
74
73
|
memory_available = (d['process']['resources']['max_memory'] / 1024 / 1024).to_s + "MB"
|
75
74
|
memory = "#{memory_used}/#{memory_available}"
|
76
75
|
respawns = "#{d['process']['respawning']['current']}/#{d['process']['respawning']['maximum']}"
|
77
|
-
|
76
|
+
|
78
77
|
[count, d['label'], d['process']['status'].capitalize, d['stack']['name'], memory, respawns, d['process']['networking']['ip_address']]
|
79
78
|
end
|
80
79
|
unless databases.empty?
|
@@ -83,12 +82,13 @@ Viaduct::Toolkit.cli.command "app:status" do |c|
|
|
83
82
|
table ['#', 'Label', 'Status', 'Type', 'Memory', 'Respawns', 'IP Address'], databases
|
84
83
|
end
|
85
84
|
end
|
86
|
-
|
85
|
+
|
87
86
|
else
|
88
87
|
error "Couldn't get application status"
|
89
88
|
end
|
90
89
|
end
|
91
90
|
end
|
91
|
+
|
92
92
|
end
|
93
93
|
|
94
94
|
def process_details(p)
|
@@ -97,23 +97,25 @@ def process_details(p)
|
|
97
97
|
field "Host", p['host']
|
98
98
|
field "LXC Name", p['lxc_name']
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
heading "Networking"
|
102
102
|
field "IP Address", p['networking']['ip_address']
|
103
103
|
field "MAC Address", p['networking']['mac_address']
|
104
104
|
field "Data", "RX: #{p['networking']['rx']} TX: #{p['networking']['tx']}"
|
105
|
-
|
105
|
+
|
106
106
|
heading "Timing"
|
107
107
|
field "Started", time(p['timing']['started'])
|
108
108
|
field "Run time", length_of_time(p['timing']['run_time'])
|
109
109
|
field "Last seen", time(p['timing']['last_seen_at'])
|
110
|
-
|
110
|
+
|
111
111
|
heading "Resources"
|
112
112
|
field "Memory", "#{p['resources']['memory_usage'] /1024/1024}MB of #{p['resources']['max_memory']/1024/1024}MB"
|
113
113
|
field "CPU Usage", p['resources']['cpu_usage']
|
114
|
-
|
114
|
+
|
115
115
|
heading "Respawning"
|
116
116
|
field "Respawns", "#{p['respawning']['current']} / #{p['respawning']['maximum']}"
|
117
117
|
field "Last respawn", time(p['respawning']['last'])
|
118
118
|
|
119
119
|
end
|
120
|
+
|
121
|
+
Viaduct::Toolkit.cli.alias_command "status", "app:status"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "app:upload" do |c|
|
2
|
+
|
3
|
+
c.syntax = "app:upload [LOCAL_PATH] [REMOTE_PATH]"
|
4
|
+
c.description = "Upload files to your application"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
if app = find_application
|
10
|
+
|
11
|
+
if args[0].nil?
|
12
|
+
error "must specify path to file to upload"
|
13
|
+
end
|
14
|
+
|
15
|
+
chech_ssh_key_presence
|
16
|
+
console = get_application_console_port_forward(app)
|
17
|
+
exec_console_command(console, "scp -r -P #{console['port']} #{args[0]} vdt@#{console['ip_address']}:#{args[1] || './'}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
Viaduct::Toolkit.cli.alias_command "upload", "app:upload"
|
@@ -0,0 +1,17 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "app:visit" do |c|
|
2
|
+
|
3
|
+
c.syntax = "app:visit"
|
4
|
+
c.description = "Visit application in a web browser"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
if application = find_application
|
10
|
+
require 'launchy'
|
11
|
+
Launchy.open("https://#{application['main_domain'] ? application['main_domain']['name'] : application['viaduct_domain']}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
Viaduct::Toolkit.cli.alias_command "visit", "app:visit"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "db:console" do |c|
|
2
|
+
|
3
|
+
c.syntax = "db:console"
|
4
|
+
c.description = "Open a console session for the given database"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
|
10
|
+
if args[0].nil?
|
11
|
+
error "You need to specify a database name"
|
12
|
+
end
|
13
|
+
if app = find_application
|
14
|
+
database = Viaduct::Toolkit.api.applications.database(:application => app['subdomain'], :database => args[0])
|
15
|
+
if database.status == 'not-found'
|
16
|
+
puts "No database found named '#{args[0]}'".red
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
error "Couldn't get database details" unless database.success?
|
21
|
+
if command = database.data['database']['console_command']
|
22
|
+
chech_ssh_key_presence
|
23
|
+
console = get_application_console_port_forward(app)
|
24
|
+
puts command
|
25
|
+
exec_console_command(console, "ssh -t vdt@#{console['ip_address']} -p #{console['port']} '#{command}'")
|
26
|
+
else
|
27
|
+
puts "Console access is not available for this database type.".red
|
28
|
+
exit 1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Viaduct::Toolkit.cli.command "db:list" do |c|
|
2
|
+
|
3
|
+
c.syntax = "db:list"
|
4
|
+
c.description = "List all databases assigned to this application"
|
5
|
+
|
6
|
+
c.action do |args, opts|
|
7
|
+
include Commander::Methods
|
8
|
+
ensure_logged_in!
|
9
|
+
if app = find_application
|
10
|
+
|
11
|
+
shared_databases = Viaduct::Toolkit.api.shared_databases.all(:application => app['subdomain'])
|
12
|
+
error "Couldn't get shared databases" unless shared_databases.success?
|
13
|
+
dedicated_databases = Viaduct::Toolkit.api.dedicated_databases.all(:application => app['subdomain'])
|
14
|
+
error "Couldn't get dedicated databaes" unless dedicated_databases.success?
|
15
|
+
|
16
|
+
|
17
|
+
rows = []
|
18
|
+
shared_databases.data.each do |db|
|
19
|
+
rows << [db['fruit'], db['label'], 'Hobby/Dev', db['type'].split('::').last]
|
20
|
+
end
|
21
|
+
|
22
|
+
dedicated_databases.data.each do |db|
|
23
|
+
rows << [db['fruit'], db['label'], 'Production', db['stack']['name']]
|
24
|
+
end
|
25
|
+
|
26
|
+
table ['ID', 'Label', 'Type', 'Engine'], rows.sort_by { |r| r[0] }
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "domain:list" do |c|
|
2
|
-
c.syntax = "domain:list
|
2
|
+
c.syntax = "domain:list"
|
3
3
|
c.description = "Return a list of domains for an application"
|
4
4
|
c.action do |args, opts|
|
5
5
|
include Commander::Methods
|
6
6
|
ensure_logged_in!
|
7
|
-
if app = find_application
|
7
|
+
if app = find_application
|
8
8
|
response = Viaduct::Toolkit.api.domains.all(:application => app['subdomain'])
|
9
9
|
if response.success?
|
10
10
|
rows = response.data.map do |d|
|
@@ -2,31 +2,21 @@ Viaduct::Toolkit.cli.command "login" do |c|
|
|
2
2
|
c.syntax = "login"
|
3
3
|
c.description = "Authenticate this computer with your Viaduct account"
|
4
4
|
c.action do |args, options|
|
5
|
-
|
6
|
-
Viaduct::Toolkit.
|
7
|
-
Viaduct::Toolkit.
|
5
|
+
|
6
|
+
Viaduct::Toolkit.env_config['token'] = nil
|
7
|
+
Viaduct::Toolkit.env_config['secret'] = nil
|
8
8
|
Viaduct::Toolkit.save_config
|
9
|
-
|
9
|
+
|
10
10
|
response = Viaduct::Toolkit.api.authentication.create_login_token
|
11
11
|
if response.success?
|
12
|
-
|
13
|
-
puts "To log you in we
|
12
|
+
|
13
|
+
puts "To log you in we've opened a browser window to allow".magenta
|
14
14
|
puts "you to enter your login details. ".magenta
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
else
|
19
|
-
puts
|
20
|
-
puts "That's fine. Just go to the URL below in your browser.".magenta
|
21
|
-
puts "This command will continue to run until you complete this".magenta
|
22
|
-
puts "action.".magenta
|
23
|
-
puts
|
24
|
-
puts response.data['url']
|
25
|
-
end
|
26
|
-
|
15
|
+
require 'launchy'
|
16
|
+
Launchy.open(response.data['url'])
|
17
|
+
|
27
18
|
puts
|
28
19
|
puts "Please wait while we verify your login...".magenta
|
29
|
-
puts
|
30
20
|
check_response = nil
|
31
21
|
100.times do
|
32
22
|
sleep 3
|
@@ -43,14 +33,15 @@ Viaduct::Toolkit.cli.command "login" do |c|
|
|
43
33
|
error "Couldn't successfully exchange login token for an API token. Please try again later."
|
44
34
|
end
|
45
35
|
end
|
46
|
-
|
36
|
+
|
47
37
|
if @authorised
|
48
|
-
Viaduct::Toolkit.
|
49
|
-
Viaduct::Toolkit.
|
38
|
+
Viaduct::Toolkit.env_config['token'] = check_response.data['token']['token']
|
39
|
+
Viaduct::Toolkit.env_config['secret'] = check_response.data['token']['secret']
|
50
40
|
|
51
41
|
user_check = Viaduct::Toolkit.api.user.details
|
52
42
|
if user_check.success?
|
53
43
|
Viaduct::Toolkit.save_config
|
44
|
+
puts
|
54
45
|
puts "Hello #{user_check.data['name']}!".green
|
55
46
|
puts "Your user account is now authorised. Your login details are".magenta
|
56
47
|
puts "stored in a .viaduct file in your home directory.".magenta
|
@@ -61,10 +52,10 @@ Viaduct::Toolkit.cli.command "login" do |c|
|
|
61
52
|
else
|
62
53
|
error "We didn't receive a login response in a timely manner. Please try again."
|
63
54
|
end
|
64
|
-
|
55
|
+
|
65
56
|
else
|
66
57
|
error "Couldn't generate a remote login token. Please try again."
|
67
58
|
end
|
68
|
-
|
59
|
+
|
69
60
|
end
|
70
|
-
end
|
61
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "ssh_key:add" do |c|
|
2
|
-
|
2
|
+
|
3
3
|
c.syntax = "ssh_keys:add PATH_TO_PUBLIC_KEY"
|
4
4
|
c.description = "Add a new SSH public key to your user account"
|
5
|
-
|
5
|
+
|
6
6
|
c.action do |args, opts|
|
7
7
|
include Commander::Methods
|
8
8
|
ensure_logged_in!
|
9
|
-
|
9
|
+
|
10
10
|
key_path = args[0]
|
11
|
-
|
11
|
+
|
12
12
|
default_key_path = File.join(ENV['HOME'], '.ssh', 'id_rsa.pub')
|
13
13
|
if key_path.nil? && File.exist?(default_key_path)
|
14
14
|
puts "You haven't provided an SSH key to this command.".yellow
|
@@ -18,7 +18,7 @@ Viaduct::Toolkit.cli.command "ssh_key:add" do |c|
|
|
18
18
|
exit(1)
|
19
19
|
end
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
if File.exist?(key_path)
|
23
23
|
response = Viaduct::Toolkit.api.ssh_keys.add(:label => "Added from #{`hostname`}", :key => File.read(key_path))
|
24
24
|
if response.success?
|
@@ -36,5 +36,5 @@ Viaduct::Toolkit.cli.command "ssh_key:add" do |c|
|
|
36
36
|
exit(1)
|
37
37
|
end
|
38
38
|
end
|
39
|
-
|
39
|
+
|
40
40
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
Viaduct::Toolkit.cli.command "ssh_key:list" do |c|
|
2
|
-
|
2
|
+
|
3
3
|
c.syntax = "ssh_key:list"
|
4
4
|
c.description = "List the keys associated with your account"
|
5
|
-
|
5
|
+
|
6
6
|
c.action do |args, opts|
|
7
7
|
include Commander::Methods
|
8
8
|
ensure_logged_in!
|
9
|
-
|
9
|
+
|
10
10
|
response = Viaduct::Toolkit.api.ssh_keys.all
|
11
11
|
if response.success?
|
12
12
|
require 'terminal-table'
|
@@ -15,12 +15,12 @@ Viaduct::Toolkit.cli.command "ssh_key:list" do |c|
|
|
15
15
|
end
|
16
16
|
table = Terminal::Table.new :rows => rows, :headings => ['Label', 'Fingerprint']
|
17
17
|
puts table
|
18
|
-
|
18
|
+
|
19
19
|
else
|
20
20
|
error "Couldn't get the SSH key list."
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
end
|
26
26
|
|
@@ -4,7 +4,7 @@ module Viaduct
|
|
4
4
|
module Toolkit
|
5
5
|
module Helpers
|
6
6
|
def ensure_logged_in!
|
7
|
-
if Viaduct::Toolkit.
|
7
|
+
if Viaduct::Toolkit.env_config['token'].nil? && Viaduct::Toolkit.env_config['secret'].nil?
|
8
8
|
puts "You need to login before using this toolkit. Use the command below".yellow
|
9
9
|
puts "to login to your Viaduct account.".yellow
|
10
10
|
puts
|
@@ -13,26 +13,26 @@ module Viaduct
|
|
13
13
|
exit 1
|
14
14
|
end
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def length_of_time(seconds)
|
18
18
|
"#{seconds} seconds"
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def time(time)
|
22
22
|
require 'time'
|
23
23
|
time = Time.parse(time) rescue nil
|
24
24
|
time ? time.strftime("%d %B %Y at %H:%M:%S UTC") : ''
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def boolean(bool)
|
28
28
|
bool ? "\u2713".green : "-".red
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def table(headings, rows)
|
32
32
|
require 'terminal-table'
|
33
33
|
puts Terminal::Table.new :rows => rows, :headings => headings.map(&:blue)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def validation_errors(errors)
|
37
37
|
errors.each do |field, messages|
|
38
38
|
messages.each do |message|
|
@@ -40,23 +40,23 @@ module Viaduct
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
-
|
43
|
+
|
44
44
|
def error(message)
|
45
45
|
raise Viaduct::Toolkit::Error, message
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def run(*commands)
|
49
49
|
stdin, stdout, stderr, w = Open3.popen3(*commands)
|
50
50
|
[stdout.gets(nil), stderr.gets(nil), w.value]
|
51
51
|
end
|
52
|
-
|
53
|
-
def find_application
|
54
|
-
if
|
55
|
-
app = Viaduct::Toolkit.api.applications.info(:application =>
|
52
|
+
|
53
|
+
def find_application
|
54
|
+
if $app.is_a?(String) && $app.length > 0
|
55
|
+
app = Viaduct::Toolkit.api.applications.info(:application => $app)
|
56
56
|
if app.success?
|
57
57
|
return app.data
|
58
58
|
else
|
59
|
-
puts "Couldn't find application with subdomain matching '#{
|
59
|
+
puts "Couldn't find application with subdomain matching '#{$app}'".red
|
60
60
|
exit(1)
|
61
61
|
end
|
62
62
|
else
|
@@ -73,39 +73,95 @@ module Viaduct
|
|
73
73
|
end
|
74
74
|
exit(1)
|
75
75
|
elsif app.data.size == 1
|
76
|
-
|
76
|
+
$app = app.data.first['subdomain']
|
77
|
+
return find_application
|
77
78
|
else
|
78
79
|
puts "Multiple applications found matching your repository. Choose an application...".yellow
|
79
80
|
choice = choose('', *app.data.map { |a| "#{a['subdomain']}: #{a['name']}"})
|
80
81
|
choice = choice.split(":", 2).first
|
81
|
-
|
82
|
+
$app = choice
|
83
|
+
return find_application()
|
82
84
|
end
|
83
85
|
end
|
84
86
|
end
|
85
87
|
end
|
86
|
-
|
88
|
+
|
87
89
|
puts "Couldn't determine a Viaduct application from command.".red
|
88
90
|
exit(1)
|
89
91
|
end
|
90
|
-
|
92
|
+
|
91
93
|
def heading(title)
|
92
|
-
puts "+" + ("-" * 78) + "+"
|
94
|
+
puts "+" + ("-" * 78) + "+"
|
93
95
|
puts "| #{title.ljust(76).yellow} |"
|
94
|
-
puts "+" + ("-" * 78) + "+"
|
96
|
+
puts "+" + ("-" * 78) + "+"
|
95
97
|
end
|
96
|
-
|
98
|
+
|
97
99
|
def field(key, value)
|
98
100
|
key = key[0,16].ljust(16, ' ')
|
99
101
|
value = value.to_s[0,58].ljust(58)
|
100
|
-
|
102
|
+
|
101
103
|
puts "| #{key.blue}| #{value} |"
|
102
104
|
end
|
103
|
-
|
105
|
+
|
104
106
|
def details(&block)
|
105
107
|
block.call
|
106
|
-
puts "+" + ("-" * 78) + "+"
|
108
|
+
puts "+" + ("-" * 78) + "+"
|
109
|
+
end
|
110
|
+
|
111
|
+
def chech_ssh_key_presence
|
112
|
+
response = Viaduct::Toolkit.api.ssh_keys.all
|
113
|
+
if response.success?
|
114
|
+
|
115
|
+
if response.data.empty?
|
116
|
+
puts "You haven't uploaded any SSH keys to your Viaduct user account.".red
|
117
|
+
puts "You cannot use SSH console access without them.".red
|
118
|
+
puts
|
119
|
+
puts "Upload your key using the command below".blue
|
120
|
+
puts
|
121
|
+
puts " $ vdt ssh_keys:add".blue
|
122
|
+
puts
|
123
|
+
exit(1)
|
124
|
+
else
|
125
|
+
stdout, stderr, status = run("ssh-add -l")
|
126
|
+
if status == 0
|
127
|
+
remote_fingerprints = response.data.map { |d| d['fingerprint'] }
|
128
|
+
local_fingerprints = stdout.split(/\n/).map { |l| l.split(/\s+/)[1] }
|
129
|
+
unless remote_fingerprints.any? { |f| local_fingerprints.include?(f) }
|
130
|
+
puts "Warning: it doesn't seem as though your SSH key has been uploaded".yellow
|
131
|
+
puts "to your Viaduct account. This session may not succeed. If it doesn't".yellow
|
132
|
+
puts "ensure that you have uploaded to your SSH key to your Viaduct account.".yellow
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
else
|
137
|
+
error "Couldn't verify remote SSH keys. Please try again."
|
138
|
+
end
|
107
139
|
end
|
108
|
-
|
140
|
+
|
141
|
+
def get_application_console_port_forward(app)
|
142
|
+
response = Viaduct::Toolkit.api.port_forwards.all(:application => app['subdomain'])
|
143
|
+
if response.success?
|
144
|
+
if console = response.data.select { |c| c['mode'] == 'console'}.first
|
145
|
+
console
|
146
|
+
else
|
147
|
+
error "Console access is not supported by this application. Please contact support."
|
148
|
+
end
|
149
|
+
else
|
150
|
+
error "Couldn't get port forward information from API for application."
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def exec_console_command(console, command)
|
155
|
+
unless console['enabled']
|
156
|
+
response = Viaduct::Toolkit.api.port_forwards.save(:id => console['id'], :enabled => 1, :auto_disable_at => '5 minutes from now')
|
157
|
+
unless response.success?
|
158
|
+
error "We couldn't enable console access at this time. Please try later."
|
159
|
+
end
|
160
|
+
end
|
161
|
+
puts "Connecting...".magenta
|
162
|
+
exec(command)
|
163
|
+
end
|
164
|
+
|
109
165
|
end
|
110
166
|
end
|
111
167
|
end
|
data/lib/viaduct/toolkit.rb
CHANGED
@@ -13,16 +13,16 @@ Commander::Methods.send :include, Viaduct::Toolkit::Helpers
|
|
13
13
|
|
14
14
|
module Viaduct
|
15
15
|
module Toolkit
|
16
|
-
|
16
|
+
|
17
17
|
class Error < StandardError
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
class << self
|
21
|
-
|
21
|
+
|
22
22
|
def binary
|
23
23
|
File.expand_path(File.join('..', '..', '..', 'bin', 'viaduct'), __FILE__)
|
24
24
|
end
|
25
|
-
|
25
|
+
|
26
26
|
def cli
|
27
27
|
@cli ||= begin
|
28
28
|
c = Commander::Runner.instance
|
@@ -30,47 +30,59 @@ module Viaduct
|
|
30
30
|
c.program :version, Viaduct::Toolkit::VERSION
|
31
31
|
c.program :description, "A CLI toolkit for Viaduct developers"
|
32
32
|
c.global_option('-c', '--config FILE', 'The config file to store local credentials within') { |file| $config_file_path = file }
|
33
|
+
c.global_option('--app NAME', 'The application to work on') { |name| $app = name }
|
34
|
+
c.global_option('--dev', 'Connect to local development installation of Viaduct (dev only)') { $dev = true }
|
33
35
|
c.default_command :help
|
34
36
|
c
|
35
37
|
end
|
36
38
|
end
|
37
|
-
|
39
|
+
|
38
40
|
def add_commands
|
39
41
|
Dir[File.expand_path(File.join('..', 'toolkit', 'commands', '*.rb'), __FILE__)].each do |file|
|
40
42
|
require file
|
41
43
|
end
|
42
44
|
end
|
43
|
-
|
45
|
+
|
44
46
|
def api
|
45
47
|
@api ||= begin
|
46
|
-
|
48
|
+
if $dev
|
49
|
+
Viaduct::API.host = 'localhost'
|
50
|
+
Viaduct::API.port = 5000
|
51
|
+
Viaduct::API.ssl = false
|
52
|
+
Viaduct::API.application_token = 'example'
|
53
|
+
end
|
54
|
+
Viaduct::API::Client.new(env_config['token'], env_config['secret'])
|
47
55
|
end
|
48
56
|
end
|
49
|
-
|
57
|
+
|
50
58
|
def reset_api
|
51
59
|
@api = nil
|
52
60
|
end
|
53
|
-
|
61
|
+
|
54
62
|
def config_file_path
|
55
63
|
$config_file_path || File.join(ENV['HOME'], '.viaduct')
|
56
64
|
end
|
57
|
-
|
65
|
+
|
66
|
+
def env_config
|
67
|
+
config[$dev ? 'dev' : 'live'] ||= {}
|
68
|
+
end
|
69
|
+
|
58
70
|
def config
|
59
71
|
@config ||= begin
|
60
72
|
if File.exist?(config_file_path)
|
61
|
-
YAML.load_file(config_file_path)
|
73
|
+
YAML.load_file(config_file_path) || {}
|
62
74
|
else
|
63
75
|
{}
|
64
76
|
end
|
65
77
|
end
|
66
78
|
end
|
67
|
-
|
79
|
+
|
68
80
|
def save_config
|
69
81
|
File.open(config_file_path, 'w') do |f|
|
70
82
|
f.write self.config.to_yaml
|
71
83
|
end
|
72
84
|
end
|
73
|
-
|
85
|
+
|
74
86
|
end
|
75
87
|
end
|
76
88
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: viaduct-toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Cooke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: commander
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 1.0.5
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: 1.0.5
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: colorize
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,6 +72,26 @@ dependencies:
|
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 1.4.5
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: launchy
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 2.4.2
|
82
|
+
- - "<"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '3.0'
|
85
|
+
type: :runtime
|
86
|
+
prerelease: false
|
87
|
+
version_requirements: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 2.4.2
|
92
|
+
- - "<"
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '3.0'
|
75
95
|
description: A set of useful tools to help developers use & manage their Viaduct applications.
|
76
96
|
email:
|
77
97
|
- adam@viaduct.io
|
@@ -84,11 +104,18 @@ files:
|
|
84
104
|
- lib/viaduct/toolkit.rb
|
85
105
|
- lib/viaduct/toolkit/commands/app_console.rb
|
86
106
|
- lib/viaduct/toolkit/commands/app_deployments.rb
|
107
|
+
- lib/viaduct/toolkit/commands/app_download.rb
|
87
108
|
- lib/viaduct/toolkit/commands/app_env.rb
|
88
109
|
- lib/viaduct/toolkit/commands/app_info.rb
|
89
110
|
- lib/viaduct/toolkit/commands/app_list.rb
|
111
|
+
- lib/viaduct/toolkit/commands/app_logs.rb
|
112
|
+
- lib/viaduct/toolkit/commands/app_open.rb
|
90
113
|
- lib/viaduct/toolkit/commands/app_public_key.rb
|
91
114
|
- lib/viaduct/toolkit/commands/app_status.rb
|
115
|
+
- lib/viaduct/toolkit/commands/app_upload.rb
|
116
|
+
- lib/viaduct/toolkit/commands/app_visit.rb
|
117
|
+
- lib/viaduct/toolkit/commands/db_console.rb
|
118
|
+
- lib/viaduct/toolkit/commands/db_list.rb
|
92
119
|
- lib/viaduct/toolkit/commands/domain_list.rb
|
93
120
|
- lib/viaduct/toolkit/commands/login.rb
|
94
121
|
- lib/viaduct/toolkit/commands/ssh_key_add.rb
|