mirror of
https://github.com/EDCD/EDDN.git
synced 2025-04-25 20:52:13 +03:00
setup_env.py is NEVER checked into git, forcing anyone running the code to ensure they have it set up correctly before setup.py will work.
231 lines
6.9 KiB
Python
231 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
|
|
|
|
# isort: off
|
|
import setup_env
|
|
# isort: on
|
|
|
|
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)
|