Root cause of today's 403 on a fresh install: assets/ lived inside the Python package at furtka/assets/, so the resource-manager tarball extracted to /opt/furtka/versions/<ver>/furtka/assets/. But Caddyfile has `root * /opt/furtka/current/assets/www`, systemd units point at /opt/furtka/current/assets/bin/furtka-status, and the install-time `systemctl link /opt/furtka/current/assets/systemd/*.service` expected the top-level layout. All three found nothing: - Caddy → 403 Forbidden (empty/missing document root) - systemctl link → silent no-op, nothing ever linked into /etc/systemd/system/ - furtka-api.service + furtka-reconcile.service → "inactive" because they were never registered Nothing in the Python package ever imported furtka.assets — these are shell scripts, HTML/CSS, systemd units, and a Caddyfile, which is config data, not package data. Promoting assets/ to the repo root matches how it's referenced everywhere downstream and eliminates the path mismatch. Changes: - git mv furtka/assets assets - iso/build.sh: tarball-staging step now also `cp -a "$REPO_ROOT/assets"` so the tarball ships ./assets at its root, and the live-ISO copy reads from $REPO_ROOT/assets instead of $REPO_ROOT/furtka/assets. - scripts/build-release-tarball.sh: same for release tarballs. - webinstaller/app.py: _resolve_assets_dir's dev fallback walks one level up to REPO_ROOT/assets/. - tests/test_webinstaller_assets.py: ASSETS constant updated. Tests still green (150/150) because both paths were fs-level — no code imports changed. Next ISO build will land assets at the path everything downstream expects. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
40 lines
1.3 KiB
Bash
Executable file
40 lines
1.3 KiB
Bash
Executable file
#!/bin/bash
|
|
# Writes /var/lib/furtka/status.json with current system stats. Fired by
|
|
# furtka-status.timer every 30s; also runs once 10s after boot. Path is under
|
|
# /var/lib/ so self-updates (which swap /opt/furtka/current) don't clobber it.
|
|
set -e
|
|
|
|
out=/var/lib/furtka/status.json
|
|
tmp=$(mktemp)
|
|
mkdir -p /var/lib/furtka
|
|
|
|
hostname=$(cat /etc/hostname)
|
|
uptime=$(uptime -p 2>/dev/null | sed 's/^up //' || echo unknown)
|
|
if command -v docker >/dev/null 2>&1; then
|
|
docker_version=$(docker --version 2>/dev/null | awk '{print $3}' | tr -d ',' || echo unavailable)
|
|
else
|
|
docker_version=unavailable
|
|
fi
|
|
disk_free=$(df -h / 2>/dev/null | awk 'NR==2 {print $4 " free of " $2}' || echo unknown)
|
|
ip_primary=$(ip -4 -o addr show scope global 2>/dev/null | awk '{print $4}' | cut -d/ -f1 | head -1 || true)
|
|
kernel=$(uname -r 2>/dev/null || echo unknown)
|
|
ram_total=$(free -h --si 2>/dev/null | awk '/^Mem:/ {print $2}' || echo unknown)
|
|
furtka_version=$(cat /opt/furtka/current/VERSION 2>/dev/null || echo dev)
|
|
updated_at=$(date -Iseconds)
|
|
|
|
cat > "$tmp" <<EOF
|
|
{
|
|
"hostname": "$hostname",
|
|
"uptime": "$uptime",
|
|
"docker_version": "$docker_version",
|
|
"disk_free": "$disk_free",
|
|
"ip_primary": "$ip_primary",
|
|
"kernel": "$kernel",
|
|
"ram_total": "$ram_total",
|
|
"furtka_version": "$furtka_version",
|
|
"updated_at": "$updated_at"
|
|
}
|
|
EOF
|
|
|
|
mv "$tmp" "$out"
|
|
chmod 644 "$out"
|