A Rust proxy that translates the Belkin OmniView Remote IP Manager's proprietary e-RIC RFB protocol (Peppercon LARA, originally served via a Java applet) into a modern HTML5 KVM console. No Java anywhere in the stack.
Browser (Vite + TypeScript)
│ WebSocket (binary, RGBA blits + input events)
▼
blekin proxy (Rust, tokio + axum)
│ HTTP session (cookie + APPLET_ID extraction)
│ TCP to OmniView:443 (e-RIC RFB)
▼
Belkin OmniView Remote IP Manager → downstream KVM switch → servers
The proxy authenticates with the OmniView's web interface, establishes an e-RIC RFB session over TCP, decodes the proprietary 8bpp protocol to RGBA, and bridges video frames and input events to a browser-based console over WebSocket.
# Backend
cargo build --release -p ericrfb-proxy
# Frontend
cd crates/ericrfb-frontend
npm ci
npm run build # outputs to ../../dist/
The proxy reads config.toml or falls back to the BLEKIN_HOST environment variable:
bind = "0.0.0.0:3000"
static_dir = "dist"
[omniview]
host = "10.3.0.130"
http_port = 80
rfb_port = 443
The systemd unit runs the proxy as a service. Nginx serves the static frontend
and reverse-proxies /api/ to the proxy:
# Backend
sudo cp target/release/ericrfb-proxy /usr/local/bin/
sudo cp asset/systemd/blekin.service /etc/systemd/system/
sudo systemctl enable --now blekin.service
# Frontend
sudo cp -r dist/* /var/www/blekin.example.com/
sudo cp asset/nginx/blekin.example.conf /etc/nginx/sites-available/
sudo ln -sf /etc/nginx/sites-available/blekin.example.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
The Belkin OmniView can control a downstream KVM switch (e.g., Avocent AutoView) by sending configurable hotkey sequences when switching ports. Configure these in the Ports page of the blekin interface.
The Avocent OSCAR menu is invoked with Print Screen, then expects the port's EID (Electronic ID) typed as digits, followed by Enter. Each phase needs a pause to let the OSCAR process the input.
Recommended settings:
1000 ms (in the Ports page global settings)PRINTSCREEN-***<EID digits>-***ENTERThe * character inserts a pause of the configured duration. Three *** = 3
seconds, which gives the OSCAR reliable processing time.
Examples (with key pause = 1000ms):
| Server | Avocent EID | Hotkey |
|---|---|---|
| server-a | 01 | PRINTSCREEN-***1-***ENTER |
| server-b | 05 | PRINTSCREEN-***5-***ENTER |
| server-c | 17 | PRINTSCREEN-***1-7-***ENTER |
| server-d | 22 | PRINTSCREEN-***2-2-***ENTER |
| server-e | 31 | PRINTSCREEN-***3-1-***ENTER |
Note: don't type the leading zero in EIDs (per Avocent OSCAR convention).
The Belkin hotkey syntax uses key names connected by operators:
| Operator | Meaning |
|---|---|
+ | Press additionally (hold previous, press next) |
- | Release all pressed keys |
> | Release most recently pressed key only |
* | Pause for the configured key pause duration |
Key names: A-Z, 0-9, F1-F12, PRINTSCREEN, ENTER, ESCAPE,
LCTRL/CTRL, LALT/ALT, LSHIFT/SHIFT, SPACE, TAB, DELETE,
INSERT, HOME, END, PAGE_UP, PAGE_DOWN, UP, DOWN, LEFT, RIGHT,
BACK_SPACE, NUM_LOCK, NUMPAD0-NUMPAD9, NUMPADPLUS, NUMPADMINUS,
NUMPADMUL, NUMPAD/, NUMPADENTER, SCROLL_LOCK, BREAK, CAPS_LOCK.
The e-RIC RFB protocol is a proprietary variant of VNC/RFB developed by Peppercon (later acquired by Raritan) under the name "LARA" (LAN Attached Remote Access). It was used in several KVM-over-IP products including the Belkin OmniView Remote IP Manager (F1DE101H). The protocol shares structural similarities with standard RFB but uses its own handshake, pixel format negotiation, and encoding extensions.
This implementation was reverse-engineered from the CFR-decompiled rc.jar Java
applet that originally provided the browser-based console.
MIT
42 activities
fe5e766 doc: add README with build, config, deployment, and OSCAR hotkey guide8c2ea95 fix: account for proxy pipeline latency in switch overlay durationa57247c fix: switch overlay dismiss — use display:none and named callbackef48bd4 ci: verify publish gating (no deploy directive)d4bbe64 ci: use bracketed deploy directives to avoid false matchesf62084e ci: gate publish jobs on commit message deploy directivesedb6853 fix: switch overlay dismissal and port dropdown selection persistence2e6f80f feat: suspend input during port switch with overlay and countdown7406b4a feat: auto-resume session on page refresh35db634 fix: hotkey-based port switching and HTML entity unescaping9bd2153 fix: add __templates__ and image button coords to KVM form submissionsd503742 fix: port count change immediately updates table rows63aa9a4 feat: Send Key dropdown for browser-intercepted keysea18d97 feat: KVM port management — configuration, switching, and navigation shelldd029c7 doc: port mapping implementation planning75a51de fix: correct keyboard scancode mapping from KeyTranslator.java4f7d69c fix: Tight palette selector 0 reads two separate color bytesacf99f8 feat: phase 9 — encoding 9 (IIP) with tile-versioned delta cachee395551 chore: deployment todosc31508f feat: phase 10 — reconnection, encoding 10, disconnect button865a08d chore: setup backend environment3ba05bc chore: setup hosting environment2539a1f ci: ssh resolvedee4b0a2 ci: debug ssh8440d65 ci: debug ssh022c38b fix(ci): frontend SSH init should test UI_HOST not WS_HOST3b9ef64 ci: debug ssh99e337d ci: debug ssh5e59088 fix(ci): use --rsync-path 'sudo rsync' for privileged deploys075fef0 fix(ci): drop Node.js install step — already on runner2700821 fix(ci): use Node.js tarball instead of fnm (runner lacks unzip)2627bab ci: add publish workflow with frontend and backend deploy8692c0e feat: phase 8 — Vite/TS canvas-based KVM console frontend3bd7ee8 feat: phase 7 — proxy daemon with HTTP login and WebSocket bridgeab74f60 feat: phase 6 — keyboard/mouse input + fix Tight zlib initc8f981f feat: phase 5 — Tight decoder with zlib streams and sub-palettes21ed797 feat: phase 4 — Hextile decoder and recording example1164ffd fix: send SetPixelFormat to request 8bpp RGB332e9823af feat: phase 3 — framebuffer, raw decoder, session pump, snapshot1bd43fc feat: phase 2 — handshake, message writers, and server message dispatch07db900 style: apply rustfmt to proto.rsc4e3df5 ci: add Gitea Actions workflow for check, fmt, clippy3db2927 feat: phase 0+1 — workspace scaffold and protocol primitivesa60cee3 fix: reconcile implementation plan with decompiled Java source