Files
ospab.network/ostp-installer/src/wizard.rs
ospab 85a2b01074 feat: Windows stack (daemon, installer, GUI)
Components:
- ostp-daemon: Windows Service with Named Pipe IPC
- ostp-installer: Setup wizard with admin privileges
- ostp-gui: Tauri dark theme UI (450x600)

Features:
- Background service management (OspabGuard)
- IPC commands: CONNECT/DISCONNECT/STATUS
- Firewall rules auto-configuration
- Wintun driver placeholder (download from wintun.net)
- Real-time stats display (upload/download/ping)

Note: Requires wintun.dll download for full functionality
2026-01-02 02:17:15 +03:00

101 lines
2.8 KiB
Rust

//! Wizard UI for installation process
use anyhow::Result;
use native_windows_gui as nwg;
use native_windows_derive as nwd;
use crate::{install_wintun_dll, service, firewall};
#[derive(Default, nwd::NwgUi)]
pub struct InstallerWizard {
#[nwg_control(size: (600, 400), position: (300, 300), title: "OSTP Installer", flags: "WINDOW|VISIBLE")]
#[nwg_events(OnWindowClose: [InstallerWizard::exit])]
window: nwg::Window,
#[nwg_layout(parent: window, spacing: 1)]
grid: nwg::GridLayout,
#[nwg_control(text: "Welcome to OSTP Installer", font: Some(&data.title_font))]
#[nwg_layout_item(layout: grid, row: 0, col: 0, col_span: 2)]
title: nwg::Label,
#[nwg_control(text: "This wizard will install OSTP VPN on your system.\n\nClick Next to continue.")]
#[nwg_layout_item(layout: grid, row: 1, col: 0, col_span: 2, row_span: 4)]
description: nwg::Label,
#[nwg_control(text: "Next")]
#[nwg_layout_item(layout: grid, row: 5, col: 1)]
#[nwg_events(OnButtonClick: [InstallerWizard::next])]
next_button: nwg::Button,
#[nwg_control(text: "Cancel")]
#[nwg_layout_item(layout: grid, row: 5, col: 0)]
#[nwg_events(OnButtonClick: [InstallerWizard::exit])]
cancel_button: nwg::Button,
#[nwg_resource(family: "Segoe UI", size: 18, weight: 700)]
title_font: nwg::Font,
step: std::cell::RefCell<usize>,
}
impl InstallerWizard {
fn next(&self) {
let mut step = self.step.borrow_mut();
*step += 1;
match *step {
1 => self.install_step(),
2 => self.finish_step(),
_ => {}
}
}
fn install_step(&self) {
self.title.set_text("Installing...");
self.description.set_text("Please wait while OSTP is being installed.");
self.next_button.set_enabled(false);
// Perform installation
std::thread::spawn(move || {
if let Err(e) = perform_installation() {
eprintln!("Installation error: {}", e);
}
});
}
fn finish_step(&self) {
self.title.set_text("Installation Complete");
self.description.set_text("OSTP has been successfully installed.\n\nClick Finish to exit.");
self.next_button.set_text("Finish");
}
fn exit(&self) {
nwg::stop_thread_dispatch();
}
}
pub fn run_wizard() -> Result<()> {
nwg::init()?;
nwg::Font::set_global_family("Segoe UI")?;
let _app = InstallerWizard::default();
nwg::dispatch_thread_events();
Ok(())
}
fn perform_installation() -> Result<()> {
tracing::info!("Step 1: Installing Wintun DLL");
install_wintun_dll()?;
tracing::info!("Step 2: Registering Windows Service");
service::install_service()?;
tracing::info!("Step 3: Configuring Firewall");
firewall::add_firewall_rules()?;
tracing::info!("Installation complete");
Ok(())
}