smartmachine 1.2.3 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/lib/smart_machine/commands/grid.rb +8 -0
  3. data/lib/smart_machine/commands/grid_commands/emailer.rb +107 -0
  4. data/lib/smart_machine/commands/grid_commands/roundcube.rb +65 -0
  5. data/lib/smart_machine/configuration.rb +35 -2
  6. data/lib/smart_machine/credentials.rb +10 -0
  7. data/lib/smart_machine/engine.rb +6 -0
  8. data/lib/smart_machine/grids/adminer.rb +1 -0
  9. data/lib/smart_machine/grids/certbot.rb +1 -0
  10. data/lib/smart_machine/grids/emailer/.keep +0 -0
  11. data/lib/smart_machine/grids/emailer.rb +188 -0
  12. data/lib/smart_machine/grids/haproxy.rb +1 -0
  13. data/lib/smart_machine/grids/mariadb.rb +1 -0
  14. data/lib/smart_machine/grids/postgresql.rb +1 -0
  15. data/lib/smart_machine/grids/roundcube.rb +114 -0
  16. data/lib/smart_machine/machine.rb +7 -0
  17. data/lib/smart_machine/syncer.rb +10 -0
  18. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/command.rb +50 -0
  19. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/entrypoint.rb +196 -0
  20. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/docker/logtailer.rb +75 -0
  21. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-auth.conf +132 -0
  22. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-mail.conf +427 -0
  23. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-master.conf +153 -0
  24. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/10-ssl.conf +87 -0
  25. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/15-mailboxes.conf +94 -0
  26. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/20-imap.conf +102 -0
  27. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/20-lmtp.conf +43 -0
  28. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/90-quota.conf +114 -0
  29. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/conf.d/90-sieve.conf +229 -0
  30. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/dovecot-sql.conf.ext +163 -0
  31. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sh +2 -0
  32. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-ham.sieve +5 -0
  33. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sh +2 -0
  34. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve/learn-spam.sieve +2 -0
  35. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/dovecot/sieve-after/spam-to-folder.sieve +6 -0
  36. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/haproxy/haproxy.cfg +58 -0
  37. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/monit/conf.d/services.cfg +70 -0
  38. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/monit/monitrc +344 -0
  39. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/opendkim.conf +71 -0
  40. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/main.cf +123 -0
  41. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/master.cf +149 -0
  42. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-sender-login-maps.cf +7 -0
  43. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-domains.cf +7 -0
  44. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-domains.cf +7 -0
  45. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-masters.cf +7 -0
  46. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-users.cf +7 -0
  47. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-alias-maps-userstothemselves.cf +7 -0
  48. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-domains.cf +7 -0
  49. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix/mysql-virtual-mailbox-maps.cf +7 -0
  50. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/postfix-policyd-spf-python/policyd-spf.conf +12 -0
  51. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/etc/spamassassin/local.cf +124 -0
  52. data/lib/smart_machine/templates/dotsmartmachine/config/emailer/usr/local/bin/quota-warning.sh +22 -0
  53. data/lib/smart_machine/templates/dotsmartmachine/config/emailer.yml +37 -0
  54. data/lib/smart_machine/templates/dotsmartmachine/config/engine.yml +2 -0
  55. data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf +35 -0
  56. data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini +4 -0
  57. data/lib/smart_machine/templates/dotsmartmachine/config/roundcube/var/roundcube/config/config.custom.inc.php +25 -0
  58. data/lib/smart_machine/templates/dotsmartmachine/config/roundcube.yml +41 -0
  59. data/lib/smart_machine/templates/dotsmartmachine/config/users.yml +1 -1
  60. data/lib/smart_machine/version.rb +2 -2
  61. data/lib/smart_machine.rb +2 -0
  62. metadata +55 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 399cf5ca8bd944f129d3731d93be76cf46ba86e3f25b97b5110ee42dc8650430
4
- data.tar.gz: 2b0166c466312def05a5ee8930bf3943c0f31e3a224d582caeee878c68e43a8d
3
+ metadata.gz: 5103e5b3902c6f7cf9e295547ff6a5fd43682c9ca11f4d740a5b193fc09a2090
4
+ data.tar.gz: c99f47d9287341f7960223dfcbd44feeacdfdaed16cbf15215865d370706c3f8
5
5
  SHA512:
6
- metadata.gz: e1f029f440a058a7185f315137f2e2544fb3898ef21d3bffb7792f50350d1b7d476c3c116d7ebec2790a2fb8f0c11cc1151558b6fc42db37edfdf55688bb8f4d
7
- data.tar.gz: d667cfb03e650d7f9497a6be4b816b3c2eb0c70e85760987746fdd083d9f2bc3496b48ff1d65df667934e6065b8dfa5355e27c48820bc72cfb3e578506c4267e
6
+ metadata.gz: 93e8261b8739b1cc1a2fa3d0400ea8c2e4bbf0b10ec3ce697ef5597b61177fd0de253dbd47e49cd5411f172c4edfd87d73e9e40ea520569d74a8c7086444b1d0
7
+ data.tar.gz: 35abb8c1171082c17b76d277d2f77f9404c6888910b00be89cfb775ea702cec73085c017f3a8c70515c80b837c7c20bbc0f681a405247e25ad46d5ffd3ca9741
@@ -1,5 +1,6 @@
1
1
  require 'smart_machine/commands/grid_commands/sub_thor'
2
2
  require 'smart_machine/commands/grid_commands/elasticsearch'
3
+ require 'smart_machine/commands/grid_commands/emailer'
3
4
  require 'smart_machine/commands/grid_commands/minio'
4
5
  require 'smart_machine/commands/grid_commands/mysql'
5
6
  require 'smart_machine/commands/grid_commands/nextcloud'
@@ -7,6 +8,7 @@ require 'smart_machine/commands/grid_commands/nginx'
7
8
  require 'smart_machine/commands/grid_commands/phpmyadmin'
8
9
  require 'smart_machine/commands/grid_commands/prereceiver'
9
10
  require 'smart_machine/commands/grid_commands/redis'
11
+ require 'smart_machine/commands/grid_commands/roundcube'
10
12
  require 'smart_machine/commands/grid_commands/terminal'
11
13
 
12
14
  module SmartMachine
@@ -17,6 +19,9 @@ module SmartMachine
17
19
  desc "elasticsearch", "Run elasticsearch grid commands"
18
20
  subcommand "elasticsearch", GridCommands::Elasticsearch
19
21
 
22
+ desc "emailer", "Run emailer grid commands"
23
+ subcommand "emailer", GridCommands::Emailer
24
+
20
25
  desc "minio", "Run minio grid commands"
21
26
  subcommand "minio", GridCommands::Minio
22
27
 
@@ -38,6 +43,9 @@ module SmartMachine
38
43
  desc "redis", "Run redis grid commands"
39
44
  subcommand "redis", GridCommands::Redis
40
45
 
46
+ desc "roundcube", "Run roundcube grid commands"
47
+ subcommand "roundcube", GridCommands::Roundcube
48
+
41
49
  desc "terminal", "Run terminal grid commands"
42
50
  subcommand "terminal", GridCommands::Terminal
43
51
  end
@@ -0,0 +1,107 @@
1
+ module SmartMachine
2
+ module Commands
3
+ module GridCommands
4
+ class Emailer < SubThor
5
+ include Utilities
6
+
7
+ desc "install", "Install emailer grid"
8
+ def install
9
+ inside_machine_dir do
10
+ with_docker_running do
11
+ puts "-----> Installing Emailer"
12
+ machine = SmartMachine::Machine.new
13
+ machine.run_on_machine commands: "smartengine grid emailer installer"
14
+ puts "-----> Emailer Installation Complete"
15
+ end
16
+ end
17
+ end
18
+
19
+ desc "uninstall", "Uninstall emailer grid"
20
+ def uninstall
21
+ inside_machine_dir do
22
+ with_docker_running do
23
+ puts "-----> Uninstalling Emailer"
24
+ machine = SmartMachine::Machine.new
25
+ machine.run_on_machine commands: "smartengine grid emailer uninstaller"
26
+ puts "-----> Emailer Uninstallation Complete"
27
+ end
28
+ end
29
+ end
30
+
31
+ desc "up", "Take UP the emailer grid"
32
+ option :name, type: :string
33
+ def up
34
+ inside_machine_dir do
35
+ with_docker_running do
36
+ machine = SmartMachine::Machine.new
37
+ name_option = options[:name] ? " --name=#{options[:name]}" : ""
38
+ machine.run_on_machine commands: "smartengine grid emailer uper#{name_option}"
39
+ end
40
+ end
41
+ end
42
+
43
+ desc "down", "Take DOWN the emailer grid"
44
+ option :name, type: :string
45
+ def down
46
+ inside_machine_dir do
47
+ with_docker_running do
48
+ machine = SmartMachine::Machine.new
49
+ name_option = options[:name] ? " --name=#{options[:name]}" : ""
50
+ machine.run_on_machine commands: "smartengine grid emailer downer#{name_option}"
51
+ end
52
+ end
53
+ end
54
+
55
+ desc "installer", "Emailer grid installer", hide: true
56
+ def installer
57
+ inside_engine_machine_dir do
58
+ name, config = SmartMachine.config.grids.emailer.first
59
+ emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
60
+ emailer.installer
61
+ end
62
+ end
63
+
64
+ desc "uninstaller", "Emailer grid uninstaller", hide: true
65
+ def uninstaller
66
+ inside_engine_machine_dir do
67
+ name, config = SmartMachine.config.grids.emailer.first
68
+ emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
69
+ emailer.uninstaller
70
+ end
71
+ end
72
+
73
+ desc "uper", "Emailer grid uper", hide: true
74
+ option :name, type: :string
75
+ def uper
76
+ inside_engine_machine_dir do
77
+ if options[:name]
78
+ emailer = SmartMachine::Grids::Emailer.new(name: options[:name])
79
+ emailer.uper
80
+ else
81
+ SmartMachine.config.grids.emailer.each do |name, config|
82
+ emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
83
+ emailer.uper
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ desc "downer", "Emailer grid downer", hide: true
90
+ option :name, type: :string
91
+ def downer
92
+ inside_engine_machine_dir do
93
+ if options[:name]
94
+ emailer = SmartMachine::Grids::Emailer.new(name: options[:name])
95
+ emailer.downer
96
+ else
97
+ SmartMachine.config.grids.emailer.each do |name, config|
98
+ emailer = SmartMachine::Grids::Emailer.new(name: name.to_s)
99
+ emailer.downer
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,65 @@
1
+ module SmartMachine
2
+ module Commands
3
+ module GridCommands
4
+ class Roundcube < SubThor
5
+ include Utilities
6
+
7
+ desc "up", "Take UP the roundcube grid"
8
+ option :name, type: :string
9
+ def up
10
+ inside_machine_dir do
11
+ with_docker_running do
12
+ machine = SmartMachine::Machine.new
13
+ name_option = options[:name] ? " --name=#{options[:name]}" : ""
14
+ machine.run_on_machine commands: "smartengine grid roundcube uper#{name_option}"
15
+ end
16
+ end
17
+ end
18
+
19
+ desc "down", "Take DOWN the roundcube grid"
20
+ option :name, type: :string
21
+ def down
22
+ inside_machine_dir do
23
+ with_docker_running do
24
+ machine = SmartMachine::Machine.new
25
+ name_option = options[:name] ? " --name=#{options[:name]}" : ""
26
+ machine.run_on_machine commands: "smartengine grid roundcube downer#{name_option}"
27
+ end
28
+ end
29
+ end
30
+
31
+ desc "uper", "Roundcube grid uper", hide: true
32
+ option :name, type: :string
33
+ def uper
34
+ inside_engine_machine_dir do
35
+ if options[:name]
36
+ roundcube = SmartMachine::Grids::Roundcube.new(name: options[:name])
37
+ roundcube.uper
38
+ else
39
+ SmartMachine.config.grids.roundcube.each do |name, config|
40
+ roundcube = SmartMachine::Grids::Roundcube.new(name: name.to_s)
41
+ roundcube.uper
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ desc "downer", "Roundcube grid downer", hide: true
48
+ option :name, type: :string
49
+ def downer
50
+ inside_engine_machine_dir do
51
+ if options[:name]
52
+ roundcube = SmartMachine::Grids::Roundcube.new(name: options[:name])
53
+ roundcube.downer
54
+ else
55
+ SmartMachine.config.grids.roundcube.each do |name, config|
56
+ roundcube = SmartMachine::Grids::Roundcube.new(name: name.to_s)
57
+ roundcube.downer
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -8,13 +8,24 @@ module SmartMachine
8
8
  end
9
9
 
10
10
  def config
11
- @config ||= OpenStruct.new(grids: grids, network: network)
11
+ @config ||= OpenStruct.new(engine: engine, grids: grids, network: network)
12
12
  end
13
13
 
14
14
  private
15
15
 
16
+ def engine
17
+ # Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/engine.yml always exists
18
+ if File.exist? "config/engine.yml"
19
+ deserialize(IO.binread("config/engine.yml")).deep_symbolize_keys
20
+ elsif File.exist? "#{File.expand_path('~')}/machine/config/engine.yml"
21
+ deserialize(IO.binread("#{File.expand_path('~')}/machine/config/engine.yml")).deep_symbolize_keys
22
+ else
23
+ {}
24
+ end
25
+ end
26
+
16
27
  def grids
17
- @grids ||= OpenStruct.new(elasticsearch: elasticsearch, minio: minio, mysql: mysql, nextcloud: nextcloud, phpmyadmin: phpmyadmin, prereceiver: prereceiver, redis: redis, terminal: terminal)
28
+ @grids ||= OpenStruct.new(elasticsearch: elasticsearch, emailer: emailer, minio: minio, mysql: mysql, nextcloud: nextcloud, phpmyadmin: phpmyadmin, prereceiver: prereceiver, redis: redis, roundcube: roundcube, terminal: terminal)
18
29
  end
19
30
 
20
31
  def elasticsearch
@@ -28,6 +39,17 @@ module SmartMachine
28
39
  end
29
40
  end
30
41
 
42
+ def emailer
43
+ # Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/emailer.yml always exists
44
+ if File.exist? "config/emailer.yml"
45
+ deserialize(IO.binread("config/emailer.yml")).deep_symbolize_keys
46
+ elsif File.exist? "#{File.expand_path('~')}/machine/config/emailer.yml"
47
+ deserialize(IO.binread("#{File.expand_path('~')}/machine/config/emailer.yml")).deep_symbolize_keys
48
+ else
49
+ {}
50
+ end
51
+ end
52
+
31
53
  def minio
32
54
  # Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/minio.yml always exists
33
55
  if File.exist? "config/minio.yml"
@@ -94,6 +116,17 @@ module SmartMachine
94
116
  end
95
117
  end
96
118
 
119
+ def roundcube
120
+ # Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/roundcube.yml always exists
121
+ if File.exist? "config/roundcube.yml"
122
+ deserialize(IO.binread("config/roundcube.yml")).deep_symbolize_keys
123
+ elsif File.exist? "#{File.expand_path('~')}/machine/config/roundcube.yml"
124
+ deserialize(IO.binread("#{File.expand_path('~')}/machine/config/roundcube.yml")).deep_symbolize_keys
125
+ else
126
+ {}
127
+ end
128
+ end
129
+
97
130
  def terminal
98
131
  # Once the SmartMachine.config assignments in smart_machine.rb file has been removed, then this file exist condition can be removed to ensure that config/terminal.yml always exists
99
132
  if File.exist? "config/terminal.yml"
@@ -56,6 +56,12 @@ module SmartMachine
56
56
  root_password: #{SecureRandom.hex(16)}
57
57
  username: #{SecureRandom.hex(8)}
58
58
  password: #{SecureRandom.hex(16)}
59
+ emailerone:
60
+ mysql_user: #{SecureRandom.hex(8)}
61
+ mysql_password: #{SecureRandom.hex(16)}
62
+ mysql_database_name: #{SecureRandom.hex(8)}
63
+ monit_smtp_username: yourmachineemailerone@yourdomain.com
64
+ monit_smtp_password: #{SecureRandom.hex(16)}
59
65
  minioone:
60
66
  access_key: #{SecureRandom.hex(8)}
61
67
  secret_key: #{SecureRandom.hex(16)}
@@ -66,6 +72,10 @@ module SmartMachine
66
72
  database_name: #{SecureRandom.hex(8)}
67
73
  redisone:
68
74
  password: #{SecureRandom.hex(16)}
75
+ roundcubeone:
76
+ database_user: #{SecureRandom.hex(8)}
77
+ database_pass: #{SecureRandom.hex(16)}
78
+ database_name: #{SecureRandom.hex(8)}
69
79
  nextcloudone:
70
80
  admin_user: #{SecureRandom.hex(8)}
71
81
  admin_password: #{SecureRandom.hex(16)}
@@ -29,6 +29,7 @@ module SmartMachine
29
29
  puts "-----> Creating image for Engine ... "
30
30
  command = [
31
31
  "docker image build --quiet --tag #{engine_image_name_with_version}",
32
+ "--build-arg TZDATA_TIMEZONE='#{SmartMachine.config.engine.dig(:engineone).dig(:timezone)}'",
32
33
  "--build-arg SMARTMACHINE_MASTER_KEY=#{SmartMachine::Credentials.new.read_key}",
33
34
  "--build-arg USER_NAME=`id -un`",
34
35
  "--build-arg USER_UID=`id -u`",
@@ -102,6 +103,11 @@ module SmartMachine
102
103
  FROM ruby:%<smartmachine_ruby_version>s-bullseye
103
104
  LABEL maintainer="plainsource <plainsource@humanmind.me>"
104
105
 
106
+ # Setting Localtime & Timezone using tzdata
107
+ ARG TZDATA_TIMEZONE
108
+ RUN ln -sf /usr/share/zoneinfo/$TZDATA_TIMEZONE /etc/localtime && \
109
+ dpkg-reconfigure -f noninteractive tzdata
110
+
105
111
  # User
106
112
  # --- Fix to change docker gid to 998 (if it is in use) so that addgroup is free to create a group with docker gid.
107
113
  ARG USER_NAME
@@ -0,0 +1 @@
1
+ # TODO: Add adminer as an alternative for phpmyadmin.
@@ -0,0 +1 @@
1
+ # TODO: Add certbot for SSL certificates.
File without changes
@@ -0,0 +1,188 @@
1
+ module SmartMachine
2
+ class Grids
3
+ class Emailer < SmartMachine::Base
4
+ def initialize(name:)
5
+ config = SmartMachine.config.grids.emailer.dig(name.to_sym)
6
+ raise "emailer config for #{name} not found." unless config
7
+
8
+ @image = "smartmachine/emailer:#{SmartMachine.version}"
9
+ @fqdn = config.dig(:fqdn)
10
+ @mailname = config.dig(:mailname)
11
+ @sysadmin_email = config.dig(:sysadmin_email)
12
+ @networks = config.dig(:networks)
13
+ @mysql_host = config.dig(:mysql_host)
14
+ @mysql_port = config.dig(:mysql_port)
15
+ @mysql_user = config.dig(:mysql_user)
16
+ @mysql_password = config.dig(:mysql_password)
17
+ @mysql_database_name = config.dig(:mysql_database_name)
18
+ @monit_smtp_email_name = config.dig(:monit_smtp_email_name)
19
+ @monit_smtp_email_address = config.dig(:monit_smtp_email_address)
20
+ @monit_smtp_host = config.dig(:monit_smtp_host)
21
+ @monit_smtp_port = config.dig(:monit_smtp_port)
22
+ @monit_smtp_username = config.dig(:monit_smtp_username)
23
+ @monit_smtp_password = config.dig(:monit_smtp_password)
24
+ @oracle_ips_allowed = config.dig(:oracle_ips_allowed)
25
+ @oracle_deflect_url = config.dig(:oracle_deflect_url)
26
+
27
+ @name = name.to_s
28
+ @home_dir = File.expand_path('~')
29
+ end
30
+
31
+ def installer
32
+ unless system("docker image inspect #{@image}", [:out, :err] => File::NULL)
33
+ puts "-----> Creating image #{@image} ... "
34
+ command = [
35
+ "docker image build -t #{@image}",
36
+ "--build-arg SMARTMACHINE_VERSION=#{SmartMachine.version}",
37
+ "-f- #{SmartMachine.config.gem_dir}/lib/smart_machine/grids/emailer",
38
+ "<<'EOF'\n#{dockerfile}EOF"
39
+ ]
40
+ if system(command.join(" "), out: File::NULL)
41
+ puts "done"
42
+ else
43
+ raise "Error: Could not install image: #{@image}"
44
+ end
45
+ else
46
+ raise "Error: Image already installed: #{@image}. Please uninstall using 'smartmachine grids emailer uninstall' and try installing again."
47
+ end
48
+ end
49
+
50
+ def uninstaller
51
+ unless system("docker inspect -f '{{.State.Running}}' '#{@name}'", [:out, :err] => File::NULL)
52
+ if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
53
+ puts "-----> Removing image #{@image} ... "
54
+ if system("docker image rm #{@image}", out: File::NULL)
55
+ puts "done"
56
+ end
57
+ else
58
+ raise "Error: Emailer already uninstalled. Please install using 'smartmachine grids emailer install' and try uninstalling again."
59
+ end
60
+ else
61
+ raise "Error: Emailer is currently running. Please stop the emailer using 'smartmachine grids emailer down' and try uninstalling again."
62
+ end
63
+ end
64
+
65
+ def uper
66
+ if system("docker image inspect #{@image}", [:out, :err] => File::NULL)
67
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/emailer/#{@name}/backups")
68
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/emailer/#{@name}/data/vmail")
69
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/emailer/#{@name}/data/opendkim")
70
+
71
+ # Setting entrypoint permission.
72
+ system("chmod +x #{@home_dir}/machine/config/emailer/docker/entrypoint.rb")
73
+
74
+ # Creating & Starting containers
75
+ print "-----> Creating container #{@name} ... "
76
+
77
+ command = [
78
+ "docker create",
79
+ "--name='#{@name}'",
80
+ "--env VIRTUAL_HOST=#{@fqdn}",
81
+ "--env VIRTUAL_PATH='/'",
82
+ "--env LETSENCRYPT_HOST=#{@fqdn}",
83
+ "--env LETSENCRYPT_EMAIL=#{@sysadmin_email}",
84
+ "--env LETSENCRYPT_TEST=false",
85
+ "--env CONTAINER_NAME='#{@name}'",
86
+ "--env FQDN='#{@fqdn}'",
87
+ "--env MAILNAME='#{@mailname}'",
88
+ "--env SYSADMIN_EMAIL='#{@sysadmin_email}'",
89
+ "--env MYSQL_HOST='#{@mysql_host}'",
90
+ "--env MYSQL_PORT='#{@mysql_port}'",
91
+ "--env MYSQL_USER='#{@mysql_user}'",
92
+ "--env MYSQL_PASSWORD='#{@mysql_password}'",
93
+ "--env MYSQL_DATABASE_NAME='#{@mysql_database_name}'",
94
+ "--env MONIT_SMTP_EMAIL_NAME='#{@monit_smtp_email_name}'",
95
+ "--env MONIT_SMTP_EMAIL_ADDRESS='#{@monit_smtp_email_address}'",
96
+ "--env MONIT_SMTP_HOST='#{@monit_smtp_host}'",
97
+ "--env MONIT_SMTP_PORT='#{@monit_smtp_port}'",
98
+ "--env MONIT_SMTP_USERNAME='#{@monit_smtp_username}'",
99
+ "--env MONIT_SMTP_PASSWORD='#{@monit_smtp_password}'",
100
+ "--env ORACLE_IPS_ALLOWED='#{@oracle_ips_allowed.join(' ')}'",
101
+ "--env ORACLE_DEFLECT_URL='#{@oracle_deflect_url}'",
102
+ "--expose='80'",
103
+ "--publish='25:25'",
104
+ # "--publish='465:465'",
105
+ "--publish='587:587'",
106
+ # "--publish='110:110'",
107
+ "--publish='995:995'",
108
+ # "--publish='143:143'",
109
+ "--publish='993:993'",
110
+ "--volume='#{@home_dir}/smartmachine/grids/nginx/certificates/#{@fqdn}:/etc/letsencrypt/live/#{@fqdn}:ro'",
111
+ "--volume='#{@home_dir}/smartmachine/config/emailer:/smartmachine/config/emailer:ro'",
112
+ "--volume='#{@home_dir}/smartmachine/grids/emailer/#{@name}/data/vmail:/var/vmail'",
113
+ "--volume='#{@home_dir}/smartmachine/grids/emailer/#{@name}/data/opendkim:/etc/opendkim'",
114
+ "--entrypoint='/smartmachine/config/emailer/docker/entrypoint.rb'",
115
+ "--tmpfs /run/tmpfs",
116
+ "--init",
117
+ "--restart='always'",
118
+ "--network='nginx-network'",
119
+ "#{@image}"
120
+ ]
121
+ if system(command.compact.join(" "), out: File::NULL)
122
+ @networks.each do |network|
123
+ system("docker network connect --alias #{@fqdn} #{network} #{@name}")
124
+ end
125
+
126
+ puts "done"
127
+ puts "-----> Starting container #{@name} ... "
128
+ if system("docker start #{@name}", out: File::NULL)
129
+ puts "done"
130
+ else
131
+ raise "Error: Could not start container: #{@name}"
132
+ end
133
+ else
134
+ raise "Error: Could not create container: #{@name}"
135
+ end
136
+ else
137
+ raise "Error: Could not find image: #{@image}"
138
+ end
139
+ end
140
+
141
+ def downer
142
+ # Disconnecting networks
143
+ @networks.reverse.each do |network|
144
+ system("docker network disconnect #{network} #{@name}")
145
+ end
146
+
147
+ # Stopping & Removing containers - in reverse order
148
+ print "-----> Stopping container #{@name} ... "
149
+ if system("docker stop '#{@name}'", out: File::NULL)
150
+ puts "done"
151
+ print "-----> Removing container #{@name} ... "
152
+ if system("docker rm '#{@name}'", out: File::NULL)
153
+ puts "done"
154
+ end
155
+ end
156
+ end
157
+
158
+ private
159
+
160
+ def dockerfile
161
+ file = <<~'DOCKERFILE'
162
+ ARG SMARTMACHINE_VERSION
163
+
164
+ FROM smartmachine/smartengine:$SMARTMACHINE_VERSION
165
+ LABEL maintainer="plainsource <plainsource@humanmind.me>"
166
+
167
+ SHELL ["/bin/bash", "-c"]
168
+
169
+ RUN apt-get update && \
170
+ \
171
+ debconf-set-selections <<< "postfix postfix/main_mailer_type string 'Internet Site'" && \
172
+ debconf-set-selections <<< "postfix postfix/mailname string %<mailname>s" && \
173
+ apt-get install -y --no-install-recommends \
174
+ rsyslog \
175
+ postfix postfix-mysql \
176
+ dovecot-managesieved dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql \
177
+ spamassassin spamc \
178
+ opendkim opendkim-tools \
179
+ postfix-policyd-spf-python postfix-pcre \
180
+ haproxy monit && \
181
+ rm -rf /var/lib/apt/lists/*
182
+ DOCKERFILE
183
+
184
+ format(file, "mailname": @mailname)
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1 @@
1
+ # TODO: Add haproxy as an alternative to nginx.
@@ -0,0 +1 @@
1
+ # TODO: Add mariadb as an alternative for mysql.
@@ -0,0 +1 @@
1
+ # TODO: Add postgresql as an alternative for mariadb & mysql.
@@ -0,0 +1,114 @@
1
+ module SmartMachine
2
+ class Grids
3
+ class Roundcube < SmartMachine::Base
4
+ def initialize(name:)
5
+ config = SmartMachine.config.grids.roundcube.dig(name.to_sym)
6
+ raise "roundcube config for #{name} not found." unless config
7
+
8
+ @fqdn = config.dig(:fqdn)
9
+ @image = config.dig(:image)
10
+ @sysadmin_email = config.dig(:sysadmin_email)
11
+ @networks = config.dig(:networks)
12
+ @database_type = config.dig(:database_type)
13
+ @database_host = config.dig(:database_host)
14
+ @database_port = config.dig(:database_port)
15
+ @database_user = config.dig(:database_user)
16
+ @database_pass = config.dig(:database_pass)
17
+ @database_name = config.dig(:database_name)
18
+ @mail_host = config.dig(:mail_host)
19
+ @mail_port = config.dig(:mail_port)
20
+ @smtp_host = config.dig(:smtp_host)
21
+ @smtp_port = config.dig(:smtp_port)
22
+ @request_path = config.dig(:request_path)
23
+ @plugins = config.dig(:plugins)
24
+ @skin = config.dig(:skin)
25
+ @upload_max_filesize = config.dig(:upload_max_filesize)
26
+ @aspell_dictionaries = config.dig(:aspell_dictionaries)
27
+
28
+ @name = name.to_s
29
+ @home_dir = File.expand_path('~')
30
+ end
31
+
32
+ def uper
33
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/backups")
34
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/data/html")
35
+ FileUtils.mkdir_p("#{@home_dir}/machine/grids/roundcube/#{@name}/data/roundcube-temp")
36
+
37
+ # Creating & Starting containers
38
+ print "-----> Creating container #{@name} ... "
39
+
40
+ command = [
41
+ "docker create",
42
+ "--name='#{@name}'",
43
+ "--env VIRTUAL_HOST=#{@fqdn}",
44
+ "--env VIRTUAL_PATH='#{@request_path}'",
45
+ "--env LETSENCRYPT_HOST=#{@fqdn}",
46
+ "--env LETSENCRYPT_EMAIL=#{@sysadmin_email}",
47
+ "--env LETSENCRYPT_TEST=false",
48
+ "--env CONTAINER_NAME='#{@name}'",
49
+ "--env FQDN='#{@fqdn}'",
50
+ "--env ROUNDCUBEMAIL_DEFAULT_HOST='#{@mail_host}'",
51
+ "--env ROUNDCUBEMAIL_DEFAULT_PORT='#{@mail_port}'",
52
+ "--env ROUNDCUBEMAIL_SMTP_SERVER='#{@smtp_host}'",
53
+ "--env ROUNDCUBEMAIL_SMTP_PORT='#{@smtp_port}'",
54
+ "--env ROUNDCUBEMAIL_USERNAME_DOMAIN=''",
55
+ "--env ROUNDCUBEMAIL_REQUEST_PATH='#{@request_path}'",
56
+ "--env ROUNDCUBEMAIL_PLUGINS='#{@plugins.join(',')}'",
57
+ "--env ROUNDCUBEMAIL_INSTALL_PLUGINS='1'",
58
+ "--env ROUNDCUBEMAIL_SKIN='#{@skin}'",
59
+ "--env ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE='#{@upload_max_filesize}'",
60
+ "--env ROUNDCUBEMAIL_SPELLCHECK_URI=''",
61
+ "--env ROUNDCUBEMAIL_ASPELL_DICTS='#{@aspell_dictionaries.join(',')}'",
62
+ "--env ROUNDCUBEMAIL_DB_TYPE='#{@database_type}'",
63
+ "--env ROUNDCUBEMAIL_DB_HOST='#{@database_host}'",
64
+ "--env ROUNDCUBEMAIL_DB_PORT='#{@database_port}'",
65
+ "--env ROUNDCUBEMAIL_DB_USER='#{@database_user}'",
66
+ "--env ROUNDCUBEMAIL_DB_PASSWORD='#{@database_pass}'",
67
+ "--env ROUNDCUBEMAIL_DB_NAME='#{@database_name}'",
68
+ "--volume='#{@home_dir}/smartmachine/config/roundcube/etc/apache2/sites-available/000-default.conf:/etc/apache2/sites-available/000-default.conf:ro'",
69
+ "--volume='#{@home_dir}/smartmachine/config/roundcube/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini:/usr/local/etc/php/conf.d/zzz_roundcube-custom.ini:ro'",
70
+ "--volume='#{@home_dir}/smartmachine/config/roundcube/var/roundcube/config:/var/roundcube/config:ro'",
71
+ "--volume='#{@home_dir}/smartmachine/grids/roundcube/#{@name}/data/html:/var/www/html'",
72
+ "--volume='#{@home_dir}/smartmachine/grids/roundcube/#{@name}/data/roundcube-temp:/tmp/roundcube-temp'",
73
+ "--tmpfs /run/tmpfs",
74
+ "--init",
75
+ "--restart='always'",
76
+ "--network='nginx-network'",
77
+ "#{@image}"
78
+ ]
79
+ if system(command.compact.join(" "), out: File::NULL)
80
+ @networks.each do |network|
81
+ system("docker network connect #{network} #{@name}")
82
+ end
83
+
84
+ puts "done"
85
+ puts "-----> Starting container #{@name} ... "
86
+ if system("docker start #{@name}", out: File::NULL)
87
+ puts "done"
88
+ else
89
+ raise "Error: Could not start container: #{@name}"
90
+ end
91
+ else
92
+ raise "Error: Could not create container: #{@name}"
93
+ end
94
+ end
95
+
96
+ def downer
97
+ # Disconnecting networks
98
+ @networks.reverse.each do |network|
99
+ system("docker network disconnect #{network} #{@name}")
100
+ end
101
+
102
+ # Stopping & Removing containers - in reverse order
103
+ print "-----> Stopping container #{@name} ... "
104
+ if system("docker stop '#{@name}'", out: File::NULL)
105
+ puts "done"
106
+ print "-----> Removing container #{@name} ... "
107
+ if system("docker rm '#{@name}'", out: File::NULL)
108
+ puts "done"
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -77,6 +77,13 @@ module SmartMachine
77
77
  # puts 'You may be prompted to make a menu selection when the Grub package is updated on Ubuntu. If prompted, select keep the local version currently installed.'
78
78
 
79
79
  # dpkg-reconfigure tzdata
80
+ # debconf-set-selections <<EOF
81
+ # tzdata tzdata/Areas select Asia
82
+ # tzdata tzdata/Areas seen true
83
+ # tzdata tzdata/Zones/Asia select Kolkata
84
+ # tzdata tzdata/Zones/Asia seen true
85
+ # EOF
86
+ # dpkg-reconfigure -fnoninteractive tzdata
80
87
  # date
81
88
 
82
89
  # hostnamectl set-hostname SmartMachine.credentials.machine[:name]