feat: update syshelper version to 0.2.0 and enhance firewall rules in installer
CI / Windows x64 (push) Successful in 10m9s

This commit is contained in:
2026-08-02 22:21:49 +07:00
parent dfecd5dafb
commit ccaf521da4
4 changed files with 42 additions and 10 deletions
+13 -8
View File
@@ -33,7 +33,12 @@ mod auth;
mod service;
mod update;
const ADDR: &str = "127.0.0.1:8787";
/// Слушаем все интерфейсы, чтобы панель открывалась и с телефона или другого
/// компьютера в домашней сети. Правило брандмауэра ставит установщик, и только
/// для частных сетей — в публичной панель наружу смотреть не должна.
const BIND_ADDR: &str = "0.0.0.0:8787";
/// Адрес для ярлыков и сообщений: 0.0.0.0 в браузер не введёшь.
const PANEL_URL: &str = "http://127.0.0.1:8787";
/// Служебные команды не должны мигать консольным окном.
#[cfg(windows)]
pub(crate) const CREATE_NO_WINDOW: u32 = 0x0800_0000;
@@ -125,19 +130,17 @@ fn stamp() -> String {
/// Открывает панель в браузере. Своего окна у программы нет, поэтому запуск
/// ярлыком без этого выглядел бы как «ничего не произошло».
fn open_panel() {
let url = format!("http://{ADDR}");
#[cfg(windows)]
{
use std::os::windows::process::CommandExt;
// пустой заголовок обязателен: иначе start примет URL за имя окна
let _ = std::process::Command::new("cmd")
.args(["/C", "start", "", &url])
.args(["/C", "start", "", PANEL_URL])
.creation_flags(CREATE_NO_WINDOW)
.spawn();
}
#[cfg(not(windows))]
let _ = std::process::Command::new("open").arg(&url).spawn();
let _ = std::process::Command::new("open").arg(PANEL_URL).spawn();
}
/// Окна нет, поэтому паника иначе прошла бы совершенно незаметно: процесс
@@ -612,12 +615,12 @@ async fn bind_panel(
) -> Option<tokio::net::TcpListener> {
let mut complained = false;
loop {
match tokio::net::TcpListener::bind(ADDR).await {
match tokio::net::TcpListener::bind(BIND_ADDR).await {
Ok(listener) => return Some(listener),
Err(e) if !complained => {
complained = true; // в журнал раз, а не каждые полминуты
state
.log(format!("{ADDR} занят ({e}) — жду, правила при этом работают"))
.log(format!("{BIND_ADDR} занят ({e}) — жду, правила при этом работают"))
.await;
}
Err(_) => {}
@@ -681,7 +684,9 @@ async fn serve(shutdown: tokio::sync::watch::Receiver<bool>) {
let Some(listener) = bind_panel(&state, shutdown.clone()).await else {
return; // службу остановили, пока ждали порт
};
state.log(format!("панель на http://{ADDR}")).await;
state
.log(format!("панель на {PANEL_URL} и на порту 8787 в локальной сети"))
.await;
let mut stop = shutdown.clone();
let result = axum::serve(listener, app)