mirror of
https://github.com/hansjone/netx.git
synced 2026-10-13 06:13:16 +08:00
Release 0.4.5: installer DB wizard, credential key, lean offline Setup.
Choose bundled or external PostgreSQL in the Setup wizard with connection validation; optional NETX_CREDENTIAL_SECRET_KEY; single desktop shortcut; faster uninstall and tray startup for offline Windows packages. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
86dfd41f44
commit
97393cd407
20 changed files with 1531 additions and 146 deletions
|
|
@ -1,4 +1,4 @@
|
|||
param(
|
||||
param(
|
||||
[string]$ProgramRoot = "",
|
||||
[string]$DataRoot = "",
|
||||
[switch]$StartOnLaunch = $true,
|
||||
|
|
@ -52,17 +52,57 @@ if (-not (Test-Path $envPath)) {
|
|||
exit 1
|
||||
}
|
||||
|
||||
# Only one tray icon per machine session (desktop + postinstall + autostart can race).
|
||||
$script:netxTrayMutex = $null
|
||||
try {
|
||||
$createdNew = $false
|
||||
$script:netxTrayMutex = New-Object System.Threading.Mutex($true, "Local\NetX.WinTray.SingleInstance", [ref]$createdNew)
|
||||
if (-not $createdNew) {
|
||||
if (Test-NetxApiHealthy -HostName $hostBind -Port $port -TimeoutSec 2) {
|
||||
try { Start-Process $uiUrl } catch {}
|
||||
} elseif ($StartOnLaunch) {
|
||||
Start-NetxPowerShell -File (Join-Path $PSScriptRoot "start_netx_app.ps1") `
|
||||
-Arguments @("-ProgramRoot", $prog, "-DataRoot", $data, "-SkipBrowser") `
|
||||
-WorkingDirectory $prog -WindowStyle Hidden | Out-Null
|
||||
}
|
||||
exit 0
|
||||
}
|
||||
} catch {
|
||||
# If mutex fails, continue with a tray (better than no UI control).
|
||||
}
|
||||
|
||||
$startPs1 = Join-Path $PSScriptRoot "start_netx_app.ps1"
|
||||
$stopPs1 = Join-Path $PSScriptRoot "stop_netx_app.ps1"
|
||||
$checkPs1 = Join-Path $PSScriptRoot "check_update.ps1"
|
||||
|
||||
function Invoke-NetxScript {
|
||||
param([string]$File, [string[]]$ExtraArgs = @())
|
||||
$args = @(
|
||||
"-NoProfile", "-ExecutionPolicy", "Bypass", "-File", $File,
|
||||
"-ProgramRoot", $prog, "-DataRoot", $data
|
||||
) + $ExtraArgs
|
||||
Start-Process -FilePath "powershell.exe" -ArgumentList $args -WorkingDirectory $prog -WindowStyle Hidden
|
||||
param(
|
||||
[string]$File,
|
||||
[string[]]$ExtraArgs = @(),
|
||||
[switch]$Wait = $false
|
||||
)
|
||||
return Start-NetxPowerShell -File $File -Arguments (@("-ProgramRoot", $prog, "-DataRoot", $data) + $ExtraArgs) `
|
||||
-WorkingDirectory $prog -WindowStyle Hidden -PassThru -Wait:$Wait
|
||||
}
|
||||
|
||||
function Open-NetxUiWhenReady {
|
||||
param([int]$TimeoutSec = 180)
|
||||
$notify.ShowBalloonTip(
|
||||
5000,
|
||||
"NetX",
|
||||
(T "Starting… first run may take a minute." "正在启动…首次迁移可能需要一分钟。"),
|
||||
[System.Windows.Forms.ToolTipIcon]::Info
|
||||
)
|
||||
if (Wait-NetxApiHealthy -HostName $hostBind -Port $port -TimeoutSec $TimeoutSec) {
|
||||
try { Start-Process $uiUrl } catch {}
|
||||
return
|
||||
}
|
||||
$notify.ShowBalloonTip(
|
||||
8000,
|
||||
"NetX",
|
||||
(T "UI not ready yet. Use tray → Open UI when the icon appears, or check data\runtime\netx.err.log." "界面尚未就绪。就绪后请用托盘「打开界面」,或查看 data\runtime\netx.err.log。"),
|
||||
[System.Windows.Forms.ToolTipIcon]::Warning
|
||||
)
|
||||
}
|
||||
|
||||
$form = New-Object System.Windows.Forms.Form
|
||||
|
|
@ -93,23 +133,30 @@ $miOpen.add_Click({ Start-Process $uiUrl })
|
|||
|
||||
$miStart = $menu.Items.Add((T "Start NetX" "启动 NetX"))
|
||||
$miStart.add_Click({
|
||||
$notify.ShowBalloonTip(3000, "NetX", (T "Starting…" "正在启动…"), [System.Windows.Forms.ToolTipIcon]::Info)
|
||||
Invoke-NetxScript -File $startPs1 -ExtraArgs @("-SkipBrowser")
|
||||
Invoke-NetxScript -File $startPs1 -ExtraArgs @("-SkipBrowser") | Out-Null
|
||||
Open-NetxUiWhenReady
|
||||
})
|
||||
|
||||
$miStop = $menu.Items.Add((T "Stop NetX" "停止 NetX"))
|
||||
$miStop = $menu.Items.Add((T "Stop NetX (keep tray)" "停止 NetX(保留托盘)"))
|
||||
$miStop.add_Click({
|
||||
$notify.ShowBalloonTip(3000, "NetX", (T "Stopping…" "正在停止…"), [System.Windows.Forms.ToolTipIcon]::Info)
|
||||
Invoke-NetxScript -File $stopPs1
|
||||
Invoke-NetxScript -File $stopPs1 | Out-Null
|
||||
})
|
||||
|
||||
$miStopExit = $menu.Items.Add((T "Stop NetX and exit tray" "停止 NetX 并退出托盘"))
|
||||
$miStopExit.add_Click({
|
||||
$notify.ShowBalloonTip(3000, "NetX", (T "Stopping…" "正在停止…"), [System.Windows.Forms.ToolTipIcon]::Info)
|
||||
Invoke-NetxScript -File $stopPs1 -Wait | Out-Null
|
||||
$notify.Visible = $false
|
||||
$form.Close()
|
||||
[System.Windows.Forms.Application]::Exit()
|
||||
})
|
||||
|
||||
$miUpdate = $menu.Items.Add((T "Check for updates" "检查更新"))
|
||||
$miUpdate.add_Click({
|
||||
try {
|
||||
$p = Start-Process -FilePath "powershell.exe" -ArgumentList @(
|
||||
"-NoProfile", "-ExecutionPolicy", "Bypass", "-File", $checkPs1,
|
||||
"-ProgramRoot", $prog, "-DataRoot", $data
|
||||
) -Wait -PassThru -WindowStyle Normal
|
||||
$p = Start-NetxPowerShell -File $checkPs1 -Arguments @("-ProgramRoot", $prog, "-DataRoot", $data) `
|
||||
-WorkingDirectory $prog -WindowStyle Normal -Wait -PassThru
|
||||
if ($p.ExitCode -eq 10) {
|
||||
$ans = [System.Windows.Forms.MessageBox]::Show(
|
||||
(T "A newer NetX is available. Download and apply now?" "发现新版本,是否立即下载并更新?"),
|
||||
|
|
@ -118,10 +165,8 @@ $miUpdate.add_Click({
|
|||
[System.Windows.Forms.MessageBoxIcon]::Question
|
||||
)
|
||||
if ($ans -eq [System.Windows.Forms.DialogResult]::Yes) {
|
||||
Start-Process -FilePath "powershell.exe" -ArgumentList @(
|
||||
"-NoProfile", "-ExecutionPolicy", "Bypass", "-File", $checkPs1,
|
||||
"-ProgramRoot", $prog, "-DataRoot", $data, "-Apply"
|
||||
) -WorkingDirectory $prog
|
||||
Start-NetxPowerShell -File $checkPs1 -Arguments @("-ProgramRoot", $prog, "-DataRoot", $data, "-Apply") `
|
||||
-WorkingDirectory $prog -WindowStyle Normal | Out-Null
|
||||
}
|
||||
} elseif ($p.ExitCode -eq 0) {
|
||||
[System.Windows.Forms.MessageBox]::Show((T "NetX is up to date ($ver)." "已是最新版本 ($ver)。"), (T "NetX update" "NetX 更新"))
|
||||
|
|
@ -146,20 +191,49 @@ $notify.add_DoubleClick({ Start-Process $uiUrl })
|
|||
$form.add_Shown({
|
||||
if ($AutoUpdate) {
|
||||
$notify.ShowBalloonTip(4000, "NetX", (T "Checking for updates…" "正在检查更新…"), [System.Windows.Forms.ToolTipIcon]::Info)
|
||||
Start-Process -FilePath "powershell.exe" -ArgumentList @(
|
||||
"-NoProfile", "-ExecutionPolicy", "Bypass", "-File", $checkPs1,
|
||||
"-ProgramRoot", $prog, "-DataRoot", $data, "-Apply", "-Quiet", "-AutoOnly"
|
||||
) -Wait -WindowStyle Hidden
|
||||
Start-NetxPowerShell -File $checkPs1 `
|
||||
-Arguments @("-ProgramRoot", $prog, "-DataRoot", $data, "-Apply", "-Quiet", "-AutoOnly") `
|
||||
-WorkingDirectory $prog -WindowStyle Hidden -Wait | Out-Null
|
||||
} elseif ($CheckUpdateOnLaunch) {
|
||||
Start-Process -FilePath "powershell.exe" -ArgumentList @(
|
||||
"-NoProfile", "-ExecutionPolicy", "Bypass", "-File", $checkPs1,
|
||||
"-ProgramRoot", $prog, "-DataRoot", $data, "-Quiet"
|
||||
) -WindowStyle Hidden
|
||||
Start-NetxPowerShell -File $checkPs1 `
|
||||
-Arguments @("-ProgramRoot", $prog, "-DataRoot", $data, "-Quiet") `
|
||||
-WorkingDirectory $prog -WindowStyle Hidden | Out-Null
|
||||
}
|
||||
if ($StartOnLaunch) {
|
||||
Invoke-NetxScript -File $startPs1 -ExtraArgs @("-SkipBrowser")
|
||||
Start-Sleep -Seconds 2
|
||||
try { Start-Process $uiUrl } catch {}
|
||||
# Detach start so the tray message pump stays alive; poll /health before browser.
|
||||
Invoke-NetxScript -File $startPs1 -ExtraArgs @("-SkipBrowser") | Out-Null
|
||||
$script:netxUiWaitTicks = 0
|
||||
$script:netxUiWaitMax = 360 # 360 * 500ms = 180s
|
||||
$script:netxUiTimer = New-Object System.Windows.Forms.Timer
|
||||
$script:netxUiTimer.Interval = 500
|
||||
$script:netxUiTimer.add_Tick({
|
||||
$script:netxUiWaitTicks++
|
||||
if (Test-NetxApiHealthy -HostName $hostBind -Port $port -TimeoutSec 2) {
|
||||
$script:netxUiTimer.Stop()
|
||||
$script:netxUiTimer.Dispose()
|
||||
try { Start-Process $uiUrl } catch {}
|
||||
return
|
||||
}
|
||||
if ($script:netxUiWaitTicks -eq 1) {
|
||||
$notify.ShowBalloonTip(
|
||||
5000,
|
||||
"NetX",
|
||||
(T "Starting… first run may take a minute." "正在启动…首次迁移可能需要一分钟。"),
|
||||
[System.Windows.Forms.ToolTipIcon]::Info
|
||||
)
|
||||
}
|
||||
if ($script:netxUiWaitTicks -ge $script:netxUiWaitMax) {
|
||||
$script:netxUiTimer.Stop()
|
||||
$script:netxUiTimer.Dispose()
|
||||
$notify.ShowBalloonTip(
|
||||
8000,
|
||||
"NetX",
|
||||
(T "UI not ready yet. Use tray → Open UI later, or check data\runtime\netx.err.log." "界面尚未就绪。请稍后用托盘「打开界面」,或查看 data\runtime\netx.err.log。"),
|
||||
[System.Windows.Forms.ToolTipIcon]::Warning
|
||||
)
|
||||
}
|
||||
})
|
||||
$script:netxUiTimer.Start()
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue