Files
minerops/backend/app/frontend/agent_management_view.py

275 lines
9.4 KiB
Python

"""Semantic HTML for the Internal Alpha Agent Management page."""
def agent_management_content(can_manage_agents: bool) -> str:
management = """
<section class="panel agent-enrollment-panel"
aria-labelledby="agentEnrollmentCreateTitle">
<div class="panel-head">
<div>
<p class="eyebrow">Agent deployment</p>
<h2 id="agentEnrollmentCreateTitle">Add Agent</h2>
<p class="panel-copy">
Create a short-lived one-time enrollment for an Agent Zone.
Windows is the currently supported deployment platform.
</p>
</div>
</div>
<form id="agentCreateForm" class="agent-create-form">
<div class="field">
<label for="agentSite">Site</label>
<select id="agentSite" required>
<option value="">Choose a site</option>
</select>
</div>
<div class="field">
<label for="agentZone">Agent Zone</label>
<select id="agentZone" required disabled>
<option value="">Choose a site first</option>
</select>
</div>
<div class="field">
<label for="agentDisplayName">Agent name</label>
<input id="agentDisplayName"
type="text"
maxlength="120"
autocomplete="off"
placeholder="Example: Plexus Unit 4 Agent"
required>
</div>
<div class="field">
<label for="agentPlatform">Platform</label>
<select id="agentPlatform">
<option value="windows">Windows</option>
<option value="linux-x64" disabled>Linux x64 — coming later</option>
<option value="linux-arm64" disabled>Linux ARM64 / Raspberry Pi — coming later</option>
</select>
</div>
<div class="agent-form-actions">
<button id="agentCreateSubmit"
class="command-button"
type="submit">
Create Windows enrollment
</button>
</div>
<p id="agentCreateStatus"
class="freshness"
aria-live="polite"></p>
</form>
<section id="agentEnrollmentResult"
class="agent-enrollment-result"
aria-labelledby="agentEnrollmentResultTitle"
hidden>
<div>
<p class="eyebrow">One-time credential</p>
<h3 id="agentEnrollmentResultTitle">
Enrollment created
</h3>
</div>
<p>
This token is displayed only for this enrollment step.
Keep it private. MinerOps does not store the plaintext token.
</p>
<div class="agent-token-box">
<code id="agentEnrollmentToken"></code>
</div>
<p id="agentEnrollmentExpires" class="freshness"></p>
<div class="agent-form-actions">
<button id="agentEnrollmentDownload"
class="command-button"
type="button">
Download Windows package
</button>
<button id="agentEnrollmentCopy"
class="quiet-button"
type="button">
Copy token
</button>
<button id="agentEnrollmentDismiss"
class="quiet-button"
type="button">
Clear token from screen
</button>
</div>
<p id="agentEnrollmentCopyStatus"
class="freshness"
aria-live="polite"></p>
<p class="panel-copy">
The Windows package contains the short-lived enrollment
credential and generic MinerOps Agent runtime. Transfer it
only to the intended Agent computer and delete the ZIP after
successful installation.
</p>
</section>
</section>
""" if can_manage_agents else """
<section class="panel">
<div class="panel-head">
<div>
<p class="eyebrow">Agent deployment</p>
<h2>Agent enrollment</h2>
</div>
</div>
<p class="permission-note">
Your account can view Agent status but cannot create Agent
enrollments.
</p>
</section>
"""
return f"""
<div id="agentManagementLoading" class="state-message" role="status">
<strong>Loading Agents</strong>
<span>Requesting Agent registry and enrollment information.</span>
</div>
<div id="agentManagementError"
class="state-message"
data-kind="error"
role="alert"
hidden>
<strong>Agent Management unavailable</strong>
<span id="agentManagementErrorText">
Agent information could not be loaded.
</span>
<button id="agentManagementRetry"
class="command-button"
type="button">
Retry
</button>
</div>
<div id="agentManagementContent" hidden>
<section class="agent-summary-grid" aria-label="Agent Management summary">
<div class="panel agent-summary-card">
<span>Registered Agents</span>
<strong id="agentCount">-</strong>
</div>
<div class="panel agent-summary-card">
<span>Agent Zones</span>
<strong id="agentZoneCount">-</strong>
</div>
<div class="panel agent-summary-card">
<span>Waiting enrollments</span>
<strong id="agentWaitingEnrollmentCount">-</strong>
</div>
</section>
<div class="agent-management-columns">
<section class="panel" aria-labelledby="registeredAgentsTitle">
<div class="panel-head">
<div>
<p class="eyebrow">Durable identities</p>
<h2 id="registeredAgentsTitle">Agents</h2>
<p class="panel-copy">
Registered Agent identities and their latest factual
check-in information.
</p>
</div>
<button id="agentManagementRefresh"
class="quiet-button"
type="button">
Refresh
</button>
</div>
<div class="table-wrap">
<table class="agent-table">
<thead>
<tr>
<th>Agent</th>
<th>Site / Zone</th>
<th>Host</th>
<th>Version</th>
<th>Last check-in</th>
<th>Credential</th>
<th>Routing</th>
</tr>
</thead>
<tbody id="agentRows"></tbody>
</table>
</div>
<p id="agentEmpty" class="panel-copy" hidden>
No registered Agents.
</p>
</section>
<section class="panel" aria-labelledby="agentZonesTitle">
<div class="panel-head">
<div>
<p class="eyebrow">Network routing boundaries</p>
<h2 id="agentZonesTitle">Agent Zones</h2>
</div>
</div>
<div class="table-wrap">
<table class="agent-zone-table">
<thead>
<tr>
<th>Site</th>
<th>Zone</th>
<th>Networks</th>
<th>Assigned Agent</th>
<th>State</th>
</tr>
</thead>
<tbody id="agentZoneRows"></tbody>
</table>
</div>
<p id="agentZoneEmpty" class="panel-copy" hidden>
No Agent Zones.
</p>
</section>
</div>
{management}
<section class="panel" aria-labelledby="agentEnrollmentHistoryTitle">
<div class="panel-head">
<div>
<p class="eyebrow">Bootstrap history</p>
<h2 id="agentEnrollmentHistoryTitle">Enrollment history</h2>
<p class="panel-copy">
Metadata only. Plaintext enrollment tokens are never
returned by this history view.
</p>
</div>
</div>
<div class="table-wrap">
<table class="agent-enrollment-table">
<thead>
<tr>
<th>Agent name</th>
<th>Site / Zone</th>
<th>Status</th>
<th>Created</th>
<th>Expires</th>
<th>Enrolled Agent</th>
</tr>
</thead>
<tbody id="agentEnrollmentRows"></tbody>
</table>
</div>
<p id="agentEnrollmentEmpty" class="panel-copy" hidden>
No Agent enrollment records.
</p>
</section>
</div>
<script src="/assets/minerops-agent-management.js" defer></script>
"""