summaryrefslogtreecommitdiffstats
path: root/packaging/windows/installer.nsi
diff options
context:
space:
mode:
Diffstat (limited to 'packaging/windows/installer.nsi')
-rw-r--r--packaging/windows/installer.nsi317
1 files changed, 275 insertions, 42 deletions
diff --git a/packaging/windows/installer.nsi b/packaging/windows/installer.nsi
index 88d160a1..a462d499 100644
--- a/packaging/windows/installer.nsi
+++ b/packaging/windows/installer.nsi
@@ -3,7 +3,7 @@
!include "FileFunc.nsh"
Name "Netdata"
-Outfile "netdata-installer.exe"
+Outfile "netdata-installer-x64.exe"
InstallDir "$PROGRAMFILES\Netdata"
RequestExecutionLevel admin
@@ -19,8 +19,8 @@ RequestExecutionLevel admin
!insertmacro MUI_PAGE_LICENSE "C:\msys64\cloud.txt"
!insertmacro MUI_PAGE_LICENSE "C:\msys64\gpl-3.0.txt"
!insertmacro MUI_PAGE_DIRECTORY
-!insertmacro MUI_PAGE_INSTFILES
Page Custom NetdataConfigPage NetdataConfigLeave
+!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
@@ -29,15 +29,60 @@ Page Custom NetdataConfigPage NetdataConfigLeave
!insertmacro MUI_LANGUAGE "English"
+!define INSTALLERLOCKFILEGUID "f787d5ef-5c41-4dc0-a115-a1fb654fad1c"
+
+# https://nsis.sourceforge.io/Allow_only_one_installer_instance
+!macro SingleInstanceFile
+ !if "${NSIS_PTR_SIZE}" > 4
+ !include "Util.nsh"
+ !else ifndef IntPtrCmp
+ !define IntPtrCmp IntCmp
+ !endif
+
+ !ifndef NSIS_PTR_SIZE & SYSTYPE_PTR
+ !define SYSTYPE_PTR i ; NSIS v2.x
+ !else
+ !define /ifndef SYSTYPE_PTR p ; NSIS v3.0+
+ !endif
+
+ !if "${NSIS_CHAR_SIZE}" < 2
+ Push "$TEMP\${INSTALLERLOCKFILEGUID}.lock"
+ !else
+ Push "$APPDATA\${INSTALLERLOCKFILEGUID}.lock"
+ !endif
+
+ System::Call 'KERNEL32::CreateFile(ts,i0x40000000,i0,${SYSTYPE_PTR}0,i4,i0x04000000,${SYSTYPE_PTR}0)${SYSTYPE_PTR}.r0'
+ ${IntPtrCmp} $0 -1 "" launch launch
+ System::Call 'kernel32::AttachConsole(i -1)i.r0'
+ ${If} $0 != 0
+ System::Call 'kernel32::GetStdHandle(i -11)i.r0'
+ FileWrite $0 "The installer is already running.$\r$\n"
+ ${EndIf}
+ Quit
+ launch:
+!macroend
+
+var hCtrlButton
var hStartMsys
var startMsys
+var hCloudURL
+var cloudURL
var hCloudToken
var cloudToken
-var hCloudRoom
-var cloudRoom
+var hCloudRooms
+var cloudRooms
+var hProxy
+var proxy
+var hInsecure
+var insecure
+var accepted
+
+var avoidClaim
Function .onInit
+ !insertmacro SingleInstanceFile
+
nsExec::ExecToLog '$SYSDIR\sc.exe stop Netdata'
pop $0
${If} $0 == 0
@@ -46,10 +91,71 @@ Function .onInit
${EndIf}
StrCpy $startMsys ${BST_UNCHECKED}
+ StrCpy $insecure ${BST_UNCHECKED}
+ StrCpy $avoidClaim ${BST_UNCHECKED}
+ StrCpy $accepted ${BST_UNCHECKED}
+
+ ${GetParameters} $R0
+ ${GetOptions} $R0 "/s" $0
+ IfErrors +2 0
+ SetSilent silent
+ ClearErrors
+
+ ${GetOptions} $R0 "/t" $0
+ IfErrors +2 0
+ StrCpy $startMsys ${BST_CHECKED}
+ ClearErrors
+
+ ${GetOptions} $R0 "/i" $0
+ IfErrors +2 0
+ StrCpy $insecure ${BST_CHECKED}
+ ClearErrors
+
+ ${GetOptions} $R0 "/a" $0
+ IfErrors +2 0
+ StrCpy $accepted ${BST_CHECKED}
+ ClearErrors
+
+ ${GetOptions} $R0 "/token=" $0
+ IfErrors +2 0
+ StrCpy $cloudToken $0
+ ClearErrors
+
+ ${GetOptions} $R0 "/rooms=" $0
+ IfErrors +2 0
+ StrCpy $cloudRooms $0
+ ClearErrors
+
+ ${GetOptions} $R0 "/proxy=" $0
+ IfErrors +2 0
+ StrCpy $proxy $0
+ ClearErrors
+
+ IfSilent checklicense goahead
+ checklicense:
+ ${If} $accepted == ${BST_UNCHECKED}
+ System::Call 'kernel32::AttachConsole(i -1)i.r0'
+ ${If} $0 != 0
+ System::Call 'kernel32::GetStdHandle(i -11)i.r0'
+ FileWrite $0 "You must accept the licenses (/A) to continue.$\r$\n"
+ ${EndIf}
+ Quit
+ ${EndIf}
+ goahead:
+FunctionEnd
+
+Function un.onInit
+!insertmacro SingleInstanceFile
+FunctionEnd
+
+Function ShowHelp
+Pop $0
+ MessageBox MB_ICONQUESTION|MB_OK "$\"Cloud URL$\" The Netdata Cloud base URL.$\n$\n$\"Proxy URL$\" set the proxy server address to use if your network requires one.$\n$\n$\"Insecure connection$\" disable verification of the server's certificate chain and host name.$\n$\n$\"Open Terminal$\" open MSYS2 terminal to run additional commands after installation." IDOK endHelp
+ endHelp:
FunctionEnd
Function NetdataConfigPage
- !insertmacro MUI_HEADER_TEXT "Netdata configuration" "Claim your agent on Netdata Cloud"
+ !insertmacro MUI_HEADER_TEXT "Netdata configuration" "Connect your Agent to your Netdata Cloud Space"
nsDialogs::Create 1018
Pop $0
@@ -57,40 +163,59 @@ Function NetdataConfigPage
Abort
${EndIf}
- ${NSD_CreateLabel} 0 0 100% 12u "Enter your Token and Cloud Room."
- ${NSD_CreateLabel} 0 15% 100% 12u "Optionally, you can open a terminal to execute additional commands."
+ IfFileExists "$INSTDIR\etc\netdata\claim.conf" NotNeeded
- ${NSD_CreateLabel} 0 35% 20% 10% "Token"
+ ${NSD_CreateLabel} 0 0 100% 12u "Enter your Space's Claim Token and the Room IDs where you want to add the Agent."
+ ${NSD_CreateLabel} 0 12% 100% 12u "If no Room IDs are specified, the Agent will be added to the $\"All nodes$\" Room."
+
+ ${NSD_CreateLabel} 0 30% 20% 10% "Claim Token"
Pop $0
- ${NSD_CreateText} 21% 35% 79% 10% ""
+ ${NSD_CreateText} 21% 30% 79% 10% ""
Pop $hCloudToken
- ${NSD_CreateLabel} 0 55% 20% 10% "Room"
+ ${NSD_CreateLabel} 0 45% 20% 10% "Room ID(s)"
+ Pop $0
+ ${NSD_CreateText} 21% 45% 79% 10% ""
+ Pop $hCloudRooms
+
+ ${NSD_CreateLabel} 0 60% 20% 10% "Proxy URL"
Pop $0
- ${NSD_CreateText} 21% 55% 79% 10% ""
- Pop $hCloudRoom
+ ${NSD_CreateText} 21% 60% 79% 10% ""
+ Pop $hProxy
- ${NSD_CreateCheckbox} 0 70% 100% 10u "Open terminal"
+ ${NSD_CreateLabel} 0 75% 20% 10% "Cloud URL"
+ Pop $0
+ ${NSD_CreateText} 21% 75% 79% 10% "https://app.netdata.cloud"
+ Pop $hCloudURL
+
+ ${NSD_CreateCheckbox} 0 92% 25% 10u "Insecure connection"
+ Pop $hInsecure
+
+ ${NSD_CreateCheckbox} 50% 92% 25% 10u "Open terminal"
Pop $hStartMsys
+
+ ${NSD_CreateButton} 90% 90% 30u 15u "&Help"
+ Pop $hCtrlButton
+ ${NSD_OnClick} $hCtrlButton ShowHelp
+
+ Goto EndDialogDraw
+
+ NotNeeded:
+ StrCpy $avoidClaim ${BST_CHECKED}
+ ${NSD_CreateLabel} 0 0 100% 12u "Your host has already been claimed. You can proceed with the update."
+
+ EndDialogDraw:
nsDialogs::Show
FunctionEnd
Function NetdataConfigLeave
- ${NSD_GetText} $hCloudToken $cloudToken
- ${NSD_GetText} $hCloudRoom $cloudRoom
- ${NSD_GetState} $hStartMsys $startMsys
-
- StrLen $0 $cloudToken
- StrLen $1 $cloudRoom
- ${If} $0 == 125
- ${AndIf} $0 == 36
- # We should start our new claiming software here
- MessageBox MB_OK "$cloudToken | $cloudRoom | $startMsys"
- ${EndIf}
-
- ${If} $startMsys == 1
- nsExec::ExecToLog '$INSTDIR\msys2.exe'
- pop $0
+ ${If} $avoidClaim == ${BST_UNCHECKED}
+ ${NSD_GetText} $hCloudToken $cloudToken
+ ${NSD_GetText} $hCloudURL $cloudURL
+ ${NSD_GetText} $hCloudRooms $cloudRooms
+ ${NSD_GetText} $hProxy $proxy
+ ${NSD_GetState} $hStartMsys $startMsys
+ ${NSD_GetState} $hInsecure $insecure
${EndIf}
FunctionEnd
@@ -132,36 +257,125 @@ Function NetdataUninstallRegistry
end:
FunctionEnd
+Function InstallDLL
+ ; Check if certutil is available
+ nsExec::ExecToStack 'where certutil'
+ Pop $R0
+ StrCmp $R0 "" NoCertUtil FoundCertUtil
+
+ NoCertUtil:
+ DetailPrint "certutil not found, assuming files are different."
+ Goto CopyDLL
+
+ FoundCertUtil:
+ ; Calculate hash of the existing DLL
+ nsExec::ExecToStack 'certutil -hashfile "$SYSDIR\wevt_netdata.dll" MD5'
+ Pop $R0
+
+ ; Calculate hash of the new DLL
+ nsExec::ExecToStack 'certutil -hashfile "$INSTDIR\usr\bin\wevt_netdata.dll" MD5'
+ Pop $R1
+
+ StrCmp $R0 $R1 SetPermissions
+
+ CopyDLL:
+ ClearErrors
+ CopyFiles /SILENT "$INSTDIR\usr\bin\wevt_netdata.dll" "$SYSDIR"
+ IfErrors RetryPrompt SetPermissions
+
+ RetryPrompt:
+ MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "Failed to copy wevt_netdata.dll probably because it is in use. Please close the Event Viewer (or other Event Log applications) and press Retry."
+ StrCmp $R0 IDRETRY CopyDLL
+ StrCmp $R0 IDCANCEL ExitInstall
+
+ Goto End
+
+ SetPermissions:
+ nsExec::ExecToLog 'icacls "$SYSDIR\wevt_netdata.dll" /grant "NT SERVICE\EventLog":R'
+ Goto End
+
+ ExitInstall:
+ Abort
+
+ End:
+FunctionEnd
+
+Function InstallManifest
+ IfFileExists "$INSTDIR\usr\bin\wevt_netdata_manifest.xml" CopyManifest End
+
+ CopyManifest:
+ ClearErrors
+ CopyFiles /SILENT "$INSTDIR\usr\bin\wevt_netdata_manifest.xml" "$SYSDIR"
+ IfErrors RetryPrompt InstallManifest
+
+ RetryPrompt:
+ MessageBox MB_RETRYCANCEL|MB_ICONEXCLAMATION "Failed to copy wevt_netdata_manifest.xml."
+ StrCmp $R0 IDRETRY CopyManifest
+ StrCmp $R0 IDCANCEL ExitInstall
+
+ InstallManifest:
+ nsExec::ExecToLog 'wevtutil im "$SYSDIR\wevt_netdata_manifest.xml" "/mf:$SYSDIR\wevt_netdata.dll" "/rf:$SYSDIR\wevt_netdata.dll"'
+ Goto End
+
+ ExitInstall:
+ Abort
+
+ End:
+FunctionEnd
+
Section "Install Netdata"
- SetOutPath $INSTDIR
- SetCompress off
+ SetOutPath $INSTDIR
+ SetCompress off
- File /r "C:\msys64\opt\netdata\*.*"
+ File /r "C:\msys64\opt\netdata\*.*"
- ClearErrors
+ ClearErrors
nsExec::ExecToLog '$SYSDIR\sc.exe create Netdata binPath= "$INSTDIR\usr\bin\netdata.exe" start= delayed-auto'
pop $0
${If} $0 != 0
- DetailPrint "Warning: Failed to create Netdata service."
+ DetailPrint "Warning: Failed to create Netdata service."
${EndIf}
- ClearErrors
+ ClearErrors
nsExec::ExecToLog '$SYSDIR\sc.exe description Netdata "Real-time system monitoring service"'
pop $0
${If} $0 != 0
- DetailPrint "Warning: Failed to add Netdata service description."
+ DetailPrint "Warning: Failed to add Netdata service description."
${EndIf}
- ClearErrors
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+ Call NetdataUninstallRegistry
+ Call InstallDLL
+ Call InstallManifest
+
+ StrLen $0 $cloudToken
+ StrLen $1 $cloudRooms
+ ${If} $0 == 0
+ ${OrIf} $1 == 0
+ Goto runCmds
+ ${EndIf}
+
+ ${If} $0 == 135
+ ${AndIf} $1 >= 36
+ nsExec::ExecToLog '$INSTDIR\usr\bin\NetdataClaim.exe /T $cloudToken /R $cloudRooms /P $proxy /I $insecure /U $cloudURL'
+ pop $0
+ ${Else}
+ MessageBox MB_OK "The Cloud information does not have the expected length."
+ ${EndIf}
+
+ runCmds:
+ ClearErrors
nsExec::ExecToLog '$SYSDIR\sc.exe start Netdata'
pop $0
${If} $0 != 0
- DetailPrint "Warning: Failed to start Netdata service."
+ MessageBox MB_OK "Warning: Failed to start Netdata service."
${EndIf}
- WriteUninstaller "$INSTDIR\Uninstall.exe"
-
- Call NetdataUninstallRegistry
+ ${If} $startMsys == ${BST_CHECKED}
+ nsExec::ExecToLog '$INSTDIR\msys2.exe'
+ pop $0
+ ${EndIf}
SectionEnd
Section "Uninstall"
@@ -179,8 +393,27 @@ Section "Uninstall"
DetailPrint "Warning: Failed to delete Netdata service."
${EndIf}
- RMDir /r "$INSTDIR"
+ ; Check if the manifest exists before uninstalling it
+ IfFileExists "$SYSDIR\wevt_netdata_manifest.xml" ManifestExistsForUninstall ManifestNotExistsForUninstall
+
+ManifestExistsForUninstall:
+ nsExec::ExecToLog 'wevtutil um "$SYSDIR\wevt_netdata_manifest.xml"'
+ pop $0
+ ${If} $0 != 0
+ DetailPrint "Warning: Failed to uninstall the event manifest."
+ ${EndIf}
+ Delete "$SYSDIR\wevt_netdata_manifest.xml"
+ Delete "$SYSDIR\wevt_netdata.dll"
+ Goto DoneUninstall
+
+ManifestNotExistsForUninstall:
+ DetailPrint "Manifest not found, skipping manifest uninstall."
+
+DoneUninstall:
+
+ ; Remove files
+ SetOutPath "$PROGRAMFILES"
+ RMDir /r /REBOOTOK "$INSTDIR"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Netdata"
SectionEnd
-