/*
# templates/update_config/services/updateConfigService.js
# Copyright 2022 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, PAGE */
define(
'shared/js/update_config/services/updateConfigService',[
"angular",
"cjt/io/whm-v1-request",
"cjt/io/whm-v1",
"cjt/io/api",
"cjt/services/APIService",
],
function(angular, APIREQUEST) {
"use strict";
var app = angular.module("whm.updateConfig.updateConfigurationService", []);
app.factory(
"updateConfigService",
["$q", "APIService", function($q, APIService) {
var UpdateConfigService = function() {
APIService.call(this);
};
UpdateConfigService.prototype = Object.create(APIService.prototype);
angular.extend(UpdateConfigService.prototype, {
/**
* Enables automatic daily updates for cPanel, RPMs, and SpamAssassin.
*
* @method - enableAutomaticUpdates
* @returns {Promise} - When resolved, the config settings have been saved. When rejected, returns a descriptive error message if available.
*/
enableAutomaticUpdates: function enableAutomaticUpdates() {
var apiCall = new APIREQUEST.Class();
var apiArgs = {
"UPDATES": "daily",
"RPMUP": "daily",
"SARULESUP": "daily"
};
apiCall.initialize("", "update_updateconf", apiArgs);
return this.deferred(apiCall).promise;
}
});
return new UpdateConfigService();
}
]);
}
);
/*
# templates/update_config/config.js Copyright 2022 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, PAGE: false */
define(
'app/config',[
"angular",
"jquery",
"lodash",
"cjt/util/locale",
"cjt/util/parse",
"uiBootstrap",
"cjt/directives/alert",
"cjt/directives/callout",
"cjt/directives/actionButtonDirective",
"cjt/directives/alertList",
"cjt/services/alertService",
"shared/js/update_config/services/updateConfigService",
],
function(angular, $, _, LOCALE, PARSE) {
"use strict";
var app = angular.module("whm.updateConfig", ["whm.updateConfig.updateConfigurationService"]);
app.controller("config", ["$scope", "updateConfigService", "alertService",
function($scope, updateConfigService, alertService) {
$scope.changeStagingDir = function() {
$scope.stagingDir = $scope.stagingSelection;
// add a slash if the path does not end in one
if (!/\/$/.test($scope.stagingSelection)) {
$scope.stagingDir += "/";
}
};
$scope.stagingdirOnChange = function() {
$scope.showStagingSubdir = toggleStagingSubdir();
$scope.stagingSelection = getPartition();
};
/**
* Decides whether to show the input group hint, based on whether or
* not the stagingDir is /usr/local/cpanel or not.
* @return boolean True if the input group should be shown.
*/
function toggleStagingSubdir() {
return !/^\/usr\/local\/cpanel\/?$/.test($scope.stagingDir);
}
$scope.submitForm = function($event) {
if ($scope.isSaving) {
$event.preventDefault();
return;
}
$scope.isSaving = true;
};
/**
* Calls the service to enable automatic daily updates for cPanel, RPMs,
* and SpamAssassin. Triggers a success or error alert based on response
* from the service.
*
* @method - enableAutomaticUpdates
*/
$scope.enableAutomaticUpdates = function() {
return updateConfigService.enableAutomaticUpdates()
.then(function(result) {
$scope.autoUpdateEnabled = true;
// Clear any previous errors before adding success message
alertService.removeById("autoUpdateError");
alertService.add({
type: "success",
message: LOCALE.maketext("The system saved your changes. To update now, click [output,url,_1,here,id,_2].", "../scripts2/upcpform", "update-now-link"),
id: "autoUpdateSuccess"
});
})
.catch(function(error) {
var errorMessage = LOCALE.maketext("The system failed to save your new settings: [_1]", _.escape(error));
alertService.add({
type: "danger",
message: errorMessage,
id: "autoUpdateError"
});
});
};
$scope.toggleVersionDetails = function() {
$scope.showVersionDetails = !$scope.showVersionDetails;
if ($scope.showVersionDetails) {
$scope.additionalInfoText = LOCALE.maketext("Hide Additional Details");
} else {
$scope.additionalInfoText = LOCALE.maketext("Show Additional Details");
}
};
/**
* Provide a string with the appropriate tense, based on the expiration date vs the current date.
* @returns string The localized string that tells when support for their custom build ended/will end.
*/
function getCustomTierExpirationStr() {
$scope.customTierIsExpired = $scope.customTierExpiration && $scope.customTierExpiration.getTime() < Date.now();
return $scope.customTier && $scope.customTierIsExpired ?
LOCALE.maketext("Support for this build ended on [_1].", $scope.customTierExpirationLocalized) :
LOCALE.maketext("Support for this build will end on [_1].", $scope.customTierExpirationLocalized);
}
/**
* Finds the partition that houses the stagingDir path.
* @return string The matching partition path.
*/
function getPartition() {
var partitions = PAGE.partitions;
// Get rid of extra slashes from the user input
var normalizedStagingDir = $scope.stagingDir.replace(/(\/)+/g, "$1");
if (!/\/$/.test(normalizedStagingDir)) {
normalizedStagingDir += "/";
}
// Find all of the matching partitions
var partitionMatches = [];
var selectPartition = "";
var partitionPath;
if (partitions.length > 0) {
for (var i = 0; i < partitions.length; i++) {
partitionPath = partitions[i].path;
if (!/\/$/.test(partitionPath)) {
partitionPath += "/";
}
if (normalizedStagingDir.indexOf(partitionPath) === 0) {
partitionMatches.push(partitions[i].path);
}
}
}
// Find the best match partition
if (partitionMatches.length > 0) {
selectPartition = partitionMatches.reduce(function(a, b) {
return a.length > b.length ? a : b;
});
}
return selectPartition;
}
$scope.init = function() {
$scope.loading = true;
$scope.preventSumbit = PAGE.preventSumbit;
$scope.saved = PAGE.saved;
$scope.saveFailed = PAGE.save_failed;
$scope.tiers = PAGE.flat_tiers;
$scope.saveFailReason = PAGE.save_fail_reason;
$scope.currentVersion = PAGE.current_version;
$scope.currentMajorVersion = PAGE.current_major_version;
$scope.currentMajorVersionNoEleven = parseInt( $scope.currentVersion.split(".")[0] );
$scope.isDevVersion = $scope.currentMajorVersionNoEleven % 2 !== 0 ? true : false;
$scope.customTier = PAGE.custom_tier;
$scope.requiredFreeSpace = PAGE.required_free_space;
$scope.hostname = PAGE.hostname;
$scope.stagingDir = PAGE.upconf.staging_dir;
$scope.stagingSelection = getPartition();
$scope.showStagingSubdir = toggleStagingSubdir();
$scope.tierSelection = $scope.customTier ? $scope.customTier : PAGE.checked;
$scope.isSaving = false;
$scope.showVersionDetails = false;
$scope.additionalInfoText = LOCALE.maketext("Show Additional Details");
var customTierInfo = PAGE.custom_tier_info;
if (customTierInfo) {
$scope.customTierLatestBuild = customTierInfo.latest_build;
/**
* We offer support for the life of the tier, even if the installed
* version or custom tier have a lower expiration date, so we need to
* find the furthest date out to display.
*/
var customTierExpiration = Math.max(customTierInfo.latest_build_expiration, customTierInfo.main_build_expiration);
if (customTierExpiration) {
$scope.customTierExpiration = new Date(customTierExpiration * 1000);
$scope.customTierExpirationLocalized = LOCALE.datetime($scope.customTierExpiration);
$scope.customTierExpiredWarningText = getCustomTierExpirationStr();
}
}
if ($scope.customTier && !customTierInfo.main_build) {
$scope.customTierInvalidWarningText = LOCALE.maketext(
"“[_1]” is not a supported named release tier. Your server won’t receive updates without a valid tier.",
$scope.customTier
);
}
$scope.hasCustomTierWarning = Boolean($scope.customTierInvalidWarningText || $scope.customTierExpiredWarningText);
$scope.upconf = PAGE.upconf;
$scope.autoUpdateEnabled = PARSE.parsePerlBoolean($scope.upconf.auto_update_enabled);
$scope.loading = false;
};
$scope.init();
}
]);
}
);
/*
# templates/update_config/index.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 require: false, define: false, PAGE: false */
define(
'app/index',[
"angular",
"jquery",
"lodash",
"cjt/core",
"cjt/modules",
"ngRoute",
"uiBootstrap",
"ngSanitize"
],
function(angular, $, _, CJT) {
return function() {
angular.module("App", [
"cjt2.config.whm.configProvider",
"ngRoute",
"ui.bootstrap",
"cjt2.whm",
"whm.updateConfig",
]);
var app = require(
[
"cjt/bootstrap",
"cjt/views/applicationController",
"app/config",
], function(BOOTSTRAP) {
var app = angular.module("App");
app.value("PAGE", PAGE);
BOOTSTRAP(document);
});
return app;
};
}
);