Adds two managed system overlays (l4d2center-maps, cedapug-maps) that fetch curated map archives from upstream sources and reconcile addons symlinks for non-Steam maps. A daily systemd timer enqueues a coalesced refresh_global_overlays worker job; downloads, extraction, and rebuilds run in the existing job worker and surface in the job log UI. Schema: GlobalOverlaySource / GlobalOverlayItem / GlobalOverlayItemFile plus nullable Job.user_id so system jobs render as "system" in the UI. The new builder reconciles symlinks against the per-source vpk cache and leaves foreign symlinks untouched. Initialize-time guard refuses to mount a partial overlay if any expected vpk is missing from cache. Refresh service uses shutil.move to handle EXDEV when /tmp and the cache live on different filesystems. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
40 lines
1.4 KiB
HTML
40 lines
1.4 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}Admin | left4me{% endblock %}
|
|
|
|
{% block content %}
|
|
<section class="panel">
|
|
<h1>Admin</h1>
|
|
<ul class="link-list">
|
|
<li><a href="/admin/users">Users</a></li>
|
|
<li><a href="/admin/jobs">Jobs</a></li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Runtime</h2>
|
|
<p class="muted">Queue a Steam runtime install/update job for the local host.</p>
|
|
<form method="post" action="/admin/install">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<button type="submit">Install or update runtime</button>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Workshop</h2>
|
|
<p class="muted">Re-fetch metadata for every workshop item; re-download those with newer versions on Steam, then enqueue rebuilds for the affected overlays.</p>
|
|
<form method="post" action="/admin/workshop/refresh">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<button type="submit">Refresh all workshop items</button>
|
|
</form>
|
|
</section>
|
|
|
|
<section class="panel">
|
|
<h2>Global map overlays</h2>
|
|
<p class="muted">Queue a refresh for managed L4D2Center and CEDAPUG map overlays.</p>
|
|
<form method="post" action="/admin/global-overlays/refresh">
|
|
<input type="hidden" name="csrf_token" value="{{ session.get('csrf_token', '') }}">
|
|
<button type="submit">Refresh global overlays</button>
|
|
</form>
|
|
</section>
|
|
{% endblock %}
|