ConfigLMM 0.4.0 → 0.5.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 (227) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/CNAME +1 -0
  4. data/Examples/.lmm.state.yaml +159 -0
  5. data/Examples/ConfigLMM.mm.yaml +32 -0
  6. data/Examples/Implemented.mm.yaml +252 -4
  7. data/Examples/SmallBusiness.mm.yaml +492 -0
  8. data/Plugins/Apps/Answer/answer.lmm.rb +165 -0
  9. data/Plugins/Apps/Answer/answer@.service +40 -0
  10. data/Plugins/Apps/ArchiSteamFarm/ArchiSteamFarm.conf.erb +0 -3
  11. data/Plugins/Apps/ArchiSteamFarm/ArchiSteamFarm.lmm.rb +0 -1
  12. data/Plugins/Apps/Authentik/Authentik-ProxyOutpost.container +7 -1
  13. data/Plugins/Apps/Authentik/Authentik-Server.container +6 -1
  14. data/Plugins/Apps/Authentik/Authentik-Worker.container +6 -1
  15. data/Plugins/Apps/Authentik/Authentik.conf.erb +12 -7
  16. data/Plugins/Apps/Authentik/Authentik.lmm.rb +226 -61
  17. data/Plugins/Apps/BookStack/BookStack.conf.erb +0 -3
  18. data/Plugins/Apps/BookStack/BookStack.container +5 -0
  19. data/Plugins/Apps/BookStack/BookStack.lmm.rb +14 -3
  20. data/Plugins/Apps/Cassandra/Cassandra.lmm.rb +9 -19
  21. data/Plugins/Apps/ClickHouse/ClickHouse.container +28 -0
  22. data/Plugins/Apps/ClickHouse/ClickHouse.lmm.rb +113 -0
  23. data/Plugins/Apps/ClickHouse/Config/listen.yaml +2 -0
  24. data/Plugins/Apps/ClickHouse/Config/logger.yaml +8 -0
  25. data/Plugins/Apps/ClickHouse/Config/zookeepers.yaml +5 -0
  26. data/Plugins/Apps/ClickHouse/Connection.rb +96 -0
  27. data/Plugins/Apps/Discourse/Discourse-Sidekiq.container +5 -0
  28. data/Plugins/Apps/Discourse/Discourse.conf.erb +1 -4
  29. data/Plugins/Apps/Discourse/Discourse.container +4 -0
  30. data/Plugins/Apps/Discourse/Discourse.lmm.rb +116 -55
  31. data/Plugins/Apps/Dovecot/Dovecot.lmm.rb +74 -62
  32. data/Plugins/Apps/ERPNext/ERPNext-Frontend.container +6 -1
  33. data/Plugins/Apps/ERPNext/ERPNext-Queue.container +5 -0
  34. data/Plugins/Apps/ERPNext/ERPNext-Scheduler.container +5 -0
  35. data/Plugins/Apps/ERPNext/ERPNext-Websocket.container +6 -1
  36. data/Plugins/Apps/ERPNext/ERPNext.container +6 -1
  37. data/Plugins/Apps/ERPNext/ERPNext.lmm.rb +138 -127
  38. data/Plugins/Apps/GitLab/GitLab.container +6 -0
  39. data/Plugins/Apps/GitLab/GitLab.lmm.rb +43 -49
  40. data/Plugins/Apps/Homepage/Homepage.conf.erb +86 -0
  41. data/Plugins/Apps/Homepage/Homepage.container +19 -0
  42. data/Plugins/Apps/Homepage/Homepage.lmm.rb +54 -0
  43. data/Plugins/Apps/IPFS/IPFS.conf.erb +0 -3
  44. data/Plugins/Apps/IPFS/IPFS.lmm.rb +0 -1
  45. data/Plugins/Apps/InfluxDB/InfluxDB.conf.erb +0 -3
  46. data/Plugins/Apps/InfluxDB/InfluxDB.lmm.rb +0 -1
  47. data/Plugins/Apps/Jackett/Jackett.conf.erb +0 -3
  48. data/Plugins/Apps/Jackett/Jackett.lmm.rb +0 -1
  49. data/Plugins/Apps/Jellyfin/Jellyfin.conf.erb +0 -3
  50. data/Plugins/Apps/Jellyfin/Jellyfin.lmm.rb +0 -1
  51. data/Plugins/Apps/LetsEncrypt/LetsEncrypt.lmm.rb +49 -28
  52. data/Plugins/Apps/LibreTranslate/LibreTranslate.container +21 -0
  53. data/Plugins/Apps/LibreTranslate/LibreTranslate.lmm.rb +34 -0
  54. data/Plugins/Apps/Lobsters/Containerfile +81 -0
  55. data/Plugins/Apps/Lobsters/Lobsters-Tasks.container +26 -0
  56. data/Plugins/Apps/Lobsters/Lobsters.conf.erb +99 -0
  57. data/Plugins/Apps/Lobsters/Lobsters.container +27 -0
  58. data/Plugins/Apps/Lobsters/Lobsters.lmm.rb +196 -0
  59. data/Plugins/Apps/Lobsters/crontab +3 -0
  60. data/Plugins/Apps/Lobsters/database.yml +26 -0
  61. data/Plugins/Apps/Lobsters/entrypoint.sh +30 -0
  62. data/Plugins/Apps/Lobsters/generateCredentials.rb +19 -0
  63. data/Plugins/Apps/Lobsters/lobsters-cron.sh +25 -0
  64. data/Plugins/Apps/Lobsters/lobsters-daily.sh +23 -0
  65. data/Plugins/Apps/Lobsters/puma.rb +49 -0
  66. data/Plugins/Apps/MariaDB/Connection.rb +55 -0
  67. data/Plugins/Apps/MariaDB/MariaDB.lmm.rb +60 -53
  68. data/Plugins/Apps/Mastodon/Mastodon-Sidekiq.container +22 -0
  69. data/Plugins/Apps/Mastodon/Mastodon-Streaming.container +20 -0
  70. data/Plugins/Apps/Mastodon/Mastodon.conf.erb +34 -45
  71. data/Plugins/Apps/Mastodon/Mastodon.container +28 -0
  72. data/Plugins/Apps/Mastodon/Mastodon.lmm.rb +240 -5
  73. data/Plugins/Apps/Mastodon/configlmm.rake +30 -0
  74. data/Plugins/Apps/Mastodon/entrypoint.sh +16 -0
  75. data/Plugins/Apps/Matrix/Element.container +5 -0
  76. data/Plugins/Apps/Matrix/Matrix.conf.erb +2 -8
  77. data/Plugins/Apps/Matrix/Matrix.lmm.rb +100 -71
  78. data/Plugins/Apps/Matrix/Synapse.container +5 -0
  79. data/Plugins/Apps/Netdata/Netdata.conf.erb +0 -3
  80. data/Plugins/Apps/Netdata/Netdata.lmm.rb +0 -1
  81. data/Plugins/Apps/Nextcloud/Nextcloud.conf.erb +3 -4
  82. data/Plugins/Apps/Nextcloud/Nextcloud.lmm.rb +150 -68
  83. data/Plugins/Apps/Nextcloud/autoconfig.php +13 -0
  84. data/Plugins/Apps/Nextcloud/config.php +10 -1
  85. data/Plugins/Apps/Nextcloud/nextcloudcron.service +8 -0
  86. data/Plugins/Apps/Nextcloud/nextcloudcron.timer +10 -0
  87. data/Plugins/Apps/Nginx/Connection.rb +93 -0
  88. data/Plugins/Apps/Nginx/conf.d/configlmm.conf +50 -9
  89. data/Plugins/Apps/Nginx/conf.d/languages.conf +21 -0
  90. data/Plugins/Apps/Nginx/config-lmm/errors.conf +25 -20
  91. data/Plugins/Apps/Nginx/config-lmm/gateway-errors.conf +20 -0
  92. data/Plugins/Apps/Nginx/config-lmm/proxy.conf +1 -1
  93. data/Plugins/Apps/Nginx/main.conf.erb +7 -3
  94. data/Plugins/Apps/Nginx/nginx.conf +2 -2
  95. data/Plugins/Apps/Nginx/nginx.lmm.rb +99 -81
  96. data/Plugins/Apps/Nginx/proxy.conf.erb +11 -3
  97. data/Plugins/Apps/Odoo/Odoo.conf.erb +0 -3
  98. data/Plugins/Apps/Odoo/Odoo.container +5 -0
  99. data/Plugins/Apps/Odoo/Odoo.lmm.rb +4 -5
  100. data/Plugins/Apps/Ollama/Ollama.container +26 -0
  101. data/Plugins/Apps/Ollama/Ollama.lmm.rb +73 -0
  102. data/Plugins/Apps/OpenTelemetry/Config/config.yaml +704 -0
  103. data/Plugins/Apps/OpenTelemetry/OpenTelemetry.lmm.rb +154 -0
  104. data/Plugins/Apps/OpenVidu/Ingress.container +5 -0
  105. data/Plugins/Apps/OpenVidu/OpenVidu.conf.erb +0 -3
  106. data/Plugins/Apps/OpenVidu/OpenVidu.container +5 -0
  107. data/Plugins/Apps/OpenVidu/OpenVidu.lmm.rb +7 -3
  108. data/Plugins/Apps/OpenVidu/OpenViduCall.conf.erb +0 -3
  109. data/Plugins/Apps/OpenVidu/OpenViduCall.container +5 -0
  110. data/Plugins/Apps/PHP-FPM/Connection.rb +91 -0
  111. data/Plugins/Apps/PHP-FPM/PHP-FPM.lmm.rb +31 -4
  112. data/Plugins/Apps/Peppermint/Peppermint.conf.erb +2 -5
  113. data/Plugins/Apps/Peppermint/Peppermint.container +5 -0
  114. data/Plugins/Apps/Peppermint/Peppermint.lmm.rb +29 -33
  115. data/Plugins/Apps/Perplexica/Perplexica.container +25 -0
  116. data/Plugins/Apps/Perplexica/Perplexica.lmm.rb +92 -0
  117. data/Plugins/Apps/Perplexica/config.toml +26 -0
  118. data/Plugins/Apps/Podman/Connection.rb +24 -0
  119. data/Plugins/Apps/Podman/Podman.lmm.rb +80 -0
  120. data/Plugins/Apps/Podman/storage.conf +6 -0
  121. data/Plugins/Apps/Postfix/Postfix.lmm.rb +242 -164
  122. data/Plugins/Apps/PostgreSQL/Connection.rb +97 -0
  123. data/Plugins/Apps/PostgreSQL/PostgreSQL.lmm.rb +184 -148
  124. data/Plugins/Apps/Pterodactyl/Pterodactyl.conf.erb +0 -3
  125. data/Plugins/Apps/Pterodactyl/Pterodactyl.lmm.rb +0 -2
  126. data/Plugins/Apps/Pterodactyl/Wings.conf.erb +0 -3
  127. data/Plugins/Apps/RVM/RVM.lmm.rb +57 -0
  128. data/Plugins/Apps/Roundcube/Roundcube.conf.erb +0 -3
  129. data/Plugins/Apps/Roundcube/Roundcube.lmm.rb +15 -19
  130. data/Plugins/Apps/SSH/SSH.lmm.rb +9 -15
  131. data/Plugins/Apps/SearXNG/SearXNG.container +22 -0
  132. data/Plugins/Apps/SearXNG/SearXNG.lmm.rb +79 -0
  133. data/Plugins/Apps/SearXNG/limiter.toml +40 -0
  134. data/Plugins/Apps/SearXNG/settings.yml +2 -0
  135. data/Plugins/Apps/SigNoz/Config/alerts.yml +11 -0
  136. data/Plugins/Apps/SigNoz/Config/otel-collector-config.yaml +110 -0
  137. data/Plugins/Apps/SigNoz/Config/otel-collector-opamp-config.yaml +1 -0
  138. data/Plugins/Apps/SigNoz/Config/prometheus.yml +18 -0
  139. data/Plugins/Apps/SigNoz/SigNoz-Collector.container +23 -0
  140. data/Plugins/Apps/SigNoz/SigNoz-Migrator.container +17 -0
  141. data/Plugins/Apps/SigNoz/SigNoz.conf.erb +61 -0
  142. data/Plugins/Apps/SigNoz/SigNoz.container +26 -0
  143. data/Plugins/Apps/SigNoz/SigNoz.lmm.rb +319 -0
  144. data/Plugins/Apps/Solr/log4j2.xml +89 -0
  145. data/Plugins/Apps/Solr/solr.lmm.rb +82 -0
  146. data/Plugins/Apps/Sunshine/Sunshine.conf.erb +0 -3
  147. data/Plugins/Apps/Sunshine/Sunshine.lmm.rb +0 -1
  148. data/Plugins/Apps/Tunnel/tunnel.lmm.rb +33 -37
  149. data/Plugins/Apps/UVdesk/UVdesk.conf.erb +0 -3
  150. data/Plugins/Apps/Umami/Umami.container +19 -0
  151. data/Plugins/Apps/Umami/Umami.lmm.rb +108 -0
  152. data/Plugins/Apps/Valkey/Valkey.lmm.rb +54 -42
  153. data/Plugins/Apps/Vaultwarden/Vaultwarden.conf.erb +9 -6
  154. data/Plugins/Apps/Vaultwarden/Vaultwarden.container +7 -1
  155. data/Plugins/Apps/Vaultwarden/Vaultwarden.lmm.rb +64 -29
  156. data/Plugins/Apps/Wiki.js/Wiki.js.conf.erb +1 -4
  157. data/Plugins/Apps/Wiki.js/Wiki.js.container +5 -0
  158. data/Plugins/Apps/Wiki.js/Wiki.js.lmm.rb +31 -37
  159. data/Plugins/Apps/YaCy/YaCy.conf.erb +93 -0
  160. data/Plugins/Apps/YaCy/YaCy.container +21 -0
  161. data/Plugins/Apps/YaCy/YaCy.lmm.rb +160 -0
  162. data/Plugins/Apps/ZooKeeper/ZooKeeper.container +24 -0
  163. data/Plugins/Apps/ZooKeeper/ZooKeeper.lmm.rb +68 -0
  164. data/Plugins/Apps/bitmagnet/bitmagnet.conf.erb +0 -3
  165. data/Plugins/Apps/bitmagnet/bitmagnet.lmm.rb +0 -1
  166. data/Plugins/Apps/gollum/gollum.conf.erb +2 -4
  167. data/Plugins/Apps/gollum/gollum.container +6 -0
  168. data/Plugins/Apps/gollum/gollum.lmm.rb +51 -50
  169. data/Plugins/Apps/llama.cpp/llama.cpp.container +28 -0
  170. data/Plugins/Apps/llama.cpp/llama.cpp.lmm.rb +90 -0
  171. data/Plugins/Apps/vLLM/vLLM.container +32 -0
  172. data/Plugins/Apps/vLLM/vLLM.lmm.rb +89 -0
  173. data/Plugins/OS/General/Utils.lmm.rb +26 -0
  174. data/Plugins/OS/Linux/Connection.rb +472 -0
  175. data/Plugins/OS/Linux/Debian/preseed.cfg.erb +25 -6
  176. data/Plugins/OS/Linux/Flavours.yaml +13 -0
  177. data/Plugins/OS/Linux/Grub/grub.cfg +10 -0
  178. data/Plugins/OS/Linux/HTTP.rb +32 -0
  179. data/Plugins/OS/Linux/Linux.lmm.rb +533 -187
  180. data/Plugins/OS/Linux/Packages.yaml +20 -1
  181. data/Plugins/OS/Linux/Services.yaml +8 -0
  182. data/Plugins/OS/Linux/Shell.rb +70 -0
  183. data/Plugins/OS/Linux/Syslinux/default +8 -0
  184. data/Plugins/OS/Linux/WireGuard/WireGuard.lmm.rb +83 -59
  185. data/Plugins/OS/Linux/WireGuard/wg0.conf.erb +3 -0
  186. data/Plugins/OS/Linux/openSUSE/autoinst.xml.erb +29 -3
  187. data/Plugins/OS/Linux/systemd/systemd.lmm.rb +13 -11
  188. data/Plugins/OS/Routers/Aruba/ArubaInstant.lmm.rb +6 -5
  189. data/Plugins/Platforms/GitHub.lmm.rb +73 -28
  190. data/Plugins/Platforms/GoDaddy/GoDaddy.lmm.rb +9 -6
  191. data/Plugins/Platforms/Proxmox/Proxmox.lmm.rb +402 -0
  192. data/Plugins/Platforms/Proxmox/XTerm.rb +321 -0
  193. data/Plugins/Platforms/libvirt/libvirt.lmm.rb +38 -13
  194. data/Plugins/Platforms/porkbun.lmm.rb +12 -2
  195. data/Plugins/Platforms/porkbun_spec.rb +2 -2
  196. data/Plugins/Services/DNS/AmberBit.lmm.rb +1 -1
  197. data/Plugins/Services/DNS/ArubaItDNS.lmm.rb +1 -1
  198. data/Plugins/Services/DNS/NICLV.lmm.rb +1 -1
  199. data/Plugins/Services/DNS/PowerDNS.lmm.rb +70 -68
  200. data/Plugins/Services/DNS/tonic.lmm.rb +22 -12
  201. data/lib/ConfigLMM/Framework/plugins/dns.rb +4 -3
  202. data/lib/ConfigLMM/Framework/plugins/linuxApp.rb +145 -184
  203. data/lib/ConfigLMM/Framework/plugins/nginxApp.rb +34 -17
  204. data/lib/ConfigLMM/Framework/plugins/plugin.rb +53 -181
  205. data/lib/ConfigLMM/Framework/plugins/store.rb +4 -4
  206. data/lib/ConfigLMM/Framework/variables.rb +75 -0
  207. data/lib/ConfigLMM/Framework.rb +1 -0
  208. data/lib/ConfigLMM/cli.rb +12 -6
  209. data/lib/ConfigLMM/commands/configsCommand.rb +37 -6
  210. data/lib/ConfigLMM/commands/diff.rb +33 -9
  211. data/lib/ConfigLMM/context.rb +22 -3
  212. data/lib/ConfigLMM/io/configList.rb +82 -6
  213. data/lib/ConfigLMM/io/connection.rb +143 -0
  214. data/lib/ConfigLMM/io/dhcp.rb +330 -0
  215. data/lib/ConfigLMM/io/http.rb +78 -0
  216. data/lib/ConfigLMM/io/local.rb +207 -0
  217. data/lib/ConfigLMM/io/pxe.rb +92 -0
  218. data/lib/ConfigLMM/io/ssh.rb +156 -0
  219. data/lib/ConfigLMM/io/tftp.rb +105 -0
  220. data/lib/ConfigLMM/io.rb +2 -0
  221. data/lib/ConfigLMM/secrets/envStore.rb +39 -0
  222. data/lib/ConfigLMM/secrets/fileStore.rb +43 -0
  223. data/lib/ConfigLMM/state.rb +2 -1
  224. data/lib/ConfigLMM/version.rb +2 -1
  225. data/lib/ConfigLMM.rb +1 -0
  226. data/{Examples → scripts}/configlmmAuth.sh +7 -5
  227. metadata +205 -8
@@ -1,3 +1,4 @@
1
+ require 'addressable/idna'
1
2
 
2
3
  module ConfigLMM
3
4
  module LMM
@@ -9,40 +10,35 @@ module ConfigLMM
9
10
  EMAIL_USER = 'email'
10
11
 
11
12
  def actionDovecotDeploy(id, target, activeState, context, options)
12
- plugins[:Linux].ensurePackage(PACKAGE_NAME, target['Location'])
13
- plugins[:Linux].ensureServiceAutoStart(SERVICE_NAME, target['Location'])
14
-
15
- if target['Location'] && target['Location'] != '@me'
16
- uri = Addressable::URI.parse(target['Location'])
17
- raise Framework::PluginProcessError.new("#{id}: Unknown Protocol: #{uri.scheme}!") if uri.scheme != 'ssh'
18
-
19
- self.class.sshStart(uri) do |ssh|
20
- distroInfo = Framework::LinuxApp.currentDistroInfo(ssh)
21
- addUserCmd = "#{distroInfo['CreateServiceUser']} --home-dir '#{EMAIL_HOME}' --create-home --comment 'Dovecot EMail' #{EMAIL_USER}"
22
- self.class.sshExec!(ssh, addUserCmd, true)
23
- uid = self.class.sshExec!(ssh, "id -u #{EMAIL_USER}").strip
24
-
25
- cmd = "sed -i 's|^#mail_uid =.*|mail_uid = #{uid}|' #{DOVECOT_DIR}conf.d/10-mail.conf"
26
- self.class.sshExec!(ssh, cmd)
27
- cmd = "sed -i 's|^#mail_gid =.*|mail_gid = #{uid}|' #{DOVECOT_DIR}conf.d/10-mail.conf"
28
- self.class.sshExec!(ssh, cmd)
29
- cmd = "sed -i 's|^#mail_location =.*|mail_location = maildir:~/Mail|' #{DOVECOT_DIR}conf.d/10-mail.conf"
30
- self.class.sshExec!(ssh, cmd)
13
+ self.withConnection(target['Location'], target) do |connection|
14
+ Linux.withConnection(connection) do |linuxConnection|
15
+
16
+ linuxConnection.ensurePackage(PACKAGE_NAME, options)
17
+ linuxConnection.ensureServiceAutoStart(SERVICE_NAME, options)
18
+
19
+ linuxConnection.createServiceUser(EMAIL_USER, EMAIL_HOME, 'Dovecot EMail', options)
20
+
21
+ uid = linuxConnection.exec("id -u #{EMAIL_USER}", false, options).strip
22
+
23
+
24
+ linuxConnection.fileReplace("#{DOVECOT_DIR}conf.d/10-mail.conf", '^#mail_uid =.*', "mail_uid = #{uid}", options)
25
+ linuxConnection.fileReplace("#{DOVECOT_DIR}conf.d/10-mail.conf", '^#mail_gid =.*', "mail_gid = #{uid}", options)
26
+ linuxConnection.fileReplace("#{DOVECOT_DIR}conf.d/10-mail.conf", '^#mail_location =.*', "mail_location = maildir:~/Mail", options)
31
27
 
32
28
  if !target['Protocols'].to_a.empty?
33
- updateRemoteFile(ssh, DOVECOT_DIR + 'dovecot.conf', options) do |configLines|
29
+ linuxConnection.updateFile(DOVECOT_DIR + 'dovecot.conf', options) do |configLines|
34
30
  configLines << "protocols = #{target['Protocols'].join(' ')}\n"
35
31
  end
36
32
  end
37
33
 
38
- updateRemoteFile(ssh, DOVECOT_DIR + 'conf.d/10-mail.conf', options) do |configLines|
34
+ linuxConnection.updateFile(DOVECOT_DIR + 'conf.d/10-mail.conf', options) do |configLines|
39
35
  configLines << "mail_home = #{EMAIL_HOME}/emails/%u\n"
40
36
  configLines << "first_valid_uid = #{uid}\n"
41
37
  configLines << "last_valid_uid = #{uid}\n"
42
38
  end
43
39
 
44
- self.class.cutConfigSection(DOVECOT_DIR + 'conf.d/10-master.conf', 'service lmtp', options, ssh)
45
- updateRemoteFile(ssh, DOVECOT_DIR + 'conf.d/10-master.conf', options) do |configLines|
40
+ self.class.cutConfigSection(DOVECOT_DIR + 'conf.d/10-master.conf', 'service lmtp', options, linuxConnection)
41
+ linuxConnection.updateFile(DOVECOT_DIR + 'conf.d/10-master.conf', options) do |configLines|
46
42
  configLines << "service lmtp {\n"
47
43
  configLines << " unix_listener lmtp {\n"
48
44
  configLines << " user = postfix\n"
@@ -52,9 +48,12 @@ module ConfigLMM
52
48
  configLines << "}\n"
53
49
  end
54
50
 
55
- self.class.cutConfigSection(DOVECOT_DIR + 'conf.d/15-mailboxes.conf', 'namespace inbox', options, ssh)
56
- updateRemoteFile(ssh, DOVECOT_DIR + 'conf.d/15-mailboxes.conf', options) do |configLines|
51
+ self.class.cutConfigSection(DOVECOT_DIR + 'conf.d/15-mailboxes.conf', 'namespace inbox', options, linuxConnection)
52
+ linuxConnection.updateFile(DOVECOT_DIR + 'conf.d/15-mailboxes.conf', options) do |configLines|
57
53
  configLines << "namespace inbox {\n"
54
+ configLines << " mailbox INBOX {\n"
55
+ configLines << " auto = subscribe\n"
56
+ configLines << " }\n"
58
57
  configLines << " mailbox Drafts {\n"
59
58
  configLines << " special_use = \\Drafts\n"
60
59
  configLines << " auto = subscribe\n"
@@ -74,16 +73,14 @@ module ConfigLMM
74
73
  configLines << "}\n"
75
74
  end
76
75
 
77
- Framework::LinuxApp.firewallAddService('imaps', ssh)
76
+ linuxConnection.firewallAddService('imaps', options)
78
77
 
79
- cmd = "sed -i 's|^!include auth-system.conf.ext|#!include auth-system.conf.ext|' #{DOVECOT_DIR}conf.d/10-auth.conf"
80
- self.class.sshExec!(ssh, cmd)
78
+ linuxConnection.fileReplace("#{DOVECOT_DIR}conf.d/10-auth.conf", '^!include auth-system.conf.ext', "#!include auth-system.conf.ext", options)
81
79
 
82
80
  if target['OAuth2']
83
- cmd = "sed -i 's|auth_mechanisms =.*|auth_mechanisms = xoauth2 oauthbearer|' #{DOVECOT_DIR}conf.d/10-auth.conf"
84
- self.class.sshExec!(ssh, cmd)
81
+ linuxConnection.fileReplace("#{DOVECOT_DIR}conf.d/10-auth.conf", 'auth_mechanisms =.*', "auth_mechanisms = xoauth2 oauthbearer", options)
85
82
 
86
- updateRemoteFile(ssh, DOVECOT_DIR + 'conf.d/10-auth.conf', options) do |configLines|
83
+ linuxConnection.updateFile(DOVECOT_DIR + 'conf.d/10-auth.conf', options) do |configLines|
87
84
  configLines << "userdb {\n"
88
85
  configLines << " driver = static\n"
89
86
  configLines << " args = allow_all_users=yes\n"
@@ -95,7 +92,7 @@ module ConfigLMM
95
92
  configLines << "}\n"
96
93
  end
97
94
 
98
- updateRemoteFile(ssh, DOVECOT_DIR + 'dovecot-oauth2.conf.ext', options) do |configLines|
95
+ linuxConnection.updateFile(DOVECOT_DIR + 'dovecot-oauth2.conf.ext', options) do |configLines|
99
96
  # Need v2.3.16+
100
97
  #configLines << "openid_configuration_url = #{target['OAuth2']['OIDC']}\n"
101
98
  if target['OAuth2']['TokenInfo']
@@ -104,18 +101,24 @@ module ConfigLMM
104
101
  if target['OAuth2']['Introspection']
105
102
  configLines << "introspection_url = #{target['OAuth2']['Introspection']}\n"
106
103
  end
107
- if target['OAuth2']['ClientID']
108
- configLines << "client_id = #{target['OAuth2']['ClientID']}\n"
104
+
105
+ secretId = target['OAuth2']['SecretId']
106
+ secretId = target['SecretId'] unless secretId
107
+ clientId = context.secrets.load(secretId, 'OAUTH2_CLIENT_ID')
108
+ clientId = target['OAuth2']['ClientID'] unless clientId
109
+ clientSecret = context.secrets.load(secretId, 'OAUTH2_CLIENT_SECRET')
110
+
111
+ if clientId
112
+ configLines << "client_id = #{clientId}\n"
109
113
  end
110
- if ENV['DOVECOT_OAUTH2_SECRET']
111
- configLines << "client_secret = #{ENV['DOVECOT_OAUTH2_SECRET']}\n"
114
+ if clientSecret
115
+ configLines << "client_secret = #{clientSecret}\n"
112
116
  end
113
117
  end
114
118
  else
115
- cmd = "sed -i 's|auth_mechanisms =.*|auth_mechanisms = plain|' #{DOVECOT_DIR}conf.d/10-auth.conf"
116
- self.class.sshExec!(ssh, cmd)
119
+ linuxConnection.fileReplace("#{DOVECOT_DIR}conf.d/10-auth.conf", 'auth_mechanisms =.*', "auth_mechanisms = plain", options)
117
120
 
118
- updateRemoteFile(ssh, DOVECOT_DIR + 'conf.d/10-auth.conf', options) do |configLines|
121
+ linuxConnection.updateFile(DOVECOT_DIR + 'conf.d/10-auth.conf', options) do |configLines|
119
122
  configLines << "auth_username_format = %u\n"
120
123
  configLines << "userdb {\n"
121
124
  configLines << " driver = static\n"
@@ -126,47 +129,56 @@ module ConfigLMM
126
129
  configLines << " args = #{DOVECOT_DIR}passwords\n"
127
130
  configLines << "}\n"
128
131
  end
129
- self.class.sshExec!(ssh, "touch #{DOVECOT_DIR}passwords")
130
- self.class.sshExec!(ssh, "chown dovecot:dovecot #{DOVECOT_DIR}passwords")
131
- self.class.sshExec!(ssh, "chmod 600 #{DOVECOT_DIR}passwords")
132
+ linuxConnection.exec("touch #{DOVECOT_DIR}passwords", options)
133
+ linuxConnection.setUserGroup("#{DOVECOT_DIR}passwords", 'dovecot', 'dovecot', options)
134
+ linuxConnection.setPrivate("#{DOVECOT_DIR}passwords", options)
132
135
  end
133
136
 
134
- certDir = Framework::LinuxApp.createCertificateOverSSH(ssh)
135
- updateRemoteFile(ssh, DOVECOT_DIR + 'conf.d/10-ssl.conf', options) do |configLines|
137
+ certDir = linuxConnection.createWildecardCertificate(options)
138
+ linuxConnection.updateFile(DOVECOT_DIR + 'conf.d/10-ssl.conf', options) do |configLines|
136
139
  configLines << "ssl_cert = <#{certDir}fullchain.pem\n"
137
140
  configLines << "ssl_key = <#{certDir}privkey.pem\n"
141
+ if !target['Domains'].to_h.empty?
142
+ target['Domains'].each do |domain, config|
143
+ if config['CertName']
144
+ configLines << "local_name #{Addressable::IDNA.to_ascii(domain)} {\n"
145
+ configLines << " ssl_cert = </etc/letsencrypt/live/#{config['CertName']}/fullchain.pem\n"
146
+ configLines << " ssl_key = </etc/letsencrypt/live/#{config['CertName']}/privkey.pem\n"
147
+ configLines << "}\n"
148
+ end
149
+ end
150
+ end
151
+ configLines
138
152
  end
153
+
154
+ linuxConnection.restartService(SERVICE_NAME, options)
139
155
  end
140
- else
141
- # TODO
142
156
  end
143
-
144
- plugins[:Linux].startService(SERVICE_NAME, target['Location'])
145
-
146
- activeState['Status'] = State::STATUS_DEPLOYED
147
157
  end
148
158
 
149
159
  def cleanup(configs, state, context, options)
150
- cleanupType(:Dovecot, configs, state, context, options) do |item, id, state, context, options, ssh|
151
- Framework::LinuxApp.stopService(SERVICE_NAME, ssh, options[:dry])
152
- Framework::LinuxApp.firewallRemoveService('imaps', ssh, options[:dry])
153
- Framework::LinuxApp.removePackage(PACKAGE_NAME, ssh, options[:dry])
160
+ cleanupType(:Dovecot, configs, state, context, options) do |item, id, state, context, options, connection|
161
+ Linux.withConnection(connection) do |linuxConnection|
162
+ linuxConnection.stopService(SERVICE_NAME, options)
163
+ linuxConnection.firewallRemoveService('imaps', options)
164
+ linuxConnection.removePackage(PACKAGE_NAME, options)
154
165
 
155
- state.item(id)['Status'] = State::STATUS_DELETED unless options[:dry]
166
+ state.item(id)['Status'] = State::STATUS_DELETED unless options[:dry]
156
167
 
157
- if options[:destroy]
158
- Framework::LinuxApp.deleteUserAndGroup(EMAIL_USER, ssh, options[:dry])
168
+ if options[:destroy]
169
+ linuxConnection.deleteUserAndGroup(EMAIL_USER, options)
159
170
 
160
- state.item(id)['Status'] = State::STATUS_DESTROYED unless options[:dry]
171
+ state.item(id)['Status'] = State::STATUS_DESTROYED unless options[:dry]
172
+ end
161
173
  end
162
174
  end
163
175
  end
164
176
 
165
- def self.cutConfigSection(file, sectionStart, options, ssh)
177
+ def self.cutConfigSection(file, sectionStart, options, linuxConnection)
166
178
  localFile = options['output'] + '/' + SecureRandom.alphanumeric(10)
167
179
  File.write(localFile, '')
168
- self.sshExec!(ssh, "touch #{file}")
169
- ssh.scp.download!(file, localFile)
180
+ linuxConnection.exec("touch #{file}", options)
181
+ linuxConnection.download(file, localFile, options)
170
182
  fileData = File.read(localFile)
171
183
  position = fileData.index(sectionStart)
172
184
  if position
@@ -179,7 +191,7 @@ module ConfigLMM
179
191
  fileData = fileData[0...position]
180
192
  end
181
193
  File.write(localFile, fileData)
182
- ssh.scp.upload!(localFile, file)
194
+ linuxConnection.upload(localFile, file, options)
183
195
  end
184
196
  end
185
197
  end
@@ -9,11 +9,16 @@ Image=ConfigLM.moe/erpnext:v$VERSION
9
9
  Exec=nginx-entrypoint.sh
10
10
  EnvironmentFile=/var/lib/erpnext/.config/containers/systemd/ERPNext.env
11
11
  PublishPort=127.0.0.1:18400:8080
12
- Network=ERPNext
12
+ Network=ERPNext.network
13
13
  HostName=ERPNext-Frontend
14
14
  UserNS=keep-id:uid=1000,gid=1000
15
15
  Volume=/var/lib/erpnext/sites:/home/frappe/frappe-bench/sites
16
16
  Volume=/var/lib/erpnext/logs:/home/frappe/frappe-bench/logs
17
+ LogDriver=journald
18
+
19
+ [Service]
20
+ TimeoutStartSec=16min
21
+ Restart=on-failure
17
22
 
18
23
  [Install]
19
24
  WantedBy=multi-user.target default.target
@@ -12,6 +12,11 @@ Network=slirp4netns:allow_host_loopback=true
12
12
  UserNS=keep-id:uid=1000,gid=1000
13
13
  Volume=/var/lib/erpnext/sites:/home/frappe/frappe-bench/sites
14
14
  Volume=/var/lib/erpnext/logs:/home/frappe/frappe-bench/logs
15
+ LogDriver=journald
16
+
17
+ [Service]
18
+ TimeoutStartSec=16min
19
+ Restart=on-failure
15
20
 
16
21
  [Install]
17
22
  WantedBy=multi-user.target default.target
@@ -11,6 +11,11 @@ EnvironmentFile=/var/lib/erpnext/.config/containers/systemd/ERPNext.env
11
11
  UserNS=keep-id:uid=1000,gid=1000
12
12
  Volume=/var/lib/erpnext/sites:/home/frappe/frappe-bench/sites
13
13
  Volume=/var/lib/erpnext/logs:/home/frappe/frappe-bench/logs
14
+ LogDriver=journald
15
+
16
+ [Service]
17
+ TimeoutStartSec=16min
18
+ Restart=on-failure
14
19
 
15
20
  [Install]
16
21
  WantedBy=multi-user.target default.target
@@ -8,12 +8,17 @@ ContainerName=ERPNext-Websocket
8
8
  Image=ConfigLM.moe/erpnext:v$VERSION
9
9
  Exec=node /home/frappe/frappe-bench/apps/frappe/socketio.js
10
10
  EnvironmentFile=/var/lib/erpnext/.config/containers/systemd/ERPNext.env
11
- Network=ERPNext
11
+ Network=ERPNext.network
12
12
  IP=10.90.50.11
13
13
  HostName=ERPNext-Websocket
14
14
  UserNS=keep-id:uid=1000,gid=1000
15
15
  Volume=/var/lib/erpnext/sites:/home/frappe/frappe-bench/sites
16
16
  Volume=/var/lib/erpnext/logs:/home/frappe/frappe-bench/logs
17
+ LogDriver=journald
18
+
19
+ [Service]
20
+ TimeoutStartSec=16min
21
+ Restart=on-failure
17
22
 
18
23
  [Install]
19
24
  WantedBy=multi-user.target default.target
@@ -7,12 +7,17 @@ After=local-fs.target
7
7
  ContainerName=ERPNext
8
8
  Image=ConfigLM.moe/erpnext:v$VERSION
9
9
  EnvironmentFile=/var/lib/erpnext/.config/containers/systemd/ERPNext.env
10
- Network=ERPNext
10
+ Network=ERPNext.network
11
11
  IP=10.90.50.10
12
12
  HostName=ERPNext
13
13
  UserNS=keep-id:uid=1000,gid=1000
14
14
  Volume=/var/lib/erpnext/sites:/home/frappe/frappe-bench/sites
15
15
  Volume=/var/lib/erpnext/logs:/home/frappe/frappe-bench/logs
16
+ LogDriver=journald
17
+
18
+ [Service]
19
+ TimeoutStartSec=12min
20
+ Restart=on-failure
16
21
 
17
22
  [Install]
18
23
  WantedBy=multi-user.target default.target