smartmachine 1.2.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/smart_machine/commands/grid.rb +8 -0
- data/lib/smart_machine/commands/grid_commands/emailer.rb +107 -0
- data/lib/smart_machine/commands/grid_commands/roundcube.rb +65 -0
- data/lib/smart_machine/configuration.rb +35 -2
- data/lib/smart_machine/credentials.rb +10 -0
- data/lib/smart_machine/engine.rb +6 -0
- data/lib/smart_machine/grids/adminer.rb +1 -0
- data/lib/smart_machine/grids/certbot.rb +1 -0
- data/lib/smart_machine/grids/emailer/.keep +0 -0
- data/lib/smart_machine/grids/emailer.rb +188 -0
- data/lib/smart_machine/grids/haproxy.rb +1 -0
- data/lib/smart_machine/grids/mariadb.rb +1 -0
- data/lib/smart_machine/grids/postgresql.rb +1 -0
- data/lib/smart_machine/grids/roundcube.rb +114 -0
- data/lib/smart_machine/machine.rb +7 -0
- data/lib/smart_machine/syncer.rb +10 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/command.rb +50 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/entrypoint.rb +196 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/logtailer.rb +75 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-auth.conf +132 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-mail.conf +427 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-master.conf +153 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-ssl.conf +87 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/15-mailboxes.conf +94 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/20-imap.conf +102 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/20-lmtp.conf +43 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/90-quota.conf +114 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/90-sieve.conf +229 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/dovecot-sql.conf.ext +163 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sh +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sieve +5 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sh +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sieve +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve-after/spam-to-folder.sieve +6 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/haproxy/haproxy.cfg +58 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/monit/conf.d/services.cfg +70 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/monit/monitrc +344 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/opendkim.conf +71 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/main.cf +123 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/master.cf +149 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-sender-login-maps.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-domains.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-domains.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-masters.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-users.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-domains.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-maps.cf +7 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix-policyd-spf-python/policyd-spf.conf +12 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/spamassassin/local.cf +124 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer/usr/local/bin/quota-warning.sh +22 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/emailer.yml +37 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/engine.yml +2 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf +35 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini +4 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/var/roundcube/config/config.custom.inc.php +25 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/roundcube.yml +41 -0
- data/lib/smart_machine/templates/dotsmartmachine/config/users.yml +1 -1
- data/lib/smart_machine/version.rb +2 -2
- data/lib/smart_machine.rb +2 -0
- metadata +55 -4
data/lib/smart_machine/syncer.rb
CHANGED
@@ -64,6 +64,9 @@ module SmartMachine
|
|
64
64
|
'grids/elasticsearch',
|
65
65
|
'grids/elasticsearch/***',
|
66
66
|
|
67
|
+
'grids/emailer',
|
68
|
+
'grids/emailer/***',
|
69
|
+
|
67
70
|
'grids/minio',
|
68
71
|
'grids/minio/***',
|
69
72
|
|
@@ -103,11 +106,17 @@ module SmartMachine
|
|
103
106
|
'bin/smartmachine',
|
104
107
|
|
105
108
|
'config',
|
109
|
+
'config/emailer',
|
110
|
+
'config/emailer/***',
|
106
111
|
'config/mysql',
|
107
112
|
'config/mysql/schedule.rb',
|
108
113
|
'config/phpmyadmin',
|
109
114
|
'config/phpmyadmin/***',
|
115
|
+
'config/roundcube',
|
116
|
+
'config/roundcube/***',
|
110
117
|
'config/credentials.yml.enc',
|
118
|
+
'config/emailer.yml',
|
119
|
+
'config/engine.yml',
|
111
120
|
'config/environment.rb',
|
112
121
|
'config/elasticsearch.yml',
|
113
122
|
'config/minio.yml',
|
@@ -117,6 +126,7 @@ module SmartMachine
|
|
117
126
|
'config/phpmyadmin.yml',
|
118
127
|
'config/prereceiver.yml',
|
119
128
|
'config/redis.yml',
|
129
|
+
'config/roundcube.yml',
|
120
130
|
'config/terminal.yml',
|
121
131
|
|
122
132
|
'grids',
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
STDOUT.sync = true
|
5
|
+
|
6
|
+
class Services
|
7
|
+
def initialize
|
8
|
+
@services = %w(rsyslog haproxy spamassassin spamassassin.update opendkim postfix dovecot)
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
puts "Starting Services..."
|
13
|
+
@services.each { |service| system("monit start #{service}") }
|
14
|
+
system("monit")
|
15
|
+
|
16
|
+
puts "Starting Logtailer..."
|
17
|
+
system("/usr/bin/logtailer.rb start")
|
18
|
+
end
|
19
|
+
|
20
|
+
def stop(signo)
|
21
|
+
puts "Stopping Logtailer..."
|
22
|
+
system("/usr/bin/logtailer.rb stop")
|
23
|
+
|
24
|
+
puts "Stopping Services... SIGNAL: SIG#{Signal.signame(signo)}."
|
25
|
+
system("monit quit")
|
26
|
+
sleep(3)
|
27
|
+
@services.reverse.each { |service| system("monit stop #{service}") }
|
28
|
+
|
29
|
+
puts "Flushing Logtailer..."
|
30
|
+
system("/usr/bin/logtailer.rb flush")
|
31
|
+
|
32
|
+
exit
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
trap('SIGINT') do |signo|
|
37
|
+
Services.new.stop(signo)
|
38
|
+
end
|
39
|
+
|
40
|
+
trap('SIGTERM') do |signo|
|
41
|
+
Services.new.stop(signo)
|
42
|
+
end
|
43
|
+
|
44
|
+
at_exit do
|
45
|
+
# Clean up.
|
46
|
+
end
|
47
|
+
|
48
|
+
Services.new.start
|
49
|
+
|
50
|
+
sleep
|
@@ -0,0 +1,196 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'fileutils'
|
5
|
+
require 'logger'
|
6
|
+
|
7
|
+
logger = Logger.new(STDOUT)
|
8
|
+
STDOUT.sync = true
|
9
|
+
|
10
|
+
def update_envkeys_in(filepaths, envkeys)
|
11
|
+
filepaths.each do |filepath|
|
12
|
+
str = File.read(filepath)
|
13
|
+
str = str.gsub(/%(?!<)/, '%%')
|
14
|
+
str = format(str, envkeys)
|
15
|
+
File.open(filepath, "w") { |file| file << str }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# initial setup
|
20
|
+
unless File.exist?('/run/initial_container_start')
|
21
|
+
FileUtils.touch('/run/initial_container_start')
|
22
|
+
|
23
|
+
# EnvKeys
|
24
|
+
envkeys = {
|
25
|
+
container_name: ENV.delete('CONTAINER_NAME'),
|
26
|
+
fqdn: ENV.delete('FQDN'),
|
27
|
+
mailname: ENV.delete('MAILNAME'),
|
28
|
+
sysadmin_email: ENV.delete('SYSADMIN_EMAIL'),
|
29
|
+
mysql_host: ENV.delete('MYSQL_HOST'),
|
30
|
+
mysql_port: ENV.delete('MYSQL_PORT'),
|
31
|
+
mysql_user: ENV.delete('MYSQL_USER'),
|
32
|
+
mysql_password: ENV.delete('MYSQL_PASSWORD'),
|
33
|
+
mysql_database_name: ENV.delete('MYSQL_DATABASE_NAME'),
|
34
|
+
monit_smtp_email_name: ENV.delete('MONIT_SMTP_EMAIL_NAME'),
|
35
|
+
monit_smtp_email_address: ENV.delete('MONIT_SMTP_EMAIL_ADDRESS'),
|
36
|
+
monit_smtp_host: ENV.delete('MONIT_SMTP_HOST'),
|
37
|
+
monit_smtp_port: ENV.delete('MONIT_SMTP_PORT'),
|
38
|
+
monit_smtp_username: ENV.delete('MONIT_SMTP_USERNAME'),
|
39
|
+
monit_smtp_password: ENV.delete('MONIT_SMTP_PASSWORD'),
|
40
|
+
oracle_ips_allowed: ENV.delete('ORACLE_IPS_ALLOWED'),
|
41
|
+
oracle_deflect_url: ENV.delete('ORACLE_DEFLECT_URL'),
|
42
|
+
timezone: `cat /etc/timezone`.chomp
|
43
|
+
}
|
44
|
+
|
45
|
+
# rsyslog
|
46
|
+
# imklog module is commented in rsyslog.conf because rsyslog does not
|
47
|
+
# have privileges to run it and hence throws error on startup.
|
48
|
+
system("sed -i '/imklog/s/^/#/' /etc/rsyslog.conf")
|
49
|
+
|
50
|
+
# Postfix
|
51
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/main.cf', '/etc/postfix/main.cf'
|
52
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/master.cf', '/etc/postfix/master.cf'
|
53
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-sender-login-maps.cf', '/etc/postfix/mysql-sender-login-maps.cf'
|
54
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-alias-domains.cf', '/etc/postfix/mysql-virtual-alias-domains.cf'
|
55
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-domains.cf', '/etc/postfix/mysql-virtual-alias-maps-domains.cf'
|
56
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-masters.cf', '/etc/postfix/mysql-virtual-alias-maps-masters.cf'
|
57
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-users.cf', '/etc/postfix/mysql-virtual-alias-maps-users.cf'
|
58
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf', '/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf'
|
59
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-domains.cf', '/etc/postfix/mysql-virtual-mailbox-domains.cf'
|
60
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-maps.cf', '/etc/postfix/mysql-virtual-mailbox-maps.cf'
|
61
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/postfix-policyd-spf-python/policyd-spf.conf', '/etc/postfix-policyd-spf-python/policyd-spf.conf'
|
62
|
+
filepaths = [
|
63
|
+
'/etc/postfix/main.cf',
|
64
|
+
'/etc/postfix/mysql-sender-login-maps.cf',
|
65
|
+
'/etc/postfix/mysql-virtual-alias-domains.cf',
|
66
|
+
'/etc/postfix/mysql-virtual-alias-maps-domains.cf',
|
67
|
+
'/etc/postfix/mysql-virtual-alias-maps-masters.cf',
|
68
|
+
'/etc/postfix/mysql-virtual-alias-maps-users.cf',
|
69
|
+
'/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf',
|
70
|
+
'/etc/postfix/mysql-virtual-mailbox-domains.cf',
|
71
|
+
'/etc/postfix/mysql-virtual-mailbox-maps.cf'
|
72
|
+
]
|
73
|
+
update_envkeys_in(filepaths, envkeys)
|
74
|
+
system("chgrp postfix /etc/postfix/mysql-*.cf")
|
75
|
+
system("chmod -R o-rwx /etc/postfix/mysql-*.cf")
|
76
|
+
|
77
|
+
# Dovecot
|
78
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/10-auth.conf', '/etc/dovecot/conf.d/10-auth.conf'
|
79
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/10-mail.conf', '/etc/dovecot/conf.d/10-mail.conf'
|
80
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/10-master.conf', '/etc/dovecot/conf.d/10-master.conf'
|
81
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/10-ssl.conf', '/etc/dovecot/conf.d/10-ssl.conf'
|
82
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/15-mailboxes.conf', '/etc/dovecot/conf.d/15-mailboxes.conf'
|
83
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/20-imap.conf', '/etc/dovecot/conf.d/20-imap.conf'
|
84
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/20-lmtp.conf', '/etc/dovecot/conf.d/20-lmtp.conf'
|
85
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/90-quota.conf', '/etc/dovecot/conf.d/90-quota.conf'
|
86
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/conf.d/90-sieve.conf', '/etc/dovecot/conf.d/90-sieve.conf'
|
87
|
+
|
88
|
+
FileUtils.mkdir '/etc/dovecot/sieve'
|
89
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sh', '/etc/dovecot/sieve/learn-ham.sh'
|
90
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sh', '/etc/dovecot/sieve/learn-spam.sh'
|
91
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sieve', '/etc/dovecot/sieve/learn-ham.sieve'
|
92
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sieve', '/etc/dovecot/sieve/learn-spam.sieve'
|
93
|
+
|
94
|
+
FileUtils.mkdir '/etc/dovecot/sieve-after'
|
95
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/sieve-after/spam-to-folder.sieve', '/etc/dovecot/sieve-after/spam-to-folder.sieve'
|
96
|
+
|
97
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/dovecot/dovecot-sql.conf.ext', '/etc/dovecot/dovecot-sql.conf.ext'
|
98
|
+
|
99
|
+
FileUtils.cp '/smartmachine/config/emailer/usr/local/bin/quota-warning.sh', '/usr/local/bin/quota-warning.sh'
|
100
|
+
|
101
|
+
filepaths = [
|
102
|
+
'/etc/dovecot/conf.d/10-ssl.conf',
|
103
|
+
'/etc/dovecot/dovecot-sql.conf.ext',
|
104
|
+
'/usr/local/bin/quota-warning.sh'
|
105
|
+
]
|
106
|
+
update_envkeys_in(filepaths, envkeys)
|
107
|
+
|
108
|
+
system("groupadd -g 5000 vmail")
|
109
|
+
system("useradd -g vmail -u 5000 vmail -d /var/vmail")
|
110
|
+
system("chown -R vmail:vmail /var/vmail")
|
111
|
+
|
112
|
+
system("sievec /etc/dovecot/sieve/learn-ham.sieve")
|
113
|
+
system("sievec /etc/dovecot/sieve/learn-spam.sieve")
|
114
|
+
system("chmod u=rwx,go= /etc/dovecot/sieve/learn-*.sh")
|
115
|
+
system("chown vmail:vmail /etc/dovecot/sieve/learn-*.sh")
|
116
|
+
system("chmod u=rw,go= /etc/dovecot/sieve/learn-*.sieve")
|
117
|
+
system("chown vmail:vmail /etc/dovecot/sieve/learn-*.sieve")
|
118
|
+
system("chmod u=rw,go= /etc/dovecot/sieve/learn-*.svbin")
|
119
|
+
system("chown vmail:vmail /etc/dovecot/sieve/learn-*.svbin")
|
120
|
+
|
121
|
+
system("sievec /etc/dovecot/sieve-after/spam-to-folder.sieve")
|
122
|
+
system("chmod u=rw,go= /etc/dovecot/sieve-after/spam-to-folder.sieve")
|
123
|
+
system("chown vmail:vmail /etc/dovecot/sieve-after/spam-to-folder.sieve")
|
124
|
+
system("chmod u=rw,go= /etc/dovecot/sieve-after/spam-to-folder.svbin")
|
125
|
+
system("chown vmail:vmail /etc/dovecot/sieve-after/spam-to-folder.svbin")
|
126
|
+
|
127
|
+
system("chown root:root /etc/dovecot/dovecot-sql.conf.ext")
|
128
|
+
system("chmod go= /etc/dovecot/dovecot-sql.conf.ext")
|
129
|
+
|
130
|
+
system("chmod +x /usr/local/bin/quota-warning.sh")
|
131
|
+
|
132
|
+
# Spamassassin
|
133
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/spamassassin/local.cf', '/etc/spamassassin/local.cf'
|
134
|
+
system("adduser --gecos '' --disabled-login spamd", out: File::NULL)
|
135
|
+
|
136
|
+
# OpenDKIM
|
137
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/opendkim.conf', '/etc/opendkim.conf'
|
138
|
+
system("adduser postfix opendkim", out: File::NULL)
|
139
|
+
system("chmod u=rw,go=r /etc/opendkim.conf")
|
140
|
+
unless File.exists? '/etc/opendkim/key.table'
|
141
|
+
FileUtils.mkdir_p '/etc/opendkim/keys'
|
142
|
+
FileUtils.touch '/etc/opendkim/key.table'
|
143
|
+
FileUtils.touch '/etc/opendkim/signing.table'
|
144
|
+
FileUtils.touch '/etc/opendkim/trusted.hosts'
|
145
|
+
key_shortname = envkeys[:mailname].gsub(/[^[:alnum:]]/, "")
|
146
|
+
raise "Could not create key_shortname from mailname to use in opendkim." if key_shortname.match(/\A[a-zA-Z0-9]*\z/).nil?
|
147
|
+
key_selector = Time.now.getlocal('+05:30').strftime("%Y%m")
|
148
|
+
raise "Could not create key_selector from Local Time to use in opendkim." if key_selector.match(/\A[0-9]*\z/).nil?
|
149
|
+
key_filename = "#{key_shortname}_#{key_selector}"
|
150
|
+
IO.write("/etc/opendkim/key.table",
|
151
|
+
"#{key_shortname} #{envkeys[:mailname]}:#{key_selector}:/etc/opendkim/keys/#{key_filename}.private\n")
|
152
|
+
IO.write("/etc/opendkim/signing.table",
|
153
|
+
"*@#{envkeys[:mailname]} #{key_shortname}\n")
|
154
|
+
IO.write("/etc/opendkim/trusted.hosts",
|
155
|
+
"127.0.0.1\n::1\nlocalhost\n#{envkeys[:fqdn]}\n#{envkeys[:mailname]}\n")
|
156
|
+
Dir.chdir("/etc/opendkim/keys") do
|
157
|
+
raise "Could not create DKIM keys." unless system("opendkim-genkey -b 2048 -h rsa-sha256 -r -s #{key_selector} -d #{envkeys[:mailname]} -v")
|
158
|
+
FileUtils.mv("#{key_selector}.private", "#{key_filename}.private")
|
159
|
+
FileUtils.mv("#{key_selector}.txt", "#{key_filename}.txt")
|
160
|
+
end
|
161
|
+
end
|
162
|
+
system("chown -R opendkim:opendkim /etc/opendkim")
|
163
|
+
system("chmod -R go-rw /etc/opendkim/keys")
|
164
|
+
system("mkdir /var/spool/postfix/opendkim")
|
165
|
+
system("chown opendkim:postfix /var/spool/postfix/opendkim")
|
166
|
+
|
167
|
+
# Haproxy
|
168
|
+
FileUtils.mkdir_p '/var/lib/haproxy/dev'
|
169
|
+
FileUtils.mkdir_p '/run/haproxy'
|
170
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/haproxy/haproxy.cfg', '/etc/haproxy/haproxy.cfg'
|
171
|
+
filepaths = [
|
172
|
+
'/etc/haproxy/haproxy.cfg'
|
173
|
+
]
|
174
|
+
update_envkeys_in(filepaths, envkeys)
|
175
|
+
|
176
|
+
# Monit
|
177
|
+
FileUtils.cp '/smartmachine/config/emailer/etc/monit/monitrc', '/etc/monit/monitrc'
|
178
|
+
FileUtils.cp_r '/smartmachine/config/emailer/etc/monit/conf.d/.', '/etc/monit/conf.d'
|
179
|
+
filepaths = [
|
180
|
+
'/etc/monit/conf.d/services.cfg',
|
181
|
+
'/etc/monit/monitrc'
|
182
|
+
]
|
183
|
+
update_envkeys_in(filepaths, envkeys)
|
184
|
+
|
185
|
+
# Logtailer
|
186
|
+
FileUtils.cp '/smartmachine/config/emailer/docker/logtailer.rb', '/usr/bin/logtailer.rb'
|
187
|
+
system("chmod +x /usr/bin/logtailer.rb")
|
188
|
+
|
189
|
+
# Command
|
190
|
+
FileUtils.cp '/smartmachine/config/emailer/docker/command.rb', '/usr/bin/command.rb'
|
191
|
+
system("chmod +x /usr/bin/command.rb")
|
192
|
+
|
193
|
+
logger.info "Initial setup completed for #{envkeys[:container_name]}."
|
194
|
+
end
|
195
|
+
|
196
|
+
ARGV.empty? ? exec("/usr/bin/command.rb") : exec(*ARGV)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
STDOUT.sync = true
|
5
|
+
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
class Logtailer
|
9
|
+
def initialize
|
10
|
+
@tailers = {
|
11
|
+
"/var/log/monit.log" => 1,
|
12
|
+
"/var/log/haproxy.log" => 1,
|
13
|
+
"/var/log/mail.log" => 1,
|
14
|
+
"/home/spamd/spamd.log" => 1
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def start
|
19
|
+
set_start_from_line
|
20
|
+
|
21
|
+
pids = []
|
22
|
+
@tailers.each do |path, start_from_line|
|
23
|
+
pid = Process.spawn("tail", "--lines=+#{start_from_line}", "-q", "-F", "#{path}", [:out, :err] => "/proc/1/fd/1")
|
24
|
+
Process.detach(pid)
|
25
|
+
pids.push(pid)
|
26
|
+
end
|
27
|
+
IO.write("/run/tmpfs/logtailer.pid", "#{pids.join(' ')}\n")
|
28
|
+
|
29
|
+
puts "Started Logtailer with PIDs " + `cat /run/tmpfs/logtailer.pid`.chomp + "."
|
30
|
+
end
|
31
|
+
|
32
|
+
def stop
|
33
|
+
pids = `cat /run/tmpfs/logtailer.pid`.chomp.split(" ")
|
34
|
+
pids.each do |pid|
|
35
|
+
system("/bin/kill --signal SIGTERM #{pid}")
|
36
|
+
end
|
37
|
+
save_start_from_line
|
38
|
+
|
39
|
+
puts "Stopped Logtailer with PIDs " + `cat /run/tmpfs/logtailer.pid`.chomp + "."
|
40
|
+
FileUtils.rm("/run/tmpfs/logtailer.pid")
|
41
|
+
end
|
42
|
+
|
43
|
+
def flush
|
44
|
+
set_start_from_line
|
45
|
+
@tailers.each do |path, start_from_line|
|
46
|
+
system("tail --lines=+#{start_from_line} -q #{path} >> /proc/1/fd/1")
|
47
|
+
end
|
48
|
+
save_start_from_line
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def set_start_from_line
|
54
|
+
if File.exist?('/run/logtailer.lines')
|
55
|
+
lines = IO.read('/run/logtailer.lines').split("\n")
|
56
|
+
lines.each do |line|
|
57
|
+
previous_line_no, path = line.split(" ")
|
58
|
+
@tailers[path] = previous_line_no.to_i + 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def save_start_from_line
|
64
|
+
str = `wc -l #{@tailers.keys.join(' ')} | head --lines=-1`
|
65
|
+
IO.write("/run/logtailer.lines", "#{str}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
if ARGV[0] == "start"
|
70
|
+
Logtailer.new.start
|
71
|
+
elsif ARGV[0] == "stop"
|
72
|
+
Logtailer.new.stop
|
73
|
+
elsif ARGV[0] == "flush"
|
74
|
+
Logtailer.new.flush
|
75
|
+
end
|
data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-auth.conf
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
##
|
2
|
+
## Authentication processes
|
3
|
+
##
|
4
|
+
|
5
|
+
# Disable LOGIN command and all other plaintext authentications unless
|
6
|
+
# SSL/TLS is used (LOGINDISABLED capability). Note that if the remote IP
|
7
|
+
# matches the local IP (ie. you're connecting from the same computer), the
|
8
|
+
# connection is considered secure and plaintext authentication is allowed.
|
9
|
+
# See also ssl=required setting.
|
10
|
+
#disable_plaintext_auth = yes
|
11
|
+
|
12
|
+
# Authentication cache size (e.g. 10M). 0 means it's disabled. Note that
|
13
|
+
# bsdauth and PAM require cache_key to be set for caching to be used.
|
14
|
+
#auth_cache_size = 0
|
15
|
+
# Time to live for cached data. After TTL expires the cached record is no
|
16
|
+
# longer used, *except* if the main database lookup returns internal failure.
|
17
|
+
# We also try to handle password changes automatically: If user's previous
|
18
|
+
# authentication was successful, but this one wasn't, the cache isn't used.
|
19
|
+
# For now this works only with plaintext authentication.
|
20
|
+
#auth_cache_ttl = 1 hour
|
21
|
+
# TTL for negative hits (user not found, password mismatch).
|
22
|
+
# 0 disables caching them completely.
|
23
|
+
#auth_cache_negative_ttl = 1 hour
|
24
|
+
|
25
|
+
# Space separated list of realms for SASL authentication mechanisms that need
|
26
|
+
# them. You can leave it empty if you don't want to support multiple realms.
|
27
|
+
# Many clients simply use the first one listed here, so keep the default realm
|
28
|
+
# first.
|
29
|
+
#auth_realms =
|
30
|
+
|
31
|
+
# Default realm/domain to use if none was specified. This is used for both
|
32
|
+
# SASL realms and appending @domain to username in plaintext logins.
|
33
|
+
#auth_default_realm =
|
34
|
+
|
35
|
+
# List of allowed characters in username. If the user-given username contains
|
36
|
+
# a character not listed in here, the login automatically fails. This is just
|
37
|
+
# an extra check to make sure user can't exploit any potential quote escaping
|
38
|
+
# vulnerabilities with SQL/LDAP databases. If you want to allow all characters,
|
39
|
+
# set this value to empty.
|
40
|
+
#auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
|
41
|
+
|
42
|
+
# Username character translations before it's looked up from databases. The
|
43
|
+
# value contains series of from -> to characters. For example "#@/@" means
|
44
|
+
# that '#' and '/' characters are translated to '@'.
|
45
|
+
#auth_username_translation =
|
46
|
+
|
47
|
+
# Username formatting before it's looked up from databases. You can use
|
48
|
+
# the standard variables here, eg. %Lu would lowercase the username, %n would
|
49
|
+
# drop away the domain if it was given, or "%n-AT-%d" would change the '@' into
|
50
|
+
# "-AT-". This translation is done after auth_username_translation changes.
|
51
|
+
#auth_username_format = %Lu
|
52
|
+
|
53
|
+
# If you want to allow master users to log in by specifying the master
|
54
|
+
# username within the normal username string (ie. not using SASL mechanism's
|
55
|
+
# support for it), you can specify the separator character here. The format
|
56
|
+
# is then <username><separator><master username>. UW-IMAP uses "*" as the
|
57
|
+
# separator, so that could be a good choice.
|
58
|
+
#auth_master_user_separator =
|
59
|
+
|
60
|
+
# Username to use for users logging in with ANONYMOUS SASL mechanism
|
61
|
+
#auth_anonymous_username = anonymous
|
62
|
+
|
63
|
+
# Maximum number of dovecot-auth worker processes. They're used to execute
|
64
|
+
# blocking passdb and userdb queries (eg. MySQL and PAM). They're
|
65
|
+
# automatically created and destroyed as needed.
|
66
|
+
#auth_worker_max_count = 30
|
67
|
+
|
68
|
+
# Host name to use in GSSAPI principal names. The default is to use the
|
69
|
+
# name returned by gethostname(). Use "$ALL" (with quotes) to allow all keytab
|
70
|
+
# entries.
|
71
|
+
#auth_gssapi_hostname =
|
72
|
+
|
73
|
+
# Kerberos keytab to use for the GSSAPI mechanism. Will use the system
|
74
|
+
# default (usually /etc/krb5.keytab) if not specified. You may need to change
|
75
|
+
# the auth service to run as root to be able to read this file.
|
76
|
+
#auth_krb5_keytab =
|
77
|
+
|
78
|
+
# Do NTLM and GSS-SPNEGO authentication using Samba's winbind daemon and
|
79
|
+
# ntlm_auth helper. <doc/wiki/Authentication/Mechanisms/Winbind.txt>
|
80
|
+
#auth_use_winbind = no
|
81
|
+
|
82
|
+
# Path for Samba's ntlm_auth helper binary.
|
83
|
+
#auth_winbind_helper_path = /usr/bin/ntlm_auth
|
84
|
+
|
85
|
+
# Time to delay before replying to failed authentications.
|
86
|
+
#auth_failure_delay = 2 secs
|
87
|
+
|
88
|
+
# Require a valid SSL client certificate or the authentication fails.
|
89
|
+
#auth_ssl_require_client_cert = no
|
90
|
+
|
91
|
+
# Take the username from client's SSL certificate, using
|
92
|
+
# X509_NAME_get_text_by_NID() which returns the subject's DN's
|
93
|
+
# CommonName.
|
94
|
+
#auth_ssl_username_from_cert = no
|
95
|
+
|
96
|
+
# Space separated list of wanted authentication mechanisms:
|
97
|
+
# plain login digest-md5 cram-md5 ntlm rpa apop anonymous gssapi otp
|
98
|
+
# gss-spnego
|
99
|
+
# NOTE: See also disable_plaintext_auth setting.
|
100
|
+
##### SmartMachine Begin.
|
101
|
+
#auth_mechanisms = plain
|
102
|
+
auth_mechanisms = plain login
|
103
|
+
##### SmartMachine Close.
|
104
|
+
|
105
|
+
##
|
106
|
+
## Password and user databases
|
107
|
+
##
|
108
|
+
|
109
|
+
#
|
110
|
+
# Password database is used to verify user's password (and nothing more).
|
111
|
+
# You can have multiple passdbs and userdbs. This is useful if you want to
|
112
|
+
# allow both system users (/etc/passwd) and virtual users to login without
|
113
|
+
# duplicating the system users into virtual database.
|
114
|
+
#
|
115
|
+
# <doc/wiki/PasswordDatabase.txt>
|
116
|
+
#
|
117
|
+
# User database specifies where mails are located and what user/group IDs
|
118
|
+
# own them. For single-UID configuration use "static" userdb.
|
119
|
+
#
|
120
|
+
# <doc/wiki/UserDatabase.txt>
|
121
|
+
|
122
|
+
#!include auth-deny.conf.ext
|
123
|
+
#!include auth-master.conf.ext
|
124
|
+
|
125
|
+
##### SmartMachine Begin.
|
126
|
+
#!include auth-system.conf.ext
|
127
|
+
!include auth-sql.conf.ext
|
128
|
+
##### SmartMachine Close.
|
129
|
+
#!include auth-ldap.conf.ext
|
130
|
+
#!include auth-passwdfile.conf.ext
|
131
|
+
#!include auth-checkpassword.conf.ext
|
132
|
+
#!include auth-static.conf.ext
|