"""Setup for EDDN software.""" import glob import os import pathlib import re import shutil import subprocess import sys from setuptools import find_packages, setup import setup_env VERSIONFILE = "src/eddn/conf/Version.py" verstr = "unknown" try: verstrline = open(VERSIONFILE, "rt").read() VSRE = r"^__version__ = ['\"]([^'\"]*)['\"]" mo = re.search(VSRE, verstrline, re.M) if mo: verstr = mo.group(1) except EnvironmentError: print(f"unable to find version in {VERSIONFILE}") raise RuntimeError(f"if {VERSIONFILE} exists, it is required to be well-formed") # Read environment-specific settings ########################################################################### # Enforce the git status being "branch "live" checked out, at its HEAD" # if setup_env.py says this is the live environment. # # The idea is to have the `live` branch, *which includes documentation* # always match what is actually running as the live service (modulo the # small window between pull/install/restart). Thus it shouldn't use # `master`, or any other branch than `live`, which may have changes merged # some time before they become live. ########################################################################### cwd = os.getcwd() # e.g. /home/eddn/live/EDDN.git if setup_env.EDDN_ENV == "live": try: git_cmd = subprocess.Popen( "git symbolic-ref -q --short HEAD".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT ) out, err = git_cmd.communicate() except Exception as e: print(f"Couldn't run git command to check branch: {e}") else: branch = out.decode().rstrip("\n") # - For any other branch checked out at its HEAD this will be a # different name. # - For any "detached HEAD" (i.e. specific commit ID, or tag) it # will be empty. if branch != "live": print(f"EDDN_ENV is '{setup_env.EDDN_ENV}' (and CWD is '{cwd}'), but branch is '{branch}', aborting!") sys.exit(-1) ########################################################################### # Location of start-eddn-service script and its config file START_SCRIPT_BIN = pathlib.Path(f"{os.environ['HOME']}/.local/bin") # Location of web files SHARE_EDDN_FILES = pathlib.Path(f"{os.environ['HOME']}/.local/share/eddn/{setup_env.EDDN_ENV}") setup( name="eddn", version=verstr, description="Elite: Dangerous Data Network", long_description="""\ The Elite Dangerous Data Network allows ED players to share data. Not affiliated with Frontier Developments. """, author="EDCD (https://edcd.github.io/)", author_email="edcd@miggy.org", url="https://github.com/EDCD/EDDN", packages=find_packages("src", exclude=["*.tests"]), package_dir={"": "src"}, # This includes them for the running code, but that doesn't help # serve them up for reference. data_files=[("eddn/schemas", glob.glob("schemas/*.json"))], # Yes, we pin versions. With python2.7 the latest pyzmq will NOT # work, for instance. install_requires=[ "argparse", "bottle", "enum34", "gevent", "jsonschema", "pyzmq", "simplejson", "mysql-connector-python", ], entry_points={ "console_scripts": [ "eddn-gateway = eddn.Gateway:main", "eddn-relay = eddn.Relay:main", "eddn-monitor = eddn.Monitor:main", "eddn-bouncer = eddn.Bouncer:main", ], }, ) def open_file_perms_recursive(dirname: pathlib.Path) -> None: """Open up file perms on the given directory and its contents.""" print(f"open_file_perms_recursive: {dirname}") for name in dirname.glob("*"): print(f"open_file_perms_recursive: {name}") if name.is_dir(): name.chmod(0o755) open_file_perms_recursive(name) else: name.chmod(0o644) # Ensure the systemd-required start files are in place print( """ ****************************************************************************** Ensuring start script and its config file are in place... """ ) try: START_SCRIPT_BIN.mkdir(mode=0o700, parents=True, exist_ok=True) except Exception as e: print(f"{START_SCRIPT_BIN} can't be created, aborting!!!\n{e!r}") exit(-1) shutil.copy(f"systemd/eddn_{setup_env.EDDN_ENV}_config", START_SCRIPT_BIN / f"eddn_{setup_env.EDDN_ENV}_config") # NB: We copy to a per-environment version so that, e.g.live use won't break # due to changes in the other environments. shutil.copy("systemd/start-eddn-service", START_SCRIPT_BIN / f"start-eddn-{setup_env.EDDN_ENV}-service") # Ensure the service log file archiving script is in place print( """ ****************************************************************************** Ensuring the service log file archiving script is in place """ ) shutil.copy("contrib/eddn-logs-archive", START_SCRIPT_BIN) # Ensure the latest monitor files are in place old_umask = os.umask(0o22) print( f""" ****************************************************************************** Ensuring {SHARE_EDDN_FILES} exists... """ ) try: SHARE_EDDN_FILES.mkdir(mode=0o700, parents=True, exist_ok=True) except Exception as e: print(f"{SHARE_EDDN_FILES} can't be created, aborting!!!\n{e!r}") exit(-1) print( """ ****************************************************************************** Ensuring latest monitor files are in place... """ ) # Copy the monitor (Web page) files try: shutil.rmtree(SHARE_EDDN_FILES / "monitor") except OSError: pass shutil.copytree( "contrib/monitor", SHARE_EDDN_FILES / "monitor", copy_function=shutil.copyfile, # type: ignore ) # And a copy of the schemas too print( """ ****************************************************************************** Ensuring latest schema files are in place for web access... """ ) try: shutil.rmtree(SHARE_EDDN_FILES / "schemas") except OSError: pass shutil.copytree( "schemas", SHARE_EDDN_FILES / "schemas", copy_function=shutil.copyfile, # type: ignore ) print( """ ****************************************************************************** Opening up permissions on monitor and schema files... """ ) os.chmod(SHARE_EDDN_FILES, 0o755) open_file_perms_recursive(SHARE_EDDN_FILES) # You still need to make an override config file if not (SHARE_EDDN_FILES / "config.json").is_file(): shutil.copy("docs/config-EXAMPLE.json", SHARE_EDDN_FILES) print( f""" ****************************************************************************** There was no config.json file in place, so docs/config-EXAMPLE.json was copied into: {SHARE_EDDN_FILES} Please review, edit and rename this file to "config.json" so that this software will actually work. See docs/Running-this-software.md for guidance. ****************************************************************************** """ ) os.umask(old_umask)