EDDN/setup.py
2022-08-18 15:18:54 +01:00

237 lines
6.9 KiB
Python

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