219 lines
9.5 KiB
NSIS
219 lines
9.5 KiB
NSIS
; ============================================================================
|
|
; NetDesk by Akronlogic -- Windows installer (NSIS / Modern UI 2)
|
|
;
|
|
; Installs NetDesk.exe + the 3 MinGW runtime DLLs into %ProgramFiles%\NetDesk,
|
|
; creates Start Menu + Desktop shortcuts, registers an uninstaller (Add/Remove
|
|
; Programs), and offers an OPTIONAL per-user autostart (HKCU Run).
|
|
;
|
|
; Build (normally driven by build-installer.ps1):
|
|
; makensis netdesk.nsi
|
|
; makensis /DSTAGEDIR=dist\NetDesk-Portable /DOUTFILE=dist\NetDesk-Setup-win64.exe netdesk.nsi
|
|
; ============================================================================
|
|
|
|
Unicode true
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Product metadata
|
|
;----------------------------------------------------------------------------
|
|
!define PRODUCT "NetDesk"
|
|
!define COMPANY "Akronlogic"
|
|
!define VERSION "0.1.0"
|
|
!define URL "https://akronlogic.com"
|
|
!define EXE "NetDesk.exe"
|
|
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}"
|
|
!define AUTORUN_KEY "Software\Microsoft\Windows\CurrentVersion\Run"
|
|
|
|
; Staging folder that holds the files to install (produced by build-portable.ps1).
|
|
; Overridable from the command line with /DSTAGEDIR=...
|
|
!ifndef STAGEDIR
|
|
!define STAGEDIR "dist\NetDesk-Portable"
|
|
!endif
|
|
!ifndef OUTFILE
|
|
!define OUTFILE "dist\NetDesk-Setup-win64.exe"
|
|
!endif
|
|
|
|
;----------------------------------------------------------------------------
|
|
; General
|
|
;----------------------------------------------------------------------------
|
|
Name "${PRODUCT} by ${COMPANY}"
|
|
OutFile "${OUTFILE}"
|
|
InstallDir "$PROGRAMFILES64\${PRODUCT}"
|
|
InstallDirRegKey HKLM "Software\${PRODUCT}" "InstallDir"
|
|
RequestExecutionLevel admin
|
|
SetCompressor /SOLID lzma
|
|
BrandingText "${PRODUCT} by ${COMPANY} -- ${URL}"
|
|
|
|
; Version info stamped on the setup .exe
|
|
VIProductVersion "${VERSION}.0"
|
|
VIAddVersionKey "ProductName" "${PRODUCT}"
|
|
VIAddVersionKey "CompanyName" "${COMPANY}"
|
|
VIAddVersionKey "FileDescription" "${PRODUCT} Setup"
|
|
VIAddVersionKey "FileVersion" "${VERSION}.0"
|
|
VIAddVersionKey "ProductVersion" "${VERSION}.0"
|
|
VIAddVersionKey "LegalCopyright" "(c) ${COMPANY}. All rights reserved."
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Modern UI 2
|
|
;----------------------------------------------------------------------------
|
|
!include "MUI2.nsh"
|
|
!include "FileFunc.nsh"
|
|
!insertmacro GetSize
|
|
|
|
!define MUI_ABORTWARNING
|
|
; Branded NetDesk icon for the setup .exe and the uninstaller (so Windows Search,
|
|
; Explorer and the installer window all show the green NetDesk mark -- not the
|
|
; generic NSIS rainbow). Overridable; build-installer.ps1 passes an absolute path
|
|
; to packaging\netdesk.ico (copied from assets\icon.ico at build time).
|
|
!ifndef BRANDICON
|
|
!define BRANDICON "netdesk.ico"
|
|
!endif
|
|
!define MUI_ICON "${BRANDICON}"
|
|
!define MUI_UNICON "${BRANDICON}"
|
|
|
|
; Offer to launch NetDesk at the end of setup
|
|
!define MUI_FINISHPAGE_RUN "$INSTDIR\${EXE}"
|
|
!define MUI_FINISHPAGE_RUN_TEXT "Launch ${PRODUCT} now"
|
|
|
|
; Install pages
|
|
!insertmacro MUI_PAGE_WELCOME
|
|
!insertmacro MUI_PAGE_COMPONENTS
|
|
!insertmacro MUI_PAGE_DIRECTORY
|
|
!insertmacro MUI_PAGE_INSTFILES
|
|
!insertmacro MUI_PAGE_FINISH
|
|
|
|
; Uninstall pages
|
|
!insertmacro MUI_UNPAGE_CONFIRM
|
|
!insertmacro MUI_UNPAGE_INSTFILES
|
|
|
|
!insertmacro MUI_LANGUAGE "English"
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Clean (re)install: a running NetDesk locks its own files, so close it first.
|
|
; Reinstalling then overwrites the existing install in place (same directory),
|
|
; upgrading an older build to this one. Full removal is via the uninstaller.
|
|
;----------------------------------------------------------------------------
|
|
Function .onInit
|
|
ExecWait 'taskkill /F /IM ${EXE} /T'
|
|
FunctionEnd
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Sections
|
|
;----------------------------------------------------------------------------
|
|
Section "!${PRODUCT} (required)" SEC_CORE
|
|
SectionIn RO
|
|
SetOverwrite on
|
|
SetOutPath "$INSTDIR"
|
|
|
|
; --- Clean (re)install: stop a running host so its binaries unlock ----------
|
|
; NetDeskHost.exe is kept alive two ways: a per-user engine/GUI child, AND the
|
|
; privileged boot-time Scheduled Task "NetDesk" (the host's SERVICE_TASK,
|
|
; created by `NetDeskHost.exe --install`, running as SYSTEM) whose broker
|
|
; respawns a session-agent ~every 2s. This installer is elevated
|
|
; (RequestExecutionLevel admin), so END THE TASK FIRST (stops the respawner),
|
|
; then force-kill every NetDeskHost.exe tree and the GUI. Errors are ignored
|
|
; (nothing running on a fresh install is normal). We only /End the task here
|
|
; (transient) -- never /Disable -- and /Run it again at the end of this
|
|
; section, so unattended autostart is preserved.
|
|
nsExec::Exec 'schtasks /End /TN "NetDesk"'
|
|
Pop $0
|
|
nsExec::Exec 'taskkill /F /IM NetDeskHost.exe /T'
|
|
Pop $0
|
|
nsExec::Exec 'taskkill /F /IM ${EXE} /T'
|
|
Pop $0
|
|
|
|
; Program + the 3 MinGW runtime DLLs that must sit beside it
|
|
File "${STAGEDIR}\${EXE}"
|
|
File "${STAGEDIR}\libstdc++-6.dll"
|
|
File "${STAGEDIR}\libgcc_s_seh-1.dll"
|
|
File "${STAGEDIR}\libwinpthread-1.dll"
|
|
File "${STAGEDIR}\README.txt"
|
|
; NetDesk is one pure-Rust binary now: the native host engine runs in-process,
|
|
; so there is no separate NetDeskHost.exe to install.
|
|
|
|
; Remember where we installed
|
|
WriteRegStr HKLM "Software\${PRODUCT}" "InstallDir" "$INSTDIR"
|
|
WriteRegStr HKLM "Software\${PRODUCT}" "Version" "${VERSION}"
|
|
|
|
; Start Menu shortcut
|
|
CreateDirectory "$SMPROGRAMS\${PRODUCT}"
|
|
CreateShortCut "$SMPROGRAMS\${PRODUCT}\${PRODUCT}.lnk" "$INSTDIR\${EXE}" "" "$INSTDIR\${EXE}" 0
|
|
CreateShortCut "$SMPROGRAMS\${PRODUCT}\Uninstall ${PRODUCT}.lnk" "$INSTDIR\uninstall.exe"
|
|
|
|
; Uninstaller + Add/Remove Programs registration
|
|
WriteUninstaller "$INSTDIR\uninstall.exe"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${PRODUCT} by ${COMPANY}"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${VERSION}"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${COMPANY}"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "URLInfoAbout" "${URL}"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${EXE}"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "InstallLocation" "$INSTDIR"
|
|
WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" '"$INSTDIR\uninstall.exe"'
|
|
WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" '"$INSTDIR\uninstall.exe" /S'
|
|
WriteRegDWORD HKLM "${UNINST_KEY}" "NoModify" 1
|
|
WriteRegDWORD HKLM "${UNINST_KEY}" "NoRepair" 1
|
|
|
|
; Estimated size for Add/Remove Programs
|
|
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
|
|
IntFmt $0 "0x%08X" $0
|
|
WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
|
|
|
|
; --- Bring the host engine back online ------------------------------------
|
|
; A fresh host `--install` finishes with `schtasks /Run /TN NetDesk`, so do the
|
|
; same: relaunch the now-updated boot-time broker. No-op if there is no task
|
|
; yet (first-time install, before the user enables unattended access); the GUI
|
|
; itself is relaunched by the Finish page's optional "Launch NetDesk now".
|
|
nsExec::Exec 'schtasks /Run /TN "NetDesk"'
|
|
Pop $0
|
|
SectionEnd
|
|
|
|
Section "Desktop shortcut" SEC_DESKTOP
|
|
CreateShortCut "$DESKTOP\${PRODUCT}.lnk" "$INSTDIR\${EXE}" "" "$INSTDIR\${EXE}" 0
|
|
SectionEnd
|
|
|
|
Section /o "Start ${PRODUCT} when I sign in" SEC_AUTOSTART
|
|
; Per-user autostart (HKCU). Optional, OFF by default. Starts the native host
|
|
; engine headlessly on login so the PC is reachable unattended.
|
|
WriteRegStr HKCU "${AUTORUN_KEY}" "${PRODUCT}" '"$INSTDIR\${EXE}" --host'
|
|
SectionEnd
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Component descriptions
|
|
;----------------------------------------------------------------------------
|
|
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_CORE} "The ${PRODUCT} application and its required runtime files."
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_DESKTOP} "Place a ${PRODUCT} shortcut on your Desktop."
|
|
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_AUTOSTART} "Launch ${PRODUCT} automatically every time you sign in (current user only)."
|
|
!insertmacro MUI_FUNCTION_DESCRIPTION_END
|
|
|
|
;----------------------------------------------------------------------------
|
|
; Uninstaller
|
|
;----------------------------------------------------------------------------
|
|
Section "Uninstall"
|
|
; Stop the host completely: end the SYSTEM task (stops the broker's respawner),
|
|
; kill the engine and the GUI, then REMOVE the autostart task entirely so no
|
|
; orphaned boot-time task is left pointing at a deleted exe.
|
|
nsExec::Exec 'schtasks /End /TN "NetDesk"'
|
|
Pop $0
|
|
ExecWait 'taskkill /F /IM NetDeskHost.exe /T'
|
|
ExecWait 'taskkill /F /IM ${EXE} /T'
|
|
nsExec::Exec 'schtasks /Delete /TN "NetDesk" /F'
|
|
Pop $0
|
|
Delete "$INSTDIR\${EXE}"
|
|
Delete "$INSTDIR\NetDeskHost.exe"
|
|
Delete "$INSTDIR\libstdc++-6.dll"
|
|
Delete "$INSTDIR\libgcc_s_seh-1.dll"
|
|
Delete "$INSTDIR\libwinpthread-1.dll"
|
|
Delete "$INSTDIR\README.txt"
|
|
Delete "$INSTDIR\uninstall.exe"
|
|
RMDir "$INSTDIR"
|
|
|
|
Delete "$SMPROGRAMS\${PRODUCT}\${PRODUCT}.lnk"
|
|
Delete "$SMPROGRAMS\${PRODUCT}\Uninstall ${PRODUCT}.lnk"
|
|
RMDir "$SMPROGRAMS\${PRODUCT}"
|
|
Delete "$DESKTOP\${PRODUCT}.lnk"
|
|
|
|
DeleteRegValue HKCU "${AUTORUN_KEY}" "${PRODUCT}"
|
|
DeleteRegKey HKLM "${UNINST_KEY}"
|
|
DeleteRegKey HKLM "Software\${PRODUCT}"
|
|
SectionEnd
|