Viewing File: /usr/local/cpanel/base/frontend/jupiter/tools/index.tt

[%
USE Api2;
USE Master;
USE CPBranding;
USE Apache;
USE VarCache;
USE Content_Includes;
USE NVData;
USE Team;

SET has_component_system = file_test('f', "/usr/local/cpanel/base/frontend/jupiter/_assets/component.html.tt");
IF has_component_system;
    USE Components;
END;

SET CPANEL.CPVAR.indexpage = "1";

SET homeDir = CPANEL.homedir,
    isReseller = ExpVar.expand('$isresellerlogin'),
    domain = CPANEL.CPDATA.DNS,
    user_theme = CPANEL.CPDATA.RS,
    user = CPANEL.user,
    display_user = CPANEL.display_user,
    isTeamUser = CPANEL.is_team_user;

IF isTeamUser;
    SET teamOwner = CPANEL.team_owner;
END;

SET embeded_styles_list = ["tools/dashboard.css"];
SET page_styles_list = [];

IF !CPANEL.ua_is_mobile;
    embeded_styles_list.push("css/angular-chosen-spinner.css");
    page_styles_list.push("libraries/chosen/1.5.1/chosen.min.css");
END;

SET applist = ["tls_status"];
SET apps = {};

FOREACH applist_item IN applist;
    apps.$applist_item = CPBranding.get_application_from_available_applications(varcache.available_applications, applist_item);
END;

SET upgradeUrl = CPANEL.CPVAR.dprefix _ CPBranding.get_implementer_from_available_applications(
        varcache.available_applications,
        'upgrade',
    ).url;
SET wpToolkitUrl = CPANEL.CPVAR.dprefix _ CPBranding.get_application_from_available_applications(
        varcache.available_applications,
        'wp-toolkit',
    ).url;

# Set NGINX variables.
SET nginx_caching_enabled       = 0; # hard coded default
SET nginx_is_installed = !file_test("e", "/etc/nginx/ea-nginx/enable.standalone") && file_test("e", "/etc/nginx/ea-nginx/cache.json");

IF isTeamUser;
    SET team_user_expire_date = Team.get_team_user_expire_date(teamOwner, display_user);
END;

IF nginx_is_installed;
    SET nginx_caching_userconf_path = "/var/cpanel/userdata/" _ user _ "/nginx-cache.json";

    SET nginx_caching_global = JSON.loadfile("/etc/nginx/ea-nginx/cache.json");
    IF nginx_caching_global.exists("enabled");
        nginx_caching_enabled = nginx_caching_global.item("enabled");
    END;

    IF file_test("e", nginx_caching_userconf_path);
        SET nginx_caching_user = JSON.loadfile(nginx_caching_userconf_path);
        IF nginx_caching_user.exists("enabled");
            nginx_caching_enabled = nginx_caching_user.item("enabled");
        END;
    END;
END;

SET display_welcome_panel = varcache.display_welcome_panel;
varcache.set('migrated_to_jupiter', to_boolean(NVData.get('migrated_to_jupiter').trim));
varcache.set('migration_modal_dismissed', to_boolean(NVData.get('cp-migration-panel_dismissed').trim));

SET display_cpanel_promotions = ExpVar.expand('$display_cpanel_promotions');

SET analytics_setting = varcache.analytics;
%]

[% js_code_first = PROCESS js_block_first %]

[% js_page_first = PROCESS register_nvdata %]

[% WRAPPER '_assets/master.html.tt'
    page_title = locale.maketext("Tools")
    page_js_top = js_code_first
    page_js = js_page_first
    include_legacy_stylesheets = 0
    include_legacy_scripts = 0
    include_cjt = 0
    embed_stylesheets = embeded_styles_list
    page_stylesheets = page_styles_list
    hide_page_heading = 0
    app_key = "tools"
    use_master_bootstrap = 0
    focus_feature_search = 1
-%]

<div growl limit-messages="1"></div>

<!-- NOTE: leave the alert-group in single quotes -->
<cp-alert-list></cp-alert-list>

<div class="row">
    <div id="main" class="col-xs-12 col-sm-12 col-md-9 col-lg-9">
        [%
        IF has_component_system && Components.has_components_for('cpanel', 'tools', 'before-menu');
            PROCESS "_assets/component.html.tt",
                APP_KEY => 'tools',
                TAG     => 'div',
                SLOT    => 'before-menu';
        END;
        %]

        [% PROCESS tools/views/applicationList.html.tt %]
        [%
        IF has_component_system && Components.has_components_for('cpanel', 'tools', 'after-menu');
            PROCESS "_assets/component.html.tt",
                APP_KEY => 'tools',
                TAG     => 'div',
                SLOT    => 'after-menu';
        END;
        %]

    </div><!-- end main -->

    <div id="stats" data-testid="sidebarParent" class="col-xs-12 col-sm-12 col-md-3 col-lg-3">
        <!-- Content Include point: before general information section -->
        [% Content_Includes.render("cpanel_jupiter_tools_general_information_before.html.tt") %]
        <!-- End: Content Include point -->
        <div id="generalInfoSection" data-testid="generalInformationSidebar" class="panel panel-widget">
            <div id="generalInfoHeaderSection" data-testid="generalInformationHeader" class="panel-heading widget-heading">
                <span role="heading" aria-level="3">[% locale.maketext("General Information") %]</span>
            </div>
            <table class="table" data-testid="generalInformationTable">
                <tbody>
                    <tr data-testid="accountRow">
                        <td colspan="2" ng-controller="accountsController">
                            <label id="lblUserName" data-testid="usernameLabel" class="general-info-label updating-elements">[% locale.maketext("Current User") %]</label>
                            [% IF isReseller && !isTeamUser %]
                                <span id="resellerSpinner" data-testid="resellerSpinner" class="fas fa-spinner fa-spin updating-elements" title="[% locale.maketext('Loading …') %]" ng-hide="updated"></span>
                                [% IF !CPANEL.ua_is_mobile %]
                                    <select width="'98%'"
                                        id="ddlAccounts"
                                        data-testid="accountsSelect"
                                        class="form-control ng-hide ng-cloak"
                                        search_contains="true"
                                        chosen
                                        ng-class="{ 'chosen-rtl': isRTL }"
                                        ng-options="item as item.accountLabel for item in accounts track by item.user"
                                        ng-model="selectedAccount"
                                        ng-change="accountChanged()">
                                    </select>
                                [% ELSE %]
                                    <select id="ddlAccounts"
                                        data-testid="accountsSelect"
                                        class="form-control ng-cloak"
                                        ng-options="item as item.accountLabel for item in accounts track by item.user"
                                        ng-model="selectedAccount"
                                        ng-change="accountChanged()">
                                    </select>
                                [% END %]
                            [% ELSE %]
                                <span id="txtUserName" data-testid="usernameText" class="general-info-value">[% display_user %]</span>
                            [% END %]
                        </td>
                    </tr>

                [% IF isTeamUser %]
                    <tr data-testid="teamOwnerRow">
                        <td colspan="2">
                            <label id="teamOwnerLabel" data-testid="teamOwnerLabel" class="general-info-label">[% locale.maketext("Team Owner") %]</label>
                            <span id="teamOwner" data-testid="teamOwnerText" class="general-info-value">[% teamOwner %]</span>
                        </td>
                    </tr>

                    [% IF team_user_expire_date %]
                    <tr data-testid="teamUserExpireRow">
                        <td colspan="2">
                            <label id="teamUserExpireDateLabel" data-testid="teamUserExpireDateLabel" class="general-info-label">[% locale.maketext("Expire Date") %]</label>
                            <span id="teamUserExpireDate" data-testid="teamUserExpireDateText" class="general-info-value">[%-
                                locale.maketext("[local_datetime,_1,date_format_medium][comment,this is needed to convert the date to a localized format]", (team_user_expire_date))
                            -%]</span>
                        </td>
                    </tr>
                    [% END %]
                [% END %]

                    [% IF apps.tls_status %]
                    <tr id="domainNameRow" data-testid="domainNameRow" ng-controller="sslStatusController" ng-init="primaryDomain = '[% domain %]'; " ng-class="{'warning':sslStatusLoaded && !sslSecured}" class="app-stat-row">
                        <td class="app-stat-data">
                            <label id="lblDomainName" data-testid="domainNameLabel" class="general-info-label">
                                [% locale.maketext("Primary Domain") %]
                                <span ng-if="sslStatusString" ng-cloak class="ng-cloak" ng-class="statusColorClasses">
                                    <span id="sslStatusToolTip" data-testid="sslStatusToolTip" ng-if="certHasErrors">
                                    <i uib-tooltip="{{certErrorsMessage}}" class="ri-1x ri-error-warning-line ssl-error-icon" aria-hidden="true"></i>
                                    <span class="sr-only">{{certErrorsMessage}}</span>
                                    </span>
                                </span>
                            </label>
                            <div id="txtDomainName" data-testid="domainNameText" class="general-info-value">
                                <span uib-tooltip="{{expandedSslStatusString}}" ng-class="sslValidationIconClasses" class="fas fa-spinner fa-spin"></span>
                                <a ng-href="{{ domainLink }}" target="_blank" title="[% locale.maketext('Preview “[_1]”', domain) %]">
                                    [% domain %]
                                    <i class="ri-1x ri-external-link-line" aria-hidden="true"></i>
                                </a>
                            </div>
                            <div class="ssl-link-container" ng-cloak ng-if="certHasErrors">
                                <a id="glass_lnkMaintain_DomainName" data-testid="domainSslStatusLink" class="link-button" href="[% CPANEL.CPVAR.dprefix _ apps.tls_status.url %]#/?domain=[% domain %]">
                                    <i class="ri-1x ri-bar-chart-grouped-line"></i>
                                    [% locale.maketext("SSL/TLS Status") %]
                                </a>
                            </div>
                        </td>
                    </tr>
                    [% ELSE %]
                    <tr id="domainNameRow" data-testid="domainNameRow">
                        <td class="app-stat-data" colspan="2" >
                            <label id="lblDomainName" data-testid="domainNameLabel" class="general-info-label">
                                [% locale.maketext("Primary Domain") %]
                            </label>
                            <div id="txtDomainName" data-testid="domainNameText" class="general-info-value">
                                <a href="https://[% domain | html %]" target="_blank" title="[% locale.maketext('Preview “[_1]”', domain) %]">
                                    [% domain %]
                                    <i class="fas fa-external-link-alt" aria-hidden="true"></i>
                                </a>
                            </div>
                        </td>
                    </tr>
                    [% END %]
                    <tr data-testid="ipAddressRow">
                        <td colspan="2">
                            [%# Loading StatsBar has significant overhead so ExpVar.expand is used here %]
                            [% IF ExpVar.expand('$hasdedicatedip') %]
                            <label id="lblIPAddress" data-testid="ipAddressLabel" class="general-info-label">[% locale.maketext("Dedicated [asis,IP] Address") %]</label>
                            [% ELSE %]
                            <label id="lblIPAddress" data-testid="ipAddressLabel" class="general-info-label">[% locale.maketext("Shared [asis,IP] Address") %]</label>
                            [% END %]
                            <span id="txtIPAddress" data-testid="ipAddressText" class="general-info-value">[% ExpVar.expand('$ip') %]</span>
                        </td>
                    </tr>
                    <tr data-testid="homeDirectoryRow">
                        <td colspan="2">
                            <label id="lblHomeDirectory" data-testid="homeDirectoryLabel" class="general-info-label">[% locale.maketext("Home Directory") %]</label>
                            <span id="txtHomeDirectory" data-testid="homeDirectoryText" class="general-info-value">[% homeDir %]</span>
                        </td>
                    </tr>
                    <tr data-testid="lastLoginRow">
                        <td colspan="2">
                            <label id="lblLastLogin" data-testid="lastLoginLabel" class="general-info-label">[% locale.maketext("Last Login [asis,IP] Address") %]</label>
                            <span id="txtLastLogin" data-testid="lastLoginText" class="general-info-value">[% execute( 'LastLogin', 'get_last_or_current_logged_in_ip' ).data %]</span>
                        </td>
                    </tr>
                    [% IF is_user_analytics_required_by_leika %]
                        <tr data-testid="uuidRow">
                            <td colspan="2">
                                <div class="gen-info__title_row">
                                    <label id="lblAcctUuid" data-testid="acctUuidLabel" class="general-info-label gen-info__details-title">[% locale.maketext("User Analytics ID") %]</label>
                                    <span id="copyMsgContainer" data-testid="clipboardCopyMessage" class="copy-msg-container label label-success">
                                        [% locale.maketext('Copied') %]
                                    </span>
                                </div>
                                <div id="acctUuidContainer" data-testid="acctUuidContainer" class="general-info-value uuid-copy-container">
                                    <i id="iconCopyUuid" data-testid="copyUuidIcon" class="ri-1x ri-file-copy-fill" title="[% locale.maketext('Click to copy the user analytics ID.') %]" aria-hidden="true"></i>
                                    <a id="linkCopyUuid" data-testid="copyUuidLink" href="javascript:void(0);" title="[% locale.maketext('Click to copy the user analytics ID.') %]">
                                        <span id="txtAcctUuid" data-testid="acctUuidText" class="general-info-value long-text-fade-overflow">[% CPANEL.CPDATA.UUID %]</span>
                                    </a>
                                </div>
                            </td>
                        </tr>
                    [% END %]
                    <tr data-testid="themesRow">
                        <td colspan="2" ng-controller="themesController">
                            <label id="lblTheme" data-testid="themesLabel" class="general-info-label updating-elements">[% locale.maketext("Theme") %]</label>
                            [% IF CPANEL.feature("theme-switch") %]
                                <span id="themeSpinner" data-testid="themesSpinner" class="fas fa-spinner fa-spin updating-elements" title="[% locale.maketext('Loading …') %]" ng-hide="updated"></span>
                                [% IF !CPANEL.ua_is_mobile %]
                                <select chosen width="'98%'"
                                    id="ddlThemes"
                                    data-testid="themesSelect"
                                    class="form-control ng-hide ng-cloak"
                                    ng-class="{ 'chosen-rtl': isRTL }"
                                    ng-options="item for item in themes"
                                    ng-model="selectedTheme"
                                    ng-change="themeChanged()">
                                </select>
                                [% ELSE %]
                                <select id="ddlThemes"
                                    data-testid="themesSelect"
                                    class="form-control ng-cloak"
                                    ng-options="item for item in themes"
                                    ng-model="selectedTheme"
                                    ng-change="themeChanged()">
                                </select>
                                [% END %]
                            [% ELSE %]
                                <span id="txtTheme" data-testid="themesText" class="general-info-value">[% user_theme %]</span>
                            [% END %]
                        </td>
                    </tr>
                [% IF nginx_is_installed %]
                    <tr data-testid="nginxRow">
                        <td colspan="2">
                            <label id="lblNginxCached" data-testid="nginxCachedlabel" class="general-info-label">[% locale.maketext("NGINX Caching") %]</label>
                            <div id="nginxContainer" data-testid="nginxContainer" class="general-info-value nginx-caching-info" ng-controller="nginxController">
                                [% IF CPANEL.feature("toggle_nginx_caching") %]
                                <toggle-switch
                                    id="switchGeneralNginxCaching"
                                    data-testid="generalNginxCachingSwitch"
                                    ng-model="nginxCachingIsEnabled"
                                    on-toggle="toggleNginxCachingStatus()"
                                    enabled-label ="[% locale.maketext('Active') %]"
                                    disabled-label="[% locale.maketext('Inactive') %]">
                                </toggle-switch>
                                [% ELSE %]
                                <span id="txtNginxCached" data-testid="nginxCachedText" class="general-info-value">
                                    [%
                                        IF nginx_caching_enabled;
                                            locale.maketext("Active");
                                        ELSE;
                                            locale.maketext('Inactive');
                                        END;
                                    %]
                                </span>
                                [% END %]
                                <button type="button" id="btnClearNGINXCache"
                                    data-testid="clearNginxCacheButton"
                                    ng-cloak
                                    button-ng-class="::showClearCacheButton()"
                                    button-class="btn-default btn-sm btn-block"
                                    title="[% locale.maketext("Clear Cache") | html %]"
                                    spinner-id="spinnerClearNGINXCache"
                                    cp-action="nginxClearCache()">
                                    [% locale.maketext("Clear Cache") %]
                                </button>
                            </div>
                        </td>
                    </tr>
                [% END %]
                    <tr data-testid="serverInfoLinkRow">
                        <td colspan="2">
                            <a href="[% CPANEL.CPVAR.dprefix _ 'tools/status.html' %]" id="lnkServerInfo"
                                data-testid="serverInfoLink"
                                alt='[% locale.maketext("Server Information") %]'>
                                <span> [% locale.maketext("Server Information") %] </span>
                            </a>
                        </td>
                    </tr>

                </tbody>
            </table>
        </div>
        <!-- Content Include point: before stats section -->
        [% Content_Includes.render("cpanel_jupiter_tools_stats_before.html.tt") %]
        <!-- End: Content Include point -->
        <div id="statsSection" data-testid="statisticsSidebar" class="panel panel-widget" ng-controller="statisticsController" ng-cloak>
            <div id="statsHeaderSection" data-testid="statisticsHeader" class="panel-heading widget-heading">
                <span role="heading" aria-level="3">[% locale.maketext("Statistics") %]</span>
                <span spinner id="loadingStatsSpinner" data-testid="statisticsSpinner" glyph-class="fas fa-spinner" class="pull-right" title="[% locale.maketext('Loading …') %]"></span>
            </div>

            <table class="table" data-testid="statisticsTable">
                <tbody>
                    <tr id="row_{{::app.id}}" data-testid="statisticsRow-{{::app.id}}" ng-repeat="app in ::statistics | orderBy:'-percent' track by app.id" ng-class="::getStatStatus(app.percent, app.error)" class="app-stat-row">
                        <td class="app-stat-data">
                            <span id="lblStatsName_{{::app.id}}" data-testid="statisticsNameLabel-{{::app.id}}" class="app-name">{{::app.description}}</span>
                            <div ng-if="!app.error">
                                <div ng-if="app.formatter === 'percent'">
                                    <span dir="ltr">{{::app.formattedPercent}}%</span>
                                </div>
                                <div class="limits-wrapper">
                                    <div class="limits-data" ng-if="app.formatter !== 'percent'">
                                        <span id="lblstats_{{::app.id}}_count" data-testid="statisticsUsageText-{{::app.id}}">{{::app.formattedUsage}}</span>
                                        <span ng-if="::app.formattedMaximum">
                                            /
                                            <span id="lblstats_{{::app.id}}" data-testid="statisticsLimitText-{{::app.id}}">{{::app.formattedMaximum}}</span>
                                        </span>
                                        <span class="stats-parenthetical-percentage" ng-if="::app.showPercent" dir="ltr">({{::app.formattedPercent}}%)</span>
                                    </div>
                                    <div ng-if="::app.showWarning">
                                        <i uib-tooltip="{{app.warningTooltip}}" id="stats-error-icon_{{::app.id}}" data-testid="statisticsWarning-{{::app.id}}" class="ri-error-warning-line stats-fix-icon" aria-hidden="true" ng-class="::glassGetStatStatus(app.percent)"></i>
                                        <span class="sr-only">{{app.warningTooltip}}</span>
                                    </div>
                                </div> <!-- end limits-wrapper -->
                                <div ng-if="::app.showActionButton">
                                    [% IF upgradeUrl -%]
                                        <div>
                                            <a id="lnkupgrade_{{::app.id}}" data-testid="linkStatisticsUpgrade-{{::app.id}}" class="link-button" href="[% upgradeUrl | html %]">
                                                [% locale.maketext('Upgrade') %]
                                            </a>
                                        </div>
                                    [% ELSE %]
                                        <div>
                                            <a id="lnkMaintain_{{::app.id}}" data-testid="statisticsMaintainLink-{{::app.id}}" ng-if="::app.url" class="link-button" href="{{::app.url}}">
                                                [% locale.maketext('Manage') %]
                                            </a>
                                        </div>
                                    [% END %]
                                </div>
                            </div>

                            <div class="error-wrapper" ng-if="app.error" ng-cloak class="ng-cloak">
                                <span id="lblStatsName_{{::app.id}}" data-testid="labelStatisticsError-{{::app.id}}" class="error-name">
                                    [% locale.maketext('Data Unavailable') %]
                                </span>
                                <span id="statError_{{::app.id}}" data-testid="textStatisticsError-{{::app.id}}" >
                                    <i uib-tooltip="{{app.error}}" class="fas fa-exclamation-triangle stats-error-icon" aria-hidden="true"></i>
                                </span>
                            </div>
                        </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div><!-- end stats -->
</div>

<!-- Initial Experience Modal -->
<!-- Show analytics modal only when leika is enabled (allow user choice) and user hasn't already opted into analytics -->
[% IF display_welcome_panel || should_prompt_user_analytics_consent %]
<cp-welcome-modal opened="true"
    display-non-analytics-steps="[% display_welcome_panel ? 'true' : 'false' %]"
    migrated-to-jupiter="[% varcache.migrated_to_jupiter ? 'true' : 'false' %]"
    display-analytics="[% should_prompt_user_analytics_consent ? 'true' : 'false' %]"></cp-welcome-modal>
[% ELSIF varcache.migrated_to_jupiter && !varcache.migration_modal_dismissed %]
<cp-migration-modal opened="true"></cp-migration-modal>
[% END %]

[%
    SET application_dir  = ExpVar.expand('$basedir') _ "/tools/";
    SET file = ExpVar.expand('$basefilename');
    SET requirejs_url_base = '/frontend/' _ user_theme;
%]

[% PROCESS '_assets/cjt2_header_include.tt' %]
[% END #wrapper -%]


[% BLOCK js_block_first %]

<script type="text/javascript">
    var DEFAULT_BOX_ORDER = [% varcache.available_applications.grouporder.json %];
    PAGE.isRTL = document.getElementsByTagName("HTML")[0].getAttribute("dir") === "rtl";
    PAGE.currentTheme = [% user_theme.json %];
    PAGE.securityToken = [% cp_security_token.json %];
    PAGE.userName = [% user.json %];
    PAGE.domain = [% domain.json %];
    PAGE.dprefix = [% JSON.stringify(CPANEL.CPVAR.dprefix) %];
    PAGE.isNginxCachingEnabled = ([% nginx_caching_enabled %]) ? true : false;
    PAGE.wpToolkitUrl = [% JSON.stringify(wpToolkitUrl) %];
</script>

[% PROCESS tools/views/applicationListHeader.html.tt %]

[% END %]

[% BLOCK register_nvdata %]
<script type="text/javascript">
    register_interfacecfg_nvdata('xmainrollstatus');
    register_interfacecfg_nvdata('xmaingroupsorder');
</script>
[% END %]
Back to Directory File Manager