amnezia-client/deploy/installer/config/controlscript.js

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;
}
}
}