firespring_dev_commands 3.0.0.pre.alpha.3 → 3.0.0.pre.alpha.4
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/firespring_dev_commands/certificate.rb +59 -0
- data/lib/firespring_dev_commands/common.rb +9 -0
- data/lib/firespring_dev_commands/coverage/base.rb +5 -0
- data/lib/firespring_dev_commands/coverage/none.rb +6 -0
- data/lib/firespring_dev_commands/docker/artifact.rb +1 -0
- data/lib/firespring_dev_commands/docker/desktop.rb +59 -0
- data/lib/firespring_dev_commands/docker/status.rb +20 -0
- data/lib/firespring_dev_commands/docker.rb +39 -0
- data/lib/firespring_dev_commands/eol.rb +12 -2
- data/lib/firespring_dev_commands/git.rb +14 -26
- data/lib/firespring_dev_commands/os.rb +35 -0
- data/lib/firespring_dev_commands/platform.rb +25 -32
- data/lib/firespring_dev_commands/port.rb +24 -0
- data/lib/firespring_dev_commands/templates/aws.rb +14 -6
- data/lib/firespring_dev_commands/templates/certificate.rb +41 -0
- data/lib/firespring_dev_commands/templates/docker/default.rb +3 -1
- data/lib/firespring_dev_commands/templates/docker/node/application.rb +7 -0
- data/lib/firespring_dev_commands/templates/docker/php/application.rb +7 -0
- data/lib/firespring_dev_commands/templates/docker/ruby/application.rb +7 -0
- data/lib/firespring_dev_commands/templates/eol.rb +3 -2
- data/lib/firespring_dev_commands/templates/git.rb +17 -0
- data/lib/firespring_dev_commands/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27d90489f25464c895ec072920e9822f6e38586c5dfcdd8621cfbecf4838429b
|
4
|
+
data.tar.gz: 31f7ecdba94899aacb1cdab3f073b3a30982bf4f566ce860836e72a179e87d6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9af3d66c489c01f8dc486ed55630761fe1e960979090694164cff63939ca254fc5e53bab01ff833d24ed15aa62a5764aa8d647ba65f3374d3b37d55be5501e06
|
7
|
+
data.tar.gz: e616f81c891cb6feb623f8e4004ca16181dfd6e4073bcc01fd4b4b38781fccd803983aa73d85889360ec08aed7de40e26f4747863f939e9c4b2c1accebcdb401
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Dev
|
2
|
+
# Class contains methods for requesting a certificate from route53.
|
3
|
+
# You must have a hosted zone defined for the desired domain
|
4
|
+
class Certificate
|
5
|
+
attr_accessor :domains, :email
|
6
|
+
|
7
|
+
def initialize(domains, email)
|
8
|
+
@domains = Array(domains)
|
9
|
+
@email = email
|
10
|
+
raise 'No certificate domains specified' if domains.empty?
|
11
|
+
end
|
12
|
+
|
13
|
+
# Request the certificate using the route53 docker image
|
14
|
+
# Certificate is stored in /etc/letsencrypt
|
15
|
+
def request
|
16
|
+
puts
|
17
|
+
puts 'Getting SSL Certs For:'
|
18
|
+
puts domains.join("\n")
|
19
|
+
puts
|
20
|
+
puts 'This process can take up to 10 minutes'
|
21
|
+
puts
|
22
|
+
puts Time.now
|
23
|
+
|
24
|
+
# TODO: Really should use the docker api for this
|
25
|
+
cmd = %w(docker run -it --rm --name certbot)
|
26
|
+
cmd << '-e' << 'AWS_ACCESS_KEY_ID'
|
27
|
+
cmd << '-e' << 'AWS_SECRET_ACCESS_KEY'
|
28
|
+
cmd << '-e' << 'AWS_SESSION_TOKEN'
|
29
|
+
cmd << '-v' << '/etc/letsencrypt:/etc/letsencrypt'
|
30
|
+
cmd << 'certbot/dns-route53:latest'
|
31
|
+
cmd << 'certonly'
|
32
|
+
cmd << '-n'
|
33
|
+
cmd << '--agree-tos'
|
34
|
+
cmd << '--dns-route53'
|
35
|
+
cmd << '-d' << domains.join(',')
|
36
|
+
cmd << '--email' << email
|
37
|
+
cmd << '--server' << 'https://acme-v02.api.letsencrypt.org/directory'
|
38
|
+
puts cmd.join(' ')
|
39
|
+
Dev::Common.new.run_command(cmd)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Saves the latest version of the certificate into the given dest_dir
|
43
|
+
def save(dest_dir)
|
44
|
+
raise "directory #{dest_dir} must be an existing directory" unless File.directory?(dest_dir)
|
45
|
+
|
46
|
+
domain = domains.first.sub(/^\*\./, '') # Need to strip off the '*.' if this is a wildcard cert
|
47
|
+
directories = Dir.glob("/etc/letsencrypt/live/#{domain}*/")
|
48
|
+
no_suffix = directories.delete("/etc/letsencrypt/live/#{domain}/")
|
49
|
+
biggest_suffix = directories.max
|
50
|
+
source_dir = biggest_suffix || no_suffix
|
51
|
+
raise "unable to determine certificate directory for #{domain}" unless source_dir
|
52
|
+
|
53
|
+
FileUtils.cp("#{source_dir}privkey.pem", dest_dir, verbose: true)
|
54
|
+
FileUtils.cp("#{source_dir}cert.pem", dest_dir, verbose: true)
|
55
|
+
FileUtils.cp("#{source_dir}chain.pem", dest_dir, verbose: true)
|
56
|
+
FileUtils.cp("#{source_dir}fullchain.pem", dest_dir, verbose: true)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -176,5 +176,14 @@ module Dev
|
|
176
176
|
|
177
177
|
format('%.1f %s', size.to_f / (1024**exp), units[exp])
|
178
178
|
end
|
179
|
+
|
180
|
+
# Center the string and pad on either side with the given padding character
|
181
|
+
def center_pad(string = '', pad: '-', len: 80)
|
182
|
+
string = " #{string} " unless string.strip.empty?
|
183
|
+
center_dash = len / 2
|
184
|
+
string = string.to_s
|
185
|
+
center_str = string.length / 2
|
186
|
+
string.rjust(center_dash + center_str - 1, pad).ljust(len - 1, pad)
|
187
|
+
end
|
179
188
|
end
|
180
189
|
end
|
@@ -1,18 +1,23 @@
|
|
1
1
|
module Dev
|
2
2
|
module Coverage
|
3
|
+
# Class which defines the methods which must be implemented to function as a coverage class
|
3
4
|
class Base
|
5
|
+
# Raises not implemented
|
4
6
|
def php_options
|
5
7
|
raise 'not implemented'
|
6
8
|
end
|
7
9
|
|
10
|
+
# Raises not implemented
|
8
11
|
def node_options
|
9
12
|
raise 'not implemented'
|
10
13
|
end
|
11
14
|
|
15
|
+
# Raises not implemented
|
12
16
|
def ruby_options
|
13
17
|
raise 'not implemented'
|
14
18
|
end
|
15
19
|
|
20
|
+
# Raises not implemented
|
16
21
|
def check(*)
|
17
22
|
raise 'not implemented'
|
18
23
|
end
|
@@ -1,22 +1,28 @@
|
|
1
1
|
module Dev
|
2
|
+
# Module with a variety of coverage methods for different languages
|
2
3
|
module Coverage
|
4
|
+
# Class which provides methods to effectvely skip coverage
|
3
5
|
class None < Base
|
4
6
|
def initialize(*)
|
5
7
|
super()
|
6
8
|
end
|
7
9
|
|
10
|
+
# Returns the php options for generating code coverage file
|
8
11
|
def php_options
|
9
12
|
[]
|
10
13
|
end
|
11
14
|
|
15
|
+
# Returns the node options for generating code coverage file
|
12
16
|
def node_options
|
13
17
|
[]
|
14
18
|
end
|
15
19
|
|
20
|
+
# Returns the ruby options for generating code coverage file
|
16
21
|
def ruby_options
|
17
22
|
[]
|
18
23
|
end
|
19
24
|
|
25
|
+
# Checks the code coverage against the defined threshold
|
20
26
|
def check(*)
|
21
27
|
# Nothing to do here
|
22
28
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Dev
|
2
|
+
class Docker
|
3
|
+
# Class for configuring docker desktop
|
4
|
+
# This is mostly around configuring the docker URL correctly
|
5
|
+
class Desktop
|
6
|
+
# A snippet of a docker compose file which forwards a socket to a local port so that we can read it in the docker library
|
7
|
+
WIN_TCP_COMPOSE_CONTENT = "
|
8
|
+
---
|
9
|
+
version: '3.8'
|
10
|
+
services:
|
11
|
+
windows_tcp:
|
12
|
+
image: alpine/socat
|
13
|
+
network_mode: bridge
|
14
|
+
ports:
|
15
|
+
- 127.0.0.1:23750:2375
|
16
|
+
volumes:
|
17
|
+
- /var/run/docker.sock:/var/run/docker.sock
|
18
|
+
command: tcp-listen:2375,reuseaddr,fork unix-connect:/var/run/docker.sock
|
19
|
+
restart: always".freeze
|
20
|
+
|
21
|
+
# Set up the local ports/sockets correctly based off of the os type
|
22
|
+
def configure
|
23
|
+
if Dev::Os.new.windows?
|
24
|
+
# Start up a small proxy container if running Docker Desktop on windows
|
25
|
+
# This is needed because the docker api library cannot connect to the windows socket
|
26
|
+
unless Dev::Port.new('127.0.0.1', 23_750).open?
|
27
|
+
LOG.info('Starting local proxy port for docker')
|
28
|
+
|
29
|
+
# Write the compose data to a tmp file
|
30
|
+
tmp_compose_file = Tempfile.new('windows_tcp')
|
31
|
+
tmp_compose_file.write(WIN_TCP_COMPOSE_CONTENT)
|
32
|
+
tmp_compose_file.close
|
33
|
+
|
34
|
+
# Start up the container
|
35
|
+
Dev::Docker::Compose.new(
|
36
|
+
compose_files: tmp_compose_file.path,
|
37
|
+
options: ['--detach'],
|
38
|
+
project_name: 'proxy'
|
39
|
+
).up
|
40
|
+
|
41
|
+
# Wait 1 second before we continue
|
42
|
+
sleep 1
|
43
|
+
end
|
44
|
+
|
45
|
+
# Configure the docker url to use 23750 on windows
|
46
|
+
::Docker.url = 'tcp://127.0.0.1:23750'
|
47
|
+
|
48
|
+
else
|
49
|
+
# If a user based socket has been defined, default to that
|
50
|
+
::Docker.url = if File.exist?("/#{Dir.home}/.docker/run/docker.sock")
|
51
|
+
"unix://#{Dir.home}/.docker/run/docker.sock"
|
52
|
+
elsif File.exist?("/#{Dir.home}/.docker/desktop/docker.sock")
|
53
|
+
"unix://#{Dir.home}/.docker/desktop/docker.sock"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -33,6 +33,26 @@ module Dev
|
|
33
33
|
EXITED,
|
34
34
|
DEAD
|
35
35
|
].freeze
|
36
|
+
|
37
|
+
# TODO: Can we use 'curses' here and overwrite the correct line?
|
38
|
+
def response_callback(response)
|
39
|
+
response.split("\n").each do |line|
|
40
|
+
data = JSON.parse(line)
|
41
|
+
if data.include?('status')
|
42
|
+
if data['id']
|
43
|
+
LOG.info "#{data['id']}: #{data['status']}"
|
44
|
+
else
|
45
|
+
LOG.info (data['status']).to_s
|
46
|
+
end
|
47
|
+
elsif data.include?('errorDetail')
|
48
|
+
raise data['errorDetail']['message']
|
49
|
+
elsif data.include?('aux')
|
50
|
+
next
|
51
|
+
else
|
52
|
+
raise "Unrecognized message from docker: #{data}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
36
56
|
end
|
37
57
|
end
|
38
58
|
end
|
@@ -77,6 +77,7 @@ module Dev
|
|
77
77
|
_prune('volumes', opts:)
|
78
78
|
end
|
79
79
|
|
80
|
+
# Prunes all volumes which start wth the given project name
|
80
81
|
def prune_project_volumes(project_name:)
|
81
82
|
project_name = project_name.to_s.strip
|
82
83
|
raise 'No project name defined' if project_name.empty?
|
@@ -122,6 +123,44 @@ module Dev
|
|
122
123
|
LOG.info "Total reclaimed space: #{Dev::Common.new.filesize(info['SpaceReclaimed'])}"
|
123
124
|
end
|
124
125
|
|
126
|
+
# Push the local version of the docker image to the defined remote repository
|
127
|
+
def push_image(image, name, tag = nil)
|
128
|
+
unless tag
|
129
|
+
if name.include?(':')
|
130
|
+
name, tag = name.split(':')
|
131
|
+
else
|
132
|
+
tag = 'latest'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
puts "Pushing to #{name}:#{tag}"
|
137
|
+
image.push(::Docker.creds, repo_tag: "#{name}:#{tag}") { |response| Dev::Docker::Status.new.response_callback(response) }
|
138
|
+
end
|
139
|
+
|
140
|
+
# Push the remote version of the docker image from the defined remote repository
|
141
|
+
def pull_image(name, tag = nil)
|
142
|
+
unless tag
|
143
|
+
if name.include?(':')
|
144
|
+
name, tag = name.split(':')
|
145
|
+
else
|
146
|
+
tag = 'latest'
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
puts "\nPulling #{name}:#{tag}"
|
151
|
+
opts = {
|
152
|
+
fromImage: "#{name}:#{tag}",
|
153
|
+
platform: Dev::Platform.new.architecture
|
154
|
+
}
|
155
|
+
::Docker::Image.create(**opts) { |response| Dev::Docker::Status.new.response_callback(response) }
|
156
|
+
end
|
157
|
+
|
158
|
+
# Remove the local version of the given docker image
|
159
|
+
def untag_image(image, name, tag)
|
160
|
+
puts "Untagging #{name}:#{tag}"
|
161
|
+
image.remove(name: "#{name}:#{tag}")
|
162
|
+
end
|
163
|
+
|
125
164
|
# Remove docker images with the "force" option set to true
|
126
165
|
# This will remove the images even if they are currently in use and cause unintended side effects.
|
127
166
|
def force_remove_images(name_and_tag)
|
@@ -46,13 +46,23 @@ module Dev
|
|
46
46
|
@products
|
47
47
|
end
|
48
48
|
|
49
|
+
# Prints all of the product version statuses
|
50
|
+
def status
|
51
|
+
product_versions.sort_by(&:name).each(&:print_status)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Returns true if any of the products are EOL
|
55
|
+
def eol?
|
56
|
+
product_versions.any?(&:eol)
|
57
|
+
end
|
58
|
+
|
49
59
|
# Prints all of the product version statuses
|
50
60
|
# Raises an error if any products are EOL
|
51
61
|
def check
|
52
62
|
puts
|
53
|
-
|
63
|
+
status
|
54
64
|
puts
|
55
|
-
raise 'found EOL versions' if
|
65
|
+
raise 'found EOL versions' if eol?
|
56
66
|
end
|
57
67
|
end
|
58
68
|
end
|
@@ -113,10 +113,10 @@ module Dev
|
|
113
113
|
next unless File.exist?(project_dir)
|
114
114
|
|
115
115
|
repo_basename = File.basename(File.realpath(project_dir))
|
116
|
-
header = "
|
117
|
-
puts center_pad(header).light_green
|
116
|
+
header = "#{repo_basename} (#{original_branches[project_dir]})"
|
117
|
+
puts Dev::Common.new.center_pad(header).light_green
|
118
118
|
@success &= status(dir: project_dir)
|
119
|
-
puts center_pad.light_green
|
119
|
+
puts Dev::Common.new.center_pad.light_green
|
120
120
|
end
|
121
121
|
puts
|
122
122
|
|
@@ -165,10 +165,10 @@ module Dev
|
|
165
165
|
next unless File.exist?(project_dir)
|
166
166
|
|
167
167
|
repo_basename = File.basename(File.realpath(project_dir))
|
168
|
-
header = "
|
169
|
-
puts center_pad(header).light_green
|
168
|
+
header = "#{repo_basename} (#{original_branches[project_dir]})"
|
169
|
+
puts Dev::Common.new.center_pad(header).light_green
|
170
170
|
reset(dir: project_dir)
|
171
|
-
puts center_pad.light_green
|
171
|
+
puts Dev::Common.new.center_pad.light_green
|
172
172
|
end
|
173
173
|
puts
|
174
174
|
end
|
@@ -191,10 +191,9 @@ module Dev
|
|
191
191
|
next unless File.exist?(project_dir)
|
192
192
|
|
193
193
|
repo_basename = File.basename(File.realpath(project_dir))
|
194
|
-
|
195
|
-
puts center_pad(header).light_green
|
194
|
+
puts Dev::Common.new.center_pad(repo_basename).light_green
|
196
195
|
@success &= checkout(branch, dir: project_dir)
|
197
|
-
puts center_pad.light_green
|
196
|
+
puts Dev::Common.new.center_pad.light_green
|
198
197
|
end
|
199
198
|
puts
|
200
199
|
|
@@ -285,10 +284,9 @@ module Dev
|
|
285
284
|
next unless File.exist?(project_dir)
|
286
285
|
|
287
286
|
repo_basename = File.basename(File.realpath(project_dir))
|
288
|
-
|
289
|
-
puts center_pad(header).light_green
|
287
|
+
puts Dev::Common.new.center_pad(repo_basename).light_green
|
290
288
|
@success &= merge(branch, dir: project_dir)
|
291
|
-
puts center_pad.light_green
|
289
|
+
puts Dev::Common.new.center_pad.light_green
|
292
290
|
end
|
293
291
|
puts
|
294
292
|
|
@@ -334,10 +332,9 @@ module Dev
|
|
334
332
|
next unless File.exist?(project_dir)
|
335
333
|
|
336
334
|
repo_basename = File.basename(File.realpath(project_dir))
|
337
|
-
|
338
|
-
puts center_pad(header).light_green
|
335
|
+
puts Dev::Common.new.center_pad(repo_basename).light_green
|
339
336
|
@success &= pull(dir: project_dir)
|
340
|
-
puts center_pad.light_green
|
337
|
+
puts Dev::Common.new.center_pad.light_green
|
341
338
|
end
|
342
339
|
puts
|
343
340
|
|
@@ -373,10 +370,9 @@ module Dev
|
|
373
370
|
next unless File.exist?(project_dir)
|
374
371
|
|
375
372
|
repo_basename = File.basename(File.realpath(project_dir))
|
376
|
-
|
377
|
-
puts center_pad(header).light_green
|
373
|
+
puts Dev::Common.new.center_pad(repo_basename).light_green
|
378
374
|
@success &= push(dir: project_dir)
|
379
|
-
puts center_pad.light_green
|
375
|
+
puts Dev::Common.new.center_pad.light_green
|
380
376
|
end
|
381
377
|
puts
|
382
378
|
|
@@ -438,14 +434,6 @@ module Dev
|
|
438
434
|
string.to_s.split("\n").each { |line| puts "#{padding}#{line}" }
|
439
435
|
end
|
440
436
|
|
441
|
-
# Center the string and pad on either side with the given padding character
|
442
|
-
def center_pad(string = '', pad: '-', len: 80)
|
443
|
-
center_dash = len / 2
|
444
|
-
string = string.to_s
|
445
|
-
center_str = string.length / 2
|
446
|
-
string.rjust(center_dash + center_str - 1, pad).ljust(len - 1, pad)
|
447
|
-
end
|
448
|
-
|
449
437
|
# Exclude the command from the message and print all error lines
|
450
438
|
private def print_errors(message)
|
451
439
|
indent message.split('error:')[1..].join
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Dev
|
2
|
+
# Class containing methods for determining operating system information
|
3
|
+
class Os
|
4
|
+
attr_accessor :os
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@os = ::RbConfig::CONFIG['host_os']
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns true if the host_os contains windowsy text
|
11
|
+
def windows?
|
12
|
+
os.match?(/(mingw|mswin|windows)/i)
|
13
|
+
end
|
14
|
+
|
15
|
+
# Returns true if the host_os contains darwinsy text
|
16
|
+
def darwin?
|
17
|
+
os.match?(/(darwin|mac os)/i)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns true if the host_os contains macsy text
|
21
|
+
def mac?
|
22
|
+
darwin?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Returns true if the host_os contains nixy text
|
26
|
+
def nix?
|
27
|
+
os.match?(/(linux|bsd|aix|solaris)/i)
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns true if the host_os contains cygwiny text
|
31
|
+
def cygwin?
|
32
|
+
os.match?(/(cygwin)/i)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,40 +1,33 @@
|
|
1
1
|
module Dev
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
ALLOWED_ARCHITECTURES = %w(arm64 amd64).freeze
|
2
|
+
# Class which returns information about the current platform
|
3
|
+
class Platform
|
4
|
+
# Constant containing all supported architectures
|
5
|
+
ALLOWED_ARCHITECTURES = %w(linux/arm64 linux/amd64).freeze
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
'linux/amd64' # 64-bit Intel/AMD architecture
|
13
|
-
when /arm|aarch64/
|
14
|
-
'linux/arm64' # ARM architecture
|
15
|
-
else
|
16
|
-
raise 'Unknown or unsupported architecture'
|
17
|
-
end
|
18
|
-
end
|
7
|
+
# If an architecture was specified in the ENV, use that. Otherwise auto-deted based of the OS reported architecture
|
8
|
+
def architecture
|
9
|
+
arch = env_architecture || os_architecture
|
10
|
+
raise "Invalid DOCKER_ARCHITECTURE: #{arch} (allowed are #{ALLOWED_ARCHITECTURES.join(', ')})" unless ALLOWED_ARCHITECTURES.include?(arch)
|
19
11
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
12
|
+
arch
|
13
|
+
end
|
14
|
+
|
15
|
+
# Check to see if a docker architecture has been specified in the ENV
|
16
|
+
# If it has, verify the format and the value
|
17
|
+
private def env_architecture
|
18
|
+
arch = ENV['DOCKER_ARCHITECTURE'].to_s.strip.downcase
|
19
|
+
return nil if arch.empty?
|
20
|
+
|
21
|
+
"linux/#{arch}" unless arch.start_with?('linux/')
|
22
|
+
arch
|
23
|
+
end
|
29
24
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
25
|
+
# Returns a valid docker architecture based off the RUBY_PLATFORM
|
26
|
+
private def os_architecture
|
27
|
+
return 'linux/amd64' if RUBY_PLATFORM.match?(/x86_64|amd64|x64-mingw/)
|
28
|
+
return 'linux/arm64' if RUBY_PLATFORM.match?(/arm|aarch64/)
|
34
29
|
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
30
|
+
raise 'Unknown or unsupported architecture'
|
38
31
|
end
|
39
32
|
end
|
40
33
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Dev
|
2
|
+
# Class containing methods for actions to be taken on ports
|
3
|
+
class Port
|
4
|
+
attr_accessor :ip_address, :port
|
5
|
+
|
6
|
+
def initialize(ip_address, port)
|
7
|
+
@ip_address = ip_address
|
8
|
+
@port = port
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns true if the port is open
|
12
|
+
# Returns false otherwise
|
13
|
+
def open?(timeout = 1)
|
14
|
+
Timeout.timeout(timeout) do
|
15
|
+
TCPSocket.new(ip_address, port).close
|
16
|
+
return true
|
17
|
+
end
|
18
|
+
|
19
|
+
false
|
20
|
+
rescue Timeout::Error, Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
21
|
+
false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -99,14 +99,22 @@ module Dev
|
|
99
99
|
|
100
100
|
DEV_COMMANDS_TOP_LEVEL.instance_eval do
|
101
101
|
return if exclude.include?(:eol)
|
102
|
+
return if ENV.fetch('CHECK_AWS', nil).to_s.strip == 'false'
|
102
103
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
account_name = Dev::Aws::Account.new.name_by_account(account_id)
|
107
|
-
LOG.info " Current AWS Account is #{account_name} (#{account_id})".light_yellow
|
104
|
+
task eol: [:'eol:aws'] do
|
105
|
+
# This is just a placeholder to execute the dependencies
|
106
|
+
end
|
108
107
|
|
109
|
-
|
108
|
+
namespace :eol do
|
109
|
+
desc 'Compares the current date to the EOL date for supported aws resources'
|
110
|
+
task aws: %w(init ensure_aws_credentials) do
|
111
|
+
account_id = Dev::Aws::Profile.new.current
|
112
|
+
account_name = Dev::Aws::Account.new.name_by_account(account_id)
|
113
|
+
LOG.info " Current AWS Account is #{account_name} (#{account_id})".light_yellow
|
114
|
+
puts
|
115
|
+
Dev::EndOfLife.new(product_versions: Dev::EndOfLife::Aws.new.default_products).status
|
116
|
+
puts
|
117
|
+
end
|
110
118
|
end
|
111
119
|
end
|
112
120
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'base_interface'
|
2
|
+
|
3
|
+
module Dev
|
4
|
+
module Template
|
5
|
+
# Class contains rake templates for managing configured certificates
|
6
|
+
class Certificate < Dev::Template::BaseInterface
|
7
|
+
attr_reader :domains, :email, :paths
|
8
|
+
|
9
|
+
def initialize(domains, email:, paths:, exclude: [])
|
10
|
+
@domains = domains
|
11
|
+
@email = email
|
12
|
+
@paths = Array(paths)
|
13
|
+
|
14
|
+
super(exclude:)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Create the rake task for the generate method
|
18
|
+
def create_generate_task!
|
19
|
+
# Have to set a local variable to be accessible inside of the instance_eval block
|
20
|
+
domains = @domains
|
21
|
+
email = @email
|
22
|
+
paths = @paths
|
23
|
+
exclude = @exclude
|
24
|
+
|
25
|
+
DEV_COMMANDS_TOP_LEVEL.instance_eval do
|
26
|
+
return if exclude.include?(:generate)
|
27
|
+
|
28
|
+
namespace :certificate do
|
29
|
+
desc 'Requests a new certificate for the configured domain using the route53 validation and deposits it in the configured paths'
|
30
|
+
task generate: %w(init_docker ensure_aws_credentials) do
|
31
|
+
Dev::Docker.new.pull_image('certbot/dns-route53', 'latest')
|
32
|
+
c = Dev::Certificate.new(domains, email)
|
33
|
+
c.request
|
34
|
+
paths.each { |path| c.save(path) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -109,9 +109,11 @@ module Dev
|
|
109
109
|
return if exclude.include?(:restart)
|
110
110
|
|
111
111
|
desc 'Runs a "down" followed by an "up"'
|
112
|
-
task restart: %w(_pre_restart_hooks) do
|
112
|
+
task restart: %w(init_docker _pre_restart_hooks _pre_down_hooks _pre_up_hooks) do
|
113
113
|
LOG.debug('In base restart')
|
114
114
|
Dev::Docker::Compose.new.restart
|
115
|
+
Rake::Task[:_post_up_hooks].execute
|
116
|
+
Rake::Task[:_post_down_hooks].execute
|
115
117
|
Rake::Task[:_post_restart_hooks].execute
|
116
118
|
end
|
117
119
|
end
|
@@ -58,6 +58,13 @@ module Dev
|
|
58
58
|
# This is just a placeholder to execute the dependencies
|
59
59
|
end
|
60
60
|
|
61
|
+
namespace :lint do
|
62
|
+
desc 'Run all linting software and apply all available fixes'
|
63
|
+
task fix: %w(node:lint:fix) do
|
64
|
+
# This is just a placeholder to execute the dependencies
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
61
68
|
namespace :node do
|
62
69
|
desc "Run the node linting software against the #{application}'s codebase" \
|
63
70
|
"\n\t(optional) use OPTS=... to pass additional options to the command"
|
@@ -102,6 +102,13 @@ module Dev
|
|
102
102
|
# This is just a placeholder to execute the dependencies
|
103
103
|
end
|
104
104
|
|
105
|
+
namespace :lint do
|
106
|
+
desc 'Run all linting software and apply all available fixes'
|
107
|
+
task fix: %w(php:lint:fix) do
|
108
|
+
# This is just a placeholder to execute the dependencies
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
105
112
|
namespace :php do
|
106
113
|
desc "Run the php linting software against the #{application}'s codebase" \
|
107
114
|
"\n\t(optional) use OPTS=... to pass additional options to the command"
|
@@ -58,6 +58,13 @@ module Dev
|
|
58
58
|
# This is just a placeholder to execute the dependencies
|
59
59
|
end
|
60
60
|
|
61
|
+
namespace :lint do
|
62
|
+
desc 'Run all linting software and apply all available fixes'
|
63
|
+
task fix: %w(ruby:lint:fix) do
|
64
|
+
# This is just a placeholder to execute the dependencies
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
61
68
|
namespace :ruby do
|
62
69
|
desc "Run the ruby linting software against the #{application}'s codebase" \
|
63
70
|
"\n\t(optional) use OPTS=... to pass additional options to the command"
|
@@ -12,9 +12,10 @@ module Dev
|
|
12
12
|
DEV_COMMANDS_TOP_LEVEL.instance_eval do
|
13
13
|
return if exclude.include?(:eol)
|
14
14
|
|
15
|
-
desc 'Compares the current date to the EOL date for all configured projects'
|
15
|
+
desc 'Compares the current date to the EOL date for all configured projects' \
|
16
|
+
"\n\toptionally specify CHECK_AWS=<true/false> to toggle whether AWS resources are checked for EOL (defaults to true)"
|
16
17
|
task eol: %w(init) do
|
17
|
-
Dev::EndOfLife.new.
|
18
|
+
Dev::EndOfLife.new.status
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -4,6 +4,23 @@ module Dev
|
|
4
4
|
module Template
|
5
5
|
# Class contains rake templates for managing your git project
|
6
6
|
class Git < Dev::Template::BaseInterface
|
7
|
+
# Create the rake task for cloning all defined repos
|
8
|
+
def create_clone_task!
|
9
|
+
# Have to set a local variable to be accessible inside of the instance_eval block
|
10
|
+
exclude = @exclude
|
11
|
+
|
12
|
+
DEV_COMMANDS_TOP_LEVEL.instance_eval do
|
13
|
+
namespace :git do
|
14
|
+
return if exclude.include?(:clone)
|
15
|
+
|
16
|
+
desc 'Make sure all repos are cloned'
|
17
|
+
task :clone do
|
18
|
+
Dev::Git.new.clone_repos
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
7
24
|
# Create the rake task for the git checkout method
|
8
25
|
def create_checkout_task!
|
9
26
|
# Have to set a local variable to be accessible inside of the instance_eval block
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: firespring_dev_commands
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.pre.alpha.
|
4
|
+
version: 3.0.0.pre.alpha.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Firespring
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -332,6 +332,7 @@ files:
|
|
332
332
|
- lib/firespring_dev_commands/bloom_growth/seat.rb
|
333
333
|
- lib/firespring_dev_commands/bloom_growth/user.rb
|
334
334
|
- lib/firespring_dev_commands/boolean.rb
|
335
|
+
- lib/firespring_dev_commands/certificate.rb
|
335
336
|
- lib/firespring_dev_commands/common.rb
|
336
337
|
- lib/firespring_dev_commands/coverage/base.rb
|
337
338
|
- lib/firespring_dev_commands/coverage/cobertura.rb
|
@@ -340,6 +341,7 @@ files:
|
|
340
341
|
- lib/firespring_dev_commands/docker.rb
|
341
342
|
- lib/firespring_dev_commands/docker/artifact.rb
|
342
343
|
- lib/firespring_dev_commands/docker/compose.rb
|
344
|
+
- lib/firespring_dev_commands/docker/desktop.rb
|
343
345
|
- lib/firespring_dev_commands/docker/status.rb
|
344
346
|
- lib/firespring_dev_commands/dotenv.rb
|
345
347
|
- lib/firespring_dev_commands/env.rb
|
@@ -358,9 +360,11 @@ files:
|
|
358
360
|
- lib/firespring_dev_commands/logger.rb
|
359
361
|
- lib/firespring_dev_commands/node.rb
|
360
362
|
- lib/firespring_dev_commands/node/audit.rb
|
363
|
+
- lib/firespring_dev_commands/os.rb
|
361
364
|
- lib/firespring_dev_commands/php.rb
|
362
365
|
- lib/firespring_dev_commands/php/audit.rb
|
363
366
|
- lib/firespring_dev_commands/platform.rb
|
367
|
+
- lib/firespring_dev_commands/port.rb
|
364
368
|
- lib/firespring_dev_commands/rake.rb
|
365
369
|
- lib/firespring_dev_commands/ruby.rb
|
366
370
|
- lib/firespring_dev_commands/ruby/audit.rb
|
@@ -381,6 +385,7 @@ files:
|
|
381
385
|
- lib/firespring_dev_commands/target_process/user_story_history.rb
|
382
386
|
- lib/firespring_dev_commands/templates/aws.rb
|
383
387
|
- lib/firespring_dev_commands/templates/base_interface.rb
|
388
|
+
- lib/firespring_dev_commands/templates/certificate.rb
|
384
389
|
- lib/firespring_dev_commands/templates/ci.rb
|
385
390
|
- lib/firespring_dev_commands/templates/config.rb
|
386
391
|
- lib/firespring_dev_commands/templates/docker/application.rb
|