Commit 7556847e authored by Eric Duminil's avatar Eric Duminil
Browse files

Slight refactor

parent 9f123942
...@@ -99,7 +99,7 @@ def app() -> None: ...@@ -99,7 +99,7 @@ def app() -> None:
args = parser.parse_args() args = parser.parse_args()
if args.install: if args.install:
cmd_install(args) cmd_install()
if args.template and args.citygml: if args.template and args.citygml:
cmd_run(args) cmd_run(args)
......
...@@ -10,12 +10,11 @@ import urllib.request ...@@ -10,12 +10,11 @@ import urllib.request
import zipfile import zipfile
from pathlib import Path from pathlib import Path
from .runner import SIMSTADT_VERSION_FORMAT
def _parse_simstadt_name(manifest: str) -> str: def _parse_simstadt_name(manifest: str) -> str:
m = re.search( m = re.search(f"Implementation-Version: *{SIMSTADT_VERSION_FORMAT}", manifest)
r"Implementation-Version:\s*(\S+)\s+\((\w+),\s*rev\.\s*(\w+),\s*(\d+)",
manifest,
)
if not m: if not m:
raise ValueError("Cannot parse Implementation-Version from MANIFEST.MF") raise ValueError("Cannot parse Implementation-Version from MANIFEST.MF")
version, branch, rev, date = m.groups() version, branch, rev, date = m.groups()
...@@ -31,7 +30,7 @@ def _get_java_version() -> int | None: ...@@ -31,7 +30,7 @@ def _get_java_version() -> int | None:
return None return None
def cmd_install(args) -> None: def cmd_install() -> None:
url = "https://simstadt.hft-stuttgart.de/download/InstallFiles/SimStadt2_latest.zip" url = "https://simstadt.hft-stuttgart.de/download/InstallFiles/SimStadt2_latest.zip"
desktop = Path.home() / "Desktop" desktop = Path.home() / "Desktop"
...@@ -53,11 +52,17 @@ def cmd_install(args) -> None: ...@@ -53,11 +52,17 @@ def cmd_install(args) -> None:
try: try:
with zipfile.ZipFile(tmp) as zf: with zipfile.ZipFile(tmp) as zf:
jar_entry = next( jar_entry = next(
(n for n in zf.namelist() if re.match(r"lib/simstadt-desktop-.*\.jar$", n)), (
n
for n in zf.namelist()
if re.match(r"lib/simstadt-desktop-.*\.jar$", n)
),
None, None,
) )
if not jar_entry: if not jar_entry:
print("Error: simstadt-desktop JAR not found in ZIP", file=sys.stderr) print(
"Error: simstadt-desktop JAR not found in ZIP", file=sys.stderr
)
raise SystemExit(1) raise SystemExit(1)
with zipfile.ZipFile(io.BytesIO(zf.read(jar_entry))) as jar: with zipfile.ZipFile(io.BytesIO(zf.read(jar_entry))) as jar:
if "META-INF/MANIFEST.MF" not in jar.namelist(): if "META-INF/MANIFEST.MF" not in jar.namelist():
...@@ -78,7 +83,10 @@ def cmd_install(args) -> None: ...@@ -78,7 +83,10 @@ def cmd_install(args) -> None:
for member in zf.infolist(): for member in zf.infolist():
member_path = (dest / member.filename).resolve() member_path = (dest / member.filename).resolve()
if not member_path.is_relative_to(dest.resolve()): if not member_path.is_relative_to(dest.resolve()):
print(f"Error: ZIP contains unsafe path: {member.filename}", file=sys.stderr) print(
f"Error: ZIP contains unsafe path: {member.filename}",
file=sys.stderr,
)
raise SystemExit(1) raise SystemExit(1)
zf.extractall(dest) zf.extractall(dest)
for member in zf.infolist(): for member in zf.infolist():
...@@ -98,6 +106,12 @@ def cmd_install(args) -> None: ...@@ -98,6 +106,12 @@ def cmd_install(args) -> None:
java_version = _get_java_version() java_version = _get_java_version()
if java_version is None: if java_version is None:
print("Warning: Java not found. SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts", file=sys.stderr) print(
"Warning: Java not found. SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts",
file=sys.stderr,
)
elif java_version < 17: elif java_version < 17:
print(f"Warning: Java {java_version} found but SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts", file=sys.stderr) print(
f"Warning: Java {java_version} found but SimStadt requires Java 17. Download: https://bell-sw.com/pages/downloads/#jdk-17-lts",
file=sys.stderr,
)
...@@ -26,6 +26,7 @@ from .utils import chdir, random_id ...@@ -26,6 +26,7 @@ from .utils import chdir, random_id
PARAMS = "params.xml" PARAMS = "params.xml"
SIMSTADT2_GLOB = "SimStadt2_0.*/" SIMSTADT2_GLOB = "SimStadt2_0.*/"
SIMSTADT_TEMP_REPO = Path(tempfile.gettempdir()) / "simstadt_repo" SIMSTADT_TEMP_REPO = Path(tempfile.gettempdir()) / "simstadt_repo"
SIMSTADT_VERSION_FORMAT = r"(\S+)\s*\((\w+), rev. (\w+), (\d+)\s*\)"
load_dotenv() load_dotenv()
...@@ -69,9 +70,9 @@ def get_template_path() -> Path: ...@@ -69,9 +70,9 @@ def get_template_path() -> Path:
) )
def get_version_and_date() -> tuple[str, str]: def get_version_and_date() -> tuple[str, str]:
SIMSTADT_VERSION_FORMAT = re.compile(r"Launching SimStadt (\S+) \((\w+), rev. (\w+), (\d+)\)") SIMSTADT_VERSION_PATTERN = re.compile(f"Launching SimStadt {SIMSTADT_VERSION_FORMAT}")
output = get_simstadt_output(get_simstadt_folder()) output = get_simstadt_output(get_simstadt_folder())
m = SIMSTADT_VERSION_FORMAT.search(output) m = SIMSTADT_VERSION_PATTERN.search(output)
if not m: if not m:
raise ValueError(f"No SimStadt version string found in output:\n{output}") raise ValueError(f"No SimStadt version string found in output:\n{output}")
version, _branch, _commit, date = m.groups() version, _branch, _commit, date = m.groups()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment