You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

217 lines
5.3 KiB

  1. # imports - standard imports
  2. import grp
  3. import os
  4. import pwd
  5. import shutil
  6. import sys
  7. # imports - module imports
  8. import bench
  9. from bench.utils import (
  10. exec_cmd,
  11. get_process_manager,
  12. log,
  13. run_xhiveframework_cmd,
  14. sudoers_file,
  15. which,
  16. is_valid_xhiveframework_branch,
  17. )
  18. from bench.utils.bench import build_assets, clone_apps_from
  19. from bench.utils.render import job
  20. @job(title="Initializing Bench {path}", success="Bench {path} initialized")
  21. def init(
  22. path,
  23. apps_path=None,
  24. no_procfile=False,
  25. no_backups=False,
  26. xhiveframework_path=None,
  27. xhiveframework_branch=None,
  28. verbose=False,
  29. clone_from=None,
  30. skip_redis_config_generation=False,
  31. clone_without_update=False,
  32. skip_assets=False,
  33. python="python3",
  34. install_app=None,
  35. dev=False,
  36. ):
  37. """Initialize a new bench directory
  38. * create a bench directory in the given path
  39. * setup logging for the bench
  40. * setup env for the bench
  41. * setup config (dir/pids/redis/procfile) for the bench
  42. * setup patches.txt for bench
  43. * clone & install xhiveframework
  44. * install python & node dependencies
  45. * build assets
  46. * setup backups crontab
  47. """
  48. # Use print("\033c", end="") to clear entire screen after each step and re-render each list
  49. # another way => https://stackoverflow.com/a/44591228/10309266
  50. import bench.cli
  51. from bench.app import get_app, install_apps_from_path
  52. from bench.bench import Bench
  53. verbose = bench.cli.verbose or verbose
  54. bench = Bench(path)
  55. bench.setup.dirs()
  56. bench.setup.logging()
  57. bench.setup.env(python=python)
  58. config = {}
  59. if dev:
  60. config["developer_mode"] = 1
  61. bench.setup.config(
  62. redis=not skip_redis_config_generation,
  63. procfile=not no_procfile,
  64. additional_config=config,
  65. )
  66. bench.setup.patches()
  67. # local apps
  68. if clone_from:
  69. clone_apps_from(
  70. bench_path=path, clone_from=clone_from, update_app=not clone_without_update
  71. )
  72. # remote apps
  73. else:
  74. xhiveframework_path = xhiveframework_path or "https://lab.membtech.com/xhiveframework/xhiveframework15.git"
  75. is_valid_xhiveframework_branch(xhiveframework_path=xhiveframework_path, xhiveframework_branch=xhiveframework_branch)
  76. get_app(
  77. xhiveframework_path,
  78. branch=xhiveframework_branch,
  79. bench_path=path,
  80. skip_assets=True,
  81. verbose=verbose,
  82. resolve_deps=False,
  83. )
  84. # fetch remote apps using config file - deprecate this!
  85. if apps_path:
  86. install_apps_from_path(apps_path, bench_path=path)
  87. # getting app on bench init using --install-app
  88. if install_app:
  89. get_app(
  90. install_app,
  91. branch=xhiveframework_branch,
  92. bench_path=path,
  93. skip_assets=True,
  94. verbose=verbose,
  95. resolve_deps=False,
  96. )
  97. if not skip_assets:
  98. build_assets(bench_path=path)
  99. if not no_backups:
  100. bench.setup.backups()
  101. def setup_sudoers(user):
  102. from bench.config.lets_encrypt import get_certbot_path
  103. if not os.path.exists("/etc/sudoers.d"):
  104. os.makedirs("/etc/sudoers.d")
  105. set_permissions = not os.path.exists("/etc/sudoers")
  106. with open("/etc/sudoers", "a") as f:
  107. f.write("\n#includedir /etc/sudoers.d\n")
  108. if set_permissions:
  109. os.chmod("/etc/sudoers", 0o440)
  110. template = bench.config.env().get_template("xhiveframework_sudoers")
  111. xhiveframework_sudoers = template.render(
  112. **{
  113. "user": user,
  114. "service": which("service"),
  115. "systemctl": which("systemctl"),
  116. "nginx": which("nginx"),
  117. "certbot": get_certbot_path(),
  118. }
  119. )
  120. with open(sudoers_file, "w") as f:
  121. f.write(xhiveframework_sudoers)
  122. os.chmod(sudoers_file, 0o440)
  123. log(f"Sudoers was set up for user {user}", level=1)
  124. def start(no_dev=False, concurrency=None, procfile=None, no_prefix=False, procman=None):
  125. program = which(procman) if procman else get_process_manager()
  126. if not program:
  127. raise Exception("No process manager found")
  128. os.environ["PYTHONUNBUFFERED"] = "true"
  129. if not no_dev:
  130. os.environ["DEV_SERVER"] = "true"
  131. command = [program, "start"]
  132. if concurrency:
  133. command.extend(["-c", concurrency])
  134. if procfile:
  135. command.extend(["-f", procfile])
  136. if no_prefix:
  137. command.extend(["--no-prefix"])
  138. os.execv(program, command)
  139. def migrate_site(site, bench_path="."):
  140. run_xhiveframework_cmd("--site", site, "migrate", bench_path=bench_path)
  141. def backup_site(site, bench_path="."):
  142. run_xhiveframework_cmd("--site", site, "backup", bench_path=bench_path)
  143. def backup_all_sites(bench_path="."):
  144. from bench.bench import Bench
  145. for site in Bench(bench_path).sites:
  146. backup_site(site, bench_path=bench_path)
  147. def fix_prod_setup_perms(bench_path=".", xhiveframework_user=None):
  148. from glob import glob
  149. from bench.bench import Bench
  150. xhiveframework_user = xhiveframework_user or Bench(bench_path).conf.get("xhiveframework_user")
  151. if not xhiveframework_user:
  152. print("xhiveframework user not set")
  153. sys.exit(1)
  154. globs = ["logs/*", "config/*"]
  155. for glob_name in globs:
  156. for path in glob(glob_name):
  157. uid = pwd.getpwnam(xhiveframework_user).pw_uid
  158. gid = grp.getgrnam(xhiveframework_user).gr_gid
  159. os.chown(path, uid, gid)
  160. def setup_fonts():
  161. fonts_path = os.path.join("/tmp", "fonts")
  162. if os.path.exists("/etc/fonts_backup"):
  163. return
  164. exec_cmd("git clone https://lab.membtech.com/xhiveframework/fonts.git", cwd="/tmp")
  165. os.rename("/etc/fonts", "/etc/fonts_backup")
  166. os.rename("/usr/share/fonts", "/usr/share/fonts_backup")
  167. os.rename(os.path.join(fonts_path, "etc_fonts"), "/etc/fonts")
  168. os.rename(os.path.join(fonts_path, "usr_share_fonts"), "/usr/share/fonts")
  169. shutil.rmtree(fonts_path)
  170. exec_cmd("fc-cache -fv")