Save Operating System (SOS) — Technical Specification

Документ: полная спецификация текущего состояния проекта • Платформа: Windows • Язык: Rust 2021 • Метка статуса UI: 2026.0.5

1. Обзор

SOS — компактный Windows-лаунчер/агрегатор, предназначенный для быстрого развёртывания наборов утилит (софт/антивирусные инструменты) с внешнего хранилища Mega.nz. Проект ориентирован на сценарии “прилетел на проблемную машину → быстро скачал нужное → открыл папку”.

Портативность

Один exe + папка res/ с внешними бинарями. Без .NET/Java/браузерных движков.

Неблокирующий UI

UI на WinAPI (NWG), загрузки и фоновые операции запускаются асинхронно (Tokio).

Обход блокировок

Локальный SOCKS5 через opera-proxy.windows-amd64.exe, регион переключается (AM/EU).

Жёсткая привязка

Скачивание завязано на megatools.exe. Без него — только “открыть веб”.

2. Цели и не-цели

2.1. Цели

  • Минимальный “вход” для пользователя: кнопка → скачалось → открылась папка.
  • Простой UI, быстрое позиционирование на экране, отсутствие лишних окон/консолей.
  • Локальный прокси для обхода ограничений (DPI/блокировки), без системной установки.
  • Тихая работа: сворачивание в трей, скрытые дочерние процессы.

2.2. Не-цели

  • Не менеджер пакетов и не “обновлятор Windows”.
  • Не гарантирует криптографическую целостность контента (хэши/подписи не проверяются).
  • Не пытается быть кроссплатформенным (Win-only).
  • Не содержит встроенного HTTP-клиента Mega — вся работа через внешний megatools.exe.

3. Технологический стек

Язык / Edition
Rust 2021
UI
native-windows-gui (NWG) + native-windows-derive
Асинхронность
tokio (runtime + spawn)
Логирование
simplelog → файл sos.log (Trace)
Скачивание
Внешний бинарь res/megatools.exe (команда dl)
Прокси
Внешний бинарь res/opera-proxy.windows-amd64.exe (SOCKS5)

4. UI/UX (главное окно и меню)

4.1. Геометрия и позиционирование

4.2. Верхняя панель навигации

4.3. Баннер и нижняя панель

4.4. StatusBar

4.5. Левое выравнивание текста кнопок (UI hack)

NWG не даёт штатного “left aligned text” для кнопок. Поэтому после инициализации UI приложение обходит нужные кнопки, берёт HWND и добавляет стиль BS_LEFT через SetWindowLongW.

5. Runtime/потоки/события

5.1. Single Instance (защита от повторного запуска)

До инициализации UI создаётся именованный mutex: Global\VasEk.SOS.Reborn.Mutex через CreateMutexW. Если GetLastError() == ERROR_ALREADY_EXISTS, процесс завершает работу (exit(0)).

5.2. UI + Tokio

Главная функция помечена #[tokio::main], после инициализации UI запускается NWG message loop: nwg::dispatch_thread_events().

Фоновые операции скачивания выполняются в tokio::spawn и сигналят в UI через nwg::Notice.

5.3. Сигнализация из фоновых задач в UI

6. Подсистема прокси (OperaProxy)

6.1. Назначение

Прокси используется как локальный SOCKS5-туннель для внешних загрузок (в первую очередь Mega.nz). Включение/выключение — чекбоксом Proxy.

6.2. Реализация

6.3. Важное поведение

7. Подсистема скачивания (megatools)

7.1. Назначение

Скачивание контента реализовано через внешний CLI res/megatools.exe. Приложение не содержит собственного клиента Mega, только оркестрирует вызовы.

7.2. Алгоритм

7.3. Поведение ошибок

8. Управление процессами и “жёсткий выход”

8.1. Почему так

На плохом/отсутствующем интернете внешние процессы (megatools.exe, opera-proxy...) могут зависнуть. Чтобы не оставлять зомби, “Выход” выполняет принудительное убийство по имени процесса.

8.2. Реализация

Примечание

taskkill по имени прибивает все процессы с таким именем в контексте пользователя. Это сделано намеренно (простота/надёжность), но может быть “шире”, чем хотелось бы в редких окружениях.

9. Логирование и диагностика

10. Сборка и релиз

10.1. Cargo

10.2. build.rs / manifest

Для Windows в бинарь вшивается manifest (comctl32.dll v6) через embed-manifest, чтобы контролы выглядели “нормально”, а не как привет из XP.

10.3. build.bat

Скрипт запускает cargo build --release и копирует sos.exe в файл релизного имени.

11. Структура проекта и артефакты

/
├─ 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
    

12. Ограничения и известные нюансы