summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorkboz <kutayboz@gmail.com>2026-09-27 22:36:36 +0200
committerkboz <kutayboz@gmail.com>2026-09-27 22:36:36 +0200
commit526c8ec005d03b17950e9f5e7fe74208b491dd68 (patch)
treeb6a5ea59040bf48ffd0953a5682a43648a03ca51 /scripts
parent1b59961ce2385252e3346ea6107b15a2c1feafe6 (diff)
downloadhaul-526c8ec005d03b17950e9f5e7fe74208b491dd68.tar.gz
feat(frontend): add guided setup flow for backend bootstrapgo-backend
Poll the backend /api/setup/status and show a Setup screen until data, auth, and backend readiness are confirmed. Remove the manual setup_auth.py and setup_eve_data.py scripts superseded by the automated setup endpoints.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/setup_auth.py131
-rw-r--r--scripts/setup_eve_data.py55
2 files changed, 0 insertions, 186 deletions
diff --git a/scripts/setup_auth.py b/scripts/setup_auth.py
deleted file mode 100644
index c4f60c5..0000000
--- a/scripts/setup_auth.py
+++ /dev/null
@@ -1,131 +0,0 @@
-from __future__ import annotations
-
-import base64
-import json
-from datetime import datetime, UTC
-from getpass import getpass
-from pathlib import Path
-import shlex
-from urllib.parse import urlencode, quote
-
-import requests
-from dotenv import load_dotenv
-from jose import jwt
-import os
-
-
-ROOT_DIR = Path(__file__).resolve().parent.parent
-AUTH_FILE = ROOT_DIR / "backend" / "src" / "cache" / "auth.json"
-ENV_FILE = ROOT_DIR / ".env"
-REDIRECT_URI = "https://localhost/callback/"
-TOKEN_URL = "https://login.eveonline.com/v2/oauth/token"
-AUTH_URL = "https://login.eveonline.com/v2/oauth/authorize/"
-SCOPES = [
- "esi-assets.read_assets.v1",
- "esi-location.read_location.v1",
- "esi-location.read_online.v1",
- "esi-wallet.read_character_wallet.v1",
- "esi-ui.open_window.v1",
- "esi-ui.write_waypoint.v1",
-]
-
-
-def build_auth_url(client_id: str) -> str:
- params = {
- "response_type": "code",
- "redirect_uri": REDIRECT_URI,
- "client_id": client_id,
- "state": "haul-local",
- "scope": " ".join(SCOPES),
- }
- return f"{AUTH_URL}?{urlencode(params, quote_via=quote)}"
-
-
-def prompt_for_value(name: str, secret: bool = False) -> str:
- while True:
- value = getpass(f"{name}: ") if secret else input(f"{name}: ").strip()
- if value:
- return value
- print(f"{name} is required.")
-
-
-def append_missing_env_values(values: dict[str, str]) -> None:
- existing_text = ENV_FILE.read_text(encoding="utf-8") if ENV_FILE.exists() else ""
- existing_keys = set()
-
- for raw_line in existing_text.splitlines():
- line = raw_line.strip()
- if not line or line.startswith("#") or "=" not in line:
- continue
- key, _ = line.split("=", 1)
- existing_keys.add(key.strip())
-
- lines_to_add = []
- for key, value in values.items():
- if key not in existing_keys:
- lines_to_add.append(f"{key}={shlex.quote(value)}")
-
- if not lines_to_add:
- return
-
- if existing_text and not existing_text.endswith("\n"):
- existing_text += "\n"
-
- ENV_FILE.write_text(existing_text + "\n".join(lines_to_add) + "\n", encoding="utf-8")
-
-
-def main() -> int:
- load_dotenv(ENV_FILE)
-
- client_id = os.getenv("CLIENT_ID") or prompt_for_value("CLIENT_ID")
- secret_key = os.getenv("SECRET_KEY") or prompt_for_value("SECRET_KEY", secret=True)
-
- print("Open this URL in your browser and complete the EVE SSO flow:\n")
- print("If you authenticated earlier without wallet access, reauthorization is required for transaction-backed route confirmation.\n")
- print(build_auth_url(client_id))
- print("\nAfter the redirect, copy the 'code' query parameter and paste it below.")
- code = input("Authorization code: ").strip()
-
- if not code:
- print("No authorization code provided.")
- return 1
-
- user_pass = f"{client_id}:{secret_key}".encode("utf-8")
- headers = {
- "Authorization": f"Basic {base64.urlsafe_b64encode(user_pass).decode()}",
- "Content-Type": "application/x-www-form-urlencoded",
- "Host": "login.eveonline.com",
- }
- form_values = {
- "grant_type": "authorization_code",
- "code": code,
- }
-
- response = requests.post(TOKEN_URL, data=form_values, headers=headers, timeout=30)
- response.raise_for_status()
- auth_data = response.json()
- auth_data["expires_at"] = int(datetime.now(UTC).timestamp()) + int(auth_data.get("expires_in", 0))
-
- AUTH_FILE.parent.mkdir(parents=True, exist_ok=True)
- AUTH_FILE.write_text(json.dumps(auth_data, indent=2), encoding="utf-8")
-
- claims = jwt.get_unverified_claims(auth_data["access_token"])
- character_id = claims.get("sub", "").split(":")[-1] if claims.get("sub") else "unknown"
- character_name = claims.get("name", "unknown")
-
- append_missing_env_values(
- {
- "CLIENT_ID": client_id,
- "SECRET_KEY": secret_key,
- "character_id": character_id,
- }
- )
-
- print(f"Saved auth cache to {AUTH_FILE}")
- print(f"Detected character: {character_name} ({character_id})")
- print(f"Ensured runtime env values exist in {ENV_FILE}")
- return 0
-
-
-if __name__ == "__main__":
- raise SystemExit(main()) \ No newline at end of file
diff --git a/scripts/setup_eve_data.py b/scripts/setup_eve_data.py
deleted file mode 100644
index a7f7efd..0000000
--- a/scripts/setup_eve_data.py
+++ /dev/null
@@ -1,55 +0,0 @@
-from __future__ import annotations
-
-import bz2
-import shutil
-import sys
-import urllib.request
-from pathlib import Path
-
-
-ROOT_DIR = Path(__file__).resolve().parent.parent
-DATA_DIR = ROOT_DIR / "backend" / "data"
-BASE_URL = "https://www.fuzzwork.co.uk/dump/latest"
-
-REQUIRED_FILES = {
- "mapDenormalize.csv": f"{BASE_URL}/mapDenormalize.csv.bz2",
- "mapJumps.csv": f"{BASE_URL}/mapJumps.csv.bz2",
- "invTypes.csv": f"{BASE_URL}/invTypes.csv.bz2",
- "mapRegions.csv": f"{BASE_URL}/mapRegions.csv.bz2",
-}
-
-
-def download_and_extract(file_name: str, url: str) -> None:
- destination = DATA_DIR / file_name
- archive_path = destination.with_suffix(destination.suffix + ".bz2")
-
- if destination.exists():
- print(f"Skipping {file_name}; already exists.")
- return
-
- print(f"Downloading {file_name} from {url}")
-
- try:
- with urllib.request.urlopen(url, timeout=60) as response, archive_path.open("wb") as output_file:
- shutil.copyfileobj(response, output_file)
-
- with bz2.open(archive_path, "rb") as compressed_file, destination.open("wb") as output_file:
- shutil.copyfileobj(compressed_file, output_file)
- finally:
- archive_path.unlink(missing_ok=True)
-
- print(f"Wrote {destination}")
-
-
-def main() -> int:
- DATA_DIR.mkdir(parents=True, exist_ok=True)
-
- for file_name, url in REQUIRED_FILES.items():
- download_and_extract(file_name, url)
-
- print("EVE static data is ready.")
- return 0
-
-
-if __name__ == "__main__":
- raise SystemExit(main()) \ No newline at end of file