foreplay 0.7.6 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c3e2f8cd2782d6841948aa40004fcb67b5ef8d9
4
- data.tar.gz: d19106d2b46fb6ee029218f83cebbecb8ebba241
3
+ metadata.gz: 9a1dbd3b362d4784a5b5878bba559b812106e9c8
4
+ data.tar.gz: fe058cb4c473892115225f78587d0f88929bc745
5
5
  SHA512:
6
- metadata.gz: 73737f31d440c221d87f1faafe4ff4a90bc816275142610111bd4f8eba0aafacd863e0a54c5c91ce7055c281ef8130c54de2745dd42888b0a7e44ccbbd15d66e
7
- data.tar.gz: 34b56f5bf72f7c6f523f41d8951a075491cda0d669a59ba06756508f3b60cb17469a71f707656b4453285352661248ade925f0d4fc6d361fe68adb3982950212
6
+ metadata.gz: 08f86cc7dfb91d26d9865dbfdcd05adf603e1f5afa690e51503215b2005ed3c93982fca7b798589b6de490184f0a3ddd875a6068ce14ed00b0ba1c871065b4cc
7
+ data.tar.gz: 3d360c7d1ab0a3fdd61d25eaa46d6da0ba38f88df993daa78ac180f57979d43e9073390de2842abb566d63028cf3c6238ad151a69b1c7a37c5ebe8a6384d4974
data/.rubocop.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  ---
2
+ # These are OK:
3
+
2
4
  StringLiterals:
3
5
  EnforcedStyle: single_quotes
4
6
  Enabled: true
@@ -6,44 +8,45 @@ StringLiterals:
6
8
  DotPosition:
7
9
  Description: 'Checks the position of the dot in multi-line method calls.'
8
10
  EnforcedStyle: leading
9
- # EnforcedStyle: trailing
10
11
  Enabled: true
11
12
 
12
- LineLength:
13
- Description: 'Limit lines to 137 characters.'
14
- Max: 137
13
+ ClassAndModuleChildren:
14
+ Description: 'Checks style of children classes and modules.'
15
+ EnforcedStyle: compact
15
16
  Enabled: true
16
17
 
17
- FileName:
18
- Description: 'Use snake_case for source file names.'
18
+ Documentation:
19
+ Description: 'Document classes and non-namespace modules.'
19
20
  Enabled: false
20
21
 
21
- MethodLength:
22
- Description: 'Avoid methods longer than 10 lines of code.'
22
+ Output:
23
+ Description: 'Checks for calls to puts, print, etc.'
23
24
  Enabled: false
24
25
 
25
- Documentation:
26
- Description: 'Document classes and non-namespace modules.'
26
+ ExtraSpacing:
27
27
  Enabled: false
28
28
 
29
+ FileName:
30
+ Description: 'Use snake_case for source file names.'
31
+ Enabled: true
32
+
33
+ # Work on these:
34
+
35
+ LineLength:
36
+ Description: 'Limit lines to 137 characters.'
37
+ Max: 120
38
+ Enabled: true
39
+
40
+ MethodLength:
41
+ Description: 'Avoid methods longer than 10 lines of code.'
42
+ Max: 27 # 85
43
+
29
44
  CyclomaticComplexity:
30
45
  Description: 'Avoid complex methods.'
31
- Max: 13
46
+ Max: 9
32
47
 
33
48
  PerceivedComplexity:
34
- Max: 17
35
-
36
- ClassLength:
37
- Description: 'Avoid classes longer than 100 lines of code.'
38
- CountComments: false # count full line comments?
39
- Max: 295
40
-
41
- Output:
42
- Description: 'Checks for calls to puts, print, etc.'
43
- Enabled: false
49
+ Max: 11 # 17
44
50
 
45
51
  AbcSize:
46
- Max: 62
47
-
48
- ExtraSpacing:
49
- Enabled: false
52
+ Max: 48 # 62
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.2.2
data/foreplay.gemspec CHANGED
@@ -8,28 +8,26 @@ Gem::Specification.new do |spec|
8
8
  spec.authors = ['Xenapto']
9
9
  spec.email = ['developers@xenapto.com']
10
10
  spec.description = 'Deploying Rails projects to Ubuntu using Foreman'
11
- spec.summary = 'Example: foreplay push to production'
11
+ spec.summary = 'Example: foreplay deploy production'
12
12
  spec.homepage = 'https://github.com/Xenapto/foreplay'
13
13
  spec.license = 'MIT'
14
14
 
15
15
  spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
16
- spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
17
- spec.test_files = spec.files.grep(/^(test|spec|features|coverage)\//)
16
+ spec.executables = spec.files.grep(%r{^bin\/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features|coverage)\/})
18
18
  spec.require_paths = ['lib']
19
19
 
20
20
  spec.add_runtime_dependency 'activesupport', '>= 3.2'
21
- spec.add_runtime_dependency 'colorize', '>= 0.7'
22
21
  spec.add_runtime_dependency 'foreman', '>= 0.76'
23
22
  spec.add_runtime_dependency 'ssh-shell', '>= 0.4'
24
- # spec.add_runtime_dependency 'thor', '~> 0.19' # Dependency of foreman anyway
25
23
 
26
- spec.add_development_dependency 'bundler', '>= 1.6'
27
- spec.add_development_dependency 'rake', '>= 10.3'
28
- spec.add_development_dependency 'rspec', '>= 3.2'
29
- spec.add_development_dependency 'cucumber', '>= 1.3'
30
- spec.add_development_dependency 'aruba', '>= 0.5'
31
- spec.add_development_dependency 'gem-release', '>= 0.7'
32
- spec.add_development_dependency 'simplecov', '>= 0.7', '>= 0.7.1' # https://github.com/colszowka/simplecov/issues/281
33
- spec.add_development_dependency 'coveralls', '>= 0.7'
34
- spec.add_development_dependency 'rubocop', '> 0.29'
24
+ spec.add_development_dependency 'bundler', '~> 1.9'
25
+ spec.add_development_dependency 'rake', '~> 10.4'
26
+ spec.add_development_dependency 'rspec', '~> 3.2'
27
+ spec.add_development_dependency 'cucumber', '~> 2.0'
28
+ spec.add_development_dependency 'aruba', '~> 0.6'
29
+ spec.add_development_dependency 'gem-release', '~> 0.7'
30
+ spec.add_development_dependency 'simplecov', '~> 0.10'
31
+ spec.add_development_dependency 'coveralls', '~> 0.8'
32
+ spec.add_development_dependency 'rubocop', '~> 0.30'
35
33
  end
data/lib/foreplay/cli.rb CHANGED
@@ -1,48 +1,47 @@
1
1
  require 'thor'
2
2
  require 'foreplay'
3
+ require 'foreplay/setup'
3
4
 
4
- module Foreplay
5
- class CLI < Thor
6
- desc 'deploy ENVIRONMENT', 'Deploys to specified environment'
7
-
8
- method_option :role, aliases: '-r'
9
- method_option :server, aliases: '-s'
10
-
11
- def deploy(environment)
12
- Foreplay::Deploy.start [:deploy, environment, options]
13
- end
14
-
15
- desc 'check ENVIRONMENT', 'Checks if configuration is OK for specified environment'
16
-
17
- method_option :role, aliases: '-r'
18
- method_option :server, aliases: '-s'
19
-
20
- def check(environment)
21
- Foreplay::Deploy.start [:check, environment, options]
22
- end
23
-
24
- desc 'setup', 'Create the Foreplay config file'
25
-
26
- method_option :name, aliases: '-n'
27
- method_option :repository, aliases: '-r'
28
- method_option :user, aliases: '-u'
29
- method_option :password
30
- method_option :keyfile
31
- method_option :private_key, aliases: '-k'
32
- method_option :path, aliases: '-f'
33
- method_option :port, aliases: '-p', type: :numeric
34
- method_option :servers, aliases: '-s', type: :array
35
- method_option :db_adapter, aliases: '-a'
36
- method_option :db_encoding, aliases: '-e'
37
- method_option :db_name, aliases: '-d'
38
- method_option :db_pool, type: :numeric
39
- method_option :db_host, aliases: '-h'
40
- method_option :db_user
41
- method_option :db_password
42
- method_option :resque_redis
43
-
44
- def setup
45
- Foreplay::Setup.start
46
- end
5
+ class Foreplay::CLI < Thor
6
+ desc 'deploy ENVIRONMENT', 'Deploys to specified environment'
7
+
8
+ method_option :role, aliases: '-r'
9
+ method_option :server, aliases: '-s'
10
+
11
+ def deploy(environment)
12
+ Foreplay::Launcher.start [:deploy, environment, options]
13
+ end
14
+
15
+ desc 'check ENVIRONMENT', 'Checks if configuration is OK for specified environment'
16
+
17
+ method_option :role, aliases: '-r'
18
+ method_option :server, aliases: '-s'
19
+
20
+ def check(environment)
21
+ Foreplay::Launcher.start [:check, environment, options]
22
+ end
23
+
24
+ desc 'setup', 'Create the Foreplay config file'
25
+
26
+ method_option :name, aliases: '-n'
27
+ method_option :repository, aliases: '-r'
28
+ method_option :user, aliases: '-u'
29
+ method_option :password
30
+ method_option :keyfile
31
+ method_option :private_key, aliases: '-k'
32
+ method_option :path, aliases: '-f'
33
+ method_option :port, aliases: '-p', type: :numeric
34
+ method_option :servers, aliases: '-s', type: :array
35
+ method_option :db_adapter, aliases: '-a'
36
+ method_option :db_encoding, aliases: '-e'
37
+ method_option :db_name, aliases: '-d'
38
+ method_option :db_pool, type: :numeric
39
+ method_option :db_host, aliases: '-h'
40
+ method_option :db_user
41
+ method_option :db_password
42
+ method_option :resque_redis
43
+
44
+ def setup
45
+ Foreplay::Setup.start
47
46
  end
48
47
  end
@@ -0,0 +1,121 @@
1
+ require 'net/ssh'
2
+
3
+ class Foreplay::Engine::Remote
4
+ include Foreplay
5
+ attr_reader :server, :steps, :instructions
6
+
7
+ def initialize(s, st, i)
8
+ @server = s
9
+ @steps = st
10
+ @instructions = i
11
+ end
12
+
13
+ def deploy
14
+ output = ''
15
+
16
+ puts "#{host}#{INDENT}Connecting to #{host} on port #{port}"
17
+
18
+ # SSH connection
19
+ session = start_session(host, user, options)
20
+
21
+ puts "#{host}#{INDENT}Successfully connected to #{host} on port #{port}"
22
+
23
+ session.shell do |sh|
24
+ steps.each do |step|
25
+ puts "#{host}#{INDENT}#{(step['commentary'] || step['command']).yellow}" unless step['silent'] == true
26
+
27
+ # Output from this step
28
+ output = ''
29
+ previous = '' # We don't need or want the final CRLF
30
+ commands = Foreplay::Engine::Step.new(step, instructions).build
31
+
32
+ commands.each do |command|
33
+ process = sh.execute command
34
+
35
+ process.on_output do |_, o|
36
+ previous = o
37
+ output += previous
38
+ end
39
+
40
+ sh.wait!
41
+
42
+ if step['ignore_error'] == true || process.exit_status == 0
43
+ print output.gsub!(/^/, "#{host}#{INDENT * 2}") unless step['silent'] == true || output.blank?
44
+ else
45
+ terminate(output)
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ session.close
52
+ output
53
+ end
54
+
55
+ # Deployment check: just say what we would have done
56
+ def check
57
+ steps.each do |step|
58
+ puts "#{host}#{INDENT}#{(step['commentary'] || step['command']).yellow}" unless step['silent'] == true
59
+ commands = Foreplay::Engine::Step.new(step, instructions).build
60
+ commands.each { |command| puts "#{host}#{INDENT * 2}#{command}" unless step['silent'] }
61
+ end
62
+
63
+ ''
64
+ end
65
+
66
+ def user
67
+ @user = instructions[:user]
68
+ end
69
+
70
+ def host
71
+ @host ||= host_port[0]
72
+ end
73
+
74
+ def port
75
+ @port ||= (host_port[1] || 22)
76
+ end
77
+
78
+ def host_port
79
+ @host_port ||= server.split(':') # Parse host + port
80
+ end
81
+
82
+ def options
83
+ return @options if @options
84
+
85
+ password = instructions[:password]
86
+ keyfile = instructions[:keyfile]
87
+ private_key = instructions[:private_key]
88
+
89
+ keyfile.sub! '~', ENV['HOME'] || '/' unless keyfile.blank? # Remote shell won't expand this for us
90
+
91
+ # SSH authentication methods
92
+ @options = { verbose: :warn, port: port }
93
+
94
+ if password.blank?
95
+ # If there's no password we must supply a private key
96
+ if private_key.blank?
97
+ message = 'No authentication methods supplied. '\
98
+ 'You must supply a private key, key file or password in the configuration file'
99
+ terminate(message) if keyfile.blank?
100
+ # Get the key from the key file
101
+ puts "#{INDENT}Using private key from #{keyfile}"
102
+ private_key = File.read keyfile
103
+ else
104
+ puts "#{INDENT}Using private key from the configuration file"
105
+ end
106
+
107
+ @options[:key_data] = [private_key]
108
+ else
109
+ # Use the password supplied
110
+ @options[:password] = password
111
+ end
112
+
113
+ @options
114
+ end
115
+
116
+ def start_session(host, user, options)
117
+ Net::SSH.start(host, user, options)
118
+ rescue SocketError => e
119
+ terminate "#{host}#{INDENT}There was a problem starting an ssh session on #{host}:\n#{e.message}"
120
+ end
121
+ end
@@ -0,0 +1,23 @@
1
+ class Foreplay::Engine::Role
2
+ attr_reader :environment, :mode, :instructions, :servers
3
+
4
+ def initialize(e, m, i)
5
+ @environment = e
6
+ @mode = m
7
+ @instructions = i
8
+ @servers = @instructions[:servers]
9
+
10
+ preposition = mode == :deploy ? 'to' : 'for'
11
+
12
+ return if @servers.length == 1
13
+
14
+ puts "#{mode.capitalize}ing #{instructions[:name].yellow} #{preposition} #{@servers.join(', ').yellow} "\
15
+ "for the #{instructions[:role].dup.yellow} role in the #{environment.dup.yellow} environment..."
16
+ end
17
+
18
+ def threads
19
+ servers.map do |server|
20
+ Thread.new { Foreplay::Engine::Server.new(environment, mode, instructions, server).execute }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,123 @@
1
+ require 'active_support/inflector'
2
+
3
+ class Foreplay::Engine::Server
4
+ include Foreplay
5
+ attr_reader :environment, :mode, :instructions, :server
6
+
7
+ def initialize(e, m, i, s)
8
+ @environment = e
9
+ @mode = m
10
+ @instructions = i
11
+ @server = s
12
+ end
13
+
14
+ def execute
15
+ preposition = mode == :deploy ? 'to' : 'for'
16
+
17
+ message = "#{mode.capitalize}ing #{name.yellow} #{preposition} #{host.yellow} "
18
+ message += "for the #{role.dup.yellow} role in the #{environment.dup.yellow} environment"
19
+ puts message
20
+
21
+ instructions[:foreman]['app'] = current_service
22
+ instructions[:foreman]['port'] = current_port
23
+ instructions[:foreman]['user'] = user
24
+ instructions[:foreman]['log'] = "$HOME/#{path}/#{current_port}/log"
25
+
26
+ # Contents of .env file
27
+ instructions[:env]['HOME'] = '$HOME'
28
+ instructions[:env]['SHELL'] = '$SHELL'
29
+ instructions[:env]['PATH'] = '$PATH:`which bundle`'
30
+
31
+ Foreplay::Engine::Remote.new(server, steps, instructions).__send__ mode
32
+ end
33
+
34
+ def role
35
+ @role ||= instructions[:role]
36
+ end
37
+
38
+ def user
39
+ @user ||= instructions[:user]
40
+ end
41
+
42
+ def name
43
+ @name ||= instructions[:name]
44
+ end
45
+
46
+ def path
47
+ return @path if @path
48
+
49
+ @path = instructions[:path]
50
+ @path.gsub! '%u', user
51
+ @path.gsub! '%a', name
52
+ @path
53
+ end
54
+
55
+ def host
56
+ return @host if @host
57
+ @host, _ = server.split(':') # Parse host + port
58
+ @host
59
+ end
60
+
61
+ def steps
62
+ @steps ||= YAML.load(
63
+ ERB.new(
64
+ File.read(
65
+ "#{File.dirname(__FILE__)}/steps.yml"
66
+ )
67
+ ).result(binding)
68
+ )
69
+ end
70
+
71
+ def current_port
72
+ @current_port ||= port_details[:current_port]
73
+ end
74
+
75
+ def current_service
76
+ @current_service ||= port_details[:current_service]
77
+ end
78
+
79
+ def former_port
80
+ @former_port ||= port_details[:former_port]
81
+ end
82
+
83
+ def former_service
84
+ @former_service ||= port_details[:former_service]
85
+ end
86
+
87
+ def current_port_file
88
+ @current_port_file ||= ".foreplay/#{name}/current_port"
89
+ end
90
+
91
+ def port_steps
92
+ @port_steps ||= [
93
+ {
94
+ 'command' => "mkdir -p .foreplay/#{name} && touch #{current_port_file} && cat #{current_port_file}",
95
+ 'silent' => true
96
+ }
97
+ ]
98
+ end
99
+
100
+ def port_details
101
+ return @port_details if @port_details
102
+
103
+ current_port_string = Foreplay::Engine::Remote.new(server, port_steps, instructions).__send__(mode).strip!
104
+
105
+ if current_port_string.blank?
106
+ puts "#{host}#{INDENT}No instance is currently deployed"
107
+ else
108
+ puts "#{host}#{INDENT}Current instance is using port #{current_port_string}"
109
+ end
110
+
111
+ cp = current_port_string.to_i
112
+ port = instructions[:port]
113
+ ports = [port + 1000, port]
114
+ cp, fp = cp == port ? ports : ports.reverse
115
+
116
+ @port_details = {
117
+ current_port: cp,
118
+ current_service: "#{name}-#{cp}",
119
+ former_port: fp,
120
+ former_service: "#{name}-#{fp}"
121
+ }
122
+ end
123
+ end
@@ -0,0 +1,52 @@
1
+ class Foreplay::Engine::Step
2
+ attr_reader :step, :instructions
3
+
4
+ def initialize(s, i)
5
+ @step = s
6
+ @instructions = i
7
+ end
8
+
9
+ def build
10
+ # Each step can be (1) a command or (2) a series of values to add to a file
11
+ if step.key?('key')
12
+ instructions.key?(step['key']) ? build_commands(step, instructions) : []
13
+ else
14
+ # ...or just execute the command specified
15
+ [step['command']]
16
+ end
17
+ end
18
+
19
+ def build_commands(step, instructions)
20
+ # Add values from the config file to a file on the remote machine
21
+ key = step['key']
22
+ prefix = step['prefix'] || ''
23
+ suffix = step['suffix'] || ''
24
+ path = step['path'] || ''
25
+ before = step['before'] || ''
26
+ delimiter = step['delimiter'] || ''
27
+ after = step['after'] || ''
28
+
29
+ step['silent'] = true
30
+ filename = "#{path}#{prefix}#{key}#{suffix}"
31
+
32
+ if step.key?('header')
33
+ commands = ["echo \"#{step['header']}\" > #{filename}"]
34
+ redirect = '>>'
35
+ else
36
+ commands = []
37
+ redirect = '>'
38
+ end
39
+
40
+ if instructions[key].is_a? Hash
41
+ instructions[key].each do |k, v|
42
+ commands << "echo \"#{before}#{k}#{delimiter}#{v}#{after}\" #{redirect} #{filename}"
43
+ redirect = '>>'
44
+ end
45
+ else
46
+ commands << "echo \"#{before}#{delimiter}#{instructions[key]}#{after}\" #{redirect} #{filename}"
47
+ redirect = '>>'
48
+ end
49
+
50
+ commands
51
+ end
52
+ end
@@ -0,0 +1,75 @@
1
+ ---
2
+ - command: "echo Foreplay version <%= VERSION %>"
3
+ commentary: "Foreplay running from <%= `hostname -f` %><%= `which foreman` %>"
4
+ - command: "mkdir -p <%= path %> && cd <%= path %> && rm -rf <%= current_port %> && git clone -b <%= instructions[:branch] || 'master' %> <%= instructions[:repository] %> <%= current_port %>"
5
+ commentary: "Cloning <%= instructions[:branch] || 'master' %> branch of repository <%= instructions[:repository] %>"
6
+ - command: "rvm rvmrc trust <%= current_port %>"
7
+ commentary: 'Trusting the .rvmrc file for the new instance'
8
+ - command: "rvm rvmrc warning ignore <%= current_port %>"
9
+ commentary: 'Ignoring the .rvmrc warning for the new instance'
10
+ - command: 'gpg --keyserver hkp://pool.sks-keyservers.net --recv-keys D39DC0E3'
11
+ commentary: "Trusting RVM's public key"
12
+ ignore_error: true
13
+ - command: "cd <%= current_port %> && mkdir -p tmp doc log config"
14
+ commentary: 'If you have a .rvmrc file there may be a delay now while we install a new ruby'
15
+ - command: 'if [ -f .ruby-version ] ; then rvm install `cat .ruby-version` ; else echo "No .ruby-version file found" ; fi'
16
+ commentary: 'If you have a .ruby-version file there may be a delay now while we install a new ruby'
17
+ - key: :env
18
+ delimiter: '='
19
+ prefix: '.'
20
+ commentary: 'Building .env'
21
+ - key: :foreman
22
+ delimiter: ': '
23
+ prefix: '.'
24
+ commentary: 'Building .foreman'
25
+ - key: :database
26
+ delimiter: ': '
27
+ suffix: '.yml'
28
+ commentary: 'Building config/database.yml'
29
+ before: ' '
30
+ header: "<%= environment %>:"
31
+ path: 'config/'
32
+ - key: :resque
33
+ delimiter: ': '
34
+ suffix: '.yml'
35
+ commentary: 'Building config/resque.yml'
36
+ before: environment
37
+ path: 'config/'
38
+ - command: 'if [ -d ../cache/vendor/bundle/bundle ] ; then rm -rf ../cache/vendor/bundle/bundle ; else echo No evidence of legacy copy bug ; fi'
39
+ commentary: 'Fixing legacy copy bug'
40
+ - command: 'if [ -d ../cache/vendor/bundle ] ; then rsync -aW --no-compress --delete --info=STATS1 ../cache/vendor/bundle/ vendor/bundle ; else echo No bundle to restore ; fi'
41
+ commentary: 'Attempting to restore bundle from cache'
42
+ - command: 'sudo ln -f `which bundle` /usr/bin/bundle || echo Using default version of bundle'
43
+ commentary: 'Setting the current version of bundle to be the default'
44
+ - command: 'bundle install --deployment --clean --jobs 2 --without development test'
45
+ commentary: 'Using bundler to install the required gems in deployment mode'
46
+ - command: 'mkdir -p ../cache/vendor && rsync -aW --no-compress --delete --info=STATS1 vendor/bundle/ ../cache/vendor/bundle'
47
+ commentary: 'Caching bundle'
48
+ - command: 'if [ -f public/assets/manifest.yml ] ; then echo "Not precompiling assets" ; else RAILS_ENV=<%= environment %> bundle exec foreman run rake assets:precompile ; fi'
49
+ commentary: 'Precompiling assets unless they were supplied'
50
+ - command: 'sudo bundle exec foreman export upstart /etc/init'
51
+ commentary: "Converting <%= current_service %> to an upstart service"
52
+ - command: "sudo start <%= current_service %> || sudo restart <%= current_service %>"
53
+ commentary: 'Starting the service'
54
+ ignore_error: true
55
+ - command: "echo <%= current_port %> > $HOME/<%= current_port_file %>"
56
+ commentary: "Setting the port for the new instance to <%= current_port %>"
57
+ - command: 'sleep 60'
58
+ commentary: 'Waiting 60s to give service time to start'
59
+ - command: "sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port <%= current_port %>"
60
+ commentary: "Adding firewall rule to direct incoming traffic on port 80 to port <%= current_port %>"
61
+ - command: "sudo iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port <%= former_port %>"
62
+ commentary: "Removing previous firewall rule directing traffic to port <%= former_port %>"
63
+ ignore_error: true
64
+ - command: 'sudo iptables-save > /etc/iptables/rules.v4'
65
+ commentary: 'Attempting to save firewall rules to /etc/iptables/rules.v4'
66
+ ignore_error: true
67
+ - command: 'sudo iptables-save > /etc/iptables.up.rules'
68
+ commentary: 'Attempting to save firewall rules to /etc/iptables.up.rules'
69
+ ignore_error: true
70
+ - command: 'sudo iptables-save -c | egrep REDIRECT --color=never'
71
+ ignore_error: true
72
+ commentary: 'Current firewall NAT configuration:'
73
+ - command: "sudo stop <%= former_service %> || echo 'No previous instance running'"
74
+ commentary: 'Stopping the previous instance'
75
+ ignore_error: true