# Массовый деплой ButtonTask по SSH (без adb) Заменяет `deploy-adb.ps1` там, где adb на устройстве отключён. Вместо USB использует Ethernet: инструмент сам выдаёт устройствам IP (мини-DHCP-сервер) и заливает бандл по SSH. Можно подключать сразу несколько устройств через свитч — каждое обрабатывается параллельно. После установки в конфиг устройства пишется static `final_ip` (по умолчанию `192.168.1.60`), затем устройство **выключается (`halt`)**, чтобы на свитче не поднималось несколько девайсов с одним и тем же IP. ## Важно про сеть Инструмент работает только в **изолированной сети**. Используйте отдельный свитч, к которому подключены: - один сетевой адаптер компьютера; - пустые устройства ButtonTask. На этом сегменте не должно быть других устройств и внешних аплинков. ## Что нужно один раз настроить 1. **Python 3** — установить с [python.org](https://www.python.org/downloads/) (обычная установка, ничего дополнительно ставить не нужно — скрипт не использует сторонние библиотеки). 2. Если в `config.json` стоит `"auth": "password"` — скачайте `plink.exe` и `pscp.exe` с [putty.org](https://www.putty.org/) и положите их в эту же папку, рядом с `mass_deploy.py`. Если `"auth": "key"` — ничего докачивать не нужно, используется встроенный в Windows 10/11 `ssh.exe`/`scp.exe`. 3. На сетевом адаптере, подключённом к выделенному свитчу, задать **статический IP** (Панель управления -> Сеть -> Свойства адаптера -> IPv4): например `192.168.1.201`, маска `255.255.255.0`, без шлюза. Этот адрес должен совпадать с `server_ip` / `bind_ip` в `config.json`. 4. Если на этом адаптере когда-либо включали "Общий доступ к подключению к интернету" (Internet Connection Sharing) — отключить. Он тоже слушает DHCP-порт и будет конфликтовать с нашим сервером. 5. Скопировать `config.example.json` в `config.json` и заполнить: - `bundle_path` — путь к `.tgz` бандлу (можно относительно этой папки, например `../winDeployScripts/buttontask-deploy-2.33.tgz`); - `device_user` / `device_password` (на голых платах обычно `linaro`/`linaro`); - `use_sudo` — `true` (root не настроен, install идёт через `sudo -S`); - `final_ip` — static IP, который останется в `network.json` после установки (по умолчанию `192.168.1.60`); - `after_install` — `halt` (рекомендуется) или `reboot`; - `reset_config` — `false` (сохранить config на устройстве) или `true` (перезаписать `config.json` и `.master` из бандла — для переустановки); - при необходимости — диапазон `pool_start`/`pool_end` (адрес `final_ip` из пула исключается автоматически). ## Запуск ### Вариант 1 — GUI для оператора Дважды кликнуть `run-gui.bat`. Порядок работы: 1. Настроить сетевой адаптер компьютера. 2. Включить GUI. 3. Выбрать сетевой интерфейс. 4. Выбрать `.tgz` бандл. 5. При переустановке на уже настроенное устройство — включить «Полный сброс конфига». 6. Нажать `Start`. 6. Вставить устройство в изолированную сеть. 7. Дождаться статуса `ГОТОВО`. 8. Вынуть устройство и повторить для следующего. Windows спросит права администратора — нужно согласиться. ### Вариант 2 — старый CLI Дважды кликнуть `run.bat`. - Windows спросит права администратора — нужно согласиться (иначе DHCP-порт может быть занят системными службами). - Windows Firewall может спросить "разрешить программе доступ к сети" — разрешить. - Появится таблица статусов, обновляющаяся раз в секунду. Подключайте устройства к свитчу — по одному или сразу все. Каждое появится в таблице (по MAC-адресу) и пройдёт стадии: ``` discover -> acked -> ждём ssh -> заливаю -> устанавливаю -> сеть -> halt -> ГОТОВО ``` Общий алгоритм деплоя: 1. Устройство получает IP по DHCP. 2. Бандл копируется по SSH. 3. Устанавливаются пакеты и файлы из бандла. 4. Применяются `sudoers` и служебные скрипты. 5. Записывается итоговая сеть устройства. 6. Устройство выключается, чтобы избежать конфликтов после установки. Если где-то `ОШИБКА`, детали видны в таблице; полный вывод install пишется в `logs/.log`. Частая ошибка на шаге `сеть`: `Connection timed out` — SSH оборвался до записи `network.json`. Устройство после этого остаётся на DHCP; в таблице будет `ОШИБКА`, не `ГОТОВО`. С новых версий deploy-скрипта запись повторяется до 3 раз и проверяется чтением файла обратно. Когда устройство показывает `ГОТОВО` — оно выключено. Можно отключать кабель и включать уже на рабочей сети: поднимется на `final_ip` с сервисами ButtonTask. `Ctrl+C` в окне консоли — остановить инструмент. ## Повторный прогон / переустановка того же устройства IP-адреса привязываются к MAC-адресу и запоминаются в файле `leases.json` рядом с конфигом — при повторной установке то же устройство снова получит тот же DHCP-IP. SSH fingerprint'ы аналогично хранятся в `host_keys.json`. Если нужно "сбросить" привязки/ключи — удалите `leases.json` и/или `host_keys.json` (файлы создаются заново автоматически). ## device-install.sh На время install `network.json` из бандла временно прячется, а старый `/opt/buttontask/config/network.json` на устройстве удаляется — иначе при переустановке install мог бы применить static во время SSH-сессии и оборвать связь. Целевой static `final_ip` записывается уже после `INSTALL-OK` и проверяется чтением файла. `config.json` и `.master` **по умолчанию сохраняются**, если уже есть на устройстве (upgrade-safe). Для переустановки «как с завода» включите `"reset_config": true` в `config.json`, галочку в GUI или переменную `BUTTONTASK_RESET_CONFIG=1` при запуске install. ## Сборка в exe Для упаковки GUI в один exe: ```powershell powershell -ExecutionPolicy Bypass -File .\build-gui.ps1 ``` В результате появится папка `dist\sshDeploy-gui\` с: - `sshDeploy-gui.exe` - `config.json` - `config.example.json` - `README.md` - `plink.exe` - `pscp.exe` Оператору можно отдавать именно эту папку.