smdev 0.4.0 → 0.5.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/smdev/ecs_exec.rb +92 -0
- data/lib/smdev.rb +25 -10
- metadata +3 -3
- data/lib/smdev/rails_console.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61964b5c32328c5e2265a32622cb85c366a70780eeaab4b95e154577942602b9
|
4
|
+
data.tar.gz: 39c56ddd43405021c465494bf439e174681e431146e59a808937f0c6592a2f97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54d844cb8292bea2cf364c473809f385bba2375d4bedede0927192c620e33bc685289831b1f7973a17a19d7b8471acfda9cf46de845367b7f2d2ab15ee3994e5
|
7
|
+
data.tar.gz: 123be6e3958715b82e1c0ae92c25e9a63f580ad0cbf55f43a2369ee1dbea782fe6d3b7dbb71e551ce4b66ef767ec817097ea0a8d6cd39ade8d3818c14482d13d
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module Smdev
|
4
|
+
module EcsExec
|
5
|
+
def self.ssh(options)
|
6
|
+
cluster_name = self.cluster_name(options)
|
7
|
+
return if cluster_name == nil
|
8
|
+
puts "Found cluster #{cluster_name}"
|
9
|
+
|
10
|
+
service_name = self.service_name(options, cluster_name)
|
11
|
+
return if service_name == nil
|
12
|
+
puts "Found service #{service_name}"
|
13
|
+
|
14
|
+
task_arn = self.task_arn(cluster_name, service_name)
|
15
|
+
puts "Found first task #{task_arn}"
|
16
|
+
command = options[:command]
|
17
|
+
|
18
|
+
execute_command_cmd = %W[
|
19
|
+
aws ecs execute-command
|
20
|
+
--cluster #{cluster_name}
|
21
|
+
--task #{task_arn}
|
22
|
+
--interactive
|
23
|
+
--command \"#{command}\"
|
24
|
+
].join(' ')
|
25
|
+
|
26
|
+
puts "Running \"#{command}\""
|
27
|
+
exec(execute_command_cmd)
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.cluster_name(options)
|
31
|
+
cluster = options[:cluster]
|
32
|
+
command = "aws ecs list-clusters | grep #{cluster}"
|
33
|
+
stdout, stderr, status = Open3.capture3(command)
|
34
|
+
|
35
|
+
if status.success?
|
36
|
+
match = stdout.match(/cluster\/([^"]+)/)
|
37
|
+
cluster_name = match[1] if match
|
38
|
+
|
39
|
+
return cluster_name
|
40
|
+
else
|
41
|
+
if stderr != ""
|
42
|
+
puts "Error executing command: #{stderr}"
|
43
|
+
else
|
44
|
+
puts "Could not find cluster whose name contains \"#{cluster}\""
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.service_name(options, cluster_name)
|
50
|
+
service = options[:service]
|
51
|
+
command = "aws ecs list-services --cluster #{cluster_name} | grep #{service}"
|
52
|
+
stdout, stderr, status = Open3.capture3(command)
|
53
|
+
|
54
|
+
if status.success?
|
55
|
+
match = stdout.match(/#{cluster_name}\/([^"]+)/)
|
56
|
+
service_name = match[1] if match
|
57
|
+
|
58
|
+
return service_name
|
59
|
+
else
|
60
|
+
if stderr != ""
|
61
|
+
puts "Error executing command: #{stderr}"
|
62
|
+
else
|
63
|
+
puts "Could not find service whose name contains \"#{service}\""
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.task_arn(cluster_name, service_name)
|
69
|
+
list_tasks_cmd = "aws ecs list-tasks --cluster #{cluster_name} --service-name #{service_name}"
|
70
|
+
stdout, stderr, status = Open3.capture3(list_tasks_cmd)
|
71
|
+
|
72
|
+
if status.success?
|
73
|
+
begin
|
74
|
+
tasks = JSON.parse(stdout)
|
75
|
+
task_arn = tasks['taskArns'][0]
|
76
|
+
|
77
|
+
if task_arn.nil? || task_arn.empty?
|
78
|
+
puts 'No task ARN found.'
|
79
|
+
exit 1
|
80
|
+
end
|
81
|
+
return task_arn
|
82
|
+
rescue JSON::ParserError
|
83
|
+
puts 'Error parsing JSON'
|
84
|
+
exit 1
|
85
|
+
end
|
86
|
+
else
|
87
|
+
puts "Error executing command: #{stderr}"
|
88
|
+
exit 1
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/smdev.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'io/console'
|
3
3
|
require 'octokit'
|
4
4
|
require 'optparse'
|
5
|
-
require 'smdev/
|
5
|
+
require 'smdev/ecs_exec'
|
6
6
|
|
7
7
|
module Smdev
|
8
8
|
class CLI
|
@@ -11,7 +11,9 @@ module Smdev
|
|
11
11
|
commands = ["local_app_setup : Install local requirements for application. (Rails Only Currently)\n",
|
12
12
|
"system_install : Install Homebrew, Ruby, PostgreSQL, and Ruby on Rails\n",
|
13
13
|
"checkout_repos : Checkout all repositories for StrongMind\n",
|
14
|
-
"console : Open a rails console\n"
|
14
|
+
"console : Open a rails console on ECS\n",
|
15
|
+
"ssh : Open a bash shell on ECS\n"
|
16
|
+
]
|
15
17
|
|
16
18
|
OptionParser.new do |opts|
|
17
19
|
opts.banner = "Usage: smdev.rb [options] <command>"
|
@@ -24,12 +26,16 @@ module Smdev
|
|
24
26
|
options[:https] = true
|
25
27
|
end
|
26
28
|
|
27
|
-
opts.on("-
|
28
|
-
options[:
|
29
|
+
opts.on("-r", "--cluster CLUSTER", "Lookup this cluster for the ECS execute (defaults to the name of your current folder)") do |cluster|
|
30
|
+
options[:cluster] = cluster
|
29
31
|
end
|
30
32
|
|
31
|
-
opts.on("-
|
32
|
-
options[:
|
33
|
+
opts.on("-v", "--service SERVICE", "Lookup this service for the ECS execute (defaults to \"prod-worker\")") do |svc|
|
34
|
+
options[:service] = svc
|
35
|
+
end
|
36
|
+
|
37
|
+
opts.on("-c", "--command COMMAND", "Set the command for the ECS execute (defaults to a bash shell when you use 'ssh' and rails console when you use 'console')") do |ecs_command|
|
38
|
+
options[:command] = ecs_command
|
33
39
|
end
|
34
40
|
|
35
41
|
opts.on("-h", "--help", "Prints this help message") do
|
@@ -61,10 +67,11 @@ module Smdev
|
|
61
67
|
when "checkout_repos"
|
62
68
|
checkout_repos(options)
|
63
69
|
when "console"
|
64
|
-
options[:
|
65
|
-
options
|
66
|
-
|
67
|
-
|
70
|
+
options[:command] = "rails c"
|
71
|
+
open_ssh(options)
|
72
|
+
when "ssh"
|
73
|
+
options[:command] ||= "/bin/sh"
|
74
|
+
open_ssh(options)
|
68
75
|
else
|
69
76
|
puts "Invalid command: #{command}. Use --help for a list of commands."
|
70
77
|
end
|
@@ -196,5 +203,13 @@ module Smdev
|
|
196
203
|
end
|
197
204
|
|
198
205
|
end
|
206
|
+
|
207
|
+
private
|
208
|
+
|
209
|
+
def open_ssh(options)
|
210
|
+
options[:service] ||= "prod-worker"
|
211
|
+
options[:cluster] ||= Dir.pwd.split('/').last
|
212
|
+
Smdev::EcsExec.ssh(options)
|
213
|
+
end
|
199
214
|
end
|
200
215
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smdev
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derek Neighbors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: StrongMind Development Tool
|
14
14
|
email: derek.neighbors@strongmind.com
|
@@ -19,7 +19,7 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- bin/smdev
|
21
21
|
- lib/smdev.rb
|
22
|
-
- lib/smdev/
|
22
|
+
- lib/smdev/ecs_exec.rb
|
23
23
|
homepage: https://github.com/StrongMind/Helpers/tree/main/smdev
|
24
24
|
licenses:
|
25
25
|
- MIT
|
data/lib/smdev/rails_console.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'open3'
|
2
|
-
require 'pty'
|
3
|
-
|
4
|
-
module Smdev
|
5
|
-
module RailsConsole
|
6
|
-
def self.console(options)
|
7
|
-
cluster_name = self.cluster_name(options)
|
8
|
-
container_name = cluster_name
|
9
|
-
task_arn = self.tasks_list(cluster_name)
|
10
|
-
|
11
|
-
execute_command_cmd = %W[
|
12
|
-
aws ecs execute-command
|
13
|
-
--cluster #{container_name}
|
14
|
-
--task #{task_arn}
|
15
|
-
--container #{container_name}
|
16
|
-
--interactive
|
17
|
-
--command \"rails c\"
|
18
|
-
].join(' ')
|
19
|
-
|
20
|
-
begin
|
21
|
-
PTY.spawn(execute_command_cmd) do |stdout, stdin, pid|
|
22
|
-
begin
|
23
|
-
# Use IO.select for bi-directional IO
|
24
|
-
loop do
|
25
|
-
r, w, e = IO.select([stdout, $stdin], [stdin], [])
|
26
|
-
|
27
|
-
# If there's something to read from stdout, print it
|
28
|
-
if r.include? stdout
|
29
|
-
output = stdout.read_nonblock(4096)
|
30
|
-
print output
|
31
|
-
end
|
32
|
-
|
33
|
-
# If there's input from the terminal, send it to stdin
|
34
|
-
if r.include? $stdin
|
35
|
-
input = $stdin.getc
|
36
|
-
stdin.write(input) if w.include? stdin
|
37
|
-
end
|
38
|
-
end
|
39
|
-
rescue Errno::EIO, EOFError
|
40
|
-
# End of file or error. Exit loop.
|
41
|
-
end
|
42
|
-
end
|
43
|
-
rescue PTY::ChildExited => e
|
44
|
-
puts "The child process exited with status #{e.status.exitstatus}"
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
def self.cluster_name(options)
|
50
|
-
command = "aws ecs list-clusters | grep #{options[:app]} | grep #{options[:env]} | grep web"
|
51
|
-
stdout, stderr, status = Open3.capture3(command)
|
52
|
-
|
53
|
-
if status.success?
|
54
|
-
match = stdout.match(/cluster\/([^"]+)/)
|
55
|
-
cluster_name = match[1] if match
|
56
|
-
|
57
|
-
return cluster_name
|
58
|
-
else
|
59
|
-
puts "Error executing command: #{stderr}"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def self.tasks_list(cluster_name)
|
64
|
-
list_tasks_cmd = "aws ecs list-tasks --cluster #{cluster_name}"
|
65
|
-
stdout, stderr, status = Open3.capture3(list_tasks_cmd)
|
66
|
-
|
67
|
-
if status.success?
|
68
|
-
begin
|
69
|
-
tasks = JSON.parse(stdout)
|
70
|
-
task_arn = tasks['taskArns'][0]
|
71
|
-
|
72
|
-
if task_arn.nil? || task_arn.empty?
|
73
|
-
puts 'No task ARN found.'
|
74
|
-
exit 1
|
75
|
-
end
|
76
|
-
return task_arn
|
77
|
-
rescue JSON::ParserError
|
78
|
-
puts 'Error parsing JSON'
|
79
|
-
exit 1
|
80
|
-
end
|
81
|
-
else
|
82
|
-
puts "Error executing command: #{stderr}"
|
83
|
-
exit 1
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|