<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[XCP Pulse collects XCP-ng and Xen Orchestra logs]]></title><description><![CDATA[<p dir="auto">While this project is more for myself it is open to others to use. Please use at your own risk. As always review the code before using in a production environment. Please leave any feedback or suggestions. <a href="https://github.com/acebmxer/xcp_pulse" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/acebmxer/xcp_pulse</a></p>
<p dir="auto">XCP Pulse collects XCP-ng and Xen Orchestra logs, bundles them for download, analyses them, and reports findings — for your own troubleshooting or to attach to a Vates support ticket. Everything goes through the <a href="https://docs.xen-orchestra.com/restapi" target="_blank" rel="noopener noreferrer nofollow ugc">Xen Orchestra REST API</a> — nothing is installed on your hosts, and it only ever reads.</p>
<p dir="auto">It runs as a container with a web UI. Being built in stages, and <strong>v0.5.1 is where it is today</strong> — so this is an early look rather than a finished tool. Log collection itself is the next big piece.</p>
<h2>What works today</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Version</th>
<th>What it does</th>
</tr>
</thead>
<tbody>
<tr>
<td>v0.1.0</td>
<td>Container, login, sessions, healthcheck</td>
</tr>
<tr>
<td>v0.2.0</td>
<td>Connect to Xen Orchestra — URL and API token, token encrypted at rest, "Test connection"</td>
</tr>
<tr>
<td>v0.3.0</td>
<td>Pools and hosts listed on the dashboard, grouped by pool</td>
</tr>
<tr>
<td>v0.4.0</td>
<td>Background jobs with live progress and history, and stored results</td>
</tr>
<tr>
<td>v0.5.0</td>
<td>Redaction — masks addresses, tokens and credentials out of log text, with a preview page</td>
</tr>
<tr>
<td>v0.5.1</td>
<td>Each redaction rule can be switched on or off</td>
</tr>
</tbody>
</table>
<p dir="auto">Redaction came before any download button on purpose. A real log bundle is full of internal addresses, usernames and session tokens, and the point of the download is sending that file to Vates — shipping collection first would have meant a headline feature that leaks credentials. One real <code>xensource.log</code> I tested against had 8,359 lines matching password, secret or session patterns.</p>
<h2>What is coming</h2>
<ul>
<li><strong>Collect the full log bundle</strong> per host, as a background job, redacted, with a download. Measured on my own XCP-ng 8.3 pool: about <strong>433 MB and 100 seconds per host</strong>, 603 files.</li>
<li><strong>Collect individual categories</strong> — XAPI, storage, audit, security, kernel and the rest — pulled out of the cached bundle instead of downloading again. Current logs only comes to roughly <strong>35 MB instead of 433 MB</strong>.</li>
<li><strong>Date ranges</strong> — of that 433 MB, 418 MB is rotated history, so asking for the last three days is a large saving.</li>
<li><strong>Findings</strong> — failed tasks, alarms, missing patches, storage errors, HA fencing, clock skew, with the evidence behind each one.</li>
<li><strong>A Vates support package</strong> — one file with the redacted bundle, findings and a manifest of what was masked.</li>
<li><strong>Multiple users</strong>, docs in the web UI, and self-update.</li>
</ul>
<p dir="auto">Full list with status: <a href="https://github.com/acebmxer/xcp_pulse/blob/main/docs/roadmap.md" target="_blank" rel="noopener noreferrer nofollow ugc">https://github.com/acebmxer/xcp_pulse/blob/main/docs/roadmap.md</a></p>
<h2>Quick start</h2>
<p dir="auto">No clone and no build — the image is published to GHCR, so the compose file and an env file are the whole deployment:</p>
<pre><code class="language-bash">mkdir xcp-pulse &amp;&amp; cd xcp-pulse
curl -o compose.yaml https://raw.githubusercontent.com/acebmxer/xcp_pulse/main/compose.yaml.example
curl -o xcp-pulse.env https://raw.githubusercontent.com/acebmxer/xcp_pulse/main/xcp-pulse.env.example
</code></pre>
<p dir="auto">Generate the admin password hash — XCP Pulse stores a hash, never a password, and refuses to start without one:</p>
<pre><code class="language-bash">docker compose run --rm xcp-pulse python -m app.hashpw
</code></pre>
<p dir="auto">Paste the printed <code>XCP_PULSE_ADMIN_PASSWORD_HASH=...</code> line into <code>xcp-pulse.env</code>, then:</p>
<pre><code class="language-bash">docker compose up -d
</code></pre>
<p dir="auto">Open <a href="http://localhost:8080" target="_blank" rel="noopener noreferrer nofollow ugc">http://localhost:8080</a> and sign in with <code>admin</code> and the password you chose.</p>
<p dir="auto">The env file has to be called <code>xcp-pulse.env</code> and not <code>.env</code> — compose treats a file of that name as its own variable source and mangles the Argon2 hash.</p>
<h2>A note on the XO account</h2>
<p dir="auto">Inventory and API-based findings work fine with a <strong>Read only</strong> role. Downloading logs does not — <code>/hosts/{id}/logs.tgz</code> requires <code>export:logs</code> on host, and on the instance I measured (XO CE, <code>@xen-orchestra/rest-api</code> 0.39.0) that privilege was not in the grantable catalogue at all. The only role that could download logs was <strong>Administrator</strong>.</p>
<p dir="auto">So for log collection you currently need an admin token. XCP Pulse reads the privilege catalogue from your instance and tells you what it can actually grant, rather than assuming — and asks which account type you gave it so it can name the missing privilege instead of showing a bare 403.</p>
<h2>Security</h2>
<p dir="auto">XCP Pulse holds a token that can read every log on your pool, and stores files containing session tokens and internal network topology. Run it on a trusted management network behind a reverse proxy — the compose file binds to <code>127.0.0.1</code> by default for that reason. Not exposed to the internet.</p>
<p dir="auto">MIT licensed. This is an independent tool and is not affiliated with or endorsed by Vates.</p>
<p dir="auto"><img src="/forum/assets/uploads/files/1788787261460-screenshot_20260907_091915-1.png" alt="Screenshot_20260907_091915-1.png" class=" img-fluid img-markdown" /><br />
<img src="/forum/assets/uploads/files/1788787295758-screenshot_20260907_092108.png" alt="Screenshot_20260907_092108.png" class=" img-fluid img-markdown" /><br />
<img src="/forum/assets/uploads/files/1788787376266-screenshot_20260907_092146.png" alt="Screenshot_20260907_092146.png" class=" img-fluid img-markdown" /></p>
]]></description><link>https://xcp-ng.org/forum/topic/12459/xcp-pulse-collects-xcp-ng-and-xen-orchestra-logs</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 15:03:16 GMT</lastBuildDate><atom:link href="https://xcp-ng.org/forum/topic/12459.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 07 Sep 2026 13:23:06 GMT</pubDate><ttl>60</ttl></channel></rss>