Viewing File: /usr/local/cpanel/base/frontend/jupiter/passenger/services/apps.js
/*
# passenger/services/zones.js Copyright(c) 2020 cPanel, L.L.C.
# All rights reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
*/
/* global define: false */
define(
[
"angular",
"jquery",
"lodash",
"cjt/util/locale",
"cjt/util/parse",
"cjt/io/api",
"cjt/io/uapi-request",
"cjt/io/uapi"
],
function(angular, $, _, LOCALE, PARSE, API, UAPIREQUEST, UAPIDRIVER) {
"use strict";
var app = angular.module("cpanel.applicationManager.appsService", []);
app.value("defaultInfo", PAGE);
var factory = app.factory("Apps", ["$q", "defaultInfo", function($q, defaultInfo) {
var store = {};
store.applications = [];
store.homedir_regex = new RegExp("^(?:" + defaultInfo.homedir + ")/?");
store.has_support_for_env_vars = PARSE.parsePerlBoolean(defaultInfo.has_mod_env);
store.max_number_of_apps = Number(defaultInfo.max_passenger_apps);
store.get_maximum_number_of_apps = function() {
return store.max_number_of_apps;
};
store.exceeds_quota = function() {
return store.applications.length >= store.max_number_of_apps;
};
store.get_default_application = function() {
var new_appl = {};
new_appl.name = "";
new_appl.path = "";
new_appl.enabled = true;
new_appl.domain = "";
new_appl.base_uri = "/";
new_appl.deployment_mode = "production";
if (store.has_support_for_env_vars) {
new_appl.envvars = {};
}
return new_appl;
};
/**
* Add an application based on the type.
* @param appl - the application object we are sending. the fields in the object
* depend on the type of record.
* @return Promise
*/
store.add_application = function(appl) {
var apiCall = new UAPIREQUEST.Class();
apiCall.initialize("PassengerApps", "register_application");
apiCall.addArgument("name", appl.name);
apiCall.addArgument("path", appl.path);
apiCall.addArgument("deployment_mode", appl.deployment_mode);
apiCall.addArgument("domain", appl.domain);
apiCall.addArgument("base_uri", appl.base_uri);
if (store.has_support_for_env_vars) {
var envvar_index = 1;
_.forEach(appl.envvars, function(value, key) {
apiCall.addArgument("envvar_name-" + envvar_index, key);
apiCall.addArgument("envvar_value-" + envvar_index, value);
envvar_index++;
});
}
apiCall.addArgument("enabled", appl.enabled ? 1 : 0);
return $q.when(API.promise(apiCall.getRunArguments()))
.then(function(response) {
response = response.parsedResponse;
if (response.status) {
var obj = store.strip_homedirs_and_convert_enabled(response.data);
store.applications.push(obj);
return obj;
} else {
return $q.reject(response.error);
}
}, function(response) {
if (!response.status) {
return $q.reject(response.error);
}
});
};
store.update_application = function(appl, previous_name) {
var apiCall = new UAPIREQUEST.Class();
_.defaults(appl, { name: "" }, { path: "" }, { base_uri: "/" });
apiCall.initialize("PassengerApps", "edit_application");
if (appl.name !== previous_name) {
apiCall.addArgument("name", previous_name);
apiCall.addArgument("new_name", appl.name);
} else {
apiCall.addArgument("name", appl.name);
}
apiCall.addArgument("path", appl.path);
apiCall.addArgument("base_uri", appl.base_uri);
apiCall.addArgument("domain", appl.domain);
apiCall.addArgument("deployment_mode", appl.deployment_mode);
if (store.has_support_for_env_vars) {
var envvar_count = _.size(appl.envvars);
if (envvar_count === 0) {
apiCall.addArgument("clear_envvars", 1);
} else {
var envvar_index = 0;
_.forEach(appl.envvars, function(value, key) {
envvar_index++;
apiCall.addArgument("envvar_name-" + envvar_index, key);
apiCall.addArgument("envvar_value-" + envvar_index, value);
});
}
}
apiCall.addArgument("enabled", appl.enabled ? 1 : 0);
return $q.when(API.promise(apiCall.getRunArguments()))
.then(function(response) {
response = response.parsedResponse;
if (response.status) {
// update the applications array with the new information
var app_to_update = store.get_application_index(previous_name);
var obj = store.strip_homedirs_and_convert_enabled(response.data);
if (response.data.name !== previous_name) {
if (app_to_update >= 0) {
store.applications.splice(app_to_update, 1);
store.applications.push(obj);
}
} else {
store.applications[app_to_update] = obj;
}
return obj;
} else {
return $q.reject(response.error);
}
}, function(response) {
return $q.reject(response.error);
});
};
store.strip_homedir_from_path = function(obj) {
if (obj.path) {
obj.path = obj.path.replace(store.homedir_regex, "");
}
return obj;
};
store.strip_homedirs_and_convert_enabled = function(to_convert) {
var temp = to_convert;
if (!Array.isArray(to_convert)) {
temp = [to_convert];
}
for (var i = 0, len = temp.length; i < len; i++) {
temp[i] = store.strip_homedir_from_path(temp[i]);
temp[i].enabled = PARSE.parsePerlBoolean(temp[i].enabled);
}
if (!Array.isArray(to_convert)) {
return temp[0];
} else {
return temp;
}
};
store.fetch = function(force) {
if (store.applications.length === 0 || force) {
var apiCall = new UAPIREQUEST.Class();
apiCall.initialize("PassengerApps", "list_applications");
return $q.when(API.promise(apiCall.getRunArguments()))
.then(function(response) {
response = response.parsedResponse;
if (response.status) {
store.applications = _.values(response.data);
store.applications = store.strip_homedirs_and_convert_enabled(store.applications);
return store.applications;
} else {
return $q.reject(response.error);
}
});
} else {
return $q.when(store.applications);
}
};
store.get_application_index = function(appl_name) {
return _.findIndex( store.applications, function(element) {
return appl_name === element.name;
});
};
store.find_application = function(appl) {
var app_index = store.get_application_index(appl.name);
if (app_index >= 0) {
return store.applications[app_index];
}
return null;
};
store.get_application_by_name = function(appl_name) {
return store.fetch()
.then(function(data) {
var app_index = store.get_application_index(appl_name);
if (app_index > -1) {
return data[app_index];
} else {
return null;
}
});
};
store.toggle_application_status = function(appl) {
var apiCall = new UAPIREQUEST.Class();
if (appl.enabled) {
apiCall.initialize("PassengerApps", "disable_application");
} else {
apiCall.initialize("PassengerApps", "enable_application");
}
apiCall.addArgument("name", appl.name);
return $q.when(API.promise(apiCall.getRunArguments()))
.then(function(response) {
response = response.parsedResponse;
if (response.status) {
var app_index = store.get_application_index(appl.name);
store.applications[app_index].enabled = !appl.enabled;
return store.applications[app_index];
} else {
return $q.reject(response.error);
}
}, function(response) {
return $q.reject(response.error);
});
};
/**
* Remove an application
* @param application - the application to remove
* @return Promise
*/
store.remove_application = function(appl_name) {
var apiCall = new UAPIREQUEST.Class();
apiCall.initialize("PassengerApps", "unregister_application");
apiCall.addArgument("name", appl_name);
return $q.when(API.promise(apiCall.getRunArguments()))
.then(function(response) {
response = response.parsedResponse;
if (response.status) {
var app_index = store.get_application_index(appl_name);
store.applications.splice(app_index, 1);
} else {
return $q.reject(response.error);
}
}, function(response) {
return $q.reject(response.error);
});
};
store.ensureDependencies = function(appType, appPath) {
var apiCall = new UAPIREQUEST.Class();
apiCall.initialize("PassengerApps", "ensure_deps");
apiCall.addArgument("type", appType);
apiCall.addArgument("app_path", appPath);
return $q.when(API.promise(apiCall.getRunArguments()))
.then(function(response) {
response = response.parsedResponse;
if (response.status) {
return response;
} else {
return $q.reject(response.error);
}
}, function(response) {
return $q.reject(response.error);
});
};
return store;
}]);
return factory;
}
);
Back to Directory
File Manager