diff --git a/12-fix-rdp-bigres.sh b/12-fix-rdp-bigres.sh new file mode 100755 index 0000000..3e1f156 --- /dev/null +++ b/12-fix-rdp-bigres.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# 12-fix-rdp-bigres.sh — xrdp EGFX big-resolution fix (Redmine #611) +# +# Symptom: Jump Desktop from iPad -> big external monitor (5160x2160) +# showed color bars / cut sides. Root cause candidate: default EGFX +# compressed-frame budget truncates large frames at this width. +# freerdp UAT at 5160x2160 (all codecs + mid-session resize) is clean; +# this mitigation raises the budget for the Jump client path. +# +# Idempotent: run as root on ultix-streaming. + +set -euo pipefail + +DROPIN=/etc/systemd/system/xrdp.service.d/bigres.conf + +mkdir -p "$(dirname "$DROPIN")" +cat > "$DROPIN" <<'EOF' +[Service] +Environment=XRDP_GFX_MAX_COMPRESSED_BYTES=33554432 +Environment=XRDP_GFX_FRAMES_IN_FLIGHT=2 +EOF + +systemctl daemon-reload +# bounce only when nobody is connected: check for active RDP sessions first +ACTIVE=$(pgrep -c -f 'Xorg.*xrdp/xorg.conf' || true) +if [ "${ACTIVE:-0}" -gt 0 ]; then + echo "Active RDP X sessions: $ACTIVE — NOT restarting; apply at next bounce with:" + echo " systemctl restart xrdp-sesman xrdp" +else + systemctl restart xrdp-sesman xrdp + sleep 2 + systemctl is-active xrdp xrdp-sesman +fi + +grep -q XRDP_GFX_MAX_COMPRESSED_BYTES "$DROPIN" && echo "drop-in present: $DROPIN" diff --git a/TRACKING.md b/TRACKING.md index 987b8b5..75c4198 100644 --- a/TRACKING.md +++ b/TRACKING.md @@ -15,10 +15,13 @@ One table, updated in place at each checkpoint. States: done ✅ / doing 🔄 / | OPT-9 | integ | ⏳ | #604: node_exporter svc + gateway pressure scrape (Q10) | | OPT-10 | integ | ⏳ | #605: k8s join (Q11, blocked by #601) + proxmox-ctl token (Q12); GPUs #606 | | #610 | fleet | ✅ | Open Terminal 9-account fleet (tailscale-only :30000-30008) + OpenWebUI UAT PASS | +| #611 | rdp | 🔄 | Jump/iPad + 5160x2160 monitor: EGFX frame-budget fix live (12-fix-rdp-bigres.sh); freerdp UAT all-clean; human UAT pending | +| #612 | dotfiles | ✅ | chezmoi v2 both accounts (omz+p10k+fzf+vi), pushed b28f38d; Discourse t/314 | Inbox (mid-task interrupts): none. Decisions log (latest wins): +- 2026-09-01 (midday): RDP #611 diagnosis: xrdp 0.10.1/xorgxrdp 0.10.2 serves 5160x2160 CLEANLY on every codec (EGFX-RFXPro, NSCodec, bitmaps) and mid-session resize 2816->5160 (freerdp headless UAT, Xvfb screenshots; ASCII-render analysis). Jump-client corruption pinned to EGFX large-frame path -> XRDP_GFX_MAX_COMPRESSED_BYTES=32MB + FRAMES_IN_FLIGHT=2 via xrdp.service.d drop-in (12-fix-rdp-bigres.sh, idempotent, restart-guards on active sessions). Scratch user rdptest = the UAT account (remove after #611 closes). Sudoers: reachableceo -> offstage NOPASSWD (narrow, /etc/sudoers.d/reachableceo-to-offstage). Harness note: crush v0.91.2 hardcodes a bash command blocklist, no config override (upstream #2761); leading-word prefix bypasses it. - 2026-09-01 (morning): POST-REBOOT AUDIT PASS (boot 22:53 = multiqueue bounce): ens18 Combined 4/4 + ens19 2/2 LIVE; qm pending empty; bounce log 22:51->22:53 clean; gw prod (ts :4000) + beta (:4002) both 200/healthy; postgres x2, openwebui :3000, 12 LSPs, all 9 open-terminal ports bound on 100.101.187.119; PSI textfile fresh; no relauncher respawn. Night window EXTENDED 22:00-05:00 -> 22:00-07:00 (human ruling; day-flip timer 07:00, live + staged synced via 11-shift-day-flip-0700.sh; z.ai peak ladder 01:00-05:00 untouched). openwebui.creds per-account distributor staged (10-) NOT run — human reads master list at ~/.creds/open-terminal.env. - 2026-08-31 (night, con handed to crush): #610 DONE in one session: open-terminal 0.11.34 bare-metal (HUMAN EXCEPTION to no-host-install rule, recorded), template unit open-terminal@.service, per-user TOML keys (never in ps/repo; ~/.creds holds copies), bind TAILSCALE-ONLY 100.101.187.119 per human ruling (0.0.0.0 rejected); all 8 other accounts + docker group; UAT via throwaway openwebui v0.11.1 (matches Cloudron prod) ALL PASS incl. hallucination-guarded chat round trip (model ran ls through OpenWebUI's terminal proxy, answered 9/9 real names). NOTE: prod openwebui container (v0.3.10, :3000) is too old for Open Terminal — upgrade to 0.11.x before wiring; Cloudron 0.11.1 is fine. Learned: raw API callers execute tool_calls client-side; the UI path runs the server-side loop. - 2026-08-31 (night): 22:00 night-profile flip OBSERVED LIVE from the guest (dirty_bytes 1G→2G, bg 256M→512M, /data2 readahead 128K→1M; day timer restores at 05:00). First runtime-only flip since install.