mirror of
https://github.com/mailcow/mailcow-dockerized.git
synced 2025-12-19 21:01:31 +00:00
133 lines
4.4 KiB
Python
133 lines
4.4 KiB
Python
from jinja2 import Environment, FileSystemLoader
|
|
from modules.BootstrapBase import BootstrapBase
|
|
from pathlib import Path
|
|
import time
|
|
import platform
|
|
|
|
class BootstrapRspamd(BootstrapBase):
|
|
def bootstrap(self):
|
|
# Connect to MySQL
|
|
self.connect_mysql()
|
|
|
|
# Connect to MySQL
|
|
self.connect_redis()
|
|
|
|
# get dovecot ips
|
|
dovecot_v4 = []
|
|
dovecot_v6 = []
|
|
while not dovecot_v4 and not dovecot_v6:
|
|
try:
|
|
dovecot_v4 = self.resolve_docker_dns_record("dovecot-mailcow", "A")
|
|
dovecot_v6 = self.resolve_docker_dns_record("dovecot-mailcow", "AAAA")
|
|
except Exception as e:
|
|
print(e)
|
|
if not dovecot_v4 and not dovecot_v6:
|
|
print("Waiting for Dovecot IPs...")
|
|
time.sleep(3)
|
|
|
|
# get rspamd ips
|
|
rspamd_v4 = []
|
|
rspamd_v6 = []
|
|
while not rspamd_v4 and not rspamd_v6:
|
|
try:
|
|
rspamd_v4 = self.resolve_docker_dns_record("rspamd-mailcow", "A")
|
|
rspamd_v6 = self.resolve_docker_dns_record("rspamd-mailcow", "AAAA")
|
|
except Exception:
|
|
print(e)
|
|
if not rspamd_v4 and not rspamd_v6:
|
|
print("Waiting for Rspamd IPs...")
|
|
time.sleep(3)
|
|
|
|
# wait for Services
|
|
services = [
|
|
["php-fpm-mailcow", 9001],
|
|
["php-fpm-mailcow", 9002]
|
|
]
|
|
for service in services:
|
|
while not self.is_port_open(service[0], service[1]):
|
|
print(f"Waiting for {service[0]} on port {service[1]}...")
|
|
time.sleep(1)
|
|
print(f"Service {service[0]} on port {service[1]} is ready!")
|
|
|
|
for dir_path in ["/etc/rspamd/plugins.d", "/etc/rspamd/custom"]:
|
|
Path(dir_path).mkdir(parents=True, exist_ok=True)
|
|
for file_path in ["/etc/rspamd/rspamd.conf.local", "/etc/rspamd/rspamd.conf.override"]:
|
|
Path(file_path).touch(exist_ok=True)
|
|
self.set_permissions("/var/lib/rspamd", 0o755)
|
|
|
|
|
|
# Setup Jinja2 Environment and load vars
|
|
self.env = Environment(
|
|
loader=FileSystemLoader([
|
|
'/service_config/custom_templates',
|
|
'/service_config/config_templates'
|
|
]),
|
|
keep_trailing_newline=True,
|
|
lstrip_blocks=True,
|
|
trim_blocks=True
|
|
)
|
|
extra_vars = {
|
|
"DOVECOT_V4": dovecot_v4[0],
|
|
"DOVECOT_V6": dovecot_v6[0],
|
|
"RSPAMD_V4": rspamd_v4[0],
|
|
"RSPAMD_V6": rspamd_v6[0],
|
|
}
|
|
self.env_vars = self.prepare_template_vars('/service_config/overwrites.json', extra_vars)
|
|
|
|
print("Set Timezone")
|
|
self.set_timezone()
|
|
|
|
print("Render config")
|
|
self.render_config("/service_config")
|
|
|
|
# Fix missing default global maps, if any
|
|
# These exists in mailcow UI and should not be removed
|
|
files = [
|
|
"/etc/rspamd/custom/global_mime_from_blacklist.map",
|
|
"/etc/rspamd/custom/global_rcpt_blacklist.map",
|
|
"/etc/rspamd/custom/global_smtp_from_blacklist.map",
|
|
"/etc/rspamd/custom/global_mime_from_whitelist.map",
|
|
"/etc/rspamd/custom/global_rcpt_whitelist.map",
|
|
"/etc/rspamd/custom/global_smtp_from_whitelist.map",
|
|
"/etc/rspamd/custom/bad_languages.map",
|
|
"/etc/rspamd/custom/sa-rules",
|
|
"/etc/rspamd/custom/dovecot_trusted.map",
|
|
"/etc/rspamd/custom/rspamd_trusted.map",
|
|
"/etc/rspamd/custom/mailcow_networks.map",
|
|
"/etc/rspamd/custom/ip_wl.map",
|
|
"/etc/rspamd/custom/fishy_tlds.map",
|
|
"/etc/rspamd/custom/bad_words.map",
|
|
"/etc/rspamd/custom/bad_asn.map",
|
|
"/etc/rspamd/custom/bad_words_de.map",
|
|
"/etc/rspamd/custom/bulk_header.map",
|
|
"/etc/rspamd/custom/bad_header.map"
|
|
]
|
|
for file in files:
|
|
path = Path(file)
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.touch(exist_ok=True)
|
|
|
|
# Fix permissions
|
|
paths_rspamd = [
|
|
"/var/lib/rspamd",
|
|
"/etc/rspamd/local.d",
|
|
"/etc/rspamd/override.d",
|
|
"/etc/rspamd/rspamd.conf.local",
|
|
"/etc/rspamd/rspamd.conf.override",
|
|
"/etc/rspamd/plugins.d"
|
|
]
|
|
for path in paths_rspamd:
|
|
self.set_owner(path, "_rspamd", "_rspamd", recursive=True)
|
|
self.set_owner("/etc/rspamd/custom", "_rspamd", "_rspamd")
|
|
self.set_permissions("/etc/rspamd/custom", 0o755)
|
|
|
|
custom_path = Path("/etc/rspamd/custom")
|
|
for child in custom_path.iterdir():
|
|
if child.is_file():
|
|
self.set_owner(child, 82, 82)
|
|
self.set_permissions(child, 0o644)
|
|
|
|
# Provide additional lua modules
|
|
arch = platform.machine()
|
|
self.run_command(["ln", "-s", f"/usr/lib/{arch}-linux-gnu/liblua5.1-cjson.so.0.0.0", "/usr/lib/rspamd/cjson.so"], check=False)
|