278 lines
9.5 KiB
Python
278 lines
9.5 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 id="agentEnrollmentResultCopy">
|
|
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"
|
|
data-can-manage-agents="{str(can_manage_agents).lower()}"
|
|
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>
|
|
<th>Action</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>
|
|
"""
|