incline 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +40 -40
- data/lib/incline/auth_engine_base.rb +1 -1
- data/lib/incline/cli/errors.rb +8 -1
- data/lib/incline/cli/helpers/yaml.rb +18 -1
- data/lib/incline/cli/prepare/add_deploy_user.rb +63 -0
- data/lib/incline/cli/prepare/config_passenger.rb +178 -0
- data/lib/incline/cli/prepare/config_ssh.rb +33 -0
- data/lib/incline/cli/prepare/create_nginx_utils.rb +52 -0
- data/lib/incline/cli/prepare/extend_shell.rb +102 -0
- data/lib/incline/cli/prepare/install_db.rb +21 -0
- data/lib/incline/cli/prepare/install_flytrap.rb +62 -0
- data/lib/incline/cli/prepare/install_passenger.rb +37 -0
- data/lib/incline/cli/prepare/install_prereqs.rb +15 -0
- data/lib/incline/cli/prepare/install_rails.rb +15 -0
- data/lib/incline/cli/prepare/install_rbenv.rb +39 -0
- data/lib/incline/cli/prepare/install_ruby.rb +27 -0
- data/lib/incline/cli/prepare/restart_nginx.rb +23 -0
- data/lib/incline/cli/prepare/ssh_copy_id.rb +32 -0
- data/lib/incline/cli/prepare/update_system.rb +16 -0
- data/lib/incline/cli/prepare.rb +270 -0
- data/lib/incline/cli/usage.rb +54 -24
- data/lib/incline/cli.rb +10 -9
- data/lib/incline/version.rb +1 -1
- data/lib/templates/test_unit/scaffold/functional_test.rb +60 -0
- data/test/cli/yaml_contents_test.rb +83 -0
- metadata +22 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fafa45ca265ae7c13ca542ea9d4dd01ab5a052c
|
4
|
+
data.tar.gz: be6b2e8f999070090c9c8367981897e8bd11a069
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '03698557ded76bf19a3afdc29e262ffffabbd232fcb4da4d382a854c297893c573ef88c7b1f91cd099e53b50862fbb2a22c2b801362725a9f93a257e0631e494'
|
7
|
+
data.tar.gz: dd2902766035cec343433b373e61b5d6f7f4ca4d376945fe67ba870d674c9b615baf21c3517a47dc7238685603dd8e01b389ad3ca4ef06dde7f0c8186c534762
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
incline (0.2.
|
4
|
+
incline (0.2.4)
|
5
5
|
ansi (~> 1.5.0)
|
6
6
|
bcrypt
|
7
7
|
bootstrap-sass
|
@@ -13,52 +13,52 @@ PATH
|
|
13
13
|
rails (~> 4.2.8)
|
14
14
|
redcarpet (~> 3.4.0)
|
15
15
|
sass-rails (~> 5.0.6)
|
16
|
-
shells (~> 0.1.
|
16
|
+
shells (~> 0.1.15)
|
17
17
|
spawnling (~> 2.1.6)
|
18
18
|
uglifier
|
19
19
|
|
20
20
|
GEM
|
21
21
|
remote: https://rubygems.org/
|
22
22
|
specs:
|
23
|
-
actionmailer (4.2.
|
24
|
-
actionpack (= 4.2.
|
25
|
-
actionview (= 4.2.
|
26
|
-
activejob (= 4.2.
|
23
|
+
actionmailer (4.2.9)
|
24
|
+
actionpack (= 4.2.9)
|
25
|
+
actionview (= 4.2.9)
|
26
|
+
activejob (= 4.2.9)
|
27
27
|
mail (~> 2.5, >= 2.5.4)
|
28
28
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
29
|
-
actionpack (4.2.
|
30
|
-
actionview (= 4.2.
|
31
|
-
activesupport (= 4.2.
|
29
|
+
actionpack (4.2.9)
|
30
|
+
actionview (= 4.2.9)
|
31
|
+
activesupport (= 4.2.9)
|
32
32
|
rack (~> 1.6)
|
33
33
|
rack-test (~> 0.6.2)
|
34
34
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
35
35
|
rails-html-sanitizer (~> 1.0, >= 1.0.2)
|
36
|
-
actionview (4.2.
|
37
|
-
activesupport (= 4.2.
|
36
|
+
actionview (4.2.9)
|
37
|
+
activesupport (= 4.2.9)
|
38
38
|
builder (~> 3.1)
|
39
39
|
erubis (~> 2.7.0)
|
40
40
|
rails-dom-testing (~> 1.0, >= 1.0.5)
|
41
41
|
rails-html-sanitizer (~> 1.0, >= 1.0.3)
|
42
|
-
activejob (4.2.
|
43
|
-
activesupport (= 4.2.
|
42
|
+
activejob (4.2.9)
|
43
|
+
activesupport (= 4.2.9)
|
44
44
|
globalid (>= 0.3.0)
|
45
|
-
activemodel (4.2.
|
46
|
-
activesupport (= 4.2.
|
45
|
+
activemodel (4.2.9)
|
46
|
+
activesupport (= 4.2.9)
|
47
47
|
builder (~> 3.1)
|
48
|
-
activerecord (4.2.
|
49
|
-
activemodel (= 4.2.
|
50
|
-
activesupport (= 4.2.
|
48
|
+
activerecord (4.2.9)
|
49
|
+
activemodel (= 4.2.9)
|
50
|
+
activesupport (= 4.2.9)
|
51
51
|
arel (~> 6.0)
|
52
52
|
activerecord-sqlserver-adapter (4.2.18)
|
53
53
|
activerecord (~> 4.2.1)
|
54
|
-
activesupport (4.2.
|
54
|
+
activesupport (4.2.9)
|
55
55
|
i18n (~> 0.7)
|
56
56
|
minitest (~> 5.1)
|
57
57
|
thread_safe (~> 0.3, >= 0.3.4)
|
58
58
|
tzinfo (~> 1.1)
|
59
59
|
ansi (1.5.0)
|
60
60
|
arel (6.0.4)
|
61
|
-
autoprefixer-rails (7.1.2.
|
61
|
+
autoprefixer-rails (7.1.2.4)
|
62
62
|
execjs
|
63
63
|
bcrypt (3.1.11)
|
64
64
|
bootstrap-sass (3.3.7)
|
@@ -85,7 +85,7 @@ GEM
|
|
85
85
|
ffi (1.9.18)
|
86
86
|
globalid (0.4.0)
|
87
87
|
activesupport (>= 4.2.0)
|
88
|
-
i18n (0.8.
|
88
|
+
i18n (0.8.6)
|
89
89
|
jbuilder (2.7.0)
|
90
90
|
activesupport (>= 4.2.0)
|
91
91
|
multi_json (>= 1.2)
|
@@ -100,25 +100,25 @@ GEM
|
|
100
100
|
mime-types (3.1)
|
101
101
|
mime-types-data (~> 3.2015)
|
102
102
|
mime-types-data (3.2016.0521)
|
103
|
-
mini_portile2 (2.
|
104
|
-
minitest (5.10.
|
103
|
+
mini_portile2 (2.2.0)
|
104
|
+
minitest (5.10.3)
|
105
105
|
multi_json (1.12.1)
|
106
|
-
net-ssh (
|
107
|
-
nokogiri (1.
|
108
|
-
mini_portile2 (~> 2.
|
106
|
+
net-ssh (4.1.0)
|
107
|
+
nokogiri (1.8.0)
|
108
|
+
mini_portile2 (~> 2.2.0)
|
109
109
|
rack (1.6.8)
|
110
110
|
rack-test (0.6.3)
|
111
111
|
rack (>= 1.0)
|
112
|
-
rails (4.2.
|
113
|
-
actionmailer (= 4.2.
|
114
|
-
actionpack (= 4.2.
|
115
|
-
actionview (= 4.2.
|
116
|
-
activejob (= 4.2.
|
117
|
-
activemodel (= 4.2.
|
118
|
-
activerecord (= 4.2.
|
119
|
-
activesupport (= 4.2.
|
112
|
+
rails (4.2.9)
|
113
|
+
actionmailer (= 4.2.9)
|
114
|
+
actionpack (= 4.2.9)
|
115
|
+
actionview (= 4.2.9)
|
116
|
+
activejob (= 4.2.9)
|
117
|
+
activemodel (= 4.2.9)
|
118
|
+
activerecord (= 4.2.9)
|
119
|
+
activesupport (= 4.2.9)
|
120
120
|
bundler (>= 1.3.0, < 2.0)
|
121
|
-
railties (= 4.2.
|
121
|
+
railties (= 4.2.9)
|
122
122
|
sprockets-rails
|
123
123
|
rails-deprecated_sanitizer (1.0.3)
|
124
124
|
activesupport (>= 4.2.0.alpha)
|
@@ -128,9 +128,9 @@ GEM
|
|
128
128
|
rails-deprecated_sanitizer (>= 1.0.1)
|
129
129
|
rails-html-sanitizer (1.0.3)
|
130
130
|
loofah (~> 2.0)
|
131
|
-
railties (4.2.
|
132
|
-
actionpack (= 4.2.
|
133
|
-
activesupport (= 4.2.
|
131
|
+
railties (4.2.9)
|
132
|
+
actionpack (= 4.2.9)
|
133
|
+
activesupport (= 4.2.9)
|
134
134
|
rake (>= 0.8.7)
|
135
135
|
thor (>= 0.18.1, < 2.0)
|
136
136
|
rake (12.0.0)
|
@@ -151,8 +151,8 @@ GEM
|
|
151
151
|
sprockets (>= 2.8, < 4.0)
|
152
152
|
sprockets-rails (>= 2.0, < 4.0)
|
153
153
|
tilt (>= 1.1, < 3)
|
154
|
-
shells (0.1.
|
155
|
-
net-ssh (~>
|
154
|
+
shells (0.1.15)
|
155
|
+
net-ssh (~> 4.1.0)
|
156
156
|
rubyserial (~> 0.4.0)
|
157
157
|
spawnling (2.1.6)
|
158
158
|
sprockets (3.7.1)
|
@@ -45,7 +45,7 @@ module Incline
|
|
45
45
|
private
|
46
46
|
|
47
47
|
def purge_old_history_for(user, max_months = 2)
|
48
|
-
user.login_histories.where('
|
48
|
+
user.login_histories.where('incline_user_login_histories.created_at <= ?', Time.now - max_months.months).delete_all
|
49
49
|
end
|
50
50
|
|
51
51
|
end
|
data/lib/incline/cli/errors.rb
CHANGED
@@ -2,7 +2,14 @@ module Incline
|
|
2
2
|
class CLI
|
3
3
|
|
4
4
|
class CliError < ::RuntimeError; end
|
5
|
-
class UsageError < CliError
|
5
|
+
class UsageError < CliError
|
6
|
+
attr_accessor :command
|
7
|
+
def initialize(msg, command = nil)
|
8
|
+
super msg
|
9
|
+
self.command = command
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
6
13
|
|
7
14
|
end
|
8
15
|
end
|
@@ -362,7 +362,7 @@ module Incline
|
|
362
362
|
base_key << line[:key]
|
363
363
|
|
364
364
|
last_line = {
|
365
|
-
key: base_key,
|
365
|
+
key: base_key.dup,
|
366
366
|
value: line[:value].to_s,
|
367
367
|
comment: line[:comment],
|
368
368
|
safe: true
|
@@ -518,6 +518,23 @@ module Incline
|
|
518
518
|
def =~(regexp)
|
519
519
|
@content =~ regexp
|
520
520
|
end
|
521
|
+
|
522
|
+
##
|
523
|
+
# Inserts a comment to the beginning of the contents.
|
524
|
+
def insert_comment(text)
|
525
|
+
text = '# ' + text.gsub("\r\n", "\n").gsub("\n", "\n# ") + "\n"
|
526
|
+
@content = @content.insert(0, text)
|
527
|
+
end
|
528
|
+
|
529
|
+
##
|
530
|
+
# Appends a comment to the end of the contents.
|
531
|
+
def append_comment(text)
|
532
|
+
text = '# ' + text.gsub("\r\n", "\n").gsub("\n", "\n# ") + "\n"
|
533
|
+
unless @content[-1] == "\n"
|
534
|
+
@content += "\n"
|
535
|
+
end
|
536
|
+
@content += text
|
537
|
+
end
|
521
538
|
|
522
539
|
private
|
523
540
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
|
2
|
+
module Incline
|
3
|
+
class CLI
|
4
|
+
class Prepare
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def user_process_list(shell, user)
|
9
|
+
shell.sudo_exec_ignore_code("pgrep -u #{@options[:deploy_user]}").to_s.split("\n").map(&:strip).reject{|s| s == ''}
|
10
|
+
end
|
11
|
+
|
12
|
+
def kill_processes(shell, user, signal)
|
13
|
+
if user_process_list(shell, user).any?
|
14
|
+
shell.sudo_exec_ignore_code "pkill -#{signal} -u #{user}"
|
15
|
+
et = Time.now + 5
|
16
|
+
while Time.now < et
|
17
|
+
return true if user_process_list(shell, user).empty?
|
18
|
+
sleep 1
|
19
|
+
end
|
20
|
+
user_process_list(shell,user).any?
|
21
|
+
else
|
22
|
+
true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_deploy_user(shell)
|
27
|
+
# clean up first
|
28
|
+
unless shell.get_user_id(@options[:deploy_user]) == 0
|
29
|
+
shell.with_stat('Removing previous deploy user') do
|
30
|
+
unless kill_processes(shell, @options[:deploy_user], 'TERM')
|
31
|
+
unless kill_processes(shell, @options[:deploy_user], 'KILL')
|
32
|
+
raise CliError, "Failed to kill all processes owned by #{@options[:deploy_user]}."
|
33
|
+
end
|
34
|
+
end
|
35
|
+
# remove crontab for user.
|
36
|
+
shell.sudo_exec_ignore_code "crontab -u #{@options[:deploy_user]} -r"
|
37
|
+
# remove at jobs for user.
|
38
|
+
shell.sudo_exec_ignore_code "find /var/spool/cron/atjobs -name \"[^.]*\" -type f -user #{@options[:deploy_user]} -delete"
|
39
|
+
# remove the user.
|
40
|
+
shell.sudo_exec "userdel -r #{@options[:deploy_user]}"
|
41
|
+
# remove the main user group.
|
42
|
+
shell.sudo_exec_ignore_code "groupdel #{@options[:deploy_user]}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
shell.with_stat('Adding deploy user') do
|
47
|
+
# create the user.
|
48
|
+
shell.sudo_exec "useradd -mU -s /bin/bash #{@options[:deploy_user]}"
|
49
|
+
shell.sudo_exec "printf \"#{@options[:deploy_password]}\\n#{@options[:deploy_password]}\\n\" | passwd #{@options[:deploy_user]}"
|
50
|
+
|
51
|
+
# add the user's group to the admin user.
|
52
|
+
shell.sudo_exec "usermod -G #{@options[:deploy_user]} -a #{@options[:admin_user]}"
|
53
|
+
|
54
|
+
# set the permissions on the user's home directory.
|
55
|
+
# it should be /home/deploy or some such, but let's not assume so.
|
56
|
+
@options[:deploy_home] = shell.exec("eval echo \"~#{@options[:deploy_user]}\"").split("\n").first.strip
|
57
|
+
shell.sudo_exec "chown #{@options[:deploy_user]}:#{@options[:deploy_user]} #{@options[:deploy_home]} && chmod 755 #{@options[:deploy_home]}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
|
2
|
+
module Incline
|
3
|
+
class CLI
|
4
|
+
class Prepare
|
5
|
+
|
6
|
+
PASSENGER_ROOT_PLACEHOLDER = /\?\?PR/
|
7
|
+
DEPLOY_HOME_PLACEHOLDER = /\?\?DH/
|
8
|
+
INST_REG_COMMENT_PLACEHOLDER = /\?\?IR/
|
9
|
+
|
10
|
+
PASSENGER_ROOT_PATH = 'ruby/vendor_ruby/phusion_passenger/locations.ini'
|
11
|
+
PASSENGER_ROOT_SEARCH = %w(/usr/share /usr/lib)
|
12
|
+
|
13
|
+
NGINX_CONFIG = <<-EOCFG
|
14
|
+
# General nginx configuration from Incline prepare script.
|
15
|
+
# Configuration file generated #{Time.now}.
|
16
|
+
|
17
|
+
user ruby-apps;
|
18
|
+
worker_processes 1;
|
19
|
+
error_log /var/log/nginx/error.log;
|
20
|
+
pid /run/nginx.pid;
|
21
|
+
|
22
|
+
events {
|
23
|
+
worker_connections 1024;
|
24
|
+
}
|
25
|
+
|
26
|
+
http {
|
27
|
+
##
|
28
|
+
# Basic Settings
|
29
|
+
##
|
30
|
+
|
31
|
+
include /etc/nginx/mime.types;
|
32
|
+
default_type application/octet-stream;
|
33
|
+
|
34
|
+
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
35
|
+
'$status $body_bytes_sent "$http_referer" '
|
36
|
+
'"$http_user_agent" "$http_x_forwarded_for"';
|
37
|
+
access_log /var/log/nginx/access.log main;
|
38
|
+
|
39
|
+
sendfile on;
|
40
|
+
index index.html index.htm;
|
41
|
+
|
42
|
+
tcp_nopush on;
|
43
|
+
tcp_nodelay on;
|
44
|
+
keepalive_timeout 65;
|
45
|
+
types_hash_max_size 2048;
|
46
|
+
|
47
|
+
##
|
48
|
+
# SSL Settings
|
49
|
+
##
|
50
|
+
|
51
|
+
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
52
|
+
ssl_ciphers DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
|
53
|
+
ssl_prefer_server_ciphers on;
|
54
|
+
ssl_session_cache shared:SSL:10m;
|
55
|
+
ssl_session_timeout 5m;
|
56
|
+
ssl_dhparam /var/ssl/dhparams.pem;
|
57
|
+
|
58
|
+
##
|
59
|
+
# Phusion Passenger settings
|
60
|
+
##
|
61
|
+
|
62
|
+
passenger_root ??PR;
|
63
|
+
passenger_ruby ??DH/.rbenv/shims/ruby;
|
64
|
+
passenger_log_level 1;
|
65
|
+
??IRpassenger_instance_registry_dir /var/run/passenger-instreg;
|
66
|
+
|
67
|
+
##
|
68
|
+
# Default server settings
|
69
|
+
##
|
70
|
+
|
71
|
+
server {
|
72
|
+
listen 80 default_server;
|
73
|
+
listen [::]:80 default_server ipv6only=on;
|
74
|
+
listen 443 ssl;
|
75
|
+
listen [::]:443 ssl;
|
76
|
+
|
77
|
+
ssl_certificate /var/ssl/ssl.crt;
|
78
|
+
ssl_certificate_key /var/ssl/ssl.key;
|
79
|
+
|
80
|
+
# Set this as appropriate.
|
81
|
+
server_name localhost;
|
82
|
+
|
83
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
84
|
+
|
85
|
+
keepalive_timeout 70;
|
86
|
+
|
87
|
+
include /etc/nginx/locations-enabled/*;
|
88
|
+
}
|
89
|
+
}
|
90
|
+
EOCFG
|
91
|
+
|
92
|
+
DEFAULT_LOC = <<-EOCFG
|
93
|
+
# This is a sample rails app configuration that also happens to take care of ignoring zombie requests.
|
94
|
+
# See the fly_trap app's README for more information about it.
|
95
|
+
location / {
|
96
|
+
# path to the public folder in your app.
|
97
|
+
root ??DH/apps/fly_trap/public;
|
98
|
+
|
99
|
+
# path rails will use as the root path, should match the path provided to location above.
|
100
|
+
passenger_base_uri /;
|
101
|
+
|
102
|
+
rails_env production;
|
103
|
+
passenger_enabled on;
|
104
|
+
}
|
105
|
+
EOCFG
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
private_constant :NGINX_CONFIG, :DEFAULT_LOC, :PASSENGER_ROOT_PLACEHOLDER, :DEPLOY_HOME_PLACEHOLDER, :PASSENGER_ROOT_PATH, :PASSENGER_ROOT_SEARCH, :INST_REG_COMMENT_PLACEHOLDER
|
110
|
+
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def config_passenger(shell)
|
115
|
+
shell.with_stat('Configuring Passenger') do
|
116
|
+
|
117
|
+
# add the ruby-apps user.
|
118
|
+
if shell.get_user_id('ruby-apps') == 0
|
119
|
+
shell.sudo_exec "useradd -mU ruby-apps"
|
120
|
+
end
|
121
|
+
|
122
|
+
# add ruby-apps and deploy groups to each other.
|
123
|
+
shell.sudo_exec_ignore_code "usermod -G ruby-apps -a #{@options[:deploy_user]}"
|
124
|
+
shell.sudo_exec_ignore_code "usermod -G #{@options[:deploy_user]} -a ruby-apps"
|
125
|
+
|
126
|
+
# backup and remove the original configuration.
|
127
|
+
shell.sudo_exec 'if [ ! -f /etc/nginx/nginx.conf.original ]; then mv -f /etc/nginx/nginx.conf /etc/nginx/nginx.conf.original; fi'
|
128
|
+
|
129
|
+
# get the passenger_root path.
|
130
|
+
pr_path = shell.sudo_exec_ignore_code "ls {#{PASSENGER_ROOT_SEARCH.join(',')}}/#{PASSENGER_ROOT_PATH} 2>/dev/null"
|
131
|
+
pr_path = pr_path.to_s.split("\n").first.to_s.strip
|
132
|
+
raise CliError, 'Failed to locate passenger_root path' if pr_path == ''
|
133
|
+
|
134
|
+
# write the new configuration to a temporary file.
|
135
|
+
shell.write_file(
|
136
|
+
"#{shell.home_path}/nginx.conf",
|
137
|
+
NGINX_CONFIG
|
138
|
+
.gsub(PASSENGER_ROOT_PLACEHOLDER, pr_path)
|
139
|
+
.gsub(DEPLOY_HOME_PLACEHOLDER, @options[:deploy_home])
|
140
|
+
.gsub(INST_REG_COMMENT_PLACEHOLDER, host_id == :centos ? '' : '# ')
|
141
|
+
)
|
142
|
+
|
143
|
+
# move it where it belongs.
|
144
|
+
shell.sudo_exec "mv -f #{shell.home_path}/nginx.conf /etc/nginx/nginx.conf"
|
145
|
+
shell.sudo_exec 'chown root:root /etc/nginx/nginx.conf && chmod 644 /etc/nginx/nginx.conf'
|
146
|
+
|
147
|
+
# create the location folders.
|
148
|
+
%w(locations-available locations-enabled).each do |loc|
|
149
|
+
loc = "/etc/nginx/#{loc}"
|
150
|
+
shell.sudo_exec "if [ ! -d #{loc} ]; then mkdir #{loc}; fi"
|
151
|
+
shell.sudo_exec "chown #{@options[:deploy_user]}:root #{loc} && chmod 6755 #{loc}"
|
152
|
+
end
|
153
|
+
|
154
|
+
# create the default location.
|
155
|
+
shell.write_file(
|
156
|
+
"#{shell.home_path}/default.loc",
|
157
|
+
DEFAULT_LOC
|
158
|
+
.gsub(PASSENGER_ROOT_PLACEHOLDER, pr_path)
|
159
|
+
.gsub(DEPLOY_HOME_PLACEHOLDER, @options[:deploy_home])
|
160
|
+
)
|
161
|
+
shell.sudo_exec "mv -f #{shell.home_path}/default.loc /etc/nginx/locations-available/default"
|
162
|
+
shell.sudo_exec "chown #{@options[:deploy_user]}:root /etc/nginx/locations-available/default && chmod 644 /etc/nginx/locations-available/default"
|
163
|
+
shell.sudo_exec "ln -s /etc/nginx/locations-available/default /etc/nginx/locations-enabled/default"
|
164
|
+
|
165
|
+
# create the SSL files.
|
166
|
+
shell.sudo_exec 'if [ ! -d /var/ssl ]; then mkdir /var/ssl; fi'
|
167
|
+
shell.sudo_exec 'chown ruby-apps:root /var/ssl && chmod 700 /var/ssl'
|
168
|
+
# strengthen SSL by using unique dhparams
|
169
|
+
shell.sudo_exec 'openssl dhparam -out /var/ssl/dhparams.pem 2048'
|
170
|
+
# generate a generic self-signed certificate to get started with.
|
171
|
+
shell.sudo_exec "openssl req -x509 -nodes -days 365 -newkey rsa:4096 -subj \"/C=#{@options[:ssl_country]}/ST=#{@options[:ssl_state]}/L=#{@options[:ssl_location]}/O=#{@options[:ssl_org]}/CN=$(hostname -f)\" -keyout /var/ssl/ssl.key -out /var/ssl/ssl.crt"
|
172
|
+
shell.sudo_exec 'chown ruby-apps:root /var/ssl/* -R && chmod 600 /var/ssl/*'
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
|
2
|
+
module Incline
|
3
|
+
class CLI
|
4
|
+
class Prepare
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def config_ssh(shell)
|
9
|
+
pa_rex = /#\s*PubkeyAuthentication\s+[^\n]*\n/
|
10
|
+
rl_rex = /#\s*PermitRootLogin\s+[^\n]*\n/
|
11
|
+
|
12
|
+
shell.with_stat('Configuring SSH') do
|
13
|
+
shell.sudo_exec "cp -f /etc/ssh/sshd_config #{shell.home_path}/tmp_sshd_conf"
|
14
|
+
contents = shell.read_file("#{shell.home_path}/tmp_sshd_conf")
|
15
|
+
new_contents = contents.gsub(pa_rex, "PubkeyAuthentication yes\n").gsub(rl_rex, "PermitRootLogin no\n")
|
16
|
+
if new_contents != contents
|
17
|
+
shell.write_file "#{shell.home_path}/tmp_sshd_conf", new_contents
|
18
|
+
shell.sudo_exec "chown root:root #{shell.home_path}/tmp_sshd_conf"
|
19
|
+
shell.sudo_exec "chmod 600 #{shell.home_path}/tmp_sshd_conf"
|
20
|
+
shell.sudo_exec "mv -f #{shell.home_path}/tmp_sshd_conf /etc/ssh/sshd_config"
|
21
|
+
|
22
|
+
begin
|
23
|
+
shell.sudo_exec_ignore_code 'systemctl restart sshd.service'
|
24
|
+
rescue
|
25
|
+
# ignore any errors from the SSH restart since we should be exiting the SSH session immediately after this gets executed anyway.
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
module Incline
|
3
|
+
class CLI
|
4
|
+
class Prepare
|
5
|
+
|
6
|
+
# create setuid utilities to test the config and reload the config.
|
7
|
+
|
8
|
+
UTIL_NGINX_RELOAD = <<-EOU
|
9
|
+
#include <unistd.h>
|
10
|
+
|
11
|
+
int main(int argc, char **argv)
|
12
|
+
{
|
13
|
+
const char *args[] = { "??NG", "-s", "reload", NULL };
|
14
|
+
setuid(0);
|
15
|
+
execv(args[0], (char **)args);
|
16
|
+
return 0;
|
17
|
+
}
|
18
|
+
EOU
|
19
|
+
|
20
|
+
UTIL_NGINX_TEST = <<-EOU
|
21
|
+
#include <unistd.h>
|
22
|
+
|
23
|
+
int main(int argc, char **argv)
|
24
|
+
{
|
25
|
+
const char *args[] = { "??NG", "-t", "-q", NULL };
|
26
|
+
setuid(0);
|
27
|
+
execv(args[0], (char **)args);
|
28
|
+
return 0;
|
29
|
+
}
|
30
|
+
EOU
|
31
|
+
|
32
|
+
|
33
|
+
private_constant :UTIL_NGINX_RELOAD, :UTIL_NGINX_TEST
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def create_nginx_utils(shell)
|
38
|
+
shell.with_status('Creating utilities') do
|
39
|
+
nginx_path = shell.exec("which nginx").split("\n").first.to_s.strip
|
40
|
+
|
41
|
+
{ 'nginx-reload' => UTIL_NGINX_RELOAD, 'nginx-test' => UTIL_NGINX_TEST }.each do |util,src|
|
42
|
+
shell.write_file "#{shell.home_path}/temp-util.c", src.gsub("??NG", nginx_path)
|
43
|
+
shell.exec "gcc -o #{shell.home_path}/#{util} #{shell.home_path}/temp-util.c"
|
44
|
+
shell.sudo_exec "chown root:root #{shell.home_path}/#{util} && chmod 4755 #{shell.home_path}/#{util}"
|
45
|
+
shell.sudo_exec "mv -f #{shell.home_path}/#{util} /usr/local/bin/#{util}"
|
46
|
+
shell.exec "rm #{shell.home_path}/temp-util.c"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Incline
|
2
|
+
class CLI
|
3
|
+
class Prepare
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
# Add full logging to the shell along with a few helper methods.
|
8
|
+
# The prefix is used to identify the shell creating the messages and will be prefixed to each line in the log.
|
9
|
+
def extend_shell(sh, prefix)
|
10
|
+
logfile.write "\n" + prefix
|
11
|
+
sh.instance_variable_set :@prep_log, logfile
|
12
|
+
sh.instance_variable_set :@prep_prefix, "\n#{prefix}"
|
13
|
+
sh.instance_variable_set :@stat_count, -1
|
14
|
+
sh.instance_variable_set :@stat_every, 128
|
15
|
+
sh.instance_variable_set :@home_path, nil
|
16
|
+
|
17
|
+
def sh.home_path
|
18
|
+
@home_path ||= exec_ignore_code("eval echo \"~#{@options[:user]}\"").to_s.split("\n").first.to_s.strip
|
19
|
+
end
|
20
|
+
|
21
|
+
def sh.with_stat(status, stat_every = 128)
|
22
|
+
if @stat_count > -1
|
23
|
+
yield
|
24
|
+
else
|
25
|
+
@stat_count = 0
|
26
|
+
@stat_every = stat_every < 1 ? 128 : stat_every
|
27
|
+
print status
|
28
|
+
yield
|
29
|
+
print "\n"
|
30
|
+
@stat_count = -1
|
31
|
+
@stat_every = 128
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def sh.exec(cmd, options = {}, &block)
|
36
|
+
super(cmd, options) do |data, type|
|
37
|
+
@prep_log.write data.gsub("\n", @prep_prefix)
|
38
|
+
@prep_log.flush
|
39
|
+
if @stat_count > -1
|
40
|
+
@stat_count += data.length
|
41
|
+
while @stat_count >= @stat_every
|
42
|
+
@stat_count -= @stat_every
|
43
|
+
print '.'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
if block
|
47
|
+
block.call data, type
|
48
|
+
else
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def sh.stat_exec(status, cmd, options = {}, &block)
|
55
|
+
with_stat(status) { exec(cmd, options, &block) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def sh.sudo_stat_exec(status, cmd, options = {}, &block)
|
59
|
+
with_stat(status) { sudo_exec(cmd, options, &block) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def sh.apt_get(command)
|
63
|
+
sudo_exec "DEBIAN_FRONTEND=noninteractive apt-get -y -q #{command}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def sh.get_user_id(user)
|
67
|
+
result = exec_ignore_code("id -u #{user} 2>/dev/null").to_s.split("\n")
|
68
|
+
result.any? ? result.first.strip.to_i : 0
|
69
|
+
end
|
70
|
+
|
71
|
+
def sh.host_info
|
72
|
+
@host_info ||=
|
73
|
+
begin
|
74
|
+
results = exec('cat /etc/*-release').split("\n").map{|s| s.strip}.reject{|s| s == ''}
|
75
|
+
info = {}
|
76
|
+
|
77
|
+
results.each do |line|
|
78
|
+
if line.include?('=')
|
79
|
+
var,_,val = line.partition('=').map{|s| s.strip}
|
80
|
+
val = val[1...-1] if val[0] == '"' && val[-1] == '"'
|
81
|
+
var.upcase!
|
82
|
+
info[var] = val
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
info['ID'] = (info['ID'] || 'unknown').downcase.to_sym
|
87
|
+
info['NAME'] ||= info['ID'].to_s
|
88
|
+
info['VERSION'] ||= '??'
|
89
|
+
info['PRETTY_NAME'] ||= "#{info['NAME']} #{info['VERSION']}"
|
90
|
+
|
91
|
+
puts info['PRETTY_NAME']
|
92
|
+
|
93
|
+
info
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
sh
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
|
2
|
+
module Incline
|
3
|
+
class CLI
|
4
|
+
class Prepare
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def install_db(shell)
|
9
|
+
shell.with_stat('Installing MariaDB') do
|
10
|
+
shell.sudo_exec 'debconf-set-selections <<< \'mariadb-server mysql-server/root_password password \''
|
11
|
+
shell.sudo_exec 'debconf-set-selections <<< \'mariadb-server mysql-server/root_password_again password \''
|
12
|
+
shell.apt_get 'install mariadb-server mariadb-client libmysqlclient-dev'
|
13
|
+
shell.sudo_exec_ignore_code 'systemctl stop mysql.service'
|
14
|
+
shell.sudo_exec 'systemctl start mysql.service'
|
15
|
+
shell.sudo_exec 'systemctl enable mysql.service'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|