Skip to content

Commit

Permalink
Make everything linux line endings, add bootstrap procedure
Browse files Browse the repository at this point in the history
  • Loading branch information
Doridian committed Mar 29, 2024
1 parent f5c4c8f commit 32c4968
Show file tree
Hide file tree
Showing 6 changed files with 267 additions and 195 deletions.
22 changes: 22 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
FROM steamcmd/steamcmd:ubuntu

RUN apt update && \
apt -y dist-upgrade && \
apt --no-install-recommends -y install python3 python3-requests python3-yaml python3-pip git openssh-client lsof libssl3 libboost-system1.74.0 && \
rm -rf /var/cache/apt
RUN pip3 install python_a2s

RUN groupadd server -g 1000 && \
useradd server -u 1000 -g 1000 -s /bin/false && \
mkdir -p /home/server && \
chown -R server:server /home/server
USER server

ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/game
ENV HOME=/home/server
ENV STARLORD_CONFIG=spaceage_gooniverse
ENV SPACEAGE_SERVER_TOKEN=dummy

COPY . /opt/StarLord

ENTRYPOINT ["/opt/StarLord/dockerboot.sh"]
1 change: 0 additions & 1 deletion config/spaceage_base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ server:
restart_every: "24h"
addons:
- name: SpaceAge
private: yes
trusted: yes
gamemodes:
- spaceage
Expand Down
20 changes: 20 additions & 0 deletions dockerboot.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#!/bin/sh
set -ex

SERVER_DIR="${HOME}"
STARLORD_DIR="${SERVER_DIR}/StarLord"
STARLORD_MAIN="${STARLORD_DIR}/__main__.py"

if [ -f "${STARLORD_MAIN}" ]; then
exec /usr/bin/python3 "${STARLORD_MAIN}"
exit 1
fi

if [ -d "${STARLORD_DIR}" ]; then
rm -rf "${STARLORD_DIR}"
fi

cp -r /opt/StarLord "${STARLORD_DIR}"

exec /usr/bin/python3 "${STARLORD_MAIN}"
exit 1
314 changes: 158 additions & 156 deletions luabin.py
Original file line number Diff line number Diff line change
@@ -1,156 +1,158 @@
from platform import architecture, system
from json import loads as json_loads, load as json_load, dump as json_dump
from os.path import join
from traceback import print_exception
from requests import get as http_get
from config import LuaBinConfig
from updateable import UpdateableResource
from typing import Any, Mapping

usedDLLs: set[str] = set()

class LuaBin(UpdateableResource):
storage: Any

def __init__(self, folder: str, name: str) -> None:
super().__init__(folder, name)
self.load()

def load(self):
usedDLLs.add(self.makeBinaryName())
usedDLLs.add(self.makeMetaName())

file = self.formatPath(self.makeMetaName())
try:
with open(file, "r") as f:
self.storage = json_load(f)
except FileNotFoundError as e:
self.storage = {}
except Exception as e:
print_exception(e)
self.storage = {}

def save(self):
file = self.formatPath(self.makeMetaName())
with open(file, "w") as f:
json_dump(self.storage, f)

def formatPath(self, name: str):
return join(self.folder, name)

def makeBinaryName(self):
arch_suffix = ""
if architecture()[0] == "64bit":
arch_suffix = "64"

system_name = system()

platform_suffix = ""
if system_name == "Windows":
# Windows is the only platform with a 32-bit suffix
# for some reason, thanks GMod
if arch_suffix == "":
arch_suffix = "32"
platform_suffix = "win"
elif system_name == "Linux":
platform_suffix = "linux"
elif system_name == "Darwin":
platform_suffix = "osx"

return f"gmsv_{self.name}_{platform_suffix}{arch_suffix}.dll"

def makeMetaName(self):
return f"{self.makeBinaryName()}.meta"

class GithubReleaseLuaBin(LuaBin):
repo_org: str
repo_name: str

def __init__(self, folder: str, name: str, config: Mapping[str, Any]):
super().__init__(folder, name)
self.repo_org = config["org"]
self.repo_name = config["name"]

if "tag" in config:
self.fixed_tag = config["tag"]
self.release = f"tags/{self.fixed_tag}"
else:
self.fixed_tag = None
self.release = "latest"

def queryReleaseInfo(self, use_release: str | None = None):
if use_release is None:
use_release = self.fixed_tag

if use_release is not None:
release = self.storage.get("release", None)
if release is not None and release["tag_name"] == use_release:
return release

res = http_get(url=f"https://github.com/repos/{self.repo_org}/{self.repo_name}/releases/{self.release}")
res.raise_for_status()

release = json_loads(res.text)

self.storage["release"] = release
self.save()

return release

def isReleaseInstalled(self, release: dict[str, Any]):
return release["tag_name"] == self.storage.get("tag_name", "")

def storeRelease(self, release: dict[str, Any]):
self.storage["tag_name"] = release["tag_name"]
self.save()

def getBinaryURL(self, release: dict[str, Any]):
binary_name = self.makeBinaryName()
for asset in release["assets"]:
if asset["name"] == binary_name:
return asset["browser_download_url"]
return None

def checkUpdate(self, offline: bool = False):
if offline:
release = self.storage.get("release", None)
if release is None:
return True
else:
release = self.queryReleaseInfo()

if self.isReleaseInstalled(release):
return False
if self.getBinaryURL(release) is None:
print("Found update, but no binary, pointless to update")
return False
return True

def update(self):
release = self.storage.get("release", None)
if release is None:
release = self.queryReleaseInfo()

if self.isReleaseInstalled(release):
return

url = self.getBinaryURL(release)
if url is None:
print("LuaBin manifest missing binaries, ignoring")
return

resp = http_get(url=url, stream=True)
resp.raise_for_status()
with open(self.formatPath(self.makeBinaryName()), "wb") as f:
_ = f.write(resp.content)

self.storeRelease(release)

def makeLuaBin(folder: str, config: LuaBinConfig):
if config.type == "github_release":
return GithubReleaseLuaBin(folder, config.name, config.config)
else:
raise ValueError(f"{config.type} is an invalid LuaBin type")

def isDLLUsed(dll: str):
return dll in usedDLLs
from platform import architecture, system
from json import loads as json_loads, load as json_load, dump as json_dump
from os.path import join
from os import makedirs
from traceback import print_exception
from requests import get as http_get
from config import LuaBinConfig
from updateable import UpdateableResource
from typing import Any, Mapping

usedDLLs: set[str] = set()

class LuaBin(UpdateableResource):
storage: Any

def __init__(self, folder: str, name: str) -> None:
super().__init__(folder, name)
self.load()

def load(self):
usedDLLs.add(self.makeBinaryName())
usedDLLs.add(self.makeMetaName())

file = self.formatPath(self.makeMetaName())
try:
with open(file, "r") as f:
self.storage = json_load(f)
except FileNotFoundError as e:
self.storage = {}
except Exception as e:
print_exception(e)
self.storage = {}

def save(self):
makedirs(self.folder, exist_ok=True)
file = self.formatPath(self.makeMetaName())
with open(file, "w") as f:
json_dump(self.storage, f)

def formatPath(self, name: str):
return join(self.folder, name)

def makeBinaryName(self):
arch_suffix = ""
if architecture()[0] == "64bit":
arch_suffix = "64"

system_name = system()

platform_suffix = ""
if system_name == "Windows":
# Windows is the only platform with a 32-bit suffix
# for some reason, thanks GMod
if arch_suffix == "":
arch_suffix = "32"
platform_suffix = "win"
elif system_name == "Linux":
platform_suffix = "linux"
elif system_name == "Darwin":
platform_suffix = "osx"

return f"gmsv_{self.name}_{platform_suffix}{arch_suffix}.dll"

def makeMetaName(self):
return f"{self.makeBinaryName()}.meta"

class GithubReleaseLuaBin(LuaBin):
repo_org: str
repo_name: str

def __init__(self, folder: str, name: str, config: Mapping[str, Any]):
super().__init__(folder, name)
self.repo_org = config["org"]
self.repo_name = config["name"]

if "tag" in config:
self.fixed_tag = config["tag"]
self.release = f"tags/{self.fixed_tag}"
else:
self.fixed_tag = None
self.release = "latest"

def queryReleaseInfo(self, use_release: str | None = None):
if use_release is None:
use_release = self.fixed_tag

if use_release is not None:
release = self.storage.get("release", None)
if release is not None and release["tag_name"] == use_release:
return release

res = http_get(url=f"https://github.com/repos/{self.repo_org}/{self.repo_name}/releases/{self.release}")
res.raise_for_status()

release = json_loads(res.text)

self.storage["release"] = release
self.save()

return release

def isReleaseInstalled(self, release: dict[str, Any]):
return release["tag_name"] == self.storage.get("tag_name", "")

def storeRelease(self, release: dict[str, Any]):
self.storage["tag_name"] = release["tag_name"]
self.save()

def getBinaryURL(self, release: dict[str, Any]):
binary_name = self.makeBinaryName()
for asset in release["assets"]:
if asset["name"] == binary_name:
return asset["browser_download_url"]
return None

def checkUpdate(self, offline: bool = False):
if offline:
release = self.storage.get("release", None)
if release is None:
return True
else:
release = self.queryReleaseInfo()

if self.isReleaseInstalled(release):
return False
if self.getBinaryURL(release) is None:
print("Found update, but no binary, pointless to update")
return False
return True

def update(self):
release = self.storage.get("release", None)
if release is None:
release = self.queryReleaseInfo()

if self.isReleaseInstalled(release):
return

url = self.getBinaryURL(release)
if url is None:
print("LuaBin manifest missing binaries, ignoring")
return

resp = http_get(url=url, stream=True)
resp.raise_for_status()
with open(self.formatPath(self.makeBinaryName()), "wb") as f:
_ = f.write(resp.content)

self.storeRelease(release)

def makeLuaBin(folder: str, config: LuaBinConfig):
if config.type == "github_release":
return GithubReleaseLuaBin(folder, config.name, config.config)
else:
raise ValueError(f"{config.type} is an invalid LuaBin type")

def isDLLUsed(dll: str):
return dll in usedDLLs
Loading

0 comments on commit 32c4968

Please sign in to comment.