344 lines
11 KiB
JavaScript
344 lines
11 KiB
JavaScript
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()){
|
|
appInstalledUninstallerPath = "/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 \<APP_NAME> if selected path don't ends with <APP_NAME>
|
|
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;
|
|
}
|
|
}
|
|
}
|