var requestToQuitFromApp = false; var updaterCompleted = 0; var desktopAppProcessRunning = false; var appInstalledUninstallerPath; var appInstalledUninstallerPath_x86; function appName() { return installer.value("Name"); } function appExecutableFileName() { if (runningOnWindows()) { return appName() + ".exe"; } else { return appName(); } } function appInstalled() { if (runningOnWindows()) { appInstalledUninstallerPath = installer.value("RootDir") + "Program Files/AmneziaVPN/maintenancetool.exe"; appInstalledUninstallerPath_x86 = installer.value("RootDir") + "Program Files (x86)/AmneziaVPN/maintenancetool.exe"; } else if (runningOnMacOS()){ appInstalledUninstallerPath = "/Applications/" + appName() + ".app/maintenancetool.app/Contents/MacOS/maintenancetool"; } else if (runningOnLinux()){ allInstalledUninstallerPath = "/opt/" + appName(); } return installer.fileExists(appInstalledUninstallerPath) || installer.fileExists(appInstalledUninstallerPath_x86); } function endsWith(str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; } function runningOnWindows() { return (installer.value("os") === "win"); } function runningOnMacOS() { return (installer.value("os") === "mac"); } function runningOnLinux() { return (installer.value("os") === "linux"); } function sleep(miliseconds) { var currentTime = new Date().getTime(); while (currentTime + miliseconds >= new Date().getTime()) {} } function raiseInstallerWindow() { if (!runningOnMacOS()) { return; } var result = installer.execute("/bin/bash", ["-c", "ps -A | grep -m1 '" + appName() + "' | awk '{print $1}'"]); if (Number(result[0]) > 0) { var arg = 'tell application \"System Events\" ' + '\n set frontmost of the first process whose unix id is ' + Number(result[0]) + ' to true ' + '\n end tell' + '\n '; installer.execute("osascript", ["-e", arg]); } } function appProcessIsRunning() { if (runningOnWindows()) { var cmdArgs = ["/FI", "WINDOWTITLE eq " + appName()]; var result = installer.execute("tasklist", cmdArgs); if ( Number(result[1]) === 0 ) { if (result[0].indexOf(appExecutableFileName()) !== -1) { return true; } } } else { return checkProccesIsRunning("pgrep -x '" + appName() + "'") } return false; } function checkProccesIsRunning(arg) { var cmdArgs = ["-c", arg]; var result = installer.execute("/bin/bash", cmdArgs); var resultArg1 = Number(result[0]) if (resultArg1 >= 3) { return true; } return false; } function requestToQuit(installer,gui) { requestToQuitFromApp = true; installer.setDefaultPageVisible(QInstaller.IntroductionPage, false); installer.setDefaultPageVisible(QInstaller.TargetDirectory, false); installer.setDefaultPageVisible(QInstaller.ComponentSelection, false); installer.setDefaultPageVisible(QInstaller.LicenseCheck, false); installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false); installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false); installer.setDefaultPageVisible(QInstaller.PerformInstallation, false); installer.setDefaultPageVisible(QInstaller.FinishedPage, false); gui.clickButton(buttons.NextButton); gui.clickButton(buttons.FinishButton); gui.clickButton(buttons.CancelButton); if (runningOnWindows()) { installer.setCancelled(); } } Controller.prototype.PerformInstallationPageCallback = function() { gui.clickButton(buttons.NextButton); } Controller.prototype.LicenseAgreementPageCallback = function() { gui.clickButton(buttons.NextButton); } Controller.prototype.FinishedPageCallback = function () { if (desktopAppProcessRunning) { gui.clickButton(buttons.FinishButton); } else if (installer.isUpdater()) { installer.autoAcceptMessageBoxes(); gui.clickButton(buttons.FinishButton); } } Controller.prototype.RestartPageCallback = function () { updaterCompleted = 1; gui.clickButton(buttons.FinishButton); } Controller.prototype.StartMenuDirectoryPageCallback = function() { gui.clickButton(buttons.NextButton); } Controller.prototype.ComponentSelectionPageCallback = function() { gui.clickButton(buttons.NextButton); } Controller.prototype.ReadyForInstallationPageCallback = function() { if (installer.isUpdater()) { gui.clickButton(buttons.CommitButton); } } Controller.prototype.TargetDirectoryPageCallback = function () { var widget = gui.pageById(QInstaller.TargetDirectory); if (widget !== null) { widget.BrowseDirectoryButton.clicked.disconnect(onBrowseButtonClicked); widget.BrowseDirectoryButton.clicked.connect(onBrowseButtonClicked); gui.clickButton(buttons.NextButton); } } Controller.prototype.IntroductionPageCallback = function () { var widget = gui.currentPageWidget(); if (installer.isUpdater() && updaterCompleted === 1) { gui.clickButton(buttons.FinishButton); gui.clickButton(buttons.CancelButton); return; } if (installer.isUninstaller()) { if (widget !== null) { widget.findChild("PackageManagerRadioButton").visible = false; widget.findChild("UpdaterRadioButton").visible = false; } } if (installer.isUpdater()) { gui.clickButton(buttons.NextButton); } } onBrowseButtonClicked = function() { var widget = gui.pageById(QInstaller.TargetDirectory); if (widget !== null) { if (runningOnWindows()) { // On Windows we are appending \ if selected path don't ends with var targetDir = widget.TargetDirectoryLineEdit.text; if (! endsWith(targetDir, appName())) { targetDir = targetDir + "\\" + appName(); } installer.setValue("TargetDir", targetDir); widget.TargetDirectoryLineEdit.setText(installer.value("TargetDir")); } } } onNextButtonClicked = function() { var widget = gui.pageById(QInstaller.TargetDirectory); if (widget !== null) { installer.setValue("APP_BUNDLE_TARGET_DIR", widget.TargetDirectoryLineEdit.text); } } function Controller () { console.log("OS: %1, architecture: %2".arg(systemInfo.prettyProductName).arg(systemInfo.currentCpuArchitecture)); if (installer.isInstaller() || installer.isUpdater()) { console.log("Check if app already installed: " + appInstalled()); } if (runningOnWindows()) { installer.setValue("AllUsers", "true"); } if (installer.isInstaller()) { installer.setDefaultPageVisible(QInstaller.ComponentSelection, false); installer.setDefaultPageVisible(QInstaller.TargetDirectory, false); installer.setDefaultPageVisible(QInstaller.StartMenuDirectoryPage, false); installer.setDefaultPageVisible(QInstaller.LicenseCheck, false); isDesktopAppProcessRunningMessageLoop(); if (requestToQuitFromApp === true) { requestToQuit(installer, gui); return; } if (runningOnMacOS()) { installer.setMessageBoxAutomaticAnswer("OverwriteTargetDirectory", QMessageBox.Yes); } if (appInstalled()) { if (QMessageBox.Ok === QMessageBox.information("os.information", appName(), qsTr("The application is already installed.") + " " + qsTr("We need to remove the old installation first. Do you wish to proceed?"), QMessageBox.Ok | QMessageBox.Cancel)) { if (appInstalled()) { var resultArray = []; if (installer.fileExists(appInstalledUninstallerPath_x86)) { console.log("Starting uninstallation " + appInstalledUninstallerPath_x86); resultArray = installer.execute(appInstalledUninstallerPath_x86); } if (installer.fileExists(appInstalledUninstallerPath)) { console.log("Starting uninstallation " + appInstalledUninstallerPath); resultArray = installer.execute(appInstalledUninstallerPath); } console.log("Uninstaller finished with code: " + resultArray[1]) if (Number(resultArray[1]) !== 0) { console.log("Uninstallation aborted by user"); installer.setCancelled(); return; } else { for (var i = 0; i < 300; i++) { sleep(100); if (!installer.fileExists(appInstalledUninstallerPath)) { break; } } } } raiseInstallerWindow(); } else { console.log("Request to quit from user"); installer.setCancelled(); return; } } } else if (installer.isUninstaller()) { isDesktopAppProcessRunningMessageLoop(); if (requestToQuitFromApp === true) { requestToQuit(installer, gui); return; } } else if (installer.isUpdater()) { installer.setMessageBoxAutomaticAnswer("cancelInstallation", QMessageBox.No); installer.installationFinished.connect(function() { gui.clickButton(buttons.NextButton); }); } } isDesktopAppProcessRunningMessageLoop = function () { if (requestToQuitFromApp === true) { return; } if (installer.isUpdater()) { for (var i = 0; i < 400; i++) { desktopAppProcessRunning = appProcessIsRunning(); if (!desktopAppProcessRunning) { break; } } } desktopAppProcessRunning = appProcessIsRunning(); if (desktopAppProcessRunning) { var result = QMessageBox.warning("QMessageBox", appName() + " installer", appName() + " is active. Close the app and press \"Retry\" button to continue installation. Press \"Abort\" button to abort the installer and exit.", QMessageBox.Retry | QMessageBox.Abort); if (result === QMessageBox.Retry) { isDesktopAppProcessRunningMessageLoop(); } else { requestToQuitFromApp = true; return; } } }