From 831bc88a924ac0c99e43e9a9d4274839b3582808 Mon Sep 17 00:00:00 2001 From: Matthew Grotke Date: Fri, 22 May 2026 02:54:56 -0400 Subject: [PATCH] Development --- docker/routlin-dash/app/config_utils.py | 2 +- docker/routlin-dash/app/view_page.py | 2 +- docker/routlin-dash/docker-compose.yml | 4 ++-- routlin/install.py | 26 +++++++++++++++++++------ 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/docker/routlin-dash/app/config_utils.py b/docker/routlin-dash/app/config_utils.py index 726ac10..cc6a928 100644 --- a/docker/routlin-dash/app/config_utils.py +++ b/docker/routlin-dash/app/config_utils.py @@ -2,7 +2,7 @@ import json, subprocess, hashlib, os, uuid from datetime import datetime, timezone from flask import session -CONFIGS_DIR = '/configs' +CONFIGS_DIR = '/routlin_location' CORE_FILE = f'{CONFIGS_DIR}/core.json' DASHBOARD_QUEUE = f'{CONFIGS_DIR}/.dashboard-queue' DASHBOARD_DONE = f'{CONFIGS_DIR}/.dashboard-done' diff --git a/docker/routlin-dash/app/view_page.py b/docker/routlin-dash/app/view_page.py index a92bd18..e40eee6 100644 --- a/docker/routlin-dash/app/view_page.py +++ b/docker/routlin-dash/app/view_page.py @@ -9,7 +9,7 @@ from config_utils import core_hash, get_pending_entries, get_dashboard_pending, bp = Blueprint('view_page', __name__) DATA_DIR = '/data' -CONFIGS_DIR = '/configs' +CONFIGS_DIR = '/routlin_location' LEVEL_RANK = {'nothing': 0, 'viewer': 1, 'administrator': 2, 'manager': 3} diff --git a/docker/routlin-dash/docker-compose.yml b/docker/routlin-dash/docker-compose.yml index 722abfb..c2bfa61 100644 --- a/docker/routlin-dash/docker-compose.yml +++ b/docker/routlin-dash/docker-compose.yml @@ -8,11 +8,11 @@ services: - "25327:25327" volumes: - ./data:/data - - $HOME/routlin:/configs - - $HOME/routlin/validation.py:/app/validation.py + - $HOME/routlin:/routlin_location - /sys/class/net:/sys/class/net:ro - /sys/devices:/sys/devices:ro environment: + - PYTHONPATH=/routlin_location - PRODUCT_DISPLAY_NAME=Routlin Dashboard - INITIAL_MANAGER_EMAIL=mgrotke@gmail.com - SECRET_KEY=ey8hSQCCYE5kQXV8nOg1CB44LSd3AoUet2ZBc3aZlFrwBbazE7aHcxXWyuT97eAObet5jmOL0CjMg0rB1hE4d2SBVYHPfl8De55EiFv307r1QP3Mf5XgOSSCxD3TuD diff --git a/routlin/install.py b/routlin/install.py index b338942..e310959 100644 --- a/routlin/install.py +++ b/routlin/install.py @@ -42,6 +42,19 @@ def die(msg): sys.exit(1) +def _compose_env(): + """Return an env dict with HOME set to the invoking user's home, not root's.""" + import pwd + sudo_user = os.environ.get('SUDO_USER') + if sudo_user: + try: + home = pwd.getpwnam(sudo_user).pw_dir + return {**os.environ, 'HOME': home} + except KeyError: + pass + return os.environ.copy() + + def check_root(): if os.geteuid() != 0: die("This script must be run as root (sudo python3 install.py).") @@ -250,19 +263,20 @@ def setup_docker_compose(reuse_config=False): if reuse_config: import time cache_bust = str(int(time.time())) + env = _compose_env() print("\n Stopping existing container...") - subprocess.run(["docker", "compose", "down"], cwd=COMPOSE_FILE.parent, check=False) + subprocess.run(["docker", "compose", "down"], cwd=COMPOSE_FILE.parent, env=env, check=False) print("\n Building dashboard image...") result = subprocess.run( ["docker", "compose", "build", "--build-arg", f"CACHE_BUST={cache_bust}"], - cwd=COMPOSE_FILE.parent, check=False + cwd=COMPOSE_FILE.parent, env=env, check=False ) if result.returncode != 0: die("docker compose build failed. Check the output above.") print("\n Starting dashboard container...") result = subprocess.run( ["docker", "compose", "up", "-d"], - cwd=COMPOSE_FILE.parent, check=False + cwd=COMPOSE_FILE.parent, env=env, check=False ) if result.returncode != 0: die("docker compose up failed. Check the output above.") @@ -301,14 +315,14 @@ def setup_docker_compose(reuse_config=False): COMPOSE_FILE.write_text(content) print(f"\n Written: {COMPOSE_FILE}") + env = _compose_env() print("\n Stopping existing container...") - subprocess.run(["docker", "compose", "down"], cwd=COMPOSE_FILE.parent, check=False) + subprocess.run(["docker", "compose", "down"], cwd=COMPOSE_FILE.parent, env=env, check=False) print("\n Starting dashboard container...") - compose_dir = COMPOSE_FILE.parent result = subprocess.run( ["docker", "compose", "up", "-d", "--build"], - cwd=compose_dir, check=False + cwd=COMPOSE_FILE.parent, env=env, check=False ) if result.returncode != 0: die("docker compose up failed. Check the output above.")