Fix manual agent install download instructions

Repo-wide /releases/latest pointed at the wrong
assets when other tracks published more recently.
Point users at probo-agent/v* releases and split
download vs enroll into separate copy blocks with
placeholder URLs they fill in.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
This commit is contained in:
Ludovic Vielle
2026-07-31 11:07:39 +02:00
parent 4d8d26aad2
commit 2f81b69ad1
3 changed files with 52 additions and 28 deletions

View File

@@ -2515,7 +2515,7 @@
"accessReviewSource": { "documentation": "Documentation", "regions": { "label": "Region", "placeholder": "Select a region", "unitedStates": "United States", "europe": "Europe" } },
"devices": { "title": "Devices", "description": "Manage computers enrolled with the Probo posture agent.", "empty": "No devices enrolled yet", "actions": { "add": "Add device", "new": "New device", "reassign": "Re-assign", "revoke": "Revoke", "delete": "Delete" }, "fields": { "organization": "Organization", "hostname": "Hostname", "owner": "Owner", "state": "State", "platform": "Platform", "osVersion": "OS version", "hardwareUuid": "Hardware UUID", "serialNumber": "Serial number", "agentVersion": "Agent version", "enrolledAt": "Enrolled at", "lastSeen": "Last seen" }, "values": { "pending": "(pending)", "never": "Never", "unassigned": "Unassigned" }, "messages": { "ownerUpdated": "Device owner updated", "revoked": "Device revoked", "deleted": "Device deleted" }, "errors": { "create": "Failed to create device", "reassign": "Failed to re-assign device", "revoke": "Failed to revoke device", "delete": "Failed to delete device" }, "confirmations": { "revoke": "Revoke device \"{{hostname}}\"? The agent on the device will stop reporting and must be re-enrolled.", "delete": "Delete device \"{{hostname}}\"? This removes it from the inventory." }, "postures": { "currentTitle": "Current postures", "empty": "No posture checks recorded", "values": { "on": "On", "off": "Off", "immediate": "Immediate", "seconds": "{{seconds}}s", "minPasswordLength": "Min length {{length}}", "configured": "Configured", "none": "None", "unknown": "Unknown" }, "checks": { "diskEncryption": "Disk encryption", "screenLock": "Screen lock", "firewallEnabled": "Firewall enabled", "timeSync": "Time sync", "osVersion": "OS version", "autoUpdate": "Auto update", "passwordPolicy": "Password policy", "remoteLogin": "Remote login", "malwareProtection": "Malware protection" } }, "history": { "title": "Report history", "empty": "No posture reports yet", "checkCount_one": "{{count}} check reported", "checkCount_other": "{{count}} checks reported", "columns": { "time": "Time", "checks": "Checks", "correlationId": "Correlation ID" }, "actions": { "copyCorrelationId": "Copy correlation ID", "correlationIdCopied": "Correlation ID copied" } } },
"employeeDevices": { "title": "Your devices" },
"deviceEnrollment": { "pageTitle": "Enroll device", "title": "Device enrollment", "setup": "Setup", "stepProgress": "Step {{current}} of {{total}}", "steps": { "privacy": { "title": "Privacy", "description": "Review collected data" }, "organization": { "title": "Organization", "description": "Choose destination workspace" }, "enroll": { "title": "Open and wait", "description": "Finish setup in the desktop agent" } }, "unavailable": { "title": "Enrollment unavailable", "description": "You do not have permission to enroll devices in any organization." }, "intro": { "title": "Before you start", "description": "Probo collects the following device metadata for inventory and posture reporting:" }, "privacy": { "identity": "Device identity: hardware UUID, hostname, and serial number (when available).", "systemDetails": "System details: platform, OS version, and Probo agent version.", "activitySignals": "Activity signals: enrollment time, heartbeats, and posture check results." }, "organization": { "title": "Choose organization", "description": "Pick which organization will own and manage this device." }, "openAgent": { "title": "Open the Probo agent", "description": "Open the desktop agent to finish setup, then keep this page open until enrollment is confirmed." }, "actions": { "backToOrganizations": "Back to organizations", "enrollNew": "Enroll new device", "openAgent": "Open Probo agent", "preparing": "Preparing…" }, "status": { "enrolledWithHostname": "{{hostname}} is enrolled.", "enrolled": "This device is enrolled.", "closeWindow": "You can close this window.", "waitingForCheckIn": "Waiting for the agent's first check-in…", "timedOut": "We haven't heard from the agent yet. Make sure the desktop agent is installed and running, then try again." }, "manual": { "cannotEnroll": "Can't enroll new device?", "tryCreating": "Try creating it manually", "title": "Manual enrollment", "creating": "Creating device…" }, "token": { "title": "Enrollment token generated", "description": "Share this enrollment token only with the device owner through a secure channel. It can be used once and expires after seven days.", "manualInstall": "Manual install (CLI / MDM)", "installUnix": "Install on macOS or Linux (run from a shell with sudo access)", "installWindows": "Install on Windows (run from an elevated PowerShell session)", "securityNotice": "The token is passed as a CLI flag (not via curl-piped-to-shell or sudo env vars). Once installed, the agent self-updates from GitHub Releases with cosign signature verification." }, "messages": { "created": "Device created. Copy the enrollment token now — it will not be shown again." }, "errors": { "copyToClipboard": "Failed to copy to clipboard" } },
"deviceEnrollment": { "pageTitle": "Enroll device", "title": "Device enrollment", "setup": "Setup", "stepProgress": "Step {{current}} of {{total}}", "steps": { "privacy": { "title": "Privacy", "description": "Review collected data" }, "organization": { "title": "Organization", "description": "Choose destination workspace" }, "enroll": { "title": "Open and wait", "description": "Finish setup in the desktop agent" } }, "unavailable": { "title": "Enrollment unavailable", "description": "You do not have permission to enroll devices in any organization." }, "intro": { "title": "Before you start", "description": "Probo collects the following device metadata for inventory and posture reporting:" }, "privacy": { "identity": "Device identity: hardware UUID, hostname, and serial number (when available).", "systemDetails": "System details: platform, OS version, and Probo agent version.", "activitySignals": "Activity signals: enrollment time, heartbeats, and posture check results." }, "organization": { "title": "Choose organization", "description": "Pick which organization will own and manage this device." }, "openAgent": { "title": "Open the Probo agent", "description": "Open the desktop agent to finish setup, then keep this page open until enrollment is confirmed." }, "actions": { "backToOrganizations": "Back to organizations", "enrollNew": "Enroll new device", "openAgent": "Open Probo agent", "preparing": "Preparing…" }, "status": { "enrolledWithHostname": "{{hostname}} is enrolled.", "enrolled": "This device is enrolled.", "closeWindow": "You can close this window.", "waitingForCheckIn": "Waiting for the agent's first check-in…", "timedOut": "We haven't heard from the agent yet. Make sure the desktop agent is installed and running, then try again." }, "manual": { "cannotEnroll": "Can't enroll new device?", "tryCreating": "Try creating it manually", "title": "Manual enrollment", "creating": "Creating device…" }, "token": { "title": "Enrollment token generated", "description": "Share this enrollment token only with the device owner through a secure channel. It can be used once and expires after seven days.", "manualInstall": "Manual install (CLI / MDM)", "releaseListHint": "Browse <link>probo-agent releases on GitHub</link> (tags probo-agent/v*), then pick the archive for your OS and architecture (for example probo-agent_Darwin_arm64.tar.gz, probo-agent_Linux_x86_64.tar.gz, or probo-agent_Windows_x86_64.zip). Replace vX.Y.Z, OS, and ARCH in the download command with the values from the asset you chose.", "installUnix": "Install on macOS or Linux (run from a shell with sudo access)", "installWindows": "Install on Windows (run from an elevated PowerShell session)", "downloadStep": "Download and place the binary", "enrollStep": "Configure the device and start the agent", "securityNotice": "The token is passed as a CLI flag (not via curl-piped-to-shell or sudo env vars). Once installed, the agent self-updates from GitHub Releases with cosign signature verification." }, "messages": { "created": "Device created. Copy the enrollment token now — it will not be shown again." }, "errors": { "copyToClipboard": "Failed to copy to clipboard" } },
"thirdPartyRiskAssessmentRow": {
"expired": "Expired",
"notes": "Notes"

View File

@@ -6101,8 +6101,11 @@
"title": "Jeton denrôlement généré",
"description": "Ne partagez ce jeton denrôlement quavec le propriétaire de lappareil, via un canal sécurisé. Il ne peut être utilisé quune seule fois et expire après sept jours.",
"manualInstall": "Installation manuelle (CLI / MDM)",
"releaseListHint": "Consultez les <link>versions probo-agent sur GitHub</link> (tags probo-agent/v*), puis choisissez larchive correspondant à votre OS et architecture (par exemple probo-agent_Darwin_arm64.tar.gz, probo-agent_Linux_x86_64.tar.gz ou probo-agent_Windows_x86_64.zip). Remplacez vX.Y.Z, OS et ARCH dans la commande de téléchargement par les valeurs de lasset choisi.",
"installUnix": "Installer sur macOS ou Linux (exécuter depuis un shell avec accès sudo)",
"installWindows": "Installer sur Windows (exécuter depuis une session PowerShell élevée)",
"downloadStep": "Télécharger et placer le binaire",
"enrollStep": "Configurer lappareil et démarrer lagent",
"securityNotice": "Le jeton est transmis sous forme dindicateur CLI (et non via un curl redirigé vers un shell ou des variables denvironnement sudo). Une fois installé, lagent se met à jour automatiquement depuis les GitHub Releases avec vérification de signature cosign."
},
"messages": {

View File

@@ -19,10 +19,23 @@
// SOFTWARE.
import { Button, Card, useToast } from "@probo/ui";
import { useTranslation } from "react-i18next";
import { Trans, useTranslation } from "react-i18next";
const RELEASE_BASE_URL
= "https://github.com/getprobo/probo/releases/latest/download";
const AGENT_RELEASES_URL
= "https://github.com/getprobo/probo/releases?q=probo-agent";
const UNIX_DOWNLOAD_COMMAND = `curl -fsSL "https://github.com/getprobo/probo/releases/download/probo-agent/vX.Y.Z/probo-agent_OS_ARCH.tar.gz" -o /tmp/probo-agent.tar.gz
tar -xzf /tmp/probo-agent.tar.gz -C /tmp
sudo install -m 0755 /tmp/probo-agent_OS_ARCH/probo-agent /usr/local/bin/probo-agent
rm -rf /tmp/probo-agent.tar.gz /tmp/probo-agent_OS_ARCH`;
const WINDOWS_DOWNLOAD_COMMAND = `$zip = "$env:TEMP\\probo-agent.zip"
$dst = "$env:ProgramFiles\\Probo"
Invoke-WebRequest -Uri "https://github.com/getprobo/probo/releases/download/probo-agent/vX.Y.Z/probo-agent_Windows_ARCH.zip" -OutFile $zip
Expand-Archive -Path $zip -DestinationPath $env:TEMP -Force
New-Item -ItemType Directory -Force -Path $dst | Out-Null
Move-Item -Force "$env:TEMP\\probo-agent_Windows_ARCH\\probo-agent.exe" "$dst\\probo-agent.exe"
Remove-Item -Recurse -Force $zip, "$env:TEMP\\probo-agent_Windows_ARCH"`;
interface EnrollmentInstructionsProps {
enrollmentToken: string;
@@ -34,32 +47,22 @@ export function EnrollmentInstructions(
) {
const { t } = useTranslation();
const unixCommand = `# 1. Download and install the probo-agent binary
OS=$(uname -s); ARCH=$(uname -m | sed 's/aarch64/arm64/; s/amd64/x86_64/')
NAME="probo-agent_\${OS}_\${ARCH}"
curl -fsSL "${RELEASE_BASE_URL}/\${NAME}.tar.gz" -o /tmp/probo-agent.tar.gz
tar -xzf /tmp/probo-agent.tar.gz -C /tmp
sudo install -m 0755 "/tmp/\${NAME}/probo-agent" /usr/local/bin/probo-agent
rm -rf /tmp/probo-agent.tar.gz "/tmp/\${NAME}"
const downloadComment = `# ${t("deviceEnrollment.token.downloadStep")}`;
const enrollComment = `# ${t("deviceEnrollment.token.enrollStep")}`;
# 2. Configure the device and start the agent service
const unixDownloadCommand = `${downloadComment}
${UNIX_DOWNLOAD_COMMAND}`;
const unixInstallCommand = `${enrollComment}
sudo /usr/local/bin/probo-agent install \\
--server ${serverUrl} \\
--enrollment-token '${enrollmentToken}'`;
const windowsCommand = `# 1. Download and install the probo-agent binary
$arch = if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { 'arm64' } else { 'x86_64' }
$name = "probo-agent_Windows_$arch"
$zip = "$env:TEMP\\probo-agent.zip"
$dst = "$env:ProgramFiles\\Probo"
Invoke-WebRequest -Uri "${RELEASE_BASE_URL}/$name.zip" -OutFile $zip
Expand-Archive -Path $zip -DestinationPath $env:TEMP -Force
New-Item -ItemType Directory -Force -Path $dst | Out-Null
Move-Item -Force "$env:TEMP\\$name\\probo-agent.exe" "$dst\\probo-agent.exe"
Remove-Item -Recurse -Force $zip, "$env:TEMP\\$name"
const windowsDownloadCommand = `${downloadComment}
${WINDOWS_DOWNLOAD_COMMAND}`;
# 2. Configure the device and start the agent service
& "$dst\\probo-agent.exe" install \`
const windowsInstallCommand = `${enrollComment}
& "$env:ProgramFiles\\Probo\\probo-agent.exe" install \`
--server ${serverUrl} \`
--enrollment-token '${enrollmentToken}'`;
@@ -77,18 +80,36 @@ Remove-Item -Recurse -Force $zip, "$env:TEMP\\$name"
</summary>
<div className="mt-4 space-y-4">
<div className="space-y-2">
<p className="text-sm text-txt-secondary">
<Trans
i18nKey="deviceEnrollment.token.releaseListHint"
components={{
link: (
<a
href={AGENT_RELEASES_URL}
target="_blank"
rel="noopener noreferrer"
className="text-txt-primary underline hover:no-underline"
/>
),
}}
/>
</p>
<div className="space-y-3">
<h3 className="text-sm font-medium">
{t("deviceEnrollment.token.installUnix")}
</h3>
<CopyableCodeBlock code={unixCommand} />
<CopyableCodeBlock code={unixDownloadCommand} />
<CopyableCodeBlock code={unixInstallCommand} />
</div>
<div className="space-y-2">
<div className="space-y-3">
<h3 className="text-sm font-medium">
{t("deviceEnrollment.token.installWindows")}
</h3>
<CopyableCodeBlock code={windowsCommand} />
<CopyableCodeBlock code={windowsDownloadCommand} />
<CopyableCodeBlock code={windowsInstallCommand} />
</div>
<p className="text-xs text-txt-secondary">