chore: auto-recover 1 unsaved session log(s)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,906 @@
|
||||
# [RECOVERED] Investigate blue screen and test detection feature
|
||||
|
||||
> **[RECOVERED -- UNVERIFIED]** Auto-reconstructed from transcript f5631414-899d-4951-99a7-4db2dd6e022f (2026-06-01T23:58:02.569Z .. 2026-06-02T03:34:43.849Z) on 2026-06-02. Prose sections are Ollama-drafted from the transcript and may be imprecise; the Commands/Config/Reference sections are extracted verbatim. Review and correct, then remove this banner.
|
||||
|
||||
## User
|
||||
- **User:** Mike Swanson (mike)
|
||||
- **Machine:** GURU-5070
|
||||
- **Role:** admin
|
||||
- **[WARNING]** whoami-block.sh unavailable; rendered from identity.json directly.
|
||||
|
||||
## Session Summary
|
||||
|
||||
The session began with an unexpected blue screen of death (BSOD) on a machine, prompting an investigation into whether GuruConnect was involved. The assistant initiated a dual-track approach: forensic analysis of the BSOD and design of a BSOD detection feature for GuruRMM. The BSOD analysis revealed a `VIDEO_TDR_FAILURE` (0x116) caused by the NVIDIA display driver, not GuruConnect. The assistant confirmed GuruConnect was not running at the time of the crash and had no involvement in the issue. Simultaneously, the assistant explored the GuruRMM codebase to implement the BSOD detection feature, leveraging existing infrastructure for event logging and alerting. The feature was validated using the real-world crash data, confirming its functionality and deduplication capabilities. The session concluded with resolving the build-tagging issue and promoting the stable release to ensure full fleet coverage.
|
||||
|
||||
## Key Decisions
|
||||
|
||||
- Use the RMM agent to analyze the minidump as SYSTEM to confirm the faulting driver and process.
|
||||
- Leverage existing event logging and alerting infrastructure in GuruRMM to avoid redundant development.
|
||||
- Validate the BSOD detection feature using real-world crash data to ensure accuracy and reliability.
|
||||
- Promote the `0.6.51` release to stable to ensure the fleet receives BSOD coverage despite the beta-first release strategy.
|
||||
|
||||
## Problems Encountered
|
||||
|
||||
- No minidumps found at default paths; required a thorough search and independent checks.
|
||||
- Initial analysis suggested GuruConnect might be involved, but further investigation clarified it was not running at the time of the crash.
|
||||
- The RMM agent needed to be used as SYSTEM to access the minidump, requiring careful coordination with the RMM infrastructure.
|
||||
- The build-tagging issue caused a fleet split, necessitating a fix to ensure consistent deployment.
|
||||
|
||||
## Configuration Changes
|
||||
|
||||
_Machine-extracted verbatim from the transcript (file targets of Write/Edit/NotebookEdit)._
|
||||
|
||||
- [created] `D:\claudetools\projects\msp-tools\guru-rmm\specs\bsod-detection\shape.md`
|
||||
- [created] `D:\claudetools\projects\msp-tools\guru-rmm\specs\bsod-detection\references.md`
|
||||
- [created] `D:\claudetools\projects\msp-tools\guru-rmm\specs\bsod-detection\standards.md`
|
||||
- [created] `D:\claudetools\projects\msp-tools\guru-rmm\specs\bsod-detection\plan.md`
|
||||
- [created] `D:\claudetools\.claude\memory\feedback_gururmm_build_channel_default.md`
|
||||
- [modified] `D:\claudetools\.claude\memory\MEMORY.md`
|
||||
- [modified] `D:\claudetools\.claude\memory\reference_gururmm.md`
|
||||
|
||||
## Credentials & Secrets
|
||||
|
||||
_Machine-extracted; review carefully -- secrets are not auto-harvested from transcripts._
|
||||
|
||||
- none detected (verify against the Commands & Outputs section)
|
||||
|
||||
## Infrastructure & Servers
|
||||
|
||||
_Machine-extracted verbatim (IP / hostname regex hits across the whole transcript)._
|
||||
|
||||
- **IPs:** `100.101.122.4`, `172.16.3.30`, `172.16.3.20`, `127.0.0.1`
|
||||
- **Hosts:** `identity.json`, `azcomputerguru.com`, `memory.dmp`, `microsoft.powershell.commands.getchilditemcommand`, `060126-16718-01.dmp`, `agent.toml`, `guruconnect.exe`, `agent-id.txt`, `last-user-inventory.txt`, `cargo.toml`, `agent.toml.example`, `build-all-platforms.sh`, `build-macos-pkg.sh`, `build-macos-signed.sh`, `build-macos.sh`, `build.rs`, `entitlements.plist`, `gururmm-agent-macos-amd64-0.6.41.zip`, `gururmm-agent-macos-arm64-0.6.41.zip`, `test-install-gururmm.sh`, `uninstall-macos.sh`, `msdl.microsoft.com`, `nvlddmkm.sys`, `mod.rs`, `plan.md`, `shape.md`, `references.md`, `standards.md`, `no-emojis.md`, `naming.md`, `output-markers.md`, `execution-pattern.md`, `grepai-first.md`, `credential-handling.md`, `response-format.md`, `commit-style.md`, `platform-parity.md`, `comment-dedup.md`, `time-entry-protocol.md`, `html-formatting.md`
|
||||
|
||||
## Commands & Outputs
|
||||
|
||||
_Machine-extracted verbatim: mutating Bash/PowerShell commands with truncated output._
|
||||
|
||||
```
|
||||
set -e
|
||||
IDENTITY_PATH="${HOME}/.claude/identity.json"
|
||||
[ -f "$IDENTITY_PATH" ] || IDENTITY_PATH="$(git rev-parse --show-toplevel)/.claude/identity.json"
|
||||
REPO_ROOT=$(jq -r '.claudetools_root // empty' "$IDENTITY_PATH" 2>/dev/null)
|
||||
[ -n "$REPO_ROOT" ] || REPO_ROOT=$(git rev-parse --show-toplevel)
|
||||
VAULT="$REPO_ROOT/.claude/scripts/vault.sh"
|
||||
RMM="http://172.16.3.30:3001"
|
||||
RMM_EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
RMM_PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email": "$RMM_EMAIL", "password": "$RMM_PASS"}
|
||||
JSON
|
||||
)
|
||||
[ -n "$TOKEN" ] || { echo "[ERROR] login failed"; exit 1; }
|
||||
echo "[OK] authenticated"
|
||||
|
||||
AGENT_ID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
# verify agent exists + connected
|
||||
curl -s "$RMM/api/agents" -H "Authorization: Bearer $TOKEN" | jq -r --arg id "$AGENT_ID" '.[] | select(.id==$id) | "[OK] target: \(.hostname) os=\(.os_type) connected=\(.is_connected) v\(.agent_version)"'
|
||||
|
||||
SCRIPT='& "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\cdb.exe" -z "C:\WINDOWS\Minidump\060126-16718-01.dmp" -y "srv*C:\symbols*https://msdl.microsoft.com/download/symbols" -c "!analyze -v; q" 2>&1 | Out-String'
|
||||
PAYLOAD=$(jq -n --arg ct powershell --arg cmd "$SCRIPT" --argjson to 280 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CMD_ID=$(curl -s -X POST "$RMM/api/agents/$AGENT_ID/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
[ -n "$CMD_ID" ] || { echo "[ERROR] dispatch failed"; exit 1; }
|
||||
echo "[OK] dispatched cmd=$CMD_ID"
|
||||
echo "$CMD_ID" > /tmp/bsod_cmd_id
|
||||
echo "$TOKEN" > /tmp/bsod_token
|
||||
bash "$REPO_ROOT/.claude/scripts/post-bot-alert.sh" "[RMM] Mike dispatched to GURU-5070 (windows) - cdb !analyze -v on BSOD minidump 0x116 -> cmd:${CMD_ID:0:8}" >/dev/null 2>&1 || true
|
||||
echo "[OK] alert posted"
|
||||
```
|
||||
Output: [OK] authenticated
|
||||
[OK] target: GURU-5070 os=windows connected=null v0.6.50
|
||||
|
||||
[OK] dispatched cmd=1bdba664-2901-4673-956a-92530615d7b5
|
||||
[OK] alert posted
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"
|
||||
TOKEN=$(cat /tmp/bsod_token)
|
||||
CMD_ID=$(cat /tmp/bsod_cmd_id)
|
||||
for i in $(seq 1 40); do
|
||||
R=$(curl -s "$RMM/api/commands/$CMD_ID" -H "Authorization: Bearer $TOKEN")
|
||||
S=$(echo "$R" | jq -r '.status // empty')
|
||||
case "$S" in
|
||||
completed|failed|cancelled|interrupted)
|
||||
echo "=== STATUS: $S (exit $(echo "$R" | jq -r '.exit_code // "—"')) ==="
|
||||
echo "$R" | jq -r '.stdout // ""'
|
||||
echo "=== STDERR ==="
|
||||
echo "$R" | jq -r '.stderr // ""'
|
||||
exit 0 ;;
|
||||
*) sleep 7 ;;
|
||||
esac
|
||||
done
|
||||
echo "[WARN] still running cmd=$CMD_ID"
|
||||
```
|
||||
Output: === STATUS: completed (exit 0) ===
|
||||
|
||||
|
||||
|
||||
Microsoft (R) Windows Debugger Version 10.0.22621.2428 AMD64
|
||||
|
||||
|
||||
Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading Dump File [C:\WINDOWS\Minidump\060126-16718-01.dmp]
|
||||
|
||||
|
||||
Mini Kernel Dump File: Only registers and stack trace are available ... [truncated]
|
||||
|
||||
```
|
||||
set -e
|
||||
RMM="http://172.16.3.30:3001"
|
||||
REPO_ROOT=$(git rev-parse --show-toplevel)
|
||||
VAULT="$REPO_ROOT/.claude/scripts/vault.sh"
|
||||
RMM_EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
RMM_PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email": "$RMM_EMAIL", "password": "$RMM_PASS"}
|
||||
JSON
|
||||
)
|
||||
AGENT_ID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
read -r -d '' PS <<'PSEOF' || true
|
||||
$p="C:\WINDOWS\Minidump\060126-16718-01.dmp"
|
||||
$fs=[System.IO.File]::OpenRead($p)
|
||||
$buf=New-Object byte[] 4096
|
||||
[void]$fs.Read($buf,0,4096)
|
||||
$fs.Close()
|
||||
$sig=[System.Text.Encoding]::ASCII.GetString($buf,0,8)
|
||||
Write-Output ("sig={0}" -f $sig)
|
||||
Write-Output ("code@0x38=0x{0:X8}" -f [BitConverter]::ToUInt32($buf,0x38))
|
||||
Write-Output ("p1@0x40=0x{0:X16}" -f [BitConverter]::ToUInt64($buf,0x40))
|
||||
Write-Output ("p2@0x48=0x{0:X16}" -f [BitConverter]::ToUInt64($buf,0x48))
|
||||
Write-Output ("p3@0x50=0x{0:X16}" -f [BitConverter]::ToUInt64($buf,0x50))
|
||||
Write-Output ("p4@0x58=0x{0:X16}" -f [BitConverter]::ToUInt64($buf,0x58))
|
||||
$ft=[BitConverter]::ToUInt64($buf,0xFA8)
|
||||
Write-Output ("filetime@0xFA8=0x{0:X16} -> {1}" -f $ft, [DateTime]::FromFileTimeUtc($ft).ToString("o"))
|
||||
PSEOF
|
||||
PAYLOAD=$(jq -n --arg ct powershell --arg cmd "$PS" --argjson to 60 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CMD_ID=$(curl -s -X POST "$RMM/api/agents/$AGENT_ID/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "$CMD_ID" > /tmp/off_cmd; echo "$TOKEN" > /tmp/off_tok
|
||||
echo "[OK] dispatched offset-read cmd=$CMD_ID"
|
||||
bash "$REPO_ROOT/.claude/scripts/post-bot-alert.sh" "[RMM] Mike dispatched to GURU-5070 (windows) - validate BSOD dump header offsets vs 0x116 fixture -> cmd:${CMD_ID:0:8}" >/dev/null 2>&1 || true
|
||||
```
|
||||
Output: [OK] dispatched offset-read cmd=d16ef774-8b8e-4e75-9206-7a9948e6a64e
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/off_tok); CMD_ID=$(cat /tmp/off_cmd)
|
||||
for i in $(seq 1 20); do
|
||||
R=$(curl -s "$RMM/api/commands/$CMD_ID" -H "Authorization: Bearer $TOKEN")
|
||||
S=$(echo "$R" | jq -r '.status // empty')
|
||||
case "$S" in
|
||||
completed|failed|cancelled|interrupted)
|
||||
echo "=== STATUS: $S (exit $(echo "$R" | jq -r '.exit_code // "—"')) ==="
|
||||
echo "$R" | jq -r '.stdout // ""'
|
||||
E=$(echo "$R" | jq -r '.stderr // ""'); [ -n "$E" ] && { echo "--- stderr ---"; echo "$E"; }
|
||||
exit 0 ;;
|
||||
*) sleep 5 ;;
|
||||
esac
|
||||
done
|
||||
echo "[WARN] still running"
|
||||
```
|
||||
Output: === STATUS: completed (exit 0) ===
|
||||
sig=PAGEDU64
|
||||
|
||||
|
||||
code@0x38=0x00000116
|
||||
|
||||
|
||||
p1@0x40=0xFFFFE28CA1998050
|
||||
|
||||
|
||||
p2@0x48=0xFFFFF8016FD61050
|
||||
|
||||
|
||||
p3@0x50=0xFFFFFFFFC000009A
|
||||
|
||||
|
||||
p4@0x58=0x0000000000000004
|
||||
|
||||
|
||||
filetime@0xFA8=0x01DCF2225812AE20 -> 2026-06-01T23:57:03.4701344Z
|
||||
|
||||
```
|
||||
echo "=== coord: gururmm components ==="; curl -s "http://172.16.3.30:8001/api/coord/components?project_key=gururmm" | jq '.' 2>/dev/null | head -60
|
||||
echo "=== coord: status ==="; curl -s "http://172.16.3.30:8001/api/coord/status" | jq '.components // .' 2>/dev/null | head -40
|
||||
echo "=== gururmm server health/version ==="; curl -s -m 8 "http://172.16.3.30:3001/api/health" ; echo; curl -s -m 8 "http://172.16.3.30:3001/api/version"; echo
|
||||
```
|
||||
Output: === coord: gururmm components ===
|
||||
{
|
||||
|
||||
"total": 5,
|
||||
|
||||
"states": [
|
||||
|
||||
{
|
||||
|
||||
"project_key": "gururmm",
|
||||
|
||||
"component": "agents",
|
||||
|
||||
"state": "deploying",
|
||||
|
||||
"version": "0.6.47",
|
||||
|
||||
"notes": "0.6.47 promoted stable, update pushed to 42/46 online agents - rolling out now",
|
||||
|
||||
"u ... [truncated]
|
||||
|
||||
```
|
||||
set -e
|
||||
RMM="http://172.16.3.30:3001"; REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null || echo /d/claudetools)
|
||||
VAULT="$REPO_ROOT/.claude/scripts/vault.sh"
|
||||
EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email":"$EMAIL","password":"$PASS"}
|
||||
JSON
|
||||
)
|
||||
echo "$TOKEN" > /tmp/rmm_tok
|
||||
AID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
echo "=== current effective channel for GURU-5070 ==="; curl -s "$RMM/api/agents/$AID/effective-channel" -H "Authorization: Bearer $TOKEN"; echo
|
||||
echo "=== set GURU-5070 -> beta ==="; curl -s -X PATCH "$RMM/api/agents/$AID/channel" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" --data-binary '{"channel":"beta"}'; echo
|
||||
echo "=== confirm ==="; curl -s "$RMM/api/agents/$AID/effective-channel" -H "Authorization: Bearer $TOKEN"; echo
|
||||
echo "=== agent current reported version ==="; curl -s "$RMM/api/agents" -H "Authorization: Bearer $TOKEN" | jq -r --arg id "$AID" '.[]|select(.id==$id)|"\(.hostname) v\(.agent_version) connected=\(.is_connected)"'
|
||||
```
|
||||
Output: Exit code 5
|
||||
bash: D:/claudetools/projects/msp-tools/guru-rmm/.claude/scripts/vault.sh: No such file or directory
|
||||
bash: D:/claudetools/projects/msp-tools/guru-rmm/.claude/scripts/vault.sh: No such file or directory
|
||||
jq: parse error: Invalid numeric literal at line 1, column 8
|
||||
|
||||
=== current effective ch ... [truncated]
|
||||
|
||||
```
|
||||
set -e
|
||||
RMM="http://172.16.3.30:3001"; REPO_ROOT=/d/claudetools
|
||||
VAULT="$REPO_ROOT/.claude/scripts/vault.sh"
|
||||
EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email":"$EMAIL","password":"$PASS"}
|
||||
JSON
|
||||
)
|
||||
[ -n "$TOKEN" ] && echo "[OK] auth" || { echo "[ERROR] no token"; exit 1; }
|
||||
echo "$TOKEN" > /tmp/rmm_tok
|
||||
AID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
echo "=== effective channel BEFORE ==="; curl -s "$RMM/api/agents/$AID/effective-channel" -H "Authorization: Bearer $TOKEN"; echo
|
||||
echo "=== PATCH -> beta ==="; curl -s -o /dev/null -w "HTTP %{http_code}\n" -X PATCH "$RMM/api/agents/$AID/channel" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" --data-binary '{"channel":"beta"}'
|
||||
echo "=== effective channel AFTER ==="; curl -s "$RMM/api/agents/$AID/effective-channel" -H "Authorization: Bearer $TOKEN"; echo
|
||||
echo "=== reported version / connected ==="; curl -s "$RMM/api/agents" -H "Authorization: Bearer $TOKEN" | jq -r --arg id "$AID" '.[]|select(.id==$id)|"\(.hostname) v\(.agent_version) connected=\(.is_connected)"'
|
||||
```
|
||||
Output: [OK] auth
|
||||
=== effective channel BEFORE ===
|
||||
{"channel":"stable","source":"default"}
|
||||
=== PATCH -> beta ===
|
||||
HTTP 204
|
||||
|
||||
=== effective channel AFTER ===
|
||||
{"channel":"beta","source":"agent"}
|
||||
=== reported version / connected ===
|
||||
GURU-5070 v0.6.50 connected=null
|
||||
|
||||
```
|
||||
VAULT="/d/claudetools/.claude/scripts/vault.sh"
|
||||
# Inspect available SSH fields without echoing secrets
|
||||
echo "=== keys in gururmm-server vault entry ==="
|
||||
bash "$VAULT" get infrastructure/gururmm-server.sops.yaml 2>/dev/null | grep -iE '^\s*(host|hostname|ip|user|username|ssh|password|port)\b|ssh' | sed -E 's/(password|pass):.*/\1: ****/I' | head -30
|
||||
```
|
||||
Output: === keys in gururmm-server vault entry ===
|
||||
host: 172.16.3.30
|
||||
port: 22
|
||||
hostname: gururmm / gururmm-build
|
||||
username: guru
|
||||
password: ****
|
||||
notes: 'Host: 172.16.3.30 | SSH Port: 22 | OS: Ubuntu 22.04 LTS | Sudo password same as SSH. Role: Production server hosting ClaudeTools database and API, Gur ... [truncated]
|
||||
|
||||
```
|
||||
VAULT="/d/claudetools/.claude/scripts/vault.sh"
|
||||
PW=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.password)
|
||||
USR=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.username 2>/dev/null)
|
||||
[ -z "$USR" ] && USR=guru
|
||||
SSH="/c/Windows/System32/OpenSSH/ssh.exe"
|
||||
sshpass -p "$PW" "$SSH" -p 22 -o StrictHostKeyChecking=accept-new -o ConnectTimeout=12 ${USR}@172.16.3.30 'D=/var/www/downloads; echo "=== agent binaries ==="; ls -la $D 2>/dev/null | grep -iE "gururmm-agent" ; echo "=== .channel sidecars ==="; for f in $D/*.channel; do [ -e "$f" ] && echo "$(basename "$f") => $(cat "$f")"; done; echo "=== newest mtimes (top 12) ==="; ls -t $D 2>/dev/null | head -12'
|
||||
```
|
||||
Output: Exit code 127
|
||||
/usr/bin/bash: line 11: sshpass: command not found
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; REPO_ROOT=/d/claudetools
|
||||
VAULT="$REPO_ROOT/.claude/scripts/vault.sh"
|
||||
EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email":"$EMAIL","password":"$PASS"}
|
||||
JSON
|
||||
)
|
||||
echo "$TOKEN" > /tmp/rmm_tok
|
||||
echo "=== agents on Linux / matching server (172.16.3.30 / gururmm / saturn) ==="
|
||||
curl -s "$RMM/api/agents" -H "Authorization: Bearer $TOKEN" | jq -r '.[] | select((.os_type=="linux") or (.hostname|test("(?i)gururmm|saturn|server"))) | "\(.hostname) | \(.os_type) | id=\(.id) | connected=\(.is_connected) | v\(.agent_version) | site=\(.site_name) client=\(.client_name)"'
|
||||
```
|
||||
Output: === agents on Linux / matching server (172.16.3.30 / gururmm / saturn) ===
|
||||
ix.azcomputerguru.com | linux | id=4ad2e426-b03f-4c5d-817c-c8c675ba73a0 | connected=null | v0.6.51 | site=DF Server Storage client=AZ Computer Guru
|
||||
|
||||
Jupiter | linux | id=443bfabb-9213-4157-8be6-2b6d5d3113b2 | connected=null | ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
D=/var/www/downloads
|
||||
echo "=== windows agent artifacts ==="; ls -la "$D" 2>/dev/null | grep -iE "windows|\.msi" | grep -iE "agent"
|
||||
echo "=== ALL .channel sidecars ==="; for f in "$D"/*.channel; do [ -e "$f" ] && echo "$(basename "$f") => $(cat "$f")"; done
|
||||
echo "=== distinct versions present ==="; ls -1 "$D" 2>/dev/null | grep -oE "[0-9]+\.[0-9]+\.[0-9]+" | sort -u
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "dispatched cmd=$CID"
|
||||
for i in $(seq 1 15); do
|
||||
R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty')
|
||||
case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac
|
||||
done
|
||||
```
|
||||
Output: dispatched cmd=693080be-6b22-417e-944a-0c29e493f31f
|
||||
status=completed
|
||||
=== windows agent artifacts ===
|
||||
|
||||
=== ALL .channel sidecars ===
|
||||
|
||||
=== distinct versions present ===
|
||||
|
||||
```
|
||||
$p = Get-Command plink -ErrorAction SilentlyContinue; if ($p) { "plink: $($p.Source)" } else { "no plink" }
|
||||
$po = Get-Command pscp -ErrorAction SilentlyContinue; if ($po) { "pscp: $($po.Source)" } else { "no pscp" }
|
||||
$m = Get-Module -ListAvailable Posh-SSH -ErrorAction SilentlyContinue; if ($m) { "Posh-SSH available v$($m.Version)" } else { "no Posh-SSH" }
|
||||
```
|
||||
Output: plink: C:\Program Files\PuTTY\plink.exe
|
||||
|
||||
pscp: C:\Program Files\PuTTY\pscp.exe
|
||||
|
||||
no Posh-SSH
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
# refresh token if needed
|
||||
code=$(curl -s -o /dev/null -w "%{http_code}" "$RMM/api/agents" -H "Authorization: Bearer $TOKEN")
|
||||
if [ "$code" != "200" ]; then
|
||||
VAULT="/d/claudetools/.claude/scripts/vault.sh"
|
||||
EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email":"$EMAIL","password":"$PASS"}
|
||||
JSON
|
||||
)
|
||||
echo "$TOKEN" > /tmp/rmm_tok
|
||||
fi
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
echo "whoami=$(whoami)"
|
||||
PID=$(pgrep -f 'gururmm-server' | head -1); echo "server_pid=$PID"
|
||||
D=$(sudo -n cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | sed -n 's/^DOWNLOADS_DIR=//p')
|
||||
[ -z "$D" ] && D=$(cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | sed -n 's/^DOWNLOADS_DIR=//p')
|
||||
D=${D:-/var/www/downloads}
|
||||
echo "DOWNLOADS_DIR=$D"
|
||||
echo "--- agent + channel files ---"; ls -la "$D" 2>&1 | grep -iE 'agent|\.channel' | head -50
|
||||
echo "--- windows channels ---"; grep -H . "$D"/*windows*.channel 2>/dev/null
|
||||
echo "--- write test ---"; if touch "$D/.wtest_$$" 2>/dev/null; then echo "WRITABLE"; rm -f "$D/.wtest_$$"; elif sudo -n touch "$D/.wtest_$$" 2>/dev/null; then echo "WRITABLE_VIA_SUDO"; sudo -n rm -f "$D/.wtest_$$"; else echo "NOT_WRITABLE"; fi
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 45 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=6947e1ff-0aba-4332-8338-070bef448322
|
||||
status=completed
|
||||
whoami=root
|
||||
|
||||
server_pid=863125
|
||||
|
||||
DOWNLOADS_DIR=/var/www/gururmm/downloads
|
||||
|
||||
--- agent + channel files ---
|
||||
|
||||
-rw-r--r-- 1 root root 5 May 25 17:54 gururmm-agent-base-0.6.41.msi.channel
|
||||
|
||||
-rw-r--r-- 1 root root 5 May 27 01:11 gururmm-ag ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
D=/var/www/gururmm/downloads
|
||||
for f in gururmm-agent-windows-amd64-0.6.51.exe gururmm-agent-windows-x86-0.6.51.exe gururmm-agent-windows-legacy-amd64-0.6.51.exe gururmm-agent-windows-legacy-x86-0.6.51.exe; do
|
||||
if [ -e "$D/$f.channel" ]; then echo beta > "$D/$f.channel"; echo "[OK] retagged $f -> $(cat "$D/$f.channel")"; else echo "[WARN] missing $f.channel"; fi
|
||||
done
|
||||
echo "--- ALL windows 0.6.51 channels now ---"
|
||||
grep -H . "$D"/*windows*0.6.51*.channel
|
||||
echo "--- base msi + linux (left as-is) ---"
|
||||
grep -H . "$D"/gururmm-agent-base-0.6.51.msi.channel "$D"/gururmm-agent-linux-amd64-0.6.51.channel 2>/dev/null
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
bash /d/claudetools/.claude/scripts/post-bot-alert.sh "[RMM] Mike re-tagged Windows 0.6.51 agent binaries stable->beta on server downloads dir (beta-first soak for BSOD feature)" >/dev/null 2>&1 || true
|
||||
```
|
||||
Output: cmd=e8e9b5dd-977f-4fc4-a5ae-9a23359cc2ad
|
||||
status=completed
|
||||
[OK] retagged gururmm-agent-windows-amd64-0.6.51.exe -> beta
|
||||
|
||||
[OK] retagged gururmm-agent-windows-x86-0.6.51.exe -> beta
|
||||
|
||||
[OK] retagged gururmm-agent-windows-legacy-amd64-0.6.51.exe -> beta
|
||||
|
||||
[OK] retagged gururmm-agent-windows-legacy-x86-0.6. ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
PID=$(pgrep -f 'gururmm-server' | head -1)
|
||||
DBU=$(cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | sed -n 's/^DATABASE_URL=//p')
|
||||
if [ -z "$DBU" ]; then echo "no DATABASE_URL in environ"; exit 0; fi
|
||||
echo "=== migration 048 / bsod_events table ==="
|
||||
psql "$DBU" -tAc "SELECT to_regclass('public.bsod_events');"
|
||||
echo "=== columns ==="
|
||||
psql "$DBU" -tAc "SELECT column_name||':'||data_type FROM information_schema.columns WHERE table_name='bsod_events' ORDER BY ordinal_position;"
|
||||
echo "=== sqlx migration 048 recorded? ==="
|
||||
psql "$DBU" -tAc "SELECT version, success FROM _sqlx_migrations WHERE version=48;"
|
||||
echo "=== existing bsod rows ==="
|
||||
psql "$DBU" -tAc "SELECT count(*) FROM bsod_events;"
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=1a1444fd-1df7-4edd-863d-41ab3a8ecdfa
|
||||
status=failed
|
||||
=== migration 048 / bsod_events table ===
|
||||
|
||||
|
||||
|
||||
=== columns ===
|
||||
|
||||
=== sqlx migration 048 recorded? ===
|
||||
|
||||
=== existing bsod rows ===
|
||||
|
||||
|
||||
|
||||
--stderr--
|
||||
ERROR: relation "bsod_events" does not exist
|
||||
|
||||
LINE 1: SELECT count(*) FROM bsod_events; ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
echo "=== running gururmm-server ==="
|
||||
ps -o pid,lstart,etime,cmd -p $(pgrep -f 'gururmm-server' | head -1) 2>/dev/null
|
||||
echo "=== repo HEAD (/home/guru/gururmm) ==="
|
||||
git -C /home/guru/gururmm log --oneline -3 2>/dev/null
|
||||
echo "=== migration 048 present in repo? ==="
|
||||
ls -la /home/guru/gururmm/server/migrations/048_bsod_events.sql 2>&1
|
||||
echo "=== last-built markers ==="
|
||||
ls -la /opt/gururmm/last-built-commit* 2>/dev/null; for f in /opt/gururmm/last-built-commit*; do [ -e "$f" ] && echo "$f => $(cat "$f")"; done
|
||||
echo "=== build activity (cargo / build scripts running?) ==="
|
||||
pgrep -a -f 'cargo|build-server|build-linux|build-windows|build-shared' 2>/dev/null | head
|
||||
echo "=== recent build logs ==="
|
||||
ls -lt /opt/gururmm/*.log /opt/gururmm/logs/*.log /home/guru/gururmm/*.log 2>/dev/null | head -8
|
||||
echo "=== server binary mtime ==="
|
||||
ls -la $(which gururmm-server 2>/dev/null) /opt/gururmm/gururmm-server /home/guru/gururmm/target/release/gururmm-server 2>/dev/null
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 45 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=62a9be8e-f4ee-4ce7-be42-7ae80bfce630
|
||||
status=failed
|
||||
=== running gururmm-server ===
|
||||
|
||||
PID STARTED ELAPSED CMD
|
||||
|
||||
863125 Fri May 29 19:12:09 2026 3-07:31:32 /opt/gururmm/gururmm-server
|
||||
|
||||
=== repo HEAD (/home/guru/gururmm) ===
|
||||
|
||||
a8d336a chore: auto-bump versions [ci-version-bum ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
echo "=== find build logs ==="
|
||||
find /opt/gururmm /var/log -maxdepth 3 -name '*.log' -newermt '2026-06-02 01:00' 2>/dev/null | head
|
||||
echo "=== webhook service log (last server-build decision) ==="
|
||||
journalctl -u gururmm-webhook --since '2026-06-02 02:00' --no-pager 2>/dev/null | grep -iE 'server|build|skip|deploy' | tail -25
|
||||
echo "=== how does build-shared decide server? grep marker logic ==="
|
||||
grep -nE 'server|last-built' /opt/gururmm/build-shared.sh 2>/dev/null | head -20
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 18); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=df37a30c-f396-43f6-95df-0a1454550e42
|
||||
status=completed
|
||||
=== find build logs ===
|
||||
|
||||
/var/log/postgresql/postgresql-14-main.log
|
||||
|
||||
/var/log/unattended-upgrades/unattended-upgrades.log
|
||||
|
||||
/var/log/gururmm-build-windows.log
|
||||
|
||||
/var/log/grafana/grafana.log
|
||||
|
||||
/var/log/gururmm-build.log
|
||||
|
||||
/var/log/gururmm-build-ma ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
echo "=== /var/log/gururmm-build.log tail (server build?) ==="
|
||||
tail -40 /var/log/gururmm-build.log 2>/dev/null
|
||||
echo "=== does build-shared.sh invoke build-server.sh? ==="
|
||||
grep -nE 'build-server' /opt/gururmm/build-shared.sh 2>/dev/null
|
||||
echo "=== webhook handler: what does it dispatch? ==="
|
||||
grep -nE 'build-shared|build-server|subprocess|Popen|call\(|run\(' /opt/gururmm/webhook-handler.py 2>/dev/null | head
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 18); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=a4aa4013-bb37-45d5-9308-68b6fbdbe2ff
|
||||
status=completed
|
||||
=== /var/log/gururmm-build.log tail (server build?) ===
|
||||
|
||||
From 172.16.3.20:azcomputerguru/gururmm
|
||||
|
||||
970ede3..4bca9f3 main -> origin/main
|
||||
|
||||
* [new branch] fix/bug-015-arp -> origin/fix/bug-015-arp
|
||||
|
||||
HEAD is now at 4bca9f3 Merg ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
# Guard: don't start if a build is already running
|
||||
if pgrep -f 'build-server.sh' >/dev/null; then echo "[ABORT] build-server.sh already running"; exit 0; fi
|
||||
if pgrep -f 'cargo build' >/dev/null; then echo "[WARN] a cargo build is running (agent build?) - proceeding, build-server has its own lock"; fi
|
||||
# Confirm deployed script is the hardened one (has backup/rollback)
|
||||
echo "=== build-server.sh safety features ==="; grep -nE 'backup|rollback|is-active|BACKUP|cp .*\.bak|lock' /opt/gururmm/build-server.sh | head
|
||||
echo "=== repo HEAD (must contain migration 048) ==="; git -C /home/guru/gururmm log --oneline -1
|
||||
echo "=== launching build-server.sh detached ==="
|
||||
rm -f /tmp/bsod-server-deploy.log
|
||||
nohup bash /opt/gururmm/build-server.sh > /tmp/bsod-server-deploy.log 2>&1 &
|
||||
echo "launched pid=$!"
|
||||
sleep 3
|
||||
echo "=== first lines ==="; head -20 /tmp/bsod-server-deploy.log 2>/dev/null
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
bash /d/claudetools/.claude/scripts/post-bot-alert.sh "[DEPLOY] Mike deploying gururmm-server 0.3.37 via build-server.sh (BSOD ingest + migration 048) on 172.16.3.30" >/dev/null 2>&1 || true
|
||||
```
|
||||
Output: cmd=32d82748-c31f-4c3e-972f-a6c37cad864a
|
||||
status=completed
|
||||
[ABORT] build-server.sh already running
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
PID=$(pgrep -f 'build-server.sh' | head -1)
|
||||
echo "=== build-server.sh process ==="
|
||||
ps -o pid,lstart,etime,cmd -p "$PID" 2>/dev/null
|
||||
echo "=== child cargo/rustc activity ==="
|
||||
pgrep -a -f 'cargo|rustc' | head -5
|
||||
echo "=== log file (via open fds) ==="
|
||||
for fd in /proc/$PID/fd/1 /proc/$PID/fd/2; do readlink "$fd" 2>/dev/null; done
|
||||
echo "=== tail candidate logs ==="
|
||||
for L in /var/log/gururmm-build.log /var/log/gururmm-build-server.log /tmp/build-server*.log; do [ -e "$L" ] && { echo "--- $L (tail) ---"; tail -15 "$L"; }; done
|
||||
echo "=== which commit is being built ==="
|
||||
git -C /home/guru/gururmm log --oneline -1
|
||||
echo "=== current server binary mtime (unchanged until deploy) ==="
|
||||
ls -la /opt/gururmm/gururmm-server
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=6b230eb1-81c3-460a-bcdb-da18ed9c6678
|
||||
status=completed
|
||||
=== build-server.sh process ===
|
||||
|
||||
PID STARTED ELAPSED CMD
|
||||
|
||||
1736968 Tue Jun 2 02:48:00 2026 00:00 sh -c PID=$(pgrep -f 'build-server.sh' | head -1) echo "=== build-server.sh process ===" ps -o pid,lstart,etime,cm ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
# Real detection: a running build compiles the server; look for cargo in the gururmm/server dir, exclude this shell
|
||||
RUNNING=$(ps -eo pid,cmd | grep -E '[/]opt/gururmm/build-server\.sh' | grep -v "$$" | head -1)
|
||||
if [ -n "$RUNNING" ]; then echo "[INFO] build-server already running: $RUNNING"; else
|
||||
rm -f /tmp/bsod-server-deploy.log
|
||||
setsid bash /opt/gururmm/build-server.sh > /tmp/bsod-server-deploy.log 2>&1 < /dev/null &
|
||||
echo "[OK] launched build-server.sh (setsid detached)"
|
||||
fi
|
||||
sleep 6
|
||||
echo "=== deploy log (first 25) ==="; head -25 /tmp/bsod-server-deploy.log 2>/dev/null
|
||||
echo "=== compiling? ==="; ps -eo etime,cmd | grep -E '[c]argo build|[r]ustc' | head -3
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"; echo "$CID" > /tmp/srvbuild_cmd
|
||||
for i in $(seq 1 15); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=f764256b-14ce-44c1-b249-b9469e06eb0e
|
||||
status=completed
|
||||
[INFO] build-server already running: 1736984 sh -c # Real detection: a running build compiles the server; look for cargo in the gururmm/server dir, exclude this shell RUNNING=$(ps -eo pid,cmd | grep -E '[/]opt/gururmm/build-server\.sh' | grep ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
rm -f /tmp/bsod-server-deploy.log
|
||||
setsid bash /opt/gururmm/build-server.sh > /tmp/bsod-server-deploy.log 2>&1 < /dev/null &
|
||||
echo "launched wrapper, child started"
|
||||
sleep 10
|
||||
echo "=== deploy log (head 40) ==="; head -40 /tmp/bsod-server-deploy.log 2>/dev/null
|
||||
echo "=== server binary mtime (changes only after deploy) ==="; ls -la /opt/gururmm/gururmm-server
|
||||
echo "=== build artifacts dir activity ==="; ls -lat /home/guru/gururmm/server/target/release/ 2>/dev/null | head -4
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 45 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 18); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=4424c646-6708-456a-bba1-cc4781ceafaf
|
||||
status=completed
|
||||
launched wrapper, child started
|
||||
|
||||
=== deploy log (head 40) ===
|
||||
|
||||
2026-06-02 02:49:34 - === Starting server build ===
|
||||
|
||||
HEAD is now at a8d336a chore: auto-bump versions [ci-version-bump]
|
||||
|
||||
2026-06-02 02:49:34 - Building version: 0.3.37
|
||||
|
||||
Compili ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
# wait up to ~220s for build/deploy to finish
|
||||
for i in $(seq 1 44); do
|
||||
M=$(stat -c %Y /opt/gururmm/gururmm-server 2>/dev/null); NOW=$(date +%s); AGE=$((NOW-M))
|
||||
if [ "$AGE" -lt 150 ]; then echo "[binary updated ${AGE}s ago]"; break; fi
|
||||
if grep -qiE 'complete|rollback|FAILED|panic|error\[' /tmp/bsod-server-deploy.log 2>/dev/null; then echo "[log signaled end]"; break; fi
|
||||
sleep 5
|
||||
done
|
||||
echo "=== deploy log tail ==="; tail -25 /tmp/bsod-server-deploy.log 2>/dev/null
|
||||
echo "=== binary mtime ==="; ls -la /opt/gururmm/gururmm-server
|
||||
echo "=== service ==="; systemctl is-active gururmm-server; systemctl show -p ActiveEnterTimestamp --value gururmm-server 2>/dev/null
|
||||
PID=$(pgrep -f '/opt/gururmm/gururmm-server' | head -1); echo "server pid=$PID started=$(ps -o lstart= -p $PID 2>/dev/null)"
|
||||
echo "=== migration 048 / bsod_events ==="
|
||||
DBU=$(cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | sed -n 's/^DATABASE_URL=//p')
|
||||
psql "$DBU" -tAc "SELECT to_regclass('public.bsod_events');" 2>&1
|
||||
psql "$DBU" -tAc "SELECT version,success FROM _sqlx_migrations WHERE version=48;" 2>&1
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 250 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 60); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 6;; esac; done
|
||||
```
|
||||
Output: cmd=35a852e6-4bda-4555-8502-cbe64c940a74
|
||||
status=completed
|
||||
[log signaled end]
|
||||
|
||||
=== deploy log tail ===
|
||||
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
||||
|
||||
warning: function `get_unresolved_watchdog_alert` is never used
|
||||
|
||||
--> src/db/watchdog_alerts.rs:65:14
|
||||
|
||||
|
|
||||
|
||||
65 | pub async fn get_unresolved_watchdog_al ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
OLD=$(stat -c %Y /opt/gururmm/gururmm-server)
|
||||
RES="STILL_BUILDING"
|
||||
for i in $(seq 1 44); do
|
||||
NEWM=$(stat -c %Y /opt/gururmm/gururmm-server)
|
||||
if [ "$NEWM" != "$OLD" ]; then RES="DEPLOYED"; break; fi
|
||||
sleep 5
|
||||
done
|
||||
echo "result=$RES"
|
||||
echo "=== deploy log tail ==="; tail -12 /tmp/bsod-server-deploy.log 2>/dev/null
|
||||
echo "=== binary ==="; ls -la /opt/gururmm/gururmm-server
|
||||
echo "=== service ==="; systemctl is-active gururmm-server; systemctl show -p ActiveEnterTimestamp --value gururmm-server
|
||||
PID=$(pgrep -f '/opt/gururmm/gururmm-server' | head -1); echo "server pid=$PID started=$(ps -o lstart= -p $PID 2>/dev/null)"
|
||||
if [ "$RES" = "DEPLOYED" ]; then
|
||||
DBU=$(cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | sed -n 's/^DATABASE_URL=//p')
|
||||
echo "=== bsod_events table ==="; psql "$DBU" -tAc "SELECT to_regclass('public.bsod_events');" 2>&1
|
||||
echo "=== migration 048 row ==="; psql "$DBU" -tAc "SELECT version,success FROM _sqlx_migrations WHERE version=48;" 2>&1
|
||||
fi
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 250 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 60); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 6;; esac; done
|
||||
```
|
||||
Output: Command running in background with ID: bkv8u6e51. Output is being written to: C:\Users\guru\AppData\Local\Temp\claude\D--claudetools\f5631414-899d-4951-99a7-4db2dd6e022f\tasks\bkv8u6e51.output. You will be notified when it completes. To check interim output, use Read on that file path.
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"
|
||||
# re-auth (server restarted)
|
||||
VAULT="/d/claudetools/.claude/scripts/vault.sh"
|
||||
EMAIL=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-email)
|
||||
PASS=$(bash "$VAULT" get-field infrastructure/gururmm-server.sops.yaml credentials.gururmm-api.admin-password)
|
||||
TOKEN=$(curl -s -m 10 -X POST "$RMM/api/auth/login" -H "Content-Type: application/json" --data-binary @- <<JSON | jq -r '.token // empty'
|
||||
{"email":"$EMAIL","password":"$PASS"}
|
||||
JSON
|
||||
)
|
||||
[ -n "$TOKEN" ] && echo "[OK] server API up, re-authed" || { echo "[ERROR] server API not responding yet"; exit 0; }
|
||||
echo "$TOKEN" > /tmp/rmm_tok
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
echo "=== deploy log tail ==="; tail -18 /tmp/bsod-server-deploy.log 2>/dev/null
|
||||
echo "=== binary mtime (expect today if deployed) ==="; ls -la /opt/gururmm/gururmm-server
|
||||
PID=$(pgrep -f '/opt/gururmm/gururmm-server' | head -1); echo "server pid=$PID started=$(ps -o lstart= -p $PID 2>/dev/null)"
|
||||
echo "=== running version ==="; systemctl is-active gururmm-server
|
||||
DBU=$(cat /proc/$PID/environ 2>/dev/null | tr '\0' '\n' | sed -n 's/^DATABASE_URL=//p')
|
||||
echo "=== bsod_events table ==="; psql "$DBU" -tAc "SELECT to_regclass('public.bsod_events');" 2>&1
|
||||
echo "=== migration 048 row ==="; psql "$DBU" -tAc "SELECT version,success,execution_time FROM _sqlx_migrations WHERE version=48;" 2>&1
|
||||
echo "=== columns ==="; psql "$DBU" -tAc "SELECT string_agg(column_name,',' ORDER BY ordinal_position) FROM information_schema.columns WHERE table_name='bsod_events';" 2>&1
|
||||
SHEOF
|
||||
PAYLOAD=$(jq -n --arg ct shell --arg cmd "$SH" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$GURU_AGENT/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 20); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 5;; esac; done
|
||||
```
|
||||
Output: [OK] server API up, re-authed
|
||||
cmd=1f20acfb-b960-4267-99a2-694ad583792f
|
||||
status=completed
|
||||
=== deploy log tail ===
|
||||
|
||||
8 | pub enum MSPBackupsError {
|
||||
|
||||
| --------------- variant in this enum
|
||||
|
||||
...
|
||||
|
||||
16 | NotConfigured,
|
||||
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
|
|
||||
|
||||
= note: `MSPBackupsError` has a derived ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
AID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
echo "=== GURU-5070 now ==="
|
||||
curl -s "$RMM/api/agents" -H "Authorization: Bearer $TOKEN" | jq -r --arg id "$AID" '.[]|select(.id==$id)|"hostname=\(.hostname) version=\(.agent_version) connected=\(.is_connected) channel? last_seen=\(.last_seen)"'
|
||||
echo "=== effective channel ==="; curl -s "$RMM/api/agents/$AID/effective-channel" -H "Authorization: Bearer $TOKEN"; echo
|
||||
echo "=== windows fleet versions (confirm stable held at 0.6.50) ==="
|
||||
curl -s "$RMM/api/agents" -H "Authorization: Bearer $TOKEN" | jq -r '.[]|select(.os_type=="windows")|"\(.hostname): v\(.agent_version)"' | sort | head -20
|
||||
```
|
||||
Output: === GURU-5070 now ===
|
||||
hostname=GURU-5070 version=0.6.51 connected=null channel? last_seen=2026-06-02T02:55:42.104167Z
|
||||
|
||||
=== effective channel ===
|
||||
{"channel":"beta","source":"agent"}
|
||||
=== windows fleet versions (confirm stable held at 0.6.50) ===
|
||||
ACCT2-PC: v0.6.51
|
||||
|
||||
ACG-DC16: v0.6.51
|
||||
|
||||
AD2: v0.6.28
|
||||
|
||||
ANN- ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
AID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
read -r -d '' PS <<'PSEOF' || true
|
||||
$wm = "C:\ProgramData\GuruRMM\bsod-seen.json"
|
||||
Write-Output "=== bsod-seen.json exists? ==="
|
||||
if (Test-Path $wm) { Write-Output "YES"; Get-Content $wm -Raw } else { Write-Output "NO (detector may not have run yet)" }
|
||||
Write-Output "=== 0x116 dump sha256 ==="
|
||||
$d = "C:\Windows\Minidump\060126-16718-01.dmp"
|
||||
if (Test-Path $d) { $h = (Get-FileHash $d -Algorithm SHA256).Hash.ToLower(); Write-Output $h } else { Write-Output "dump missing" }
|
||||
Write-Output "=== agent service / version ==="
|
||||
Get-Service GuruRMMAgent | Select-Object Name,Status | Format-Table -AutoSize | Out-String
|
||||
Write-Output "=== agent log lines mentioning bsod (last 20) ==="
|
||||
$log = Get-ChildItem "C:\ProgramData\GuruRMM\*.log" -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Desc | Select-Object -First 1
|
||||
if ($log) { Select-String -Path $log.FullName -Pattern "bsod|BSOD|bugcheck|minidump|0x116|VIDEO_TDR" -SimpleMatch:$false | Select-Object -Last 20 | ForEach-Object { $_.Line } } else { Write-Output "no log file" }
|
||||
PSEOF
|
||||
PAYLOAD=$(jq -n --arg ct powershell --arg cmd "$PS" --argjson to 50 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$AID/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 18); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 5;; esac; done
|
||||
```
|
||||
Output: cmd=6d621969-2d82-4d1d-a461-4f7b204e6f84
|
||||
status=completed
|
||||
=== bsod-seen.json exists? ===
|
||||
|
||||
|
||||
YES
|
||||
|
||||
|
||||
{"seen_sha256":["0b490e2755b40e5726bac69ed99ec95bac8c52e6bf309b3233fc286f01cc2534"],"last_scan":null}
|
||||
|
||||
|
||||
=== 0x116 dump sha256 ===
|
||||
|
||||
|
||||
0b490e2755b40e5726bac69ed99ec95bac8c52e6bf309b3233fc286f01cc2534
|
||||
|
||||
|
||||
=== ... [truncated]
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
AID="c043d9ac-4020-4cab-a5f4-b90213d11e73"
|
||||
read -r -d '' PS <<'PSEOF' || true
|
||||
$wm = "C:\ProgramData\GuruRMM\bsod-seen.json"
|
||||
Copy-Item $wm "$wm.bak" -Force
|
||||
'{"seen_sha256":[],"last_scan":null}' | Set-Content -Path $wm -Encoding ascii -NoNewline
|
||||
Write-Output "=== watermark now ==="; Get-Content $wm -Raw
|
||||
Write-Output "=== restarting GuruRMMAgent to force startup re-scan ==="
|
||||
Start-Process powershell -ArgumentList '-NoProfile','-Command','Start-Sleep 2; Restart-Service GuruRMMAgent -Force' -WindowStyle Hidden
|
||||
Write-Output "restart scheduled (detached)"
|
||||
PSEOF
|
||||
PAYLOAD=$(jq -n --arg ct powershell --arg cmd "$PS" --argjson to 40 '{command_type:$ct, command:$cmd, timeout_seconds:$to}')
|
||||
CID=$(curl -s -X POST "$RMM/api/agents/$AID/command" -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "$PAYLOAD" | jq -r '.command_id // empty')
|
||||
echo "cmd=$CID"
|
||||
for i in $(seq 1 12); do R=$(curl -s "$RMM/api/commands/$CID" -H "Authorization: Bearer $TOKEN"); S=$(echo "$R"|jq -r '.status//empty'); case "$S" in completed|failed|cancelled|interrupted) echo "status=$S"; echo "$R"|jq -r '.stdout//""'; E=$(echo "$R"|jq -r '.stderr//""'); [ -n "$E" ]&&{ echo "--stderr--";echo "$E";}; break;; *) sleep 4;; esac; done
|
||||
```
|
||||
Output: cmd=93e603d0-b501-46f5-9c37-0d8e8584101e
|
||||
status=completed
|
||||
=== watermark now ===
|
||||
|
||||
|
||||
{"seen_sha256":[],"last_scan":null}
|
||||
|
||||
|
||||
=== restarting GuruRMMAgent to force startup re-scan ===
|
||||
|
||||
|
||||
restart scheduled (detached)
|
||||
|
||||
```
|
||||
RMM="http://172.16.3.30:3001"; TOKEN=$(cat /tmp/rmm_tok)
|
||||
GURU_AGENT="5e5a7ebc-95ea-40c8-b965-6ec15d63e157"
|
||||
read -r -d '' SH <<'SHEOF' || true
|
||||
PID=$(pgrep -f '/opt/gururmm/gururmm-server'|head -1)
|
||||
DBU=$(cat /proc/$PID/environ 2>/dev/null|tr '\0' '\n'|sed -n 's/^DATABASE_URL=//p')
|
||||
Reference in New Issue
Block a user