Compare commits

...
4 Commits
Author SHA1 Message Date
Codex 02fefa1e4e fix(autostart): run from repo root + visible console at logon
autostart-run.bat did 'cd /d %~dp0' -> scripts/, but web-vnc.exe/webvnc.conf/
go.mod live in the repo root, so the binary was never found and web-vnc never
started after reboot. Now it cd's to %~dp0.. (repo root).

The task was ONSTART/RU SYSTEM (session 0) so it could not show a window, making
failures invisible. install-autostart.bat now registers ONLOGON /RL HIGHEST as the
current user -> a visible console opens at logon. autostart-run.bat sets a window
title, prints status, stays open while web-vnc serves, and pauses on fatal errors
(no binary / no webvnc.conf) so the reason is visible. Docs updated.
2026-08-06 01:09:47 +03:00
Codex f315618bfc fix(autostart): wait for the VNC server before starting web-vnc
autostart-run.bat checked 5900 once at startup; at boot the UltraVNC service may
not be up yet, so web-vnc either spawned a 2nd VNC server (conflict) or started
serving on :8080 before the VNC server was ready, breaking browser connections.

Now autostart-run.bat polls 127.0.0.1:5900 for up to ~30s (one PowerShell loop:
TcpClient + Start-Sleep 1, exits on first accepted connection) and only then
launches web-vnc.exe -- without --spawn when 5900 already listens, or spawning a
local server (portable vnc\winvnc.exe / tvnserver.exe, else auto-detect) if it
never came up. Docs (AGENTS.md, README.md) updated.
2026-08-05 16:14:39 +03:00
Codex 9b8ee94dd5 refactor: move user-facing scripts to repo root; fix set-password ordering
- install-autostart.bat, uninstall-autostart.bat, restart-autostart.bat,
  open-firewall.bat moved from scripts/ to the repo root (next to run.bat and
  set-password.bat). Internal helpers (autostart-run.bat, ensure-vnc-password.ps1,
  get-novnc.*, get-vnc.ps1, list-ips.ps1) stay in scripts/. autostart-run.bat is
  kept in scripts/ because the scheduled task /TR points at it; moving it would
  break already-installed tasks.
- Updated all references (set-password.bat, run.bat, install/restart-autostart.bat,
  AGENTS.md, README.md).
- set-password.bat: write webvnc.conf BEFORE the UltraVNC sync so the web password
  is configured even if ensure-vnc-password.ps1 fails / its UAC is dismissed
  (previously 'Password is not configured' from install-autostart.bat when the
  sync blocked before conf was written).
- AGENTS.md / README.md structure + autostart sections updated for the new layout.
2026-08-05 15:38:39 +03:00
Codex 754f77a8d0 feat: autostart as a service + separate password setup (set-password.bat)
- set-password.bat: one-time password setup -> writes webvnc.conf (HASH + VNC_PASSWORD), syncs UltraVNC via ensure-vnc-password.ps1; if the 'web-vnc' task is installed, restarts it (elevated) to reload the new password, skipping restart when the password is unchanged.
- run.bat: no longer prompts for the password; reads it from webvnc.conf (asks to run set-password.bat first if absent). Also clears --spawn-command (not just --spawn) when 5900 is already listening, to avoid spawning a 2nd VNC server.
- scripts/autostart-run.bat: non-interactive launcher for the scheduled task (reads webvnc.conf, finds only a LOCAL VNC server, never downloads at boot).
- scripts/install-autostart.bat / uninstall-autostart.bat: register/remove a 'web-vnc' scheduled task (ONSTART, SYSTEM, HIGHEST) via schtasks.
- scripts/restart-autostart.bat: restart the task to apply a new password; checks whether web-vnc.exe is running (stop+start, or just start).
- .gitignore: ignore webvnc.conf (secret).
- AGENTS.md / README.md: document the autostart flow, set-password.bat, the new scripts, and that the running gateway must be restarted to apply a password change.
2026-08-05 15:23:58 +03:00
10 changed files with 522 additions and 66 deletions
+3
View File
@@ -32,3 +32,6 @@ internal/server/static/novnc-original.html
# Downloaded VNC server (installed via scripts/get-vnc.ps1)
/vnc/
# Stored web access password + hash (created by set-password.bat)
webvnc.conf
+73 -15
View File
@@ -59,26 +59,38 @@ internal/relay websocket.go — RFC6455 на stdlib; relay.go — WS
internal/vncspawner кросс-ОС поиск/запуск VNC-сервера (build-теги по ОС)
internal/server HTTP-роуты, /api/status, middleware сессии, embed.FS
internal/server/static встроенные ассеты (vnc.html, favicon.ico + noVNC core/app/vendor)
Все пользовательские точки входа лежат в корне репозитория:
set-password.bat настройка пароля: спрашивает пароль, генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored) — ДО синхронизации UltraVNC, чтобы веб-пароль был настроен даже если синк упадёт или UAC отменят; затем синхронизирует VNC-пароль UltraVNC (scripts/ensure-vnc-password.ps1). Если установлено задание «web-vnc» — перезапускает его через restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONLOGON /RL HIGHEST, от имени текущего пользователя) — открывает ВИДИМУЮ консоль с scripts/autostart-run.bat при входе пользователя в систему; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf. (Вариант ONSTART/SYSTEM скрыт в session 0 и окна не показывает — поэтому не используется.)
uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
open-firewall.bat открыть порт 8080 в Windows Firewall (от админа, один раз).
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
Внутренние помощники (вызываются другими скриптами, не пользователем) — в scripts/:
scripts/autostart-run.bat launcher для автостарта: лежит в scripts/, но работает относительно КОРНЯ репо (cd /d %~dp0.. — web-vnc.exe/webvnc.conf/vnc/go.mod там). Читает webvnc.conf, ПОЛЛИТ 127.0.0.1:5900 до ~30 c (UltraVNC-сервис может ещё подниматься) и только потом запускает web-vnc.exe — без --spawn если 5900 уже слушает, иначе спавнит локальный VNC-сервер (portable vnc\\winvnc.exe/tvnserver.exe или авто-детект). Ничего не качает на старте. Запускается ВИДИМОЙ консолью (задание из install-autostart.bat): окно остаётся, пока web-vnc serves; при фатальной ошибке/no binary/no conf — pause, чтобы окно не закрылось и было видно причину. Вызывается также restart-autostart.bat.
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat.
scripts/get-novnc.{ps1,sh} скачать noVNC
scripts/get-vnc.ps1 скачать портативный UltraVNC в vnc/ (с верификацией zip)
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (от админа)
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с паролем из run.bat (пишет только при несовпадении; UAC только при смене) — вызывается из run.bat
run.bat запуск в один клик (спрашивает только пароль); синхронизирует VNC-пароль UltraVNC с введённым (см. ensure-vnc-password.ps1); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
```
## Соглашения и подводные камни
- **Кодировка файлов `.bat`:** **UTF-8 с BOM**, окончания строк **CRLF**, и `chcp 65001 >nul`
после `@echo off`. Именно **BOM** заставляет `cmd` читать .bat как UTF-8 независимо
от OEM-кодировки консоли (без BOM + `chcp 65001` в `cmd` даёт `????` — cmd читает
файл по OEM-кодировке, а не по `chcp`). BOM + `chcp 65001` проверено: кириллица в
`echo`/`set /p`/`for /f` отображается корректно, `@echo off` работает. Альтернатива
без BOM — включить системную опцию «Beta: Use Unicode UTF-8 for worldwide language
support» (тогда OEM-кодировка = 65001), но это влияет на всю систему (нужен reboot,
могут ломаться legacy-приложения под cp866/cp1251) — поэтому по умолчанию BOM.
Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`.
- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
- **Кодировка файлов `.bat`:** текст всех `.bat`**English ASCII**, окончания строк **CRLF**,
**без BOM** и без `chcp` — ASCII читается `cmd` одинаково при любой OEM-кодировке, так
что кириллица в `echo`/`set /p`/`for /f` больше не нужна. Это намеренный отход от
кириллицы в bat-файлах (см. коммит «Translate run.bat and open-firewall.bat to English
ASCII»). Исторически кириллица в `.bat` требовала **UTF-8 с BOM** + `chcp 65001 >nul`
после `@echo off` (BOM заставлял `cmd` читать файл как UTF-8; без BOM + `chcp 65001` в
`cmd` давал `????`, т.к. cmd читает файл по OEM-кодировке, а не по `chcp`). Альтернатива
без BOM — системная опция «Beta: Use Unicode UTF-8 for worldwide language support»
(OEM=65001), но она влияет на всю систему (reboot, могут ломаться legacy-приложения
под cp866/cp1251). Если когда-нибудь вернёшь кириллицу в `.bat` — пиши через
`[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`
(с BOM). Для **English ASCII** — то же, но `[Text.UTF8Encoding]::new($false)` (без BOM).- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
`Set-Content -Encoding UTF8` (ставит BOM). Используй
`[System.IO.File]::WriteAllText(path, content, [Text.UTF8Encoding]::new($false))`.
- **`.gitignore`:** бинарники игнорируются **root-anchored** (`/web-vnc`,
@@ -112,6 +124,52 @@ run.bat запуск в один клик (спрашивае
- **Hijack WebSocket:** `internal/relay` сам делает апгрейд через
`http.Hijacker`; гейтвей НЕ использует gorilla/websocket.
## Автостарт (запуск при загрузке ОС)
Чтобы gateway поднимался сам при включении машины (а не интерактивно через `run.bat`),
пароль должен быть настроен заранее и не запрашиваться при старте. Поэтому процедура:
1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, генерирует хэш
и пишет `webvnc.conf` (HASH + VNC_PASSWORD), а уже ПОТОМ синхронизирует VNC-пароль
UltraVNC (`scripts/ensure-vnc-password.ps1`) — так веб-пароль оказывается настроен,
даже если синк упадёт или UAC отменят. Файл `webvnc.conf`**секрет**, в git не
коммитится (см. `.gitignore`).
2. **Один раз (от админа)** запустить `install-autostart.bat` — регистрирует
плановое задание `web-vnc` через `schtasks /Create /SC ONLOGON /RL HIGHEST` (от имени
текущего пользователя, без `/RU SYSTEM`), которое при **входе пользователя в систему**
открывает **видимую консоль** с `scripts/autostart-run.bat`. Запуск от SYSTEM/ONSTART
намеренно не используется: он выполняется в session 0 и НЕ показывает окно на рабочем
столе, поэтому увидеть ошибки запуска было бы невозможно.
3. `scripts/autostart-run.bat`**неинтерактивный** launcher: читает `webvnc.conf`,
при необходимости собирает `web-vnc.exe` (если есть Go), затем **опрашивает
`127.0.0.1:5900` до ~30 c** (один PowerShell-проект крутит цикл try/TcpClient +
`Start-Sleep 1`; выходит сразу, как только порт принял соединение) — UltraVNC-сервис
при загрузке может ещё подниматься. Если `5900` слушает — запускает
`web-vnc.exe --password-hash <HASH> --listen :8080` **без** `--spawn` (подключается
к существующему серверу, не плодя второй). Если за ~30 c не поднялось — спавнит
локальный VNC-сервер (`--spawn-command "vnc\winvnc.exe -run"` если есть portable,
иначе `--spawn` с авто-детектом) и запускает web-vnc. На старте ничего не качает.
Задание держит процесс живым в foreground.
4. Снять автостарт: `uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
Замечания:
- Задание выполняется от имени **текущего пользователя** при его входе (видимая консоль),
а не от SYSTEM в session 0. Поэтому web-vnc может сам спавнить VNC-сервер в сеансе
пользователя (что удобнее для захвата рабочего стола, чем SYSTEM). Если уже работает
сервис UltraVNC (`uvnc_service`) и слушает 5900 — `autostart-run.bat` подключается к нему
без `--spawn`. Портативный `vnc\winvnc.exe` спавнится только если 5900 не слушает.
- Автостарт срабатывает при **входе пользователя**, а не до входа. Если нужен запуск до
логина (без окна) — это отдельный скрытый вариант ONSTART/SYSTEM; текущий по умолчанию
ориентирован на «видимую консоль после ребута/логина».
- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз
при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому
`set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через
`restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли
`web-vnc.exe`, и делает `schtasks /End` + `/Run` (или только `/Run`, если процесс не
запущен). Рестарт пропускается, если пароль не изменился (детект по старому `VNC_PASSWORD`
из `webvnc.conf`, т.к. PBKDF2-хэш всегда новый из-за соли). Если задание не установлено —
`set-password.bat` только пишет `webvnc.conf` и подсказывает `install-autostart.bat`. Для
интерактивного `run.bat` нового пароля — просто перезапусти его вручную.
## Что делать дальше (известные TODO)
- Надёжный авто-скачиватель VNC-сервера (URL UltraVNC на SourceForge нестабилен —
@@ -122,6 +180,6 @@ run.bat запуск в один клик (спрашивае
**UltraVNC как сервис (`uvnc_service`, LocalSystem):** пароль хранится в
`%ProgramData%\UltraVNC\ultravnc.ini`; задать его обычным пользователем через
tray-иконку молча не получается (нет прав на запись).
`run.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1`
`set-password.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1`
(пишет только при несовпадении; UAC только при смене пароля). VNC-пароль = первые 8 байт,
поэтому используй ASCII-пароль <= 8 символов и там, и в `run.bat`.
поэтому используй ASCII-пароль <= 8 символов и в `set-password.bat`, и в VNC-сервере.
+56 -17
View File
@@ -18,29 +18,57 @@ Go-модулей, собирается офлайн.
└─ прозрачный релей WS↔TCP
```
## Самый простой запуск (Windows) — одним батником
## Самый простой запуск (Windows)
В папке проекта есть `run.bat`. Он делает всё сам и спрашивает **только пароль**:
Запуск состоит из двух шагов: один раз задаётся пароль, затем `run.bat` поднимает
gateway без запросов.
1. **Один раз** задайте пароль:
```bat
set-password.bat
```
Спросит пароль доступа, сгенерирует хэш и сохранит его вместе с паролем в
`webvnc.conf` (секрет, в git не коммитится), а затем синхронизирует им пароль
UltraVNC-сервиса (`scripts\ensure-vnc-password.ps1`, UAC только при смене).
Веб-пароль оказывается настроен, даже если синк UltraVNC упадёт или UAC отменят.
Используйте ASCII-пароль длиной до 8 символов (VNC-пароль = первые 8 байт).
2. **Запустите gateway**:
```bat
run.bat
```
Что делает `run.bat`:
1. Если `web-vnc.exe` отсутствует — собирает его (нужен установленный Go).
Если Go нет — подсказывает, что сделать.
2. Если noVNC-клиент ещё не встроен — пытается его скачать (нужен интернет).
Без интернета продолжит работу, но в браузере будет страница-заглушка.
3. Спрашивает пароль доступа.
4. Генерирует из него хэш.
5. Ищет VNC-сервер: если он не установлен — пытается скачать портативный
UltraVNC (`scripts\get-vnc.ps1`) и запускать его.
6. Выводит список всех адресов для подключения (`http://localhost:8080` и
`http://<каждый IPv4 машины>:8080`) и запускает сервер с флагом `--spawn`.
`run.bat` собирает `web-vnc.exe` (нужен Go, если бинарника нет), встраивает
noVNC-клиент (качает при наличии интернета), находит/докачивает VNC-сервер,
читает пароль из `webvnc.conf` (больше не спрашивает), печатает адреса
(`http://localhost:8080` и `http://<каждый IPv4 машины>:8080`) и запускает
сервер с флагом `--spawn`. Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) —
запускается без `--spawn`, подключаясь к существующему серверу.
После запуска откройте в браузере один из выведенных адресов,
введите тот же пароль — и попадёте на рабочий стол.
### Автостарт при загрузке ОС (вместо ручного `run.bat`)
```bat
set-password.bat :: один раз: пароль -> webvnc.conf
install-autostart.bat :: один раз (от админа): плановое задание «web-vnc»
```
`install-autostart.bat` регистрирует через `schtasks` задание (`ONLOGON`, `HIGHEST`,
от имени текущего пользователя), которое **при входе в систему открывает видимую
консоль** с `scripts\autostart-run.bat` — launcher, читающий `webvnc.conf`, ждущий
`127.0.0.1:5900` до ~30 c и затем запускающий `web-vnc.exe` (не качает ничего на старте).
Окно остаётся, пока web-vnc работает; при ошибке — пауза, чтобы было видно причину.
Запуск от `SYSTEM`/`ONSTART` не используется: он в session 0 и окна не показывает.
Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`.
Снять автостарт: `uninstall-autostart.bat` (от админа).
**Смена пароля:** `web-vnc.exe` читает пароль из `webvnc.conf` только при старте и не
перечитывает его в runtime. Поэтому `set-password.bat` (если задание «web-vnc» установлено)
перезапускает его через `restart-autostart.bat` (с elevation) — тот проверяет,
запущен ли `web-vnc.exe` (если да — стоп + старт, если нет — только старт). Рестарт
пропускается, если пароль не изменился. Для интерактивного `run.bat` просто перезапустите
его вручную.
## Быстрый старт вручную (Windows)
```powershell
@@ -166,7 +194,7 @@ web-vnc --gen-hash "ваш-пароль"
По умолчанию Windows Firewall блокирует входящие подключения. Один раз
выполните от имени администратора:
```bat
scripts\open-firewall.bat
open-firewall.bat
```
Это откроет входящий TCP-порт 8080. (`run.bat` выводит адреса и подсказку.)
@@ -182,11 +210,22 @@ internal/relay WebSocket на stdlib (RFC 6455) + мост WS↔TCP
internal/vncspawner кросс-ОС поиск и запуск VNC-сервера
internal/server HTTP-роуты, middleware сессии, встроенная статика
internal/server/static встроенные веб-ассеты (vnc.html + core/app/vendor noVNC)
Пользовательские точки входа — в корне репозитория:
run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает)
set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC
install-autostart.bat автостарт при входе (schtasks ONLOGON/HIGHEST, видимая консоль) — от админа
uninstall-autostart.bat снять автостарт — от админа
restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа
open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored)
Внутренние помощники — в scripts/ (вызываются другими скриптами):
scripts/autostart-run.bat launcher автостарта (видимая консоль): cd в корень репо, читает webvnc.conf, ждёт 5900 до ~30 c, запускает web-vnc (без --spawn, если VNC уже слушает); pause на ошибке
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC (вызывается из set-password.bat)
scripts/get-novnc.{ps1,sh} скачать noVNC во встроенную статику
scripts/get-vnc.ps1 скачать портативный VNC-сервер (UltraVNC) в папку vnc/
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
run.bat запуск в один клик (спрашивает только пароль)
```
## Кросс-компиляция под другую ОС
+59
View File
@@ -0,0 +1,59 @@
@echo off
REM ============================================================
REM install-autostart.bat - register web-vnc as a startup task.
REM Creates a scheduled task "web-vnc" that runs at YOUR logon
REM (as the current user, with highest privileges available to
REM you) and opens a VISIBLE console window running
REM scripts\autostart-run.bat. The console stays open while
REM web-vnc serves, and pauses on error so you can see why it
REM did not start.
REM
REM Why logon (not boot/SYSTEM): a task that runs as SYSTEM at
REM boot runs in session 0 and CANNOT show a window on your
REM desktop, so you would never see its output. Running at your
REM logon, in your session, makes the console visible. (If you
REM need it before any user logs in, that requires the hidden
REM SYSTEM/boot variant - which is invisible by design.)
REM Requires administrator rights (auto-elevates).
REM Run set-password.bat first to configure the password.
REM ============================================================
cd /d "%~dp0"
REM Admin check + auto-elevate.
net session >nul 2>nul
if errorlevel 1 (
echo Requesting administrator rights ...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
if not exist "webvnc.conf" (
echo [error] Password is not configured. Run set-password.bat first.
pause
exit /b 1
)
if not exist "scripts\autostart-run.bat" (
echo [error] scripts\autostart-run.bat not found.
pause
exit /b 1
)
set "TASK=web-vnc"
set "CMD=%~dp0scripts\autostart-run.bat"
echo Creating scheduled task "%TASK%" (at logon, current user, highest, visible) ...
schtasks /Create /TN "%TASK%" /TR "cmd /c \"%CMD%\"" /SC ONLOGON /RL HIGHEST /F
if errorlevel 1 (
echo [error] Could not create the task.
pause
exit /b 1
)
echo.
echo Done. web-vnc will start automatically when you log in: a console
echo window will open and stay while it serves. Close that window to stop it.
echo Start it now (without re-logging-in):
echo schtasks /Run /TN "%TASK%"
echo Remove it with: uninstall-autostart.bat
echo.
pause
+58
View File
@@ -0,0 +1,58 @@
@echo off
REM ============================================================
REM restart-autostart.bat - restart the "web-vnc" task so the
REM running gateway reloads webvnc.conf (e.g. after set-password.bat
REM changed the password). web-vnc.exe reads the hash and the VNC
REM password only once at startup, so a restart is the only way to
REM apply a new password to the live gateway.
REM
REM It first checks whether web-vnc.exe is actually running:
REM - running -> stop the task (schtasks /End) and start it again;
REM - not running -> just start it (no /End).
REM Requires administrator rights (the task was created elevated), so it
REM auto-elevates. Called from set-password.bat, or run manually.
REM ============================================================
cd /d "%~dp0"
net session >nul 2>nul
if errorlevel 1 (
echo Requesting administrator rights ...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
set "TASK=web-vnc"
schtasks /Query /TN "%TASK%" >nul 2>nul
if errorlevel 1 (
echo [error] Task "%TASK%" is not installed. Run install-autostart.bat first.
pause
exit /b 1
)
REM --- Is web-vnc.exe currently running? ---
set "RUNNING=0"
tasklist /FI "IMAGENAME eq web-vnc.exe" 2>nul | findstr /I /B /C:"web-vnc.exe" >nul
if not errorlevel 1 set "RUNNING=1"
if "%RUNNING%"=="1" (
echo web-vnc.exe is running - restarting task "%TASK%" ...
schtasks /End /TN "%TASK%" >nul 2>nul
REM give the previous process a moment to release port 8080
timeout /t 2 /nobreak >nul
) else (
echo web-vnc.exe is NOT running - just starting task "%TASK%" ...
)
schtasks /Run /TN "%TASK%"
if errorlevel 1 (
echo [error] Could not start the task.
pause
exit /b 1
)
echo.
echo Done. web-vnc reloaded the password from webvnc.conf.
echo Check it at http://localhost:8080
echo.
pause
+28 -31
View File
@@ -1,6 +1,9 @@
@echo off
REM ============================================================
REM web-vnc launcher - one-click start, asks only for the password.
REM web-vnc launcher - starts the gateway without prompting.
REM The password is set up once with set-password.bat (stored in
REM webvnc.conf). If webvnc.conf is missing, this script tells you
REM to run set-password.bat first.
REM ============================================================
cd /d "%~dp0"
@@ -70,41 +73,39 @@ echo Install UltraVNC/TightVNC manually or retry: scripts\get-vnc.ps1
echo.
:vncdone
REM --- 4. Password ---
:getpw
set "PW="
set /p "PW=Enter access password: "
if "%PW%"=="" goto emptypw
goto gotpw
:emptypw
echo Password cannot be empty.
goto getpw
:gotpw
REM --- 4b. Sync UltraVNC password with the one entered (only when it differs) ---
echo Syncing UltraVNC password with the one entered. It will ask for admin rights if they differ...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - continuing.
REM --- 5. Password hash + same password for the VNC server ---
echo Generating password hash ...
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
if "%HASH%"=="" goto hashfail
REM --- 4. Stored password (set up once via set-password.bat) ---
if not exist "webvnc.conf" goto nopwconf
set "HASH="
set "VNC_PW="
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do (
if /i "%%a"=="HASH" set "HASH=%%b"
if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b"
)
if "%HASH%"=="" goto nopwconf
if "%VNC_PW%"=="" goto nopwconf
REM The same password is auto-sent to noVNC to authenticate against the VNC server.
set "WEBVNC_VNC_PASSWORD=%PW%"
set "PW="
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
set "VNC_PW="
goto havepw
:nopwconf
echo [error] Password is not configured yet.
echo Run set-password.bat once to set the password, then start run.bat.
echo.
pause
exit /b 1
:havepw
REM --- 6. Available addresses ---
REM --- 5. Available addresses ---
echo.
echo === Addresses to connect to (port 8080) ===
echo http://localhost:8080
for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\list-ips.ps1"') do echo http://%%a:8080
echo.
echo If it does not open from another machine, run once as administrator:
echo scripts\open-firewall.bat
echo open-firewall.bat
echo.
REM --- 7. Launch ---
REM --- 6. Launch ---
echo Starting web-vnc on http://localhost:8080
echo Stop: Ctrl+C
echo.
@@ -114,6 +115,7 @@ powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient('127.0.0
if not errorlevel 1 (
echo VNC server already listening on 127.0.0.1:5900 - connecting to it without --spawn.
set "SPAWNFLAG="
set "SPAWNARGS="
)
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
echo.
@@ -125,8 +127,3 @@ exit /b
echo Build failed.
pause
exit /b 1
:hashfail
echo [error] Could not generate the password hash.
pause
exit /b 1
+105
View File
@@ -0,0 +1,105 @@
@echo off
REM ============================================================
REM autostart-run.bat - launcher used by the scheduled task
REM created by install-autostart.bat. Runs in a VISIBLE console
REM window (install-autostart.bat registers it at logon, as the
REM current user, so the window is visible - unlike a hidden
REM SYSTEM/boot task). It reads the password from webvnc.conf,
REM WAITS for the VNC server on 127.0.0.1:5900 (the UltraVNC
REM service may still be starting), and only then starts
REM web-vnc.exe in the foreground. If no VNC server comes up,
REM it spawns a local one. On any fatal error it pauses so the
REM window stays open and you can read why it did not start.
REM
REM This script lives in scripts/ but operates relative to the
REM REPO ROOT (web-vnc.exe, webvnc.conf, vnc\, ./cmd/web-vnc are
REM there), so it cd's to %~dp0.. first.
REM Exit codes: 0 = server ran and stopped; 1 = no binary;
REM 2 = password not configured; other = web-vnc error.
REM ============================================================
title web-vnc autostart
cd /d "%~dp0.."
echo.
echo === web-vnc autostart ===
echo Working dir: %CD%
echo.
REM --- 1. Binary (build if Go is available, else fail) ---
if exist "web-vnc.exe" goto havebin
where go >nul 2>nul
if errorlevel 1 goto nobinary
echo Building web-vnc.exe ...
go build -o web-vnc.exe .\cmd\web-vnc
if errorlevel 1 goto nobinary
:havebin
if not exist "web-vnc.exe" goto nobinary
REM --- 2. Stored password ---
if not exist "webvnc.conf" goto noconf
set "HASH="
set "VNC_PW="
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do (
if /i "%%a"=="HASH" set "HASH=%%b"
if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b"
)
if "%HASH%"=="" goto noconf
if "%VNC_PW%"=="" goto noconf
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
set "VNC_PW="
REM --- 3. Wait for the VNC server on 127.0.0.1:5900 ---
REM At boot/logon the UltraVNC service may still be starting.
REM Poll up to ~30 s (one PowerShell process loops internally) so we do
REM NOT spawn a 2nd server and do NOT serve before the VNC server is
REM ready. Exits 0 as soon as 5900 accepts a connection, 1 on timeout.
echo Waiting for VNC server on 127.0.0.1:5900 (up to 30 s) ...
powershell -NoProfile -Command "for($i=0;$i -lt 30;$i++){try{$c=New-Object Net.Sockets.TcpClient('127.0.0.1',5900);$c.Close();exit 0}catch{};Start-Sleep -Seconds 1};exit 1"
if not errorlevel 1 goto vnc_up
:vnc_down
echo VNC server is not up after the wait.
set "SPAWN_CMD="
if exist "vnc\winvnc.exe" set "SPAWN_CMD=vnc\winvnc.exe -run"
if exist "vnc\tvnserver.exe" if not defined SPAWN_CMD set "SPAWN_CMD=vnc\tvnserver.exe -run"
if defined SPAWN_CMD goto have_spawn
set "SPAWNARGS="
set "SPAWNFLAG=--spawn"
echo No local VNC server; web-vnc will auto-detect and spawn one.
goto launch
:have_spawn
set "SPAWNARGS=--spawn-command "%SPAWN_CMD%""
set "SPAWNFLAG=--spawn"
echo Starting local VNC server: %SPAWN_CMD%
goto launch
:vnc_up
echo VNC server is up - connecting to it without --spawn.
set "SPAWNARGS="
set "SPAWNFLAG="
:launch
REM --- 4. Launch (foreground; the console window stays open while it serves) ---
echo.
echo Starting web-vnc on http://localhost:8080
echo Close this window to stop it.
echo.
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
echo.
echo Server stopped (exit code %errorlevel%).
pause
exit /b
:nobinary
echo.
echo [error] web-vnc.exe not found and could not be built.
echo Build it once with: go build -o web-vnc.exe .\cmd\web-vnc
echo or run run.bat interactively.
pause
exit /b 1
:noconf
echo.
echo [error] webvnc.conf not found. Run set-password.bat first to set the password.
pause
exit /b 2
+111
View File
@@ -0,0 +1,111 @@
@echo off
REM ============================================================
REM set-password.bat - setup of the web access password.
REM Asks for the password, generates a hash and saves it together
REM with the VNC password to webvnc.conf (gitignored). AFTER that
REM (so the web password is configured even if the next step fails)
REM it syncs the UltraVNC service password via ensure-vnc-password.ps1.
REM
REM If the "web-vnc" autostart task is installed, this script also
REM restarts it (elevated, via restart-autostart.bat) so the
REM running gateway reloads the new password. The restart is skipped
REM only when the password did not actually change. restart-autostart.bat
REM checks whether web-vnc.exe is running and stops+starts it, or just
REM starts it.
REM ============================================================
cd /d "%~dp0"
echo.
echo === web-vnc: password setup ===
echo.
REM --- 1. Binary (needed for --gen-hash) ---
if exist "web-vnc.exe" goto havebin
where go >nul 2>nul
if errorlevel 1 (
echo [error] web-vnc.exe not found and Go is not installed.
echo Build it first with: go build -o web-vnc.exe .\cmd\web-vnc
echo or run run.bat once interactively.
pause
exit /b 1
)
echo Building web-vnc.exe ...
go build -o web-vnc.exe .\cmd\web-vnc
if errorlevel 1 (
echo Build failed.
pause
exit /b 1
)
:havebin
REM --- 2. Remember the previous password (to detect a real change) ---
set "OLD_PW="
if exist "webvnc.conf" (
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do if /i "%%a"=="VNC_PASSWORD" set "OLD_PW=%%b"
)
REM --- 3. Ask password ---
:getpw
set "PW="
set /p "PW=Enter access password (ASCII, max 8 chars for VNC): "
if "%PW%"=="" (
echo Password cannot be empty.
goto getpw
)
REM --- 4. Generate hash ---
echo Generating password hash ...
set "HASH="
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
if "%HASH%"=="" (
echo [error] Could not generate the password hash.
pause
exit /b 1
)
REM --- 5. Save to webvnc.conf (overwrite) ---
REM Done BEFORE the UltraVNC sync so the web password is configured
REM even if the sync below fails or is cancelled (UAC).
echo HASH=%HASH%> "webvnc.conf"
echo VNC_PASSWORD=%PW%>> "webvnc.conf"
set "HASH="
echo Saved to webvnc.conf.
REM --- 6. Sync UltraVNC service password (UAC only if it differs) ---
echo Syncing UltraVNC password with the one entered ...
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - the web password is still saved.
REM --- 7. Apply to the running gateway (if the autostart task is installed) ---
REM web-vnc.exe reads the hash + VNC password only at startup, so a
REM restart is required for the new password to take effect.
schtasks /Query /TN "web-vnc" >nul 2>nul
if errorlevel 1 goto no_task
REM Skip the restart if the password did not change (the running gateway
REM already accepts it; PBKDF2 hash is always new due to salt, so we compare
REM the entered password with the old VNC_PASSWORD from webvnc.conf).
if not defined OLD_PW goto do_restart
if /i not "%OLD_PW%"=="%PW%" goto do_restart
echo.
echo Password unchanged - the running gateway keeps accepting it. No restart needed.
echo If the gateway is not running, start it with: restart-autostart.bat ^(admin^)
goto cleanup
:do_restart
echo.
echo Applying the new password to the "web-vnc" task ^(needs admin^) ...
powershell -NoProfile -Command "Start-Process -FilePath '%~dp0restart-autostart.bat' -Verb RunAs -Wait"
goto cleanup
:no_task
echo.
echo Autostart task "web-vnc" is not installed.
echo To start on every boot, run once as administrator:
echo install-autostart.bat
:cleanup
set "PW="
set "OLD_PW="
echo.
pause
+26
View File
@@ -0,0 +1,26 @@
@echo off
REM ============================================================
REM uninstall-autostart.bat - remove the web-vnc startup task.
REM Deletes the scheduled task "web-vnc" created by
REM install-autostart.bat. Requires administrator rights
REM (auto-elevates).
REM ============================================================
cd /d "%~dp0"
net session >nul 2>nul
if errorlevel 1 (
echo Requesting administrator rights ...
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
exit /b
)
set "TASK=web-vnc"
echo Removing scheduled task "%TASK%" ...
schtasks /Delete /TN "%TASK%" /F
if errorlevel 1 (
echo [error] Could not remove the task (maybe it does not exist).
pause
exit /b 1
)
echo Done.
pause