BootstrapSogo.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. from jinja2 import Environment, FileSystemLoader
  2. from modules.BootstrapBase import BootstrapBase
  3. from pathlib import Path
  4. import os
  5. import sys
  6. import time
  7. class Bootstrap(BootstrapBase):
  8. def bootstrap(self):
  9. # Skip SOGo if set
  10. if self.isYes(os.getenv("SKIP_SOGO", "")):
  11. print("SKIP_SOGO is set, skipping SOGo startup...")
  12. time.sleep(365 * 24 * 60 * 60)
  13. sys.exit(1)
  14. # Connect to MySQL
  15. self.connect_mysql()
  16. # Wait until port is free
  17. while self.is_port_open("sogo-mailcow", 20000):
  18. print("Port 20000 still in use — terminating sogod...")
  19. self.kill_proc("sogod")
  20. time.sleep(3)
  21. # Wait for schema to update to expected version
  22. self.wait_for_schema_update(init_file_path="init_db.inc.php")
  23. # Setup Jinja2 Environment and load vars
  24. self.env = Environment(
  25. loader=FileSystemLoader("./etc/sogo/config_templates"),
  26. keep_trailing_newline=True,
  27. lstrip_blocks=True,
  28. trim_blocks=True
  29. )
  30. extra_vars = {
  31. "SQL_DOMAINS": self.get_domains(),
  32. "IAM_SETTINGS": self.get_identity_provider_settings()
  33. }
  34. self.env_vars = self.prepare_template_vars('/overwrites.json', extra_vars)
  35. print("Set Timezone")
  36. self.set_timezone()
  37. print("Set Syslog redis")
  38. self.set_syslog_redis()
  39. print("Render config")
  40. self.render_config("sogod.plist.j2", "/var/lib/sogo/GNUstep/Defaults/sogod.plist")
  41. self.render_config("UIxTopnavToolbar.wox.j2", "/usr/lib/GNUstep/SOGo/Templates/UIxTopnavToolbar.wox")
  42. print("Fix permissions")
  43. self.set_owner("/var/lib/sogo", "sogo", "sogo", recursive=True)
  44. self.set_permissions("/var/lib/sogo/GNUstep/Defaults/sogod.plist", 0o600)
  45. # Rename custom logo
  46. logo_src = Path("/etc/sogo/sogo-full.svg")
  47. if logo_src.exists():
  48. print("Set Logo")
  49. self.move_file(logo_src, "/etc/sogo/custom-fulllogo.svg")
  50. # Rsync web content
  51. print("Syncing web content")
  52. self.rsync_file("/usr/lib/GNUstep/SOGo/", "/sogo_web/", recursive=True)
  53. # Chown backup path
  54. self.set_owner("/sogo_backup", "sogo", "sogo", recursive=True)
  55. def get_domains(self):
  56. """
  57. Retrieves a list of domains and their GAL (Global Address List) status.
  58. Executes a SQL query to select:
  59. - `domain`
  60. - a human-readable GAL status ("YES" or "NO")
  61. - `ldap_gal` as a boolean (True/False)
  62. Returns:
  63. list[dict]: A list of dicts with keys: domain, gal_status, ldap_gal.
  64. Example: [{"domain": "example.com", "gal_status": "YES", "ldap_gal": True}]
  65. Logs:
  66. Error messages if the query fails.
  67. """
  68. query = """
  69. SELECT domain,
  70. CASE gal WHEN '1' THEN 'YES' ELSE 'NO' END AS gal_status,
  71. ldap_gal = 1 AS ldap_gal
  72. FROM domain;
  73. """
  74. try:
  75. cursor = self.mysql_conn.cursor()
  76. cursor.execute(query)
  77. result = cursor.fetchall()
  78. cursor.close()
  79. return [
  80. {
  81. "domain": row[0],
  82. "gal_status": row[1],
  83. "ldap_gal": bool(row[2])
  84. }
  85. for row in result
  86. ]
  87. except Exception as e:
  88. print(f"Error fetching domains: {e}")
  89. return []
  90. def get_identity_provider_settings(self):
  91. """
  92. Retrieves all key-value identity provider settings.
  93. Returns:
  94. dict: Settings in the format { key: value }
  95. Logs:
  96. Error messages if the query fails.
  97. """
  98. query = "SELECT `key`, `value` FROM identity_provider;"
  99. try:
  100. cursor = self.mysql_conn.cursor()
  101. cursor.execute(query)
  102. result = cursor.fetchall()
  103. cursor.close()
  104. iam_settings = {row[0]: row[1] for row in result}
  105. if iam_settings['authsource'] == "ldap":
  106. protocol = "ldaps" if iam_settings.get("use_ssl") else "ldap"
  107. starttls = "/????!StartTLS" if iam_settings.get("use_tls") else ""
  108. iam_settings['ldap_url'] = f"{protocol}://{iam_settings['host']}:{iam_settings['port']}{starttls}"
  109. return iam_settings
  110. except Exception as e:
  111. print(f"Error fetching identity provider settings: {e}")
  112. return {}