!include FileFunc.nsh !include LogicLib.nsh !include MUI.nsh !include nsDialogs.nsh !include x64.nsh !define MUI_ICON "win32/logo.ico" !insertmacro MUI_PAGE_DIRECTORY Name "Instrumental Tools" Icon "win32/logo.ico" OutFile "<%= installer_file_name %>" InstallDir "$PROGRAMFILES\Instrumental Tools" Var Dialog Var WelcomeLabel Var KeyLabel Var HostnameLabel Var EnableScriptsLabel Var ScriptDirectoryLabel Var KeyText Var HostnameText Var EnableScriptsCheckbox Var ScriptDirectoryRequest Var ScriptDirectoryBrowser Var ScriptDirectoryTemp Var ApiKey Var ScriptDirectoryDestination Var EnableScripts Var Hostname Var ServiceCommand Var DotNetVersion Var InstallUtilPath Var DotNetFriendlyVersion Var DotNetInstall Function .onInit StrCpy $DotNetFriendlyVersion "4.0" StrCpy $DotNetInstall "http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=en" StrCpy $DotNetVersion "v4.0.30319" StrCpy $InstallUtilPath "$WINDIR\Microsoft.NET\Framework\$DotNetVersion\installUtil.exe" Call AssertDotNet ${GetOptions} $CMDLINE "/K" $ApiKey IfErrors 0 +2 StrCpy $ApiKey "Your API Key" ${GetOptions} $CMDLINE "/H" $Hostname IfErrors 0 +2 Call GetComputerName ${GetOptions} $CMDLINE "/E" $0 IfErrors 0 +2 StrCpy $EnableScripts 1 StrCpy $EnableScripts 0 ${GetOptions} $CMDLINE "/SD" $ScriptDirectoryDestination IfErrors 0 +2 StrCpy $ScriptDirectoryDestination "$INSTDIR\Scripts" FunctionEnd Function un.onInit StrCpy $DotNetFriendlyVersion "4.0" StrCpy $DotNetInstall "http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9cfb2d51-5ff4-4491-b0e5-b386f32c0992&displaylang=en" StrCpy $DotNetVersion "v4.0.30319" StrCpy $InstallUtilPath "$WINDIR\Microsoft.NET\Framework\$DotNetVersion\installUtil.exe" FunctionEnd Function GetComputerName ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ActiveComputerName" "ComputerName" StrCmp $0 "" win9x StrCpy $1 $0 4 3 Goto done win9x: ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName" StrCpy $1 $0 4 3 done: StrCpy $Hostname $0 FunctionEnd Function WriteConfigFile FileOpen $4 "$INSTDIR\etc\instrumental.yml" "w" FileWrite $4 "---$\r$\n" FileWrite $4 "# Replace YOUR_API_KEY with the API key for your Instrumental project and$\r$\n" FileWrite $4 "# remove the # from the beginning of the following line to have instrument_server$\r$\n" FileWrite $4 "# start sending metrics to your account.$\r$\n" FileWrite $4 "$\r$\n" FileWrite $4 "api_key: $ApiKey$\r$\n" FileWrite $4 "$\r$\n" FileClose $4 FunctionEnd Page custom nsDialogsPage nsDialogsPageLeave Page instfiles Function AssertDotNet IfFileExists $InstallUtilPath NextStep MessageBox MB_OK|MB_ICONEXCLAMATION "You must have the Microsoft .NET Framework $DotNetFriendlyVersion Installed to use this application. $\n$\n The installer will now open the Microsft .NET Framework $DotNetFriendlyVersion webpage" ExecShell Open "$DotNetInstall" SW_SHOWNORMAL Quit NextStep: FunctionEnd Function BrowseDest nsDialogs::SelectFolderDialog "Select Folder" $ScriptDirectoryDestination Pop $0 ${If} $0 != error StrCpy $ScriptDirectoryDestination $0 ${NSD_SetText} $ScriptDirectoryRequest $ScriptDirectoryDestination ${EndIf} FunctionEnd Function EnDisableButton ${NSD_GetState} $EnableScriptsCheckbox $0 ${If} $0 == 1 StrCpy $EnableScripts 1 1 EnableWindow $ScriptDirectoryBrowser 1 EnableWindow $ScriptDirectoryRequest 1 ${Else} StrCpy $EnableScripts 0 1 EnableWindow $ScriptDirectoryBrowser 0 EnableWindow $ScriptDirectoryRequest 0 ${EndIf} FunctionEnd Function nsDialogsPage !insertmacro MUI_HEADER_TEXT "Monitoring Options" "Enter your configuration details below. API key information is available on your account on https://instrumentalapp.com/." nsDialogs::Create 1018 Pop $Dialog ${If} $Dialog == error Abort ${EndIf} ${NSD_CreateLabel} 0 0 100% 12u "Enter configuration details below" Pop $WelcomeLabel ${NSD_CreateLabel} 0 13u 30% 12u "API Key" Pop $KeyLabel ${NSD_CreateText} 35% 13u 60% 12u $ApiKey Pop $KeyText ${NSD_CreateLabel} 0 26u 30% 12u "Hostname" Pop $HostnameLabel ${NSD_CreateText} 35% 26u 60% 12u $Hostname Pop $HostnameText ${NSD_CreateLabel} 0 39u 30% 12u "Enable Custom Scripts?" Pop $EnableScriptsLabel ${NSD_CreateCheckbox} 35% 39u 60% 12u "" Pop $EnableScriptsCheckbox ${NSD_CreateLabel} 0 52u 30% 12u "Script Directory" Pop $ScriptDirectoryLabel ${NSD_CreateDirRequest} 35% 52u 40% 12u $ScriptDirectoryDestination Pop $ScriptDirectoryRequest ${NSD_CreateBrowseButton} 77% 52u 10% 12u ".." Pop $ScriptDirectoryBrowser StrCmp $EnableScripts 1 0 nomatch ${NSD_Check} $EnableScriptsCheckbox Call EnDisableButton nomatch: Call EnDisableButton ${NSD_OnClick} $EnableScriptsCheckbox EnDisableButton ${NSD_OnClick} $ScriptDirectoryRequest BrowseDest ${NSD_OnClick} $ScriptDirectoryBrowser BrowseDest nsDialogs::Show FunctionEnd Function nsDialogsPageLeave ${NSD_GetText} $HostnameText $Hostname ${NSD_GetText} $KeyText $ApiKey ${NSD_GetState} $EnableScriptsCheckbox $EnableScripts ${NSD_GetText} $ScriptDirectoryRequest $ScriptDirectoryDestination FunctionEnd Section "Installing Files" SetOutPath $INSTDIR <% directories.each do |directory| %> File /r <%= directory %>/*.* <% end %> <% files, _ = removable_artifacts %> <% files.each do |file| %> SetFileAttributes "$INSTDIR\\<%= file %>" NORMAL <% if file.index("Gemfile.lock") %> Exec 'icacls "$INSTDIR\\<%= file %>" /grant BUILTIN\Users:f' <% end %> <% end %> WriteUninstaller $INSTDIR\<%= uninstaller_name %> Call WriteConfigFile ${If} $EnableScripts == 1 CreateDirectory "$ScriptDirectoryDestination" Exec '"$InstallUtilPath" /Hostname="$Hostname" /ScriptsDirectory="$ScriptDirectoryDestination" /ScriptsEnabled="True" /Path="$INSTDIR" /Config="$INSTDIR\etc\instrumental.yml" InstrumentServer.exe' ${Else} Exec '"$InstallUtilPath" /Path="$INSTDIR" /Config="$INSTDIR\etc\instrumental.yml" /Hostname="$Hostname" InstrumentServer.exe' ${EndIf} Exec '"sc" start "Instrument Server"' SectionEnd Section "Uninstall" Exec '"sc" stop "Instrument Server"' Exec '"$InstallUtilPath" /u "$INSTDIR\InstrumentServer.exe"' <% files, directories = removable_artifacts %> <% files.each do |file| %> delete "$INSTDIR\\<%= file %>" <% end %> delete "$INSTDIR\\<%= uninstaller_name %>" <% directories.each do |directory| %> <% if directory.strip.empty? %> rmdir "$INSTDIR" <% else %> rmdir /R "$INSTDIR\\<%= directory %>" <% end %> <% end %> SectionEnd