BootstrapMysql.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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. import platform
  8. import subprocess
  9. class Bootstrap(BootstrapBase):
  10. def bootstrap(self):
  11. self.upgrade_mysql()
  12. # Setup Jinja2 Environment and load vars
  13. self.env = Environment(
  14. loader=FileSystemLoader('./etc/mysql/conf.d/config_templates'),
  15. keep_trailing_newline=True,
  16. lstrip_blocks=True,
  17. trim_blocks=True
  18. )
  19. extra_vars = {
  20. }
  21. self.env_vars = self.prepare_template_vars('/overwrites.json', extra_vars)
  22. print("Set Timezone")
  23. self.set_timezone()
  24. print("Render config")
  25. self.render_config("my.cnf.j2", "/etc/mysql/conf.d/my.cnf")
  26. def upgrade_mysql(self, max_retries=5, wait_interval=3):
  27. """
  28. Runs mysql_upgrade in a controlled way using run_command.
  29. Starts mysqld in background, upgrades, shuts down, then restarts in foreground.
  30. """
  31. dbuser = "root"
  32. dbpass = os.getenv("MYSQL_ROOT_PASSWORD", "")
  33. socket = "/var/run/mysqld/mysqld.sock"
  34. print("Starting temporary mysqld for upgrade...")
  35. temp_proc = subprocess.Popen([
  36. "mysqld",
  37. "--user=mysql",
  38. "--skip-networking",
  39. f"--socket={socket}"
  40. ])
  41. self.connect_mysql()
  42. print("Running mysql_upgrade...")
  43. retries = 0
  44. while retries < max_retries:
  45. result = self.run_command([
  46. "mysql_upgrade",
  47. "-u", dbuser,
  48. f"-p{dbpass}",
  49. f"--socket={socket}"
  50. ], check=False)
  51. if result.returncode == 0:
  52. print("mysql_upgrade completed successfully.")
  53. break
  54. else:
  55. print(f"mysql_upgrade failed (try {retries+1}/{max_retries})")
  56. retries += 1
  57. time.sleep(wait_interval)
  58. else:
  59. print("mysql_upgrade failed after all retries.")
  60. temp_proc.terminate()
  61. return False
  62. print("Shutting down temporary mysqld...")
  63. self.run_command([
  64. "mariadb-admin",
  65. "shutdown",
  66. f"--socket={socket}",
  67. "-u", dbuser,
  68. f"-p{dbpass}"
  69. ])