2026-05-08 WebOS luna-send SSH guide

This commit is contained in:
Alexey Martemyanov
2026-05-08 18:10:22 +06:00
parent 75ba4e208e
commit 882142f742
2 changed files with 180 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# WebOS TV — luna-send via SSH
TV IP: `192.168.1.75`, user: `root`
## Проблема
`luna-send` пишет вывод в tty, не в stdout. Через SSH без PTY — пусто.
## Решение — через `script`
```bash
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://...\" /tmp/o.txt; cat /tmp/o.txt"
```
## Методы
### Список запущенных приложений
```bash
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/running '{}'\" /tmp/o.txt; cat /tmp/o.txt"
```
### Закрыть приложение
```bash
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.service.applicationmanager/closeByAppId '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt"
```
### Удалить приложение (dev)
```bash
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/remove '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt"
```
### Установить ipk
```bash
scp app.ipk root@192.168.1.75:/tmp/
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.appInstallService/dev/install '{\"id\":\"APP_ID\",\"ipkUrl\":\"/tmp/app.ipk\",\"subscribe\":true}'\" /tmp/o.txt; cat /tmp/o.txt"
```
### Запустить приложение
```bash
ssh root@192.168.1.75 "script -q -c \"luna-send -n 1 -f luna://com.webos.applicationManager/launch '{\"id\":\"APP_ID\"}'\" /tmp/o.txt; cat /tmp/o.txt"
```
## Не работает
- `ares-install/ares-launch` — требует dev mode (порт 9922)
- `listRunningApps` — нет метода, правильно: `running`
- `applicationManager/remove` — нет, правильно: `appInstallService/dev/remove`
+136
View File
@@ -0,0 +1,136 @@
# Magic4PC — WebOS Client
Управление LG MagicRemote как мышью/клавиатурой на HTPC через Bazzite.
## Архитектура
- **TV (WebOS)** — app `me.wouterdek.magic4pc` + JS-сервис `me.wouterdek.magic4pc.service`
- App: React/Enact UI, слушает кнопки пульта, отправляет в сервис через luna
- Сервис: Node.js, бродкастит UDP, принимает подключение от Go-клиента на HTPC
- **HTPC (Bazzite)** — Go-клиент `~/magic4pc/`, сервис `magic4pc.service`
- Получает UDP-пакеты от TV, инжектирует ввод через `/dev/uinput`
- `inputBackKey()` → Esc в gamescope, x1 в KDE
- Репо: https://github.com/mallexxx/magic4pc_altclient (ветка `main`)
## Исходники
| Компонент | Путь |
|-----------|------|
| WebOS UI | `~/Developer/magic4pc/webos/src/views/MainPanel.js` |
| WebOS сервис | `~/Developer/magic4pc/webos/service/m4p_service.js` |
| Go клиент | `~/Developer/magic4pc_altclient/` |
| HTPC бинарник | `~/magic4pc/magic4pc` |
| HTPC сервис | `~/.config/systemd/user/magic4pc.service` (HTPC) |
| run.sh | `~/magic4pc/run.sh` (HTPC) |
## Кнопки пульта (keyCode)
| Код | Кнопка | Действие |
|-----|--------|----------|
| 406 | 🔵 Синяя | Открыть панель настроек |
| 461 | Back | Esc (gamescope) / x1 (KDE) |
| 458 | Guide | системный (не перехватывается) |
| 403 | 🔴 Красная | передаётся на HTPC |
| 415 | Play | передаётся на HTPC |
| 19 | Pause | передаётся на HTPC |
## Панель настроек (синяя кнопка)
- **Статус** — Connected to IP:port / Waiting / Service disabled
- **v1.1.0** — версия справа от статуса
- **Input source** — выбор HDMI входа
- **Enable / Disable** — старт/стоп сервиса
- **Autostart** — регистрация в EIM (запуск при переключении на HDMI)
- **Show Log / Hide Log** — лог событий и ошибок поверх видео
## Сборка WebOS app
```bash
cd ~/Developer/magic4pc/webos
NODE_OPTIONS=--openssl-legacy-provider npm run build
```
Требует `--openssl-legacy-provider` — старый webpack несовместим с Node 25.
## Деплой на TV (192.168.1.75)
TV рутован, SSH без пароля: `ssh root@192.168.1.75`
### Деплой через IPK (стандартный способ)
```bash
# Сборка
cd ~/Developer/magic4pc/webos
NODE_OPTIONS=--openssl-legacy-provider npm run build
/Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ service/ --outdir .
# Деплой на TV
scp me.wouterdek.magic4pc_1.1.0_all.ipk root@192.168.1.75:/tmp/magic4pc.ipk
ssh root@192.168.1.75 "
luna-send -n 1 'luna://com.webos.applicationManager/closeApp' '{\"id\":\"me.wouterdek.magic4pc\"}'; sleep 1
killall -9 node 2>/dev/null; sleep 1
mkdir -p /tmp/m4p_deploy && cd /tmp/m4p_deploy
ar x /tmp/magic4pc.ipk
mkdir -p data && tar xf data.tar.gz -C data
cp data/usr/palm/applications/me.wouterdek.magic4pc/main.js /media/developer/apps/usr/palm/applications/me.wouterdek.magic4pc/
cp data/usr/palm/applications/me.wouterdek.magic4pc/main.css /media/developer/apps/usr/palm/applications/me.wouterdek.magic4pc/
cp data/usr/palm/services/me.wouterdek.magic4pc.service/m4p_service.js /media/developer/apps/usr/palm/services/me.wouterdek.magic4pc.service/
luna-send -n 1 'luna://com.webos.applicationManager/launch' '{\"id\":\"me.wouterdek.magic4pc\"}'
echo deployed ok
"
```
> ⚠️ `ares-package dist/ service/` — оба аргумента обязательны, иначе сервис не попадёт в IPK.
> `killall -9 node` обязателен — WebOS кэширует Node.js сервис в памяти.
> Распаковывать IPK в отдельную папку (`/tmp/m4p_deploy`) — иначе `ar x` конфликтует с существующим `debian-binary` в `/tmp`.
### Полная переустановка через ipk (если нужны новые ресурсы/appinfo)
```bash
cd ~/Developer/magic4pc/webos
/Users/admin/webOS_TV_SDK/CLI/bin/ares-package dist/ --outdir .
scp me.wouterdek.magic4pc_1.0.0_all.ipk root@192.168.1.75:/tmp/
ssh root@192.168.1.75 "
cd /tmp && ar x me.wouterdek.magic4pc_1.0.0_all.ipk
mkdir -p /tmp/ipk_data
tar xf data.tar.gz -C /tmp/ipk_data 2>/dev/null || tar xf data.tar.xz -C /tmp/ipk_data
cp /tmp/ipk_data/usr/palm/applications/me.wouterdek.magic4pc/main.js \
/media/developer/apps/usr/palm/applications/me.wouterdek.magic4pc/
cp /tmp/ipk_data/usr/palm/services/me.wouterdek.magic4pc.service/m4p_service.js \
/media/developer/apps/usr/palm/services/me.wouterdek.magic4pc.service/
"
```
> ⚠️ `luna://com.webos.appInstallService/dev/install` требует Developer Mode.
> TV рутован → прямая копия файлов надёжнее.
### Если изменения не видны (кэш WebOS)
WebAppMgr кэширует JS. Помогает: закрыть+открыть через luna. Если нет — перезагрузка TV.
## Деплой Go-клиента на HTPC
```bash
cd ~/Developer/magic4pc_altclient
GOOS=linux GOARCH=amd64 go build -o magic4pc_new .
scp magic4pc_new bazzite@192.168.1.86:~/magic4pc/
ssh bazzite@192.168.1.86 "
systemctl --user stop magic4pc
mv ~/magic4pc/magic4pc_new ~/magic4pc/magic4pc
systemctl --user start magic4pc
"
```
## HTPC сервис
```bash
ssh bazzite@192.168.1.86 "systemctl --user status magic4pc"
ssh bazzite@192.168.1.86 "systemctl --user restart magic4pc"
```
> `enable` не используется — autostart через EIM на стороне TV.
## Известные проблемы
- **Guide (458)** — перехватывается WebOS системно, EIM-регистрация не помогает. Нет решения.
- **WebOS кэш** — после scp деплоя иногда нужна перезагрузка TV