goMH — это специализированный инструмент для технической поддержки систем автоматизации ресторанов (iiko, Syrve). Программа предоставляет единый CLI/TUI интерфейс для автоматизации рутинных задач: установки ПО, настройки оборудования, диагностики и управления удаленным доступом в среде Windows.
Проект призван заменить разрозненные скрипты (bat/ps1) и ручные действия инженеров внедрения и поддержки. Все операции выполняются через интерактивное меню с автоматическим контролем ошибок и логированием.
- Дистрибутивы: Установка iiko и Syrve (Front, Back, Chain). Поддержка Portable-версий и Патчей.
- Плагины: Интеллектуальная установка плагинов iikoFront с проверкой совместимости API.
- Диагностика: Сбор логов (включая вложенные архивы),
tail -fдля логов, очистка временных файлов. - Периферия: Настройка сканеров ШК через виртуальные COM-порты (VComCaster).
- Утилиты: Запуск и автоматическое скачивание OrderCheck и FrontTools.
- Оборудование: Установка драйверов ФР (Атол, Штрих, Poscenter) с умной очисткой старых версий.
- Сеть: Настройка проброса портов через FRPC с автоматическим поиском свободных портов на сервере.
- Удаленный доступ: Установка TeamViewer (Host), LiteManager, агента сбора данных ФР (POSRelayd).
В проекте появился стабильный non-interactive режим для внешнего запуска из saga/adapters:
goMH.exe automation run --request .\request.json
Get-Content .\request.json | goMH.exe automation run --stdin
goMH.exe automation list-operationsКлючевые свойства режима:
stdoutсодержит только финальный JSON response.stderrсодержит только диагностические/status-сообщения.- automation слой использует существующие
app/modruntimeиtaskqueue. - поддерживаются
dry_run,timeout_seconds,working_dir,root_overrideи machine-readable task log.
Подробная спецификация контракта, примеры request/response и exit codes описаны в документе docs/automation-cli.md.
После рефакторинга приложение использует единый runtime для GUI и TUI:
taskqueue— единая очередь задач, статусов, прогресса и task-логов.app/modruntime— общий слой выполнения модулей с привязкойAssetManagerиWinUtilsкTaskContext.logstream— отдельный параллельный механизм для просмотра логов; это больше не частный случай queue-задачи.core.QueueModule— единый контракт модуля: конфигурация, построение плана, выполнение.
Коротко по режимам:
- постановка задачи из TUI и GUI идет через один и тот же
modruntime.Service; - queue-задачи пишут прогресс и строки в task-log, доступный обоим интерфейсам;
- просмотр лога может работать отдельно от очереди: в
stdoutили в task-контекст; - завершение задач и их статусы пишутся в общий лог утилиты через пакет
logging.
Модуль для работы с продуктами iiko и Syrve.
- Источники:
- Официальные: Скачивание релизных версий с официальных источников iiko и Syrve.
- Portable: Загрузка портативных версий (ZIP) с внутреннего FTP/HTTP источника.
- Portable-режим:
- Автоматическая распаковка архивов (с учетом вложенности).
- Создание ярлыка на рабочем столе с ключом
/AdditionalTmpFolder.
- Система патчинга (iikoFront):
- Автоматический поиск доступных патчей для установленной версии.
- Восстановление существующего бэкапа перед установкой.
- Бэкапирование заменяемых файлов.
- Откат изменений при ошибках.
Установка и обновление плагинов для iikoFront.
- Манифест: Загружает JSON-манифест доступных плагинов. Манифест генерируется скриптом ежедневного опроса ресурса патчей.
- Совместимость: Фильтрует плагины, проверяя совместимость их
ApiVersionс установленной версией iikoFront. - Автообновление: При установке iikoFront модуль может автоматически обновить критические плагины (например,
SberbankPlugin,DualConnector) до актуальных версий, сохраняя конфиги.
3. VComCaster (Сканеры ШК)
Комплексная настройка сканеров штрих-кодов в режим эмуляции COM-порта.
- Драйвер com0com: Автоматическая установка и создание виртуальной пары портов.
- Детекция оборудования: Сканирование USB-шин для поиска подключенных сканеров.
- Генерация конфига: Создание
config.iniдля маппинга физического устройства на виртуальный порт. - Интеграция с iiko: Автоматическая правка
config.xmliikoFront (прописывание порта сканера), если процесс iikoFront не запущен. - Автозапуск: Создание задачи в Планировщике Windows на автозапуск при старте компьютера.
4. FRPC (Туннелирование)
Клиент для быстрого проброса портов (Fast Reverse Proxy).
- API-интеграция: Обращается к серверу FRPS для поиска свободных портов в заданном диапазоне.
- Служба Windows: Установка через NSSM с настройкой автозапуска.
- Конфигурация: Автоматическая генерация
frpc.iniс уникальными именами секций.
Установка драйверов ККТ.
- Universal Driver Installer: Для драйверов Poscenter и KKTlab (Штрих) реализован алгоритм предварительного поиска и тихого удаления старых версий во избежание конфликтов.
- Атол: Стандартная тихая установка ДТО 10.
Набор инструментов для диагностики.
- Log Collector:
- Сбор логов за последние N дней.
- Умный поиск: сканирует не только текстовые файлы, но и распаковывает вложенные архивы (
.zip,.gz,.7z) для проверки даты изменения файлов внутри них.
- Temp Cleaner: Очистка временных файлов по маскам путей.
- Live Log: Просмотр логов в реальном времени (аналог
tail -f). - OrderCheck & FrontTools:
- Утилиты не зашиты в сборку, а скачиваются через AssetManager при первом обращении.
- Автоматическое определение типа БД iikoFront (
.sdfили.db) и выбор соответствующей версии FrontTools. - Для OrderCheck автоматическое нахождение БД Алкоплагина и предложение пользователю что открыть.
- TeamViewer: Получение динамической ссылки (Custom Design) через API TeamViewer.
- POSRelayd Agent: Установка агента сбора данных ФР, настройка службы и триггеров запуска.
- LiteManager: Тихая установка MSI.
Модуль для работы с системой Честный Знак (локальный компонент).
- Проверка наличия .NET Framework 4.8.
- Автоматическая установка .NET 4.8 при отсутствии.
- Тихая установка/обновление MSI пакета Regime.
- ОС: Windows 10/11 (x64/x86).
- Права: Запуск от имени администратора обязателен.
- Интернет: Необходим для загрузки конфига и дистрибутивов.
При запуске программа ищет config.json рядом с исполняемым файлом. Если он не найден — скачивает актуальный конфиг с центрального сервера.
Пример структуры конфига:
{
"root_path": "C:\\MH",
"logging": {
"level": "INFO",
"file_enabled": true
},
"self_update_config": {
"enabled": true,
"reference_url": "https://server.com/goMH.exe",
"hash_url": "https://server.com/goMH.md5"
},
"modules": [ {"id": "iiko"}, {"id": "VComCaster"} ],
"asset_catalog": { ... }
}При запуске goMH проверяет наличие новой версии на сервере (сравнивая MD5-хеш). Если доступно обновление, программа автоматически скачивает новый EXE-файл, выполняет безопасную подмену и перезапускается.
Программа полностью управляется через файл config.json. Это позволяет менять ссылки на дистрибутивы, добавлять новые драйверы и настраивать пути без пересборки приложения.
Актуальный раздел логирования:
"logging": {
"level": "INFO",
"file_enabled": true
}Переходная совместимость:
log_levelвсе еще читается как legacy-алиас дляlogging.level;- если
logging.file_enabledне задан, файловый лог включен по умолчанию; - общий лог пишется в
goMH.logрядом с исполняемым файлом.
При запуске goMH.exe ищет конфигурацию в следующем приоритете:
- Аргумент командной строки:
goMH.exe -config="my_custom_config.json" - Локальный файл: Файл
config.json, лежащий рядом с исполняемым файлом. - Удаленный сервер (Default): Если локального файла нет, программа автоматически скачивает актуальную конфигурацию с:
http://f.serty.top/distr/installer/config.json
{
"root_path": "C:\\MH", // Корневая папка для работы (логи, временные файлы)
"assets_cache_path": "C:\\MH\\_assets", // Папка для кэширования скачанных установщиков
"logging": {
"level": "INFO", // Уровень детализации логов (debug, info, warn, error)
"file_enabled": true // Запись общего лога в goMH.log рядом с exe
},
"log_level": "INFO", // Legacy-алиас для плавной миграции старых конфигов
// Настройка самообновления
"self_update_config": {
"enabled": true,
"reference_url": "https://f.serty.top/distr/installer/goMH.exe",
"hash_url": "https://f.serty.top/distr/installer/goMH.md5"
},
// Доступные FTP-серверы (используются для загрузки драйверов и portable-версий)
"ftp_config": [
{
"host": "ftp.example.com",
"port": 21,
"user": "user",
"pass": "pass"
}
],
// Специфичные настройки дистрибутивов iiko и Syrve
"distro_config": {
"iiko": {
"components": [
{
"id": "iiko_rms_back", // Уникальное имя компонента
"menu_text": "iikoRMS BackOffice", // Текст в меню
"install_args": "/install /passive", // Аргументы установки
"run_after": "C:\\Program Files\\iiko\\iikoRMS\\Office\\BackOffice.exe", // Путь для запуска
"url_template": "https://downloads.iiko.online/{{VERSION}}/iiko/RMS/BackOffice/Setup.RMS.BackOffice.exe", // URL для загрузки офц источник
"portable_archive_key": "iiko_rms" // Ключ для поиска portable-архива
}, { ... }], // Список компонентов (Front, BackOffice)
"patches_base_url": "https://rapid.iiko.ru/versionPatches" // URL для поиска патчей
},
"syrve": { ... }, // Настройки для Syrve аналогичны iiko
"iiko_portable_sources": { // Настройки для загрузки portable-версий
"http_source": { // Отдельный HTTP-источник
"enabled": true, // Включаем-отключаем
"url": "https://f.serty.top/iikoBacks", // URL корня для загрузки
"archive_names": { // Ключ -> Шаблон имени архива
"iiko_rms": "RMSOffice{{version}}.zip", // Можно указать сложный путь до архива
"iiko_chain": "ChainOffice{{version}}.zip"
}
},
"ftp_source": { // Отдельный FTP-источник, поля аналогичны
...
}
},
"excluded_plugins": [ ... ], // Плагины, которые нужно игнорировать, достаточно фрагмента имени
"auto_update_plugins": [ ... ] // Части имен плагинов для автообновления
},
"TeamViewerConfig": {
"ShortURL": "http://get.teamviewer.com/organization_url", // короткая ссылка на скачивание актуального дистрибутива
"ApiURL": "https://get.teamviewer.com/api/CustomDesign"
},
// Настройки модуля FRPC (туннелирование)
"frpc_config": {
"install_path": "C:\\MH\\FRPC",
"server_config": {
"host": "frps.example.com",
"api_port": 443,
"tunnel_port": 50005,
"user": "admin",
"pass": "secret"
}
},
// Настройки для очистки и сбора логов
"MaintenanceConfig": { // Каталоги поддерживают wildcard (*)
"TempPaths": [ "C:\\Windows\\Temp", ... ],
"LogCollectorPaths": [ "C:\\Users\\*\\AppData\\Roaming\\iiko\\...", ... ]
},
// Каталог ресурсов (Asset Manager)
// Связывает ID ресурса с URL для скачивания
"asset_catalog": {
"7zip_installer": {
"url": "https://.../7z1900-x64.exe",
"type": "file",
"download_method": "HTTP" // Можно указать метод загрузки вручную
},
"VComCaster_Package": {
"url": "https://.../vcomcaster.zip",
"type": "zip",
"destination": "vcomcaster" // Можно указать куда распаковывать
}
},
// Список драйверов фискальных регистраторов
"fiscal_drivers_config": [ // Секция для каждого драйвера
...
]
}Файл конфигурации config.json по-умолчанию ищется рядом с .exe. Если рядом нет, он загружается с http://f.serty.top/distr/installer/config.json Чувствительных данных на FTP-серверах, указанных в конфигурации быть не должно.
Проект написан на Go 1.25.1.
# Установка зависимостей
go mod download
# Сборка (production)
go build -ldflags="-s -w" -o goMH.exe main.gomain.go: Точка входа, инициализация, главное меню.core/: Интерфейсы (Installer,AssetManager,WinUtils).app/modruntime/: Общий runtime модулей и единая постановка задач.taskqueue/: Очередь выполнения, task-логи, события и отмена.logstream/: Параллельный tail/read механизм для просмотра логов.assetmgr/: Загрузка файлов (HTTP/FTP), кэширование, распаковка (ZIP/7z).winutils/: Системные вызовы (WMI, Registry, Services, Shortcuts).modules/: Реализация бизнес-логики модулей.tui/: Пользовательский интерфейс (меню, прогресс-бары).config/: Структуры конфигурации.