Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/mysqlhost/services/MySQLHostDataSource.js

/*
# templates/mysqlhost/services/MySQLHostDataSource.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 */
/* jshint -W100 */

define(
    [
        "angular",
        "jquery",
        "lodash",
        "cjt/util/locale",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1", // IMPORTANT: Load the driver so it's ready
        "app/models/MysqlProfile",
        "app/models/MysqlProfileUsingSsh"
    ],
    function(angular, $, _, LOCALE, PARSE, API, APIREQUEST, APIDRIVER, MysqlProfile, MysqlProfileUsingSsh) {

        // Retrieve the current application
        var app = angular.module("App");

        var mysqlHostData = app.factory("MySQLHostDataSource", ["$q", function($q) {

            var mysqlHostData = {};

            mysqlHostData.profiles = {};

            mysqlHostData.clearCache = function() {
                mysqlHostData.profiles = {};
            };

            mysqlHostData.generateErrorMessageForDisplay = function(metadata) {
                if (!metadata) {
                    return LOCALE.maketext("An unexpected error occurred.");
                }

                var error = _.escape(metadata.reason) + "<br><br>",
                    i = 0,
                    len = metadata.error_count,
                    escapedMessages = [];

                for (i; i < len; i++) {
                    escapedMessages.push(_.escape(metadata.errors[i]));
                }

                error += escapedMessages.join("<br>");

                return error;
            };

            mysqlHostData.createObjectForTransport = function(object) {
                var obj = {};

                if (object instanceof MysqlProfile) {
                    obj = {
                        "name": object.name,
                        "mysql_host": object.host,
                        "mysql_port": object.port,
                        "mysql_user": object.account,
                        "mysql_pass": object.password
                    };
                    if (object.hasOwnProperty("active")) {
                        obj.active = object.active ? 1 : 0;
                    }
                } else if (object instanceof MysqlProfileUsingSsh) {
                    obj = {
                        "name": object.name,
                        "host": object.host,
                        "port": object.port,
                        "user": object.account,
                        "password": object.password,
                        "sshkey_name": object.ssh_key,
                        "sshkey_passphrase": object.ssh_passphrase,
                        "root_escalation_method": object.escalation_type
                    };
                    if (object.hasOwnProperty("active")) {
                        obj.active = object.active ? 1 : 0;
                    }
                    if (object.escalation_type === "su") {
                        obj.root_password = object.escalation_password;
                    }
                }

                return obj;
            };

            mysqlHostData.createObjectFromAPI = function(name, object) {
                var obj = new MysqlProfile({
                    name: name,
                    host: object.mysql_host,
                    port: object.mysql_port,
                    account: object.mysql_user,
                    password: object.mysql_pass,
                    comment: object.setup_via,
                    is_local: object.is_localhost_profile,
                    is_supported: object.mysql_version_is_supported
                });
                var isActive = PARSE.parsePerlBoolean(object.active);
                if (isActive) {
                    obj.activate();
                } else {
                    obj.deactivate();
                }

                return obj;
            };

            mysqlHostData.createObjectsFromAPI = function(data) {
                var profiles = {};
                for (var i = 0, keys = _.keys(data), len = keys.length; i < len; i++) {
                    var name = keys[i];
                    var obj = mysqlHostData.createObjectFromAPI(name, data[keys[i]]);
                    profiles[name] = obj;
                }
                return profiles;
            };

            mysqlHostData.createProfile = function(profileData) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();

                if (profileData.type === "ssh") {
                    apiCall.initialize("", "remote_mysql_create_profile_via_ssh");
                } else {
                    apiCall.initialize("", "remote_mysql_create_profile");
                }

                var obj = mysqlHostData.createObjectForTransport(profileData);
                for (var i = 0, keys = _.keys(obj), len = keys.length; i < len; i++) {
                    var value = obj[keys[i]];
                    apiCall.addArgument(keys[i], value);
                }

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            mysqlHostData.profiles[response.data.profile_saved] = mysqlHostData.createObjectFromAPI(response.data.profile_saved, response.data.profile_details);
                            deferred.resolve(null);
                        } else {
                            deferred.reject(mysqlHostData.generateErrorMessageForDisplay(response.meta));
                        }
                    });

                return deferred.promise;
            };

            mysqlHostData.updateProfile = function(profileData) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();

                apiCall.initialize("", "remote_mysql_update_profile");

                var obj = mysqlHostData.createObjectForTransport(profileData);
                for (var i = 0, keys = _.keys(obj), len = keys.length; i < len; i++) {
                    var value = obj[keys[i]];
                    apiCall.addArgument(keys[i], value);
                }

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            mysqlHostData.profiles[response.data.profile_saved] = mysqlHostData.createObjectFromAPI(response.data.profile_saved, response.data.profile_details);
                            deferred.resolve(null);
                        } else {
                            deferred.reject(mysqlHostData.generateErrorMessageForDisplay(response.meta));
                        }
                    });

                return deferred.promise;
            };


            mysqlHostData.loadProfiles = function() {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "remote_mysql_read_profiles");

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            mysqlHostData.profiles = mysqlHostData.createObjectsFromAPI(response.data);
                            deferred.resolve(null);
                        } else {
                            deferred.reject(mysqlHostData.generateErrorMessageForDisplay(response.meta));
                        }
                    });

                return deferred.promise;
            };

            mysqlHostData.deleteProfile = function(profileName) {

                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "remote_mysql_delete_profile");
                apiCall.addArgument("name", profileName);

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {

                        // create items from the response
                        response = response.parsedResponse;
                        if (response.status) {
                            delete mysqlHostData.profiles[profileName];
                            deferred.resolve(null);
                        } else {
                            deferred.reject(mysqlHostData.generateErrorMessageForDisplay(response.meta));
                        }
                    });

                return deferred.promise;
            };

            mysqlHostData.validateProfile = function(profileName) {

                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "remote_mysql_validate_profile");
                apiCall.addArgument("name", profileName);

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response.data.profile_validated);
                        } else {
                            var errorHtml;

                            errorHtml = mysqlHostData.generateErrorMessageForDisplay(response.meta);
                            errorHtml = mysqlHostData.appendTroubleshootingLink({
                                html: errorHtml,
                                linkId: "validate-troubleshoot-link-" + profileName,
                            });

                            deferred.reject(errorHtml);
                        }
                    });

                return deferred.promise;
            };

            mysqlHostData.activateProfile = function(profileName) {

                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "remote_mysql_initiate_profile_activation");
                apiCall.addArgument("name", profileName);

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response.data.activation_job_started);
                        } else {
                            deferred.reject(mysqlHostData.generateErrorMessageForDisplay(response.meta));
                        }
                    });

                return deferred.promise;
            };

            mysqlHostData.monitorActivation = function(profileName) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "remote_mysql_monitor_profile_activation");

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (!response.data.job_in_progress && response.data.last_job_details.status === "FAILED") {
                            deferred.reject(response.data);
                        } else {
                            deferred.resolve(response.data);
                        }
                    });

                return deferred.promise;
            };

            mysqlHostData.activationInProgress = function() {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "remote_mysql_monitor_profile_activation");

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;

                        var activationDetails = {};

                        if (_.isNull(response.data.job_in_progress) && _.isNull(response.data.last_job_details)) {
                            deferred.reject({ in_progress: false });
                        }

                        activationDetails.in_progress = response.data.job_in_progress ? true : false;
                        if (activationDetails.in_progress) {
                            activationDetails.payload = response.data.job_in_progress;
                        } else {
                            activationDetails.payload = response.data.last_job_details;
                        }

                        deferred.resolve(activationDetails);
                    });

                return deferred.promise;
            };

            /**
             * Appends HTML for the troubleshooting link to the end of a growl
             * message's HTML.
             *
             * @method appendTroubleshootingLink
             * @param {object} args
             * @param {string} args.html - The HTML string to which the troubleshooting message should be appended.
             * @param {string} args.linkId - The ID to use on the anchor tag for the link.
             * @returns {string} - The final HTML string, with the troubleshooting message appended.
             */
            mysqlHostData.appendTroubleshootingLink = function(args) {
                var finalHtml = args.html;
                var troubleshootingLinkId = args.linkId;

                var troubleshootingHtml = LOCALE.maketext(
                    "For more information, read our [output,url,_1,documentation,target,_2,id,_3].",
                    "https://go.cpanel.net/troubleshootmysqlprofiles",
                    "troubleshootingDocs",
                    troubleshootingLinkId
                );

                finalHtml += "<div class=\"growl-troubleshooting-link\">" + troubleshootingHtml + "</div>";
                return finalHtml;
            };


            return mysqlHostData;
        }]);

        return mysqlHostData;
    }
);
Back to Directory File Manager