SOS — компактный Windows-лаунчер/агрегатор, предназначенный для быстрого развёртывания наборов утилит (софт/антивирусные инструменты) с внешнего хранилища Mega.nz. Проект ориентирован на сценарии “прилетел на проблемную машину → быстро скачал нужное → открыл папку”.
Один exe + папка res/ с внешними бинарями. Без .NET/Java/браузерных движков.
UI на WinAPI (NWG), загрузки и фоновые операции запускаются асинхронно (Tokio).
Локальный SOCKS5 через opera-proxy.windows-amd64.exe, регион переключается (AM/EU).
Скачивание завязано на megatools.exe. Без него — только “открыть веб”.
megatools.exe.native-windows-gui (NWG) + native-windows-derivetokio (runtime + spawn)simplelog → файл sos.log (Trace)res/megatools.exe (команда dl)res/opera-proxy.windows-amd64.exe (SOCKS5)472x135, стиль POPUP (без системной рамки).SystemParametersInfoW(SPI_GETWORKAREA).res/sos_banner.bmp (ImageFrame), по клику прячет окно в трей.cmd /C start).downloads_sos через explorer.exe.SB_SETPARTS (0..380 и 380..end).2026.04.Прокси: AM | порт 7743
NWG не даёт штатного “left aligned text” для кнопок. Поэтому после инициализации UI приложение
обходит нужные кнопки, берёт HWND и добавляет стиль BS_LEFT через SetWindowLongW.
До инициализации UI создаётся именованный mutex:
Global\VasEk.SOS.Reborn.Mutex через CreateMutexW.
Если GetLastError() == ERROR_ALREADY_EXISTS, процесс завершает работу (exit(0)).
Главная функция помечена #[tokio::main], после инициализации UI запускается
NWG message loop: nwg::dispatch_thread_events().
Фоновые операции скачивания выполняются в tokio::spawn и сигналят в UI через nwg::Notice.
Arc<Mutex<Option<String>>> (путь к папке или None).NoticeSender.notice().OnNotice и выполняет post-action: обновляет статус, открывает папку, показывает ошибку.Прокси используется как локальный SOCKS5-туннель для внешних загрузок (в первую очередь Mega.nz). Включение/выключение — чекбоксом Proxy.
127.0.0.1:0."res/opera-proxy.windows-amd64.exe" -country <AM|EU> -bind-address 127.0.0.1:<port> -socks-mode
CREATE_NO_WINDOW.ProxyManager.set_country() при активном прокси выполняется stop/start (порт может измениться).
Скачивание контента реализовано через внешний CLI res/megatools.exe.
Приложение не содержит собственного клиента Mega, только оркестрирует вызовы.
Downloader::download(name, link, use_proxy, proxy_port, ...).downloads_sos\<name>."res/megatools.exe" dl [--proxy socks5://127.0.0.1:<port>] --path "downloads_sos\<name>" "<mega-url>"
sleep(3s) перед запуском megatools.CREATE_NO_WINDOW.explorer.File already exists — это не считается ошибкой, UI просто открывает папку.
На плохом/отсутствующем интернете внешние процессы (megatools.exe, opera-proxy...)
могут зависнуть. Чтобы не оставлять зомби, “Выход” выполняет принудительное убийство по имени процесса.
ProxyManager.stop() (kill + wait на Child).
taskkill /F /T /IM megatools.exe
taskkill /F /T /IM opera-proxy.windows-amd64.exe
nwg::stop_thread_dispatch().taskkill по имени прибивает все процессы с таким именем в контексте пользователя. Это сделано намеренно (простота/надёжность), но может быть “шире”, чем хотелось бы в редких окружениях.
sos.log, уровень Trace.
Для Windows в бинарь вшивается manifest (comctl32.dll v6) через embed-manifest,
чтобы контролы выглядели “нормально”, а не как привет из XP.
Скрипт запускает cargo build --release и копирует sos.exe в файл релизного имени.
/
├─ Cargo.toml
├─ Cargo.lock
├─ build.rs
├─ build.bat
├─ src/
│ ├─ main.rs (UI, события, single-instance, statusbar, exit policy)
│ ├─ downloader.rs (запуск megatools, прокси-аргументы, Notice sync)
│ └─ proxy.rs (opera-proxy lifecycle, country AM/EU, free port)
└─ res/
├─ icon.ico
├─ sos_banner.bmp
├─ megatools.exe
└─ opera-proxy.windows-amd64.exe
downloads_sos\...sos.logtaskkill /IM по имени — намеренно грубо.Command::output() (блокирующий), но выполняется в отдельной tokio-задаче; UI-поток не блокируется.