diff --git a/setup/win32/setup.nsi b/setup/win32/setup.nsi index 02b6f2cd..d8c2f51e 100755 --- a/setup/win32/setup.nsi +++ b/setup/win32/setup.nsi @@ -1,477 +1,477 @@ -# Part of Odoo,Flectra. See LICENSE file for full copyright and licensing details. - -# TODO: Avoid to uninstall the database -# TODO: We can update the server or the clients without to uninstall the all-in-one -# TODO: Add startmenu handling (link to localhost + uninstall) - -!include 'MUI2.nsh' -!include 'FileFunc.nsh' -!include 'LogicLib.nsh' -!include 'Sections.nsh' -!include 'x64.nsh' - -!macro IfKeyExists ROOT MAIN_KEY KEY - # This macro comes from http://nsis.sourceforge.net/Check_for_a_Registry_Key - Push $R0 - Push $R1 - Push $R2 - - # XXX bug if ${ROOT}, ${MAIN_KEY} or ${KEY} use $R0 or $R1 - - StrCpy $R1 "0" # loop index - StrCpy $R2 "0" # not found - - ${Do} - EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1" - ${If} $R0 == "${KEY}" - StrCpy $R2 "1" # found - ${Break} - ${EndIf} - IntOp $R1 $R1 + 1 - ${LoopWhile} $R0 != "" - - ClearErrors - - Exch 2 - Pop $R0 - Pop $R1 - Exch $R2 -!macroend - -!define PUBLISHER 'FlectraHQ' - -!ifndef MAJOR_VERSION - !define MAJOR_VERSION '1' -!endif - -!ifndef MINOR_VERSION - !define MINOR_VERSION '0' -!endif - -!ifndef REVISION_VERSION - !define REVISION_VERSION 'alpha1' -!endif - -!ifndef VERSION - !define VERSION "0" -#!define VERSION "${MAJOR_VERSION}.${MINOR_VERSION}-r${REVISION_VERSION}" -!endif - -!define PRODUCT_NAME "Flectra" -!define DISPLAY_NAME "${PRODUCT_NAME} ${MAJOR_VERSION}.${MINOR_VERSION}" - -!define REGISTRY_ROOT HKLM -!define UNINSTALL_BASE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall" -!define UNINSTALL_REGISTRY_KEY "${UNINSTALL_BASE_REGISTRY_KEY}\${DISPLAY_NAME}" - -!define UNINSTALL_REGISTRY_KEY_SERVER "${UNINSTALL_BASE_REGISTRY_KEY}\Flectra Server ${VERSION}" - -!define REGISTRY_KEY "Software\${DISPLAY_NAME}" - -!define DEFAULT_POSTGRESQL_HOSTNAME 'localhost' -!define DEFAULT_POSTGRESQL_PORT 5432 -!define DEFAULT_POSTGRESQL_USERNAME 'openpg' -!define DEFAULT_POSTGRESQL_PASSWORD 'openpgpwd' - -Name '${DISPLAY_NAME}' -Caption "${PRODUCT_NAME} ${VERSION} Setup" -OutFile "flectra-allinone-setup-${VERSION}.exe" -SetCompressor /FINAL lzma -#SetCompress auto -ShowInstDetails show - -#XPStyle on - -InstallDir "$PROGRAMFILES\Flectra ${VERSION}" -InstallDirRegKey HKCU "${REGISTRY_KEY}" "" - -BrandingText '${PRODUCT_NAME} ${VERSION}' - -RequestExecutionLevel admin - -#VIAddVersionKey "ProductName" "${PRODUCT_NAME}" -#VIAddVersionKey "CompanyName" "${PUBLISHER}" -#VIAddVersionKey "FileDescription" "Installer of ${DISPLAY_NAME}" -#VIAddVersionKey "LegalCopyright" "${PUBLISHER}" -#VIAddVersionKey "LegalTrademark" "FLECTRA is a trademark of ${PUBLISHER}" -#VIAddVersionKey "FileVersion" "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}" -#VIProductVersion "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}" - -!insertmacro GetParameters -!insertmacro GetOptions - -Var Option_AllInOne -Var HasPostgreSQL -Var cmdLineParams - -Var TextPostgreSQLHostname -Var TextPostgreSQLPort -Var TextPostgreSQLUsername -Var TextPostgreSQLPassword - -Var HWNDPostgreSQLHostname -Var HWNDPostgreSQLPort -Var HWNDPostgreSQLUsername -Var HWNDPostgreSQLPassword - -!define STATIC_PATH "static" -!define PIXMAPS_PATH "${STATIC_PATH}\pixmaps" -!define POSTGRESQL_EXE_FILENAME "postgresql-9.5.8-1-windows.exe" -!define POSTGRESQL_EXE "${STATIC_PATH}\${POSTGRESQL_EXE_FILENAME}" - -!define MUI_ABORTWARNING -!define MUI_ICON "${PIXMAPS_PATH}\flectra-icon.ico" - -!define MUI_WELCOMEFINISHPAGE_BITMAP "${PIXMAPS_PATH}\flectra-intro.bmp" -!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${PIXMAPS_PATH}\flectra-intro.bmp" -!define MUI_HEADERIMAGE -!define MUI_HEADERIMAGE_BITMAP "${PIXMAPS_PATH}\flectra-slogan.bmp" -!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH -!define MUI_HEADER_TRANSPARENT_TEXT "" - -!insertmacro MUI_PAGE_WELCOME -!insertmacro MUI_PAGE_LICENSE "${STATIC_PATH}\doc\LICENSE" -!define MUI_COMPONENTSPAGE_SMALLDESC -!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentLeave -!insertmacro MUI_PAGE_COMPONENTS -Page Custom ShowPostgreSQL LeavePostgreSQL -!insertmacro MUI_PAGE_DIRECTORY -!insertmacro MUI_PAGE_INSTFILES - -!define MUI_FINISHPAGE_NOAUTOCLOSE -!define MUI_FINISHPAGE_RUN -!define MUI_FINISHPAGE_RUN_CHECKED -!define MUI_FINISHPAGE_RUN_TEXT "$(DESC_FinishPageText)" -!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink" -!define MUI_FINISHPAGE_LINK $(DESC_FinishPage_Link) -!define MUI_FINISHPAGE_LINK_LOCATION "https://flectrahq.com/page/contactus" -!insertmacro MUI_PAGE_FINISH - -!insertmacro MUI_UNPAGE_WELCOME -!insertmacro MUI_UNPAGE_CONFIRM -!insertmacro MUI_UNPAGE_INSTFILES -!insertmacro MUI_UNPAGE_FINISH - -!insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_LANGUAGE "French" -!insertmacro MUI_RESERVEFILE_LANGDLL - -; English -LangString DESC_FLECTRA_Server ${LANG_ENGLISH} "Install the Flectra Server with all the Flectra standard modules." -LangString DESC_PostgreSQL ${LANG_ENGLISH} "Install the PostgreSQL RDBMS used by Flectra." -LangString DESC_FinishPage_Link ${LANG_ENGLISH} "Contact Flectra for Partnership and/or Support" -LangString DESC_AtLeastOneComponent ${LANG_ENGLISH} "You have to choose at least one component" -LangString DESC_CanNotInstallPostgreSQL ${LANG_ENGLISH} "You can not install the PostgreSQL database without the Flectra Server" -LangString WARNING_HostNameIsEmpty ${LANG_ENGLISH} "The hostname for the connection to the PostgreSQL Server is empty" -LangString WARNING_UserNameIsEmpty ${LANG_ENGLISH} "The username for the connection to the PostgreSQL Server is empty" -LangString WARNING_PasswordIsEmpty ${LANG_ENGLISH} "The password for the connection to the PostgreSQL Server is empty" -LangString WARNING_PortIsWrong ${LANG_ENGLISH} "The port for the connexion to the PostgreSQL Server is wrong (default: 5432)" -LangString DESC_PostgreSQLPage ${LANG_ENGLISH} "Configure the information for the PostgreSQL connection" -LangString DESC_PostgreSQL_Hostname ${LANG_ENGLISH} "Hostname" -LangString DESC_PostgreSQL_Port ${LANG_ENGLISH} "Port" -LangString DESC_PostgreSQL_Username ${LANG_ENGLISH} "Username" -LangString DESC_PostgreSQL_Password ${LANG_ENGLISH} "Password" -LangString Profile_AllInOne ${LANG_ENGLISH} "All In One" -LangString Profile_Server ${LANG_ENGLISH} "Server only" -LangString TITLE_FLECTRA_Server ${LANG_ENGLISH} "Flectra Server" -LangString TITLE_PostgreSQL ${LANG_ENGLISH} "PostgreSQL Database" -LangString DESC_FinishPageText ${LANG_ENGLISH} "Start Flectra" - -; French -LangString DESC_FLECTRA_Server ${LANG_FRENCH} "Installation du Serveur Flectra avec tous les modules Flectra standards." -LangString DESC_PostgreSQL ${LANG_FRENCH} "Installation de la base de données PostgreSQL utilisée par Flectra." -LangString DESC_FinishPage_Link ${LANG_FRENCH} "Contactez Flectra pour un Partenariat et/ou du Support" -LangString DESC_AtLeastOneComponent ${LANG_FRENCH} "Vous devez choisir au moins un composant" -LangString DESC_CanNotInstallPostgreSQL ${LANG_FRENCH} "Vous ne pouvez pas installer la base de données PostgreSQL sans le serveur Flectra" -LangString WARNING_HostNameIsEmpty ${LANG_FRENCH} "L'adresse pour la connection au serveur PostgreSQL est vide" -LangString WARNING_UserNameIsEmpty ${LANG_FRENCH} "Le nom d'utilisateur pour la connection au serveur PostgreSQL est vide" -LangString WARNING_PasswordIsEmpty ${LANG_FRENCH} "Le mot de passe pour la connection au serveur PostgreSQL est vide" -LangString WARNING_PortIsWrong ${LANG_FRENCH} "Le port pour la connection au serveur PostgreSQL est erroné (défaut: 5432)" -LangString DESC_PostgreSQLPage ${LANG_FRENCH} "Configurez les informations de connection pour le serveur PostgreSQL" -LangString DESC_PostgreSQL_Hostname ${LANG_FRENCH} "Hôte" -LangString DESC_PostgreSQL_Port ${LANG_FRENCH} "Port" -LangString DESC_PostgreSQL_Username ${LANG_FRENCH} "Utilisateur" -LangString DESC_PostgreSQL_Password ${LANG_FRENCH} "Mot de passe" -LangString Profile_AllInOne ${LANG_FRENCH} "All In One" -LangString Profile_Server ${LANG_FRENCH} "Seulement le serveur" -LangString TITLE_FLECTRA_Server ${LANG_FRENCH} "Serveur Flectra" -LangString TITLE_PostgreSQL ${LANG_FRENCH} "Installation du serveur de base de données PostgreSQL" -LangString DESC_FinishPageText ${LANG_FRENCH} "Démarrer Flectra" - -InstType $(Profile_AllInOne) -InstType $(Profile_Server) - -Section $(TITLE_FLECTRA_Server) SectionFLECTRA_Server - SectionIn 1 2 - - # TODO: install in a temp dir before - - # Installing winpython - SetOutPath "$INSTDIR\python" - File /r /x "__pycache__" "..\..\..\WinPython\python-3.6.2\*" - - SetOutPath "$INSTDIR\nssm" - File /r /x "src" "..\..\..\nssm-2.24\*" - - SetOutPath "$INSTDIR\server" - File /r /x "${POSTGRESQL_EXE_FILENAME}" /x "wkhtmltopdf" "..\..\*" - - SetOutPath "$INSTDIR\vcredist" - File /r "..\..\..\vcredist\*.exe" - - # Install Visual C redistribuable files - DetailPrint "Installing Visual C++ redistributable files" - ${If} ${RunningX64} - nsExec::Exec '"$INSTDIR\vcredist\vc_redist.x64.exe" /q' - ${Else} - nsExec::Exec '"$INSTDIR\vcredist\vc_redist.x86.exe" /q' - ${EndIf} - - SetOutPath "$INSTDIR\thirdparty" - File /r "${STATIC_PATH}\wkhtmltopdf\*" - File /r "${STATIC_PATH}\less\*" - -# If there is a previous install of the FLECTRA Server, keep the login/password from the config file - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_host" $TextPostgreSQLHostname - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_user" $TextPostgreSQLUsername - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_password" $TextPostgreSQLPassword - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_port" $TextPostgreSQLPort - # Fix the addons path - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "addons_path" "$INSTDIR\server\flectra\addons" - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "bin_path" "$INSTDIR\thirdparty" - - # if we're going to install postgresql force it's path, - # otherwise we consider it's always done and/or correctly tune by users - ${If} $HasPostgreSQL == 0 - WriteIniStr "$INSTDIR\server\flectra.conf" "options" "pg_path" "$INSTDIR\PostgreSQL\bin" - ${EndIf} - - DetailPrint "Installing Windows service" - nsExec::ExecTOLog '"$INSTDIR\python\python.exe" "$INSTDIR\server\flectra-bin" --stop-after-init --logfile "$INSTDIR\server\flectra.log" -s' - ${If} ${RunningX64} - nsExec::ExecToLog '"$INSTDIR\nssm\win64\nssm.exe" install ${SERVICENAME} "$INSTDIR\python\python.exe" "\"$INSTDIR\server\flectra-bin\""' - nsExec::ExecToLog '"$INSTDIR\nssm\win64\nssm.exe" set ${SERVICENAME} AppDirectory "$\"$INSTDIR\server$\""' - ${Else} - nsExec::ExecToLog '"$INSTDIR\nssm\win32\nssm.exe" install ${SERVICENAME} "$INSTDIR\python\python.exe" "\"$INSTDIR\server\flectra-bin\""' - nsExec::ExecToLog '"$INSTDIR\nssm\win32\nssm.exe" set ${SERVICENAME} AppDirectory "$\"$INSTDIR\server$\""' - ${EndIf} - - nsExec::Exec "net stop ${SERVICENAME}" - sleep 2 - - nsExec::Exec "net start ${SERVICENAME}" - sleep 2 - -SectionEnd - -Section $(TITLE_PostgreSQL) SectionPostgreSQL - SectionIn 1 2 - SetOutPath '$TEMP' - nsExec::Exec 'net user openpgsvc /delete' - - File ${POSTGRESQL_EXE} - - ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ActiveComputerName" "ComputerName" - StrCmp $0 "" win9x - Goto done - win9x: - ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName" - done: - Rmdir /r "$INSTDIR\PostgreSQL" - ExecWait '"$TEMP\${POSTGRESQL_EXE_FILENAME}" \ - --mode unattended \ - --prefix "$INSTDIR\PostgreSQL" \ - --datadir "$INSTDIR\PostgreSQL\data" \ - --servicename "PostgreSQL_For_Flectra" \ - --serviceaccount "openpgsvc" --servicepassword "0p3npgsvcPWD" \ - --superaccount "$TextPostgreSQLUsername" --superpassword "$TextPostgreSQLPassword" \ - --serverport $TextPostgreSQLPort' -SectionEnd - -Section -Post - WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" - WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "InstallLocation" "$INSTDIR" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "DisplayName" "${DISPLAY_NAME}" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${MAJOR_VERSION}.${MINOR_VERSION}" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "Publisher" "${PUBLISHER}" -; WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "Version" "${VERSION}" -; WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "VersionMajor" "${MAJOR_VERSION}.${MINOR_VERSION}" -; WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "VersionMinor" "${REVISION_VERSION}" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "HelpLink" "support@flectrahq.com" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "HelpTelephone" "+65.00.00.00.00" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "URLInfoAbout" "https://flectrahq.com" - WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "Contact" "sales@flectrahq.com" - WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "NoModify" "1" - WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "NoRepair" "1" - WriteUninstaller "$INSTDIR\Uninstall.exe" -SectionEnd - -!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN - !insertmacro MUI_DESCRIPTION_TEXT ${SectionFLECTRA_Server} $(DESC_FLECTRA_Server) - !insertmacro MUI_DESCRIPTION_TEXT ${SectionPostgreSQL} $(DESC_PostgreSQL) -!insertmacro MUI_FUNCTION_DESCRIPTION_END - -Section "Uninstall" - # Check if the server is installed - !insertmacro IfKeyExists "HKLM" "${UNINSTALL_REGISTRY_KEY_SERVER}" "UninstallString" - Pop $R0 - ReadRegStr $0 HKLM "${UNINSTALL_REGISTRY_KEY_SERVER}" "UninstallString" - ExecWait '"$0" /S' - - nsExec::Exec "net stop ${SERVICENAME}" - nsExec::Exec "sc delete ${SERVICENAME}" - sleep 2 - - Rmdir /r "$INSTDIR\server" - Rmdir /r "$INSTDIR\thirdparty" - Rmdir /r "$INSTDIR\python" - Rmdir /r "$INSTDIR\nssm" - DeleteRegKey HKLM "${UNINSTALL_REGISTRY_KEY}" -SectionEnd - -Function .onInit - Push $R0 - - ${GetParameters} $cmdLineParams - ClearErrors - - Pop $R0 - - StrCpy $Option_AllInOne 0 - StrCpy $HasPostgreSQL 0 - - StrCpy $TextPostgreSQLHostname ${DEFAULT_POSTGRESQL_HOSTNAME} - StrCpy $TextPostgreSQLPort ${DEFAULT_POSTGRESQL_PORT} - StrCpy $TextPostgreSQLUsername ${DEFAULT_POSTGRESQL_USERNAME} - StrCpy $TextPostgreSQLPassword ${DEFAULT_POSTGRESQL_PASSWORD} - - Push $R0 - ${GetOptions} $cmdLineParams '/allinone' $R0 - IfErrors +2 0 - StrCpy $Option_AllInOne 1 - Pop $R0 - - StrCmp $Option_AllInOne 1 AllInOneMode - StrCmp $Option_AllInOne 0 NoAllInOneMode - - AllInOneMode: - MessageBox MB_OK|MB_ICONINFORMATION "All In One" - - NoAllInOneMode: - - !insertmacro MUI_LANGDLL_DISPLAY - - ClearErrors - EnumRegKey $0 HKLM "SOFTWARE\PostgreSQL\Installations" 0 - IfErrors DoInstallPostgreSQL 0 - StrCmp $0 "" DoInstallPostgreSQL - StrCpy $HasPostgreSQL 1 - #SectionSetText ${SectionPostgreSQL} "" - !insertmacro UnselectSection ${SectionPostgreSQL} - SectionSetFlags ${SectionPostgreSQL} ${SF_RO} - - DoInstallPostgreSQL: -FunctionEnd - -Function .onSelChange - ${If} $HasPostgreSQL == 1 - !insertmacro UnselectSection ${SectionPostgreSQL} - ${EndIf} -FunctionEnd - -Function PostgreSQLOnBack -FunctionEnd - -Function ShowPostgreSQL - SectionGetFlags ${SectionFLECTRA_Server} $0 - IntOp $0 $0 & ${SF_SELECTED} - IntCmp $0 ${SF_SELECTED} LaunchPostgreSQLConfiguration - Abort - LaunchPostgreSQLConfiguration: - - nsDialogs::Create /NOUNLOAD 1018 - Pop $0 - - ${If} $0 == error - Abort - ${EndIf} - - GetFunctionAddress $0 PostgreSQLOnBack - nsDialogs::OnBack $0 - - ${NSD_CreateLabel} 0 0 100% 10u $(DESC_PostgreSQLPage) - Pop $0 - - ${NSD_CreateLabel} 0 45 60u 12u $(DESC_PostgreSQL_Hostname) - Pop $0 - ${NSD_CreateText} 100 45 150u 12u $TextPostgreSQLHostname - Pop $HWNDPostgreSQLHostname - - ${NSD_CreateLabel} 0 75 60u 12u $(DESC_PostgreSQL_Port) - Pop $0 - ${NSD_CreateNumber} 100 75 150u 12u $TextPostgreSQLPort - Pop $HWNDPostgreSQLPort - ${NSD_CreateLabel} 0 105 60u 12u $(DESC_PostgreSQL_Username) - Pop $0 - ${NSD_CreateText} 100 105 150u 12u $TextPostgreSQLUsername - Pop $HWNDPostgreSQLUsername - ${NSD_CreateLabel} 0 135 60u 12u $(DESC_PostgreSQL_Password) - Pop $0 - ${NSD_CreateText} 100 135 150u 12u $TextPostgreSQLPassword - Pop $HWNDPostgreSQLPassword - - nsDialogs::Show -FunctionEnd - -Function LeavePostgreSQL - ${NSD_GetText} $HWNDPostgreSQLHostname $TextPostgreSQLHostname - ${NSD_GetText} $HWNDPostgreSQLPort $TextPostgreSQLPort - ${NSD_GetText} $HWNDPostgreSQLUsername $TextPostgreSQLUsername - ${NSD_GetText} $HWNDPostgreSQLPassword $TextPostgreSQLPassword - StrLen $1 $TextPostgreSQLHostname - ${If} $1 == 0 - MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_HostNameIsEmpty) - Abort - ${EndIf} - - ${If} $TextPostgreSQLPort <= 0 - ${OrIf} $TextPostgreSQLPort > 65535 - MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PortIsWrong) - Abort - ${EndIf} - - StrLen $1 $TextPostgreSQLUsername - ${If} $1 == 0 - MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_UserNameIsEmpty) - Abort - ${EndIf} - - StrLen $1 $TextPostgreSQLPassword - ${If} $1 == 0 - MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PasswordIsEmpty) - Abort - ${EndIf} -FunctionEnd - -Function ComponentLeave - SectionGetFlags ${SectionFLECTRA_Server} $0 - IntOp $0 $0 & ${SF_SELECTED} - IntCmp $0 ${SF_SELECTED} Done - - SectionGetFlags ${SectionPostgreSQL} $0 - IntOp $0 $0 & ${SF_SELECTED} - IntCmp $0 ${SF_SELECTED} DontInstallPostgreSQL - - ChooseAtLeastOneComponent: - MessageBox MB_ICONEXCLAMATION|MB_OK $(DESC_AtLeastOneComponent) - Abort - - DontInstallPostgreSQL: - MessageBox MB_ICONEXCLAMATION|MB_OK $(DESC_CanNotInstallPostgreSQL) - Abort - Done: -FunctionEnd - -Function LaunchLink - ExecShell "open" "http://localhost:7073/" -FunctionEnd +# Part of Odoo,Flectra. See LICENSE file for full copyright and licensing details. + +# TODO: Avoid to uninstall the database +# TODO: We can update the server or the clients without to uninstall the all-in-one +# TODO: Add startmenu handling (link to localhost + uninstall) + +!include 'MUI2.nsh' +!include 'FileFunc.nsh' +!include 'LogicLib.nsh' +!include 'Sections.nsh' +!include 'x64.nsh' + +!macro IfKeyExists ROOT MAIN_KEY KEY + # This macro comes from http://nsis.sourceforge.net/Check_for_a_Registry_Key + Push $R0 + Push $R1 + Push $R2 + + # XXX bug if ${ROOT}, ${MAIN_KEY} or ${KEY} use $R0 or $R1 + + StrCpy $R1 "0" # loop index + StrCpy $R2 "0" # not found + + ${Do} + EnumRegKey $R0 ${ROOT} "${MAIN_KEY}" "$R1" + ${If} $R0 == "${KEY}" + StrCpy $R2 "1" # found + ${Break} + ${EndIf} + IntOp $R1 $R1 + 1 + ${LoopWhile} $R0 != "" + + ClearErrors + + Exch 2 + Pop $R0 + Pop $R1 + Exch $R2 +!macroend + +!define PUBLISHER 'FlectraHQ' + +!ifndef MAJOR_VERSION + !define MAJOR_VERSION '1' +!endif + +!ifndef MINOR_VERSION + !define MINOR_VERSION '0' +!endif + +!ifndef REVISION_VERSION + !define REVISION_VERSION 'alpha1' +!endif + +!ifndef VERSION + !define VERSION "0" +#!define VERSION "${MAJOR_VERSION}.${MINOR_VERSION}-r${REVISION_VERSION}" +!endif + +!define PRODUCT_NAME "Flectra" +!define DISPLAY_NAME "${PRODUCT_NAME} ${MAJOR_VERSION}.${MINOR_VERSION}" + +!define REGISTRY_ROOT HKLM +!define UNINSTALL_BASE_REGISTRY_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall" +!define UNINSTALL_REGISTRY_KEY "${UNINSTALL_BASE_REGISTRY_KEY}\${DISPLAY_NAME}" + +!define UNINSTALL_REGISTRY_KEY_SERVER "${UNINSTALL_BASE_REGISTRY_KEY}\Flectra Server ${VERSION}" + +!define REGISTRY_KEY "Software\${DISPLAY_NAME}" + +!define DEFAULT_POSTGRESQL_HOSTNAME 'localhost' +!define DEFAULT_POSTGRESQL_PORT 5432 +!define DEFAULT_POSTGRESQL_USERNAME 'openpg' +!define DEFAULT_POSTGRESQL_PASSWORD 'openpgpwd' + +Name '${DISPLAY_NAME}' +Caption "${PRODUCT_NAME} ${VERSION} Setup" +OutFile "flectra-allinone-setup-${VERSION}.exe" +SetCompressor /FINAL lzma +#SetCompress auto +ShowInstDetails show + +#XPStyle on + +InstallDir "$PROGRAMFILES\Flectra ${VERSION}" +InstallDirRegKey HKCU "${REGISTRY_KEY}" "" + +BrandingText '${PRODUCT_NAME} ${VERSION}' + +RequestExecutionLevel admin + +#VIAddVersionKey "ProductName" "${PRODUCT_NAME}" +#VIAddVersionKey "CompanyName" "${PUBLISHER}" +#VIAddVersionKey "FileDescription" "Installer of ${DISPLAY_NAME}" +#VIAddVersionKey "LegalCopyright" "${PUBLISHER}" +#VIAddVersionKey "LegalTrademark" "FLECTRA is a trademark of ${PUBLISHER}" +#VIAddVersionKey "FileVersion" "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}" +#VIProductVersion "${MAJOR_VERSION}.${MINOR_VERSION}.${REVISION_VERSION}" + +!insertmacro GetParameters +!insertmacro GetOptions + +Var Option_AllInOne +Var HasPostgreSQL +Var cmdLineParams + +Var TextPostgreSQLHostname +Var TextPostgreSQLPort +Var TextPostgreSQLUsername +Var TextPostgreSQLPassword + +Var HWNDPostgreSQLHostname +Var HWNDPostgreSQLPort +Var HWNDPostgreSQLUsername +Var HWNDPostgreSQLPassword + +!define STATIC_PATH "static" +!define PIXMAPS_PATH "${STATIC_PATH}\pixmaps" +!define POSTGRESQL_EXE_FILENAME "postgresql-9.5.4-2-windows.exe" +!define POSTGRESQL_EXE "${STATIC_PATH}\${POSTGRESQL_EXE_FILENAME}" + +!define MUI_ABORTWARNING +!define MUI_ICON "${PIXMAPS_PATH}\flectra-icon.ico" + +!define MUI_WELCOMEFINISHPAGE_BITMAP "${PIXMAPS_PATH}\flectra-intro.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${PIXMAPS_PATH}\flectra-intro.bmp" +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "${PIXMAPS_PATH}\flectra-slogan.bmp" +!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH +!define MUI_HEADER_TRANSPARENT_TEXT "" + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "${STATIC_PATH}\doc\LICENSE" +!define MUI_COMPONENTSPAGE_SMALLDESC +!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentLeave +!insertmacro MUI_PAGE_COMPONENTS +Page Custom ShowPostgreSQL LeavePostgreSQL +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_FINISHPAGE_RUN +!define MUI_FINISHPAGE_RUN_CHECKED +!define MUI_FINISHPAGE_RUN_TEXT "$(DESC_FinishPageText)" +!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink" +!define MUI_FINISHPAGE_LINK $(DESC_FinishPage_Link) +!define MUI_FINISHPAGE_LINK_LOCATION "https://flectrahq.com/page/contactus" +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_WELCOME +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES +!insertmacro MUI_UNPAGE_FINISH + +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_RESERVEFILE_LANGDLL + +; English +LangString DESC_FLECTRA_Server ${LANG_ENGLISH} "Install the Flectra Server with all the Flectra standard modules." +LangString DESC_PostgreSQL ${LANG_ENGLISH} "Install the PostgreSQL RDBMS used by Flectra." +LangString DESC_FinishPage_Link ${LANG_ENGLISH} "Contact Flectra for Partnership and/or Support" +LangString DESC_AtLeastOneComponent ${LANG_ENGLISH} "You have to choose at least one component" +LangString DESC_CanNotInstallPostgreSQL ${LANG_ENGLISH} "You can not install the PostgreSQL database without the Flectra Server" +LangString WARNING_HostNameIsEmpty ${LANG_ENGLISH} "The hostname for the connection to the PostgreSQL Server is empty" +LangString WARNING_UserNameIsEmpty ${LANG_ENGLISH} "The username for the connection to the PostgreSQL Server is empty" +LangString WARNING_PasswordIsEmpty ${LANG_ENGLISH} "The password for the connection to the PostgreSQL Server is empty" +LangString WARNING_PortIsWrong ${LANG_ENGLISH} "The port for the connexion to the PostgreSQL Server is wrong (default: 5432)" +LangString DESC_PostgreSQLPage ${LANG_ENGLISH} "Configure the information for the PostgreSQL connection" +LangString DESC_PostgreSQL_Hostname ${LANG_ENGLISH} "Hostname" +LangString DESC_PostgreSQL_Port ${LANG_ENGLISH} "Port" +LangString DESC_PostgreSQL_Username ${LANG_ENGLISH} "Username" +LangString DESC_PostgreSQL_Password ${LANG_ENGLISH} "Password" +LangString Profile_AllInOne ${LANG_ENGLISH} "All In One" +LangString Profile_Server ${LANG_ENGLISH} "Server only" +LangString TITLE_FLECTRA_Server ${LANG_ENGLISH} "Flectra Server" +LangString TITLE_PostgreSQL ${LANG_ENGLISH} "PostgreSQL Database" +LangString DESC_FinishPageText ${LANG_ENGLISH} "Start Flectra" + +; French +LangString DESC_FLECTRA_Server ${LANG_FRENCH} "Installation du Serveur Flectra avec tous les modules Flectra standards." +LangString DESC_PostgreSQL ${LANG_FRENCH} "Installation de la base de données PostgreSQL utilisée par Flectra." +LangString DESC_FinishPage_Link ${LANG_FRENCH} "Contactez Flectra pour un Partenariat et/ou du Support" +LangString DESC_AtLeastOneComponent ${LANG_FRENCH} "Vous devez choisir au moins un composant" +LangString DESC_CanNotInstallPostgreSQL ${LANG_FRENCH} "Vous ne pouvez pas installer la base de données PostgreSQL sans le serveur Flectra" +LangString WARNING_HostNameIsEmpty ${LANG_FRENCH} "L'adresse pour la connection au serveur PostgreSQL est vide" +LangString WARNING_UserNameIsEmpty ${LANG_FRENCH} "Le nom d'utilisateur pour la connection au serveur PostgreSQL est vide" +LangString WARNING_PasswordIsEmpty ${LANG_FRENCH} "Le mot de passe pour la connection au serveur PostgreSQL est vide" +LangString WARNING_PortIsWrong ${LANG_FRENCH} "Le port pour la connection au serveur PostgreSQL est erroné (défaut: 5432)" +LangString DESC_PostgreSQLPage ${LANG_FRENCH} "Configurez les informations de connection pour le serveur PostgreSQL" +LangString DESC_PostgreSQL_Hostname ${LANG_FRENCH} "Hôte" +LangString DESC_PostgreSQL_Port ${LANG_FRENCH} "Port" +LangString DESC_PostgreSQL_Username ${LANG_FRENCH} "Utilisateur" +LangString DESC_PostgreSQL_Password ${LANG_FRENCH} "Mot de passe" +LangString Profile_AllInOne ${LANG_FRENCH} "All In One" +LangString Profile_Server ${LANG_FRENCH} "Seulement le serveur" +LangString TITLE_FLECTRA_Server ${LANG_FRENCH} "Serveur Flectra" +LangString TITLE_PostgreSQL ${LANG_FRENCH} "Installation du serveur de base de données PostgreSQL" +LangString DESC_FinishPageText ${LANG_FRENCH} "Démarrer Flectra" + +InstType $(Profile_AllInOne) +InstType $(Profile_Server) + +Section $(TITLE_FLECTRA_Server) SectionFLECTRA_Server + SectionIn 1 2 + + # TODO: install in a temp dir before + + # Installing winpython + SetOutPath "$INSTDIR\python" + File /r /x "__pycache__" "..\..\..\WinPython\python-3.6.2\*" + + SetOutPath "$INSTDIR\nssm" + File /r /x "src" "..\..\..\nssm-2.24\*" + + SetOutPath "$INSTDIR\server" + File /r /x "${POSTGRESQL_EXE_FILENAME}" /x "wkhtmltopdf" "..\..\*" + + SetOutPath "$INSTDIR\vcredist" + File /r "..\..\..\vcredist\*.exe" + + # Install Visual C redistribuable files + DetailPrint "Installing Visual C++ redistributable files" + ${If} ${RunningX64} + nsExec::Exec '"$INSTDIR\vcredist\vc_redist.x64.exe" /q' + ${Else} + nsExec::Exec '"$INSTDIR\vcredist\vc_redist.x86.exe" /q' + ${EndIf} + + SetOutPath "$INSTDIR\thirdparty" + File /r "${STATIC_PATH}\wkhtmltopdf\*" + File /r "${STATIC_PATH}\less\*" + +# If there is a previous install of the FLECTRA Server, keep the login/password from the config file + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_host" $TextPostgreSQLHostname + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_user" $TextPostgreSQLUsername + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_password" $TextPostgreSQLPassword + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "db_port" $TextPostgreSQLPort + # Fix the addons path + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "addons_path" "$INSTDIR\server\flectra\addons,$INSTDIR\server\addons" + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "bin_path" "$INSTDIR\thirdparty" + + # if we're going to install postgresql force it's path, + # otherwise we consider it's always done and/or correctly tune by users + ${If} $HasPostgreSQL == 0 + WriteIniStr "$INSTDIR\server\flectra.conf" "options" "pg_path" "$INSTDIR\PostgreSQL\bin" + ${EndIf} + + DetailPrint "Installing Windows service" + nsExec::ExecTOLog '"$INSTDIR\python\python.exe" "$INSTDIR\server\flectra-bin" --stop-after-init --logfile "$INSTDIR\server\flectra.log" -s' + ${If} ${RunningX64} + nsExec::ExecToLog '"$INSTDIR\nssm\win64\nssm.exe" install ${SERVICENAME} "$INSTDIR\python\python.exe" "\"$INSTDIR\server\flectra-bin\""' + nsExec::ExecToLog '"$INSTDIR\nssm\win64\nssm.exe" set ${SERVICENAME} AppDirectory "$\"$INSTDIR\server$\""' + ${Else} + nsExec::ExecToLog '"$INSTDIR\nssm\win32\nssm.exe" install ${SERVICENAME} "$INSTDIR\python\python.exe" "\"$INSTDIR\server\flectra-bin\""' + nsExec::ExecToLog '"$INSTDIR\nssm\win32\nssm.exe" set ${SERVICENAME} AppDirectory "$\"$INSTDIR\server$\""' + ${EndIf} + + nsExec::Exec "net stop ${SERVICENAME}" + sleep 2 + + nsExec::Exec "net start ${SERVICENAME}" + sleep 2 + +SectionEnd + +Section $(TITLE_PostgreSQL) SectionPostgreSQL + SectionIn 1 2 + SetOutPath '$TEMP' + nsExec::Exec 'net user openpgsvc /delete' + + File ${POSTGRESQL_EXE} + + ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ActiveComputerName" "ComputerName" + StrCmp $0 "" win9x + Goto done + win9x: + ReadRegStr $0 HKLM "System\CurrentControlSet\Control\ComputerName\ComputerName" "ComputerName" + done: + Rmdir /r "$INSTDIR\PostgreSQL" + ExecWait '"$TEMP\${POSTGRESQL_EXE_FILENAME}" \ + --mode unattended \ + --prefix "$INSTDIR\PostgreSQL" \ + --datadir "$INSTDIR\PostgreSQL\data" \ + --servicename "PostgreSQL_For_Flectra" \ + --serviceaccount "openpgsvc" --servicepassword "0p3npgsvcPWD" \ + --superaccount "$TextPostgreSQLUsername" --superpassword "$TextPostgreSQLPassword" \ + --serverport $TextPostgreSQLPort' +SectionEnd + +Section -Post + WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe" + WriteRegExpandStr HKLM "${UNINSTALL_REGISTRY_KEY}" "InstallLocation" "$INSTDIR" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "DisplayName" "${DISPLAY_NAME}" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "DisplayVersion" "${MAJOR_VERSION}.${MINOR_VERSION}" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "Publisher" "${PUBLISHER}" +; WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "Version" "${VERSION}" +; WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "VersionMajor" "${MAJOR_VERSION}.${MINOR_VERSION}" +; WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "VersionMinor" "${REVISION_VERSION}" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "HelpLink" "support@flectrahq.com" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "HelpTelephone" "+65.00.00.00.00" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "URLInfoAbout" "https://flectrahq.com" + WriteRegStr HKLM "${UNINSTALL_REGISTRY_KEY}" "Contact" "sales@flectrahq.com" + WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "NoModify" "1" + WriteRegDWORD HKLM "${UNINSTALL_REGISTRY_KEY}" "NoRepair" "1" + WriteUninstaller "$INSTDIR\Uninstall.exe" +SectionEnd + +!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${SectionFLECTRA_Server} $(DESC_FLECTRA_Server) + !insertmacro MUI_DESCRIPTION_TEXT ${SectionPostgreSQL} $(DESC_PostgreSQL) +!insertmacro MUI_FUNCTION_DESCRIPTION_END + +Section "Uninstall" + # Check if the server is installed + !insertmacro IfKeyExists "HKLM" "${UNINSTALL_REGISTRY_KEY_SERVER}" "UninstallString" + Pop $R0 + ReadRegStr $0 HKLM "${UNINSTALL_REGISTRY_KEY_SERVER}" "UninstallString" + ExecWait '"$0" /S' + + nsExec::Exec "net stop ${SERVICENAME}" + nsExec::Exec "sc delete ${SERVICENAME}" + sleep 2 + + Rmdir /r "$INSTDIR\server" + Rmdir /r "$INSTDIR\thirdparty" + Rmdir /r "$INSTDIR\python" + Rmdir /r "$INSTDIR\nssm" + DeleteRegKey HKLM "${UNINSTALL_REGISTRY_KEY}" +SectionEnd + +Function .onInit + Push $R0 + + ${GetParameters} $cmdLineParams + ClearErrors + + Pop $R0 + + StrCpy $Option_AllInOne 0 + StrCpy $HasPostgreSQL 0 + + StrCpy $TextPostgreSQLHostname ${DEFAULT_POSTGRESQL_HOSTNAME} + StrCpy $TextPostgreSQLPort ${DEFAULT_POSTGRESQL_PORT} + StrCpy $TextPostgreSQLUsername ${DEFAULT_POSTGRESQL_USERNAME} + StrCpy $TextPostgreSQLPassword ${DEFAULT_POSTGRESQL_PASSWORD} + + Push $R0 + ${GetOptions} $cmdLineParams '/allinone' $R0 + IfErrors +2 0 + StrCpy $Option_AllInOne 1 + Pop $R0 + + StrCmp $Option_AllInOne 1 AllInOneMode + StrCmp $Option_AllInOne 0 NoAllInOneMode + + AllInOneMode: + MessageBox MB_OK|MB_ICONINFORMATION "All In One" + + NoAllInOneMode: + + !insertmacro MUI_LANGDLL_DISPLAY + + ClearErrors + EnumRegKey $0 HKLM "SOFTWARE\PostgreSQL\Installations" 0 + IfErrors DoInstallPostgreSQL 0 + StrCmp $0 "" DoInstallPostgreSQL + StrCpy $HasPostgreSQL 1 + #SectionSetText ${SectionPostgreSQL} "" + !insertmacro UnselectSection ${SectionPostgreSQL} + SectionSetFlags ${SectionPostgreSQL} ${SF_RO} + + DoInstallPostgreSQL: +FunctionEnd + +Function .onSelChange + ${If} $HasPostgreSQL == 1 + !insertmacro UnselectSection ${SectionPostgreSQL} + ${EndIf} +FunctionEnd + +Function PostgreSQLOnBack +FunctionEnd + +Function ShowPostgreSQL + SectionGetFlags ${SectionFLECTRA_Server} $0 + IntOp $0 $0 & ${SF_SELECTED} + IntCmp $0 ${SF_SELECTED} LaunchPostgreSQLConfiguration + Abort + LaunchPostgreSQLConfiguration: + + nsDialogs::Create /NOUNLOAD 1018 + Pop $0 + + ${If} $0 == error + Abort + ${EndIf} + + GetFunctionAddress $0 PostgreSQLOnBack + nsDialogs::OnBack $0 + + ${NSD_CreateLabel} 0 0 100% 10u $(DESC_PostgreSQLPage) + Pop $0 + + ${NSD_CreateLabel} 0 45 60u 12u $(DESC_PostgreSQL_Hostname) + Pop $0 + ${NSD_CreateText} 100 45 150u 12u $TextPostgreSQLHostname + Pop $HWNDPostgreSQLHostname + + ${NSD_CreateLabel} 0 75 60u 12u $(DESC_PostgreSQL_Port) + Pop $0 + ${NSD_CreateNumber} 100 75 150u 12u $TextPostgreSQLPort + Pop $HWNDPostgreSQLPort + ${NSD_CreateLabel} 0 105 60u 12u $(DESC_PostgreSQL_Username) + Pop $0 + ${NSD_CreateText} 100 105 150u 12u $TextPostgreSQLUsername + Pop $HWNDPostgreSQLUsername + ${NSD_CreateLabel} 0 135 60u 12u $(DESC_PostgreSQL_Password) + Pop $0 + ${NSD_CreateText} 100 135 150u 12u $TextPostgreSQLPassword + Pop $HWNDPostgreSQLPassword + + nsDialogs::Show +FunctionEnd + +Function LeavePostgreSQL + ${NSD_GetText} $HWNDPostgreSQLHostname $TextPostgreSQLHostname + ${NSD_GetText} $HWNDPostgreSQLPort $TextPostgreSQLPort + ${NSD_GetText} $HWNDPostgreSQLUsername $TextPostgreSQLUsername + ${NSD_GetText} $HWNDPostgreSQLPassword $TextPostgreSQLPassword + StrLen $1 $TextPostgreSQLHostname + ${If} $1 == 0 + MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_HostNameIsEmpty) + Abort + ${EndIf} + + ${If} $TextPostgreSQLPort <= 0 + ${OrIf} $TextPostgreSQLPort > 65535 + MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PortIsWrong) + Abort + ${EndIf} + + StrLen $1 $TextPostgreSQLUsername + ${If} $1 == 0 + MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_UserNameIsEmpty) + Abort + ${EndIf} + + StrLen $1 $TextPostgreSQLPassword + ${If} $1 == 0 + MessageBox MB_ICONEXCLAMATION|MB_OK $(WARNING_PasswordIsEmpty) + Abort + ${EndIf} +FunctionEnd + +Function ComponentLeave + SectionGetFlags ${SectionFLECTRA_Server} $0 + IntOp $0 $0 & ${SF_SELECTED} + IntCmp $0 ${SF_SELECTED} Done + + SectionGetFlags ${SectionPostgreSQL} $0 + IntOp $0 $0 & ${SF_SELECTED} + IntCmp $0 ${SF_SELECTED} DontInstallPostgreSQL + + ChooseAtLeastOneComponent: + MessageBox MB_ICONEXCLAMATION|MB_OK $(DESC_AtLeastOneComponent) + Abort + + DontInstallPostgreSQL: + MessageBox MB_ICONEXCLAMATION|MB_OK $(DESC_CanNotInstallPostgreSQL) + Abort + Done: +FunctionEnd + +Function LaunchLink + ExecShell "open" "http://localhost:7073/" +FunctionEnd