"""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)