From 02b035f0d4e91f851ffd92a951ef2606b14dedd8 Mon Sep 17 00:00:00 2001 From: Jason Boyer Date: Sun, 26 Nov 2017 13:14:46 -0500 Subject: [PATCH] LP1733692: Improve Hatch Un/Installer Will find 23 or 64 bit JRE/JDK and install registry keys where all user accounts can access them, as well as install the Chrome Web Store version of the extention. Uninstaller could still stand some work, I have an idea involving CopyFiles but that will have to wait. Signed-off-by: Jason Boyer --- installer/windows/defines.nsh | 11 ++- installer/windows/hatch.nsi | 213 +++++++++++++++++++++++++++--------------- 2 files changed, 142 insertions(+), 82 deletions(-) diff --git a/installer/windows/defines.nsh b/installer/windows/defines.nsh index b53b728914..45bd0987bf 100644 --- a/installer/windows/defines.nsh +++ b/installer/windows/defines.nsh @@ -7,8 +7,8 @@ !define APPNAME "Hatch" !define COMPANYNAME "Evergreen ILS" !define DESCRIPTION "Java based Print Service and Local Storage System" -!define EXTENSIONID "ppooibdipmklfichpmkcgplfgdplgahl" ;Chrome extension id -!define EXTENSION_UPDATEURL "https://chrome.google.com/webstore/detail/hatch-native-messenger/ppooibdipmklfichpmkcgplfgdplgahl" ;Chrome web store link +!define EXTENSIONID "ppooibdipmklfichpmkcgplfgdplgahl" ; Chrome extension id +!define EXTENSION_UPDATEURL "https://clients2.google.com/service/update2/crx" ; Chrome Web Store Autoupdate URL ;----------------------------------- ; Version info ; Version numbers should be integers @@ -20,9 +20,10 @@ ; Add Remove info ; The following will be displayed by the "Click here for support information" link ; in Add/Remove Programs. You can use mailto: links here. -!define HELPURL "mailto:[your@email.here]" -!define UPDATEURL "http://..." -!define ABOUTURL "http://..." +; Unless there's real info, leave these blank. The registry keys will be skipped if they're blank +!define HELPURL "" +!define UPDATEURL "" +!define ABOUTURL "" ; The size in KB of all the files we'll be installing !define INSTALLSIZE 332000 diff --git a/installer/windows/hatch.nsi b/installer/windows/hatch.nsi index 3b676f0f18..650f7cc9b7 100644 --- a/installer/windows/hatch.nsi +++ b/installer/windows/hatch.nsi @@ -24,6 +24,7 @@ !include StrRep.nsh !include ReplaceInFile.nsh ;--------------------------------------------------------------- + ; Installer's filename Outfile "${APPNAME} Installer.exe" RequestExecutionLevel admin @@ -36,72 +37,121 @@ Name "${APPNAME}" ;================================== ; Page system !insertmacro MUI_PAGE_WELCOME -!define MUI_PAGE_CUSTOMFUNCTION_PRE VersionChecker +!define MUI_PAGE_CUSTOMFUNCTION_PRE ValidateInstall !insertmacro MUI_PAGE_LICENSE "license.rtf" ;Loads licence.rtf to show license content !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_LANGUAGE "English" + ;------------------------------------- ; Code to verify if a user is an admin !macro VerifyUserIsAdmin UserInfo::GetAccountType pop $0 ${If} $0 != "admin" ;Require admin rights - messageBox mb_iconstop "Administrator rights required!" + messageBox MB_OK|MB_ICONSTOP "Administrator rights required!" setErrorLevel 740 ;ERROR_ELEVATION_REQUIRED quit ${EndIf} !macroend -;--------------------------------------------------------------------- -; 1. Check for Java -; 2. Read our current version and check if it's newer, older, or the same -; LogicLib gives S>, S<, and S== for comparing strings. -!macro VersionCheck - ;JRE Check - ClearErrors - ${if} ${RunningX64} - SetRegView 64 ;So we can read the Registry of 64 bit devices - ${endif} - ReadRegStr $R0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" - ReadRegStr $R1 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment\$R0" "JavaHome" - IfErrors 0 NoAbort - MessageBox MB_OK "Java not detected. Setup will now exit." - Quit - NoAbort: - ${If} $R0 S< ${JRE_MIN_VERSION} - MessageBox MB_OK "You must update Java. Setup will now exit." - ${EndIf} - ; Hatch Version Check - ReadRegStr $R2 HKCU "Software\${COMPANYNAME}\${APPNAME}" "Version" - ${If} $R2 = 0 - Goto INSTALL ;As you were, citizen. - ${ElseIf} $R2 S== ${FULLVERSION} ;Same version is installed - MessageBox MB_OKCANCEL|MB_ICONSTOP "You already have this version of ${APPNAME} installed. You must uninstall the currently installed version to continue." IDOK UNINSTALL IDCANCEL QUIT - ${ElseIf} $R2 S> ${FULLVERSION} ;Older version is installed - MessageBox MB_OKCANCEL|MB_ICONSTOP "You are tring to install an older version of ${APPNAME} than the one you currently have installed. You must uninstall the currently installed verion to continue." IDOK UNINSTALL IDCANCEL QUIT - ${ElseIf} $R2 S< ${FULLVERSION} ;Newer version is installed - MessageBox MB_OKCANCEL|MB_ICONSTOP "You have a previous version of ${APPNAME} installed. You must uninstall the currently installed version to continue." IDOK UNINSTALL IDCANCEL QUIT - ${EndIf} - UNINSTALL: - ExecWait '"$INSTDIR\Uninstall ${APPNAME}.exe"_?=$INSTDIR' - Goto INSTALL - QUIT: - Quit - INSTALL: +; Find any installed JRE/JDK and return the version or -1 +Function DetectJava + ; 32 bit JRE >= 9 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\JRE" "CurrentVersion" + StrCmp $0 "" +1 Found + + ; 32 bit JDK >= 9 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\JDK" "CurrentVersion" + StrCmp $0 "" +1 Found + + ; 64 bit JRE >= 9 + ${If} ${RunningX64} + SetRegView 64 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\JRE" "CurrentVersion" + SetRegView 32 ; basically SetRegView Default since NSIS only creates 32 bit installers + StrCmp $0 "" +1 Found + ${EndIf} -!macroend + ; 64 bit JDK >= 9 + ${If} ${RunningX64} + SetRegView 64 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\JDK" "CurrentVersion" + SetRegView 32 + StrCmp $0 "" +1 Found + ${EndIf} + + ; 32 bit JRE < 9 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" + StrCmp $0 "" +1 Found + + ; 32 bit JDK < 9 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" + StrCmp $0 "" +1 Found + + ; 64 bit JRE < 9 + ${If} ${RunningX64} + SetRegView 64 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" "CurrentVersion" + SetRegView 32 + StrCmp $0 "" +1 Found + ${EndIf} + + ; 64 bit JDK < 9 + ${If} ${RunningX64} + SetRegView 64 + ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Development Kit" "CurrentVersion" + SetRegView 32 + StrCmp $0 "" +1 Found + ${EndIf} + + ; Nuthin. + Push "-1" + Return + + Found: + Push $0 + Return +FunctionEnd function .onInit setShellVarContext all !insertmacro VerifyUserIsAdmin + Return functionEnd + ;----------------- ;Check our version -function VersionChecker - !insertmacro VersionCheck +function ValidateInstall + Call DetectJava + Pop $0 + StrCmp $0 "-1" NoJava + ${If} $0 S< ${JRE_MIN_VERSION} + MessageBox MB_OK "Please update Java to version ${JRE_MIN_VERSION} or higher. Setup will now exit." /SD IDOK IDOK QUIT + ${EndIf} + ; Hatch Version Check + ReadRegStr $1 HKLM "SOFTWARE\${COMPANYNAME}\${APPNAME}" "Version" + StrCmp $1 "" INSTALL + ${If} $1 S== ${FULLVERSION} ;Same version is installed + MessageBox MB_OKCANCEL|MB_ICONINFORMATION "You already have this version of ${APPNAME} installed. You must uninstall the currently installed version to continue." /SD IDOK IDOK UNINSTALL IDCANCEL QUIT + ${ElseIf} $1 S> ${FULLVERSION} ;Older version is installed + MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "You are tring to install an older version of ${APPNAME} than the one you currently have installed. You must uninstall the currently installed verion to continue." /SD IDOK IDOK UNINSTALL IDCANCEL QUIT + ${ElseIf} $1 S< ${FULLVERSION} ;Newer version is installed + MessageBox MB_OKCANCEL|MB_ICONINFORMATION "You have a previous version of ${APPNAME} installed. The previous version will be uninrtalled so installation can continue." /SD IDOK IDOK UNINSTALL IDCANCEL QUIT + ${EndIf} + UNINSTALL: + ReadRegStr $1 HKLM "SOFTWARE\${COMPANYNAME}\${APPNAME}" "Install Path" + ; This leaves the uninstaller behind because it doesn't copy itself to a temp location. There's not a good way to clean that up that doesn't introduce potential race conditions on slow machines. :-/ + ExecWait '"$1\Uninstall ${APPNAME}.exe" /S _?=$1' + Goto INSTALL + NoJava: + MessageBox MB_OK|MB_ICONSTOP "Java Not Detected. Please install a JRE of version ${JRE_MIN_VERSION} or greater." /SD IDOK + QUIT: + Quit + INSTALL: + Return functionEnd ;-------------------------- @@ -127,32 +177,32 @@ section "install" writeUninstaller "$INSTDIR\Uninstall ${APPNAME}.exe" ; Registry info for Add/Remove Programs - WriteRegStr HKCU "Software\${COMPANYNAME}\${APPNAME}" "Install Path" $INSTDIR - WriteRegStr HKCU "Software\${COMPANYNAME}\${APPNAME}" "Version" "${FULLVERSION}" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${COMPANYNAME} - ${APPNAME} - ${DESCRIPTION}" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$\"$INSTDIR\Uninstall ${APPNAME}.exe$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\Uninstall ${APPNAME}.exe$\" /S" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "InstallLocation" "$\"$INSTDIR$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ ${APPNAME}" "DisplayIcon" "$\"$INSTDIR\logo.ico$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "Publisher" "$\"${COMPANYNAME}$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "HelpLink" "$\"${HELPURL}$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLUpdateInfo" "$\"${UPDATEURL}$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLInfoAbout" "$\"${ABOUTURL}$\"" - WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" "$\"${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}$\"" - WriteRegStr HKCU "Software\Google\Chrome\NativeMessagingHosts\org.evergreen_ils.hatch" "" "$INSTDIR\extension\host\org.evergreen_ils.hatch.json" - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMajor" ${VERSIONMAJOR} - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMinor" ${VERSIONMINOR} + WriteRegStr HKLM "SOFTWARE\${COMPANYNAME}\${APPNAME}" "Install Path" $INSTDIR + WriteRegStr HKLM "SOFTWARE\${COMPANYNAME}\${APPNAME}" "Version" "${FULLVERSION}" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${COMPANYNAME} - ${APPNAME} - ${DESCRIPTION}" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\Uninstall ${APPNAME}.exe" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "QuietUninstallString" "$INSTDIR\Uninstall ${APPNAME}.exe /S" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "InstallLocation" "$INSTDIR" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$INSTDIR\logo.ico" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "Publisher" "${COMPANYNAME}" + StrCmp "${HELPURL}" "" +2 + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "HelpLink" "${HELPURL}" + StrCmp "${UPDATEURL}" "" +2 + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLUpdateInfo" "${UPDATEURL}" + StrCmp "${ABOUTURL}" "" +2 + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLInfoAbout" "${ABOUTURL}" + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}" + WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMajor" ${VERSIONMAJOR} + WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMinor" ${VERSIONMINOR} # There is no option for modifying or repairing the install - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" 1 - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" 1 + WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" 1 + WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" 1 # Set the INSTALLSIZE constant (!defined at the top of this script) so Add/Remove Programs can accurately report the size - WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "EstimatedSize" ${INSTALLSIZE} + WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "EstimatedSize" ${INSTALLSIZE} - ;Uncommend when extension is on web store - ;${if} ${RunningX64} - ;WriteRegStr HKLM "Software\Wow6432Node\Google\Chrome\Extensions\${EXTENSIONID}" "update_url" "${EXTENSION_UPDATEURL}" - ;${EndIf} - ;WriteRegStr HKLM "Software\Google\Chrome\Extensions\${EXTENSIONID}" "update_url" "${EXTENSION_UPDATEURL}" + ; Connect Hatch to Chrome and install the Hatch extension from the Chrome Web Store + WriteRegStr HKLM "SOFTWARE\Google\Chrome\NativeMessagingHosts\org.evergreen_ils.hatch" "" "$INSTDIR\extension\host\org.evergreen_ils.hatch.json" + WriteRegStr HKLM "Software\Google\Chrome\Extensions\${EXTENSIONID}" "update_url" "${EXTENSION_UPDATEURL}" SectionEnd @@ -163,7 +213,7 @@ function un.onInit SetShellVarContext all # Verify uninstaller - MessageBox MB_OKCANCEL "Permanently remove ${APPNAME}?" IDOK next + MessageBox MB_OKCANCEL "Permanently remove ${APPNAME}?" /SD IDOK IDOK next Abort next: !insertmacro VerifyUserIsAdmin @@ -171,23 +221,32 @@ functionEnd section "uninstall" # Remove the actual files - delete $INSTDIR\*.* - rmDir /r $INSTDIR\extension - rmDir /r $INSTDIR\lib + Delete /REBOOTOK $INSTDIR\hatch.bat + Delete /REBOOTOK $INSTDIR\hatch.properties + Delete /REBOOTOK $INSTDIR\logging.properties + ; blindly using /r isn't ideal but the extreme unlikelyhood of there being \lib or \extension folders under $PROGRAMFILES makes it low risk. + RmDir /r /REBOOTOK $INSTDIR\extension + RmDir /r /REBOOTOK $INSTDIR\lib # Delete uninstaller last - delete "$INSTDIR\Uninstall ${APPNAME}.exe" + Delete /REBOOTOK "$INSTDIR\Uninstall ${APPNAME}.exe" # Remove installation directory - rmDir $INSTDIR\ + RmDir /REBOOTOK $INSTDIR # Remove uninstaller info from registry - DeleteRegKey HKCU "Software\${COMPANYNAME}\${APPNAME}" - DeleteRegKey HKCU "Software\${COMPANYNAME}" - DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" - DeleteRegKey HKCU "Software\Google\Chrome\NativeMessagingHosts\org.evergreen_ils.hatch" - DeleteRegKey HKLM "Software\Google\Chrome\Extensions\${EXTENSIONID}" - ${if} ${RunningX64} - DeleteRegKey HKLM "Software\Wow6432Node\Google\Chrome\Extensions\${EXTENSIONID}" + DeleteRegKey HKLM "SOFTWARE\${COMPANYNAME}\${APPNAME}" + DeleteRegKey HKLM "SOFTWARE\${COMPANYNAME}" + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" + DeleteRegKey HKLM "SOFTWARE\Google\Chrome\NativeMessagingHosts\org.evergreen_ils.hatch" + DeleteRegKey HKLM "SOFTWARE\Google\Chrome\Extensions\${EXTENSIONID}" + ${If} ${RunningX64} + DeleteRegKey HKLM "SOFTWARE\Wow6432Node\Google\Chrome\Extensions\${EXTENSIONID}" ${EndIf} + + IfRebootFlag 0 Done + MessageBox MB_YESNO "A reboot is required to finish the installation. Do you wish to reboot now?" /SD IDNO IDNO Done + Reboot + + Done: sectionEnd -- 2.11.0