diff --git a/AGENTS.md b/AGENTS.md index 2a480d9..9489784 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -59,18 +59,22 @@ 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 ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf. +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= и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore). + +Внутренние помощники (вызываются другими скриптами, не пользователем) — в scripts/: +scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-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 с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat -set-password.bat настройка пароля: спрашивает пароль, синхронизирует VNC-пароль UltraVNC (ensure-vnc-password.ps1), генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored). Если установлено задание «web-vnc» — перезапускает его через scripts/restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс). -webvnc.conf создаётся set-password.bat; содержит HASH= и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore). -run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему -scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-autostart.bat. -scripts/install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf. -scripts/uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа). -scripts/restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную. ``` ## Соглашения и подводные камни @@ -125,11 +129,12 @@ scripts/restart-autostart.bat перезапускает задание «web-vn Чтобы gateway поднимался сам при включении машины (а не интерактивно через `run.bat`), пароль должен быть настроен заранее и не запрашиваться при старте. Поэтому процедура: -1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, синхронизирует - VNC-пароль UltraVNC (`scripts/ensure-vnc-password.ps1`), генерирует хэш и пишет - `webvnc.conf` (HASH + VNC_PASSWORD). Файл `webvnc.conf` — **секрет**, в git не +1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, генерирует хэш + и пишет `webvnc.conf` (HASH + VNC_PASSWORD), а уже ПОТОМ синхронизирует VNC-пароль + UltraVNC (`scripts/ensure-vnc-password.ps1`) — так веб-пароль оказывается настроен, + даже если синк упадёт или UAC отменят. Файл `webvnc.conf` — **секрет**, в git не коммитится (см. `.gitignore`). -2. **Один раз (от админа)** запустить `scripts/install-autostart.bat` — регистрирует +2. **Один раз (от админа)** запустить `install-autostart.bat` — регистрирует плановое задание `web-vnc` через `schtasks /Create /SC ONSTART /RU SYSTEM /RL HIGHEST`, которое при загрузке ОС запускает `scripts/autostart-run.bat`. 3. `scripts/autostart-run.bat` — **неинтерактивный** launcher: читает `webvnc.conf`, @@ -139,7 +144,7 @@ scripts/restart-autostart.bat перезапускает задание «web-vn процесс живым). Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) — запускает **без** `--spawn` и **без** `--spawn-command`, подключаясь к существующему серверу (иначе попытка породить второй VNC-сервер конфликтовала бы с сервисом). -4. Снять автостарт: `scripts/uninstall-autostart.bat` (от админа) — `schtasks /Delete`. +4. Снять автостарт: `uninstall-autostart.bat` (от админа) — `schtasks /Delete`. Замечания: - Задание выполняется от `SYSTEM`, поэтому VNC-сервер, отдавающий рабочий стол, должен @@ -149,7 +154,7 @@ scripts/restart-autostart.bat перезапускает задание «web-vn - **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому `set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через - `scripts\restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли + `restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли `web-vnc.exe`, и делает `schtasks /End` + `/Run` (или только `/Run`, если процесс не запущен). Рестарт пропускается, если пароль не изменился (детект по старому `VNC_PASSWORD` из `webvnc.conf`, т.к. PBKDF2-хэш всегда новый из-за соли). Если задание не установлено — diff --git a/README.md b/README.md index 53a7f86..3d90aa4 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,10 @@ gateway без запросов. ```bat set-password.bat ``` - Спросит пароль доступа, синхронизирует им пароль UltraVNC-сервиса - (`scripts\ensure-vnc-password.ps1`, UAC только при смене), сгенерирует хэш и - сохранит его вместе с паролем в `webvnc.conf` (секрет, в git не коммитится). + Спросит пароль доступа, сгенерирует хэш и сохранит его вместе с паролем в + `webvnc.conf` (секрет, в git не коммитится), а затем синхронизирует им пароль + UltraVNC-сервиса (`scripts\ensure-vnc-password.ps1`, UAC только при смене). + Веб-пароль оказывается настроен, даже если синк UltraVNC упадёт или UAC отменят. Используйте ASCII-пароль длиной до 8 символов (VNC-пароль = первые 8 байт). 2. **Запустите gateway**: @@ -50,17 +51,17 @@ gateway без запросов. ```bat set-password.bat :: один раз: пароль -> webvnc.conf -scripts\install-autostart.bat :: один раз (от админа): плановое задание «web-vnc» +install-autostart.bat :: один раз (от админа): плановое задание «web-vnc» ``` `install-autostart.bat` регистрирует через `schtasks` задание (`ONSTART`, `SYSTEM`, `HIGHEST`), которое при загрузке запускает `scripts\autostart-run.bat` — неинтерактивный launcher, читающий `webvnc.conf` и не качающий ничего на старте. Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`. -Снять автостарт: `scripts\uninstall-autostart.bat` (от админа). +Снять автостарт: `uninstall-autostart.bat` (от админа). **Смена пароля:** `web-vnc.exe` читает пароль из `webvnc.conf` только при старте и не перечитывает его в runtime. Поэтому `set-password.bat` (если задание «web-vnc» установлено) -перезапускает его через `scripts\restart-autostart.bat` (с elevation) — тот проверяет, +перезапускает его через `restart-autostart.bat` (с elevation) — тот проверяет, запущен ли `web-vnc.exe` (если да — стоп + старт, если нет — только старт). Рестарт пропускается, если пароль не изменился. Для интерактивного `run.bat` просто перезапустите его вручную. @@ -190,7 +191,7 @@ web-vnc --gen-hash "ваш-пароль" По умолчанию Windows Firewall блокирует входящие подключения. Один раз выполните от имени администратора: ```bat - scripts\open-firewall.bat + open-firewall.bat ``` Это откроет входящий TCP-порт 8080. (`run.bat` выводит адреса и подсказку.) @@ -206,17 +207,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 ONSTART/SYSTEM) — от админа +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 для автостарта (читает webvnc.conf) +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 интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает) -set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC -webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored) -scripts/autostart-run.bat неинтерактивный launcher для автостарта (читает webvnc.conf) -scripts/install-autostart.bat автостарт при загрузке ОС (schtasks ONSTART/SYSTEM) — от админа -scripts/uninstall-autostart.bat снять автостарт — от админа -scripts/restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа ``` ## Кросс-компиляция под другую ОС diff --git a/scripts/install-autostart.bat b/install-autostart.bat similarity index 96% rename from scripts/install-autostart.bat rename to install-autostart.bat index 893db86..7ee818e 100644 --- a/scripts/install-autostart.bat +++ b/install-autostart.bat @@ -43,6 +43,6 @@ echo. echo Done. web-vnc will start automatically on every boot. echo Start it now (without rebooting): echo schtasks /Run /TN "%TASK%" -echo Remove it with: scripts\uninstall-autostart.bat +echo Remove it with: uninstall-autostart.bat echo. pause \ No newline at end of file diff --git a/scripts/open-firewall.bat b/open-firewall.bat similarity index 100% rename from scripts/open-firewall.bat rename to open-firewall.bat diff --git a/scripts/restart-autostart.bat b/restart-autostart.bat similarity index 95% rename from scripts/restart-autostart.bat rename to restart-autostart.bat index 94eda42..0ed31b9 100644 --- a/scripts/restart-autostart.bat +++ b/restart-autostart.bat @@ -25,7 +25,7 @@ set "TASK=web-vnc" schtasks /Query /TN "%TASK%" >nul 2>nul if errorlevel 1 ( - echo [error] Task "%TASK%" is not installed. Run scripts\install-autostart.bat first. + echo [error] Task "%TASK%" is not installed. Run install-autostart.bat first. pause exit /b 1 ) diff --git a/run.bat b/run.bat index 143a5f4..1ccf8de 100644 --- a/run.bat +++ b/run.bat @@ -102,7 +102,7 @@ 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 --- 6. Launch --- diff --git a/set-password.bat b/set-password.bat index 5a94261..507fd99 100644 --- a/set-password.bat +++ b/set-password.bat @@ -1,16 +1,17 @@ @echo off REM ============================================================ REM set-password.bat - setup of the web access password. -REM Asks for the password, syncs the UltraVNC service password, -REM generates a hash and saves both to webvnc.conf (gitignored). -REM After this, run.bat and the autostart task start without asking. +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 scripts\restart-autostart.bat) so the +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 (the running gateway -REM already accepts it). restart-autostart.bat checks whether -REM web-vnc.exe is running and stops+starts it, or just starts it. +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" @@ -52,12 +53,7 @@ if "%PW%"=="" ( goto getpw ) -REM --- 4. 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 - continuing. - -REM --- 5. Generate hash --- +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" @@ -67,12 +63,19 @@ if "%HASH%"=="" ( exit /b 1 ) -REM --- 6. Save to webvnc.conf (overwrite) --- +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. @@ -86,20 +89,20 @@ 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: scripts\restart-autostart.bat ^(admin^) +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 '%~dp0scripts\restart-autostart.bat' -Verb RunAs -Wait" +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 scripts\install-autostart.bat +echo install-autostart.bat :cleanup set "PW=" diff --git a/scripts/uninstall-autostart.bat b/uninstall-autostart.bat similarity index 100% rename from scripts/uninstall-autostart.bat rename to uninstall-autostart.bat