Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/transfer_tool/getacctlist.tmpl

[%
# cpanel - whostmgr/docroot/templates/transfer_tool/getacctlist.tmpl
#                                                  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

    USE JSON;
    USE Whostmgr;
    USE CPUsername;
    USE CpanelDB;
    USE NVData;

    SET locale_is_rtl = 0;

    WRAPPER 'master_templates/master.tmpl'
        header = data.header,
        breadcrumburl = '/scripts5/account_copy_input',
        stylesheets = [
            '/css/whm_dynamic_notices.css',
            Whostmgr.find_file_url('/libraries/chosen/1.5.1/chosen.min.css'),
            Whostmgr.find_file_url('/templates/transfer_tool/getacctlist.min.css'),
        ],
        scripts = [],
        theme = 'bootstrap';

    PROCESS '_ajaxapp.tmpl';

    SET MAJOR_VERSIONS_MATCH = 1;
    IF data.remote.major_version && data.remote.major_version != data.local.major_version;
        MAJOR_VERSIONS_MATCH = 0;
    END;

    SET ROUNDCUBE_DBTYPES_MATCH = 1;
    IF data.remote.roundcube_dbtype && data.remote.roundcube_dbtype != data.local.roundcube_dbtype;
        ROUNDCUBE_DBTYPES_MATCH = 0;
    END;
-%]

<div id="content" ng-controller="MainController as main" ng-cloak>
    <div id="callback_block"></div>
    <section class="callout callout-[%- MAJOR_VERSIONS_MATCH ? "info" : "warning" -%]">
        <div class="limit-info">
            <p>
              [% locale.maketext('Source: “[output,strong,_1]” version “[output,strong,_2]” …',  '{{ main.PAGE.remote.host }}', '{{main.PAGE.remote.display_version}}' ) %]
            </p>
            <p>
              [% locale.maketext('Target: “[output,strong,_1]” version “[output,strong,_2]” …', '{{ main.PAGE.local.host }}', '{{main.PAGE.local.display_version}}' ) %]
            </p>
            [% IF !MAJOR_VERSIONS_MATCH %]
              <p>
                [% locale.maketext('The source server is not running the same major version as the target server.'); %]
                [% locale.maketext('[asis,cPanel] highly recommends that the source server runs the same major version for at least 24 hours to ensure any data conversions have completed.') %]
              </p>
            [% END %]
        </div>
        <button class="btn btn-primary" id="reAnalyzeRemoteButton" type="button" title="Reanalyze {{main.PAGE.remote.host}}">
            <span class="glyphicon glyphicon-download-alt"></span>
            <span>[% locale.maketext("Rescan Source Server") %]</span>
        </button>
    </section>

    [% IF data.hostname_err -%]
        <section id="hostnameWarning" class="callout callout-warning hostname-warning">
            <div id="hostnameWarningHeader" class="callout-heading">[% locale.maketext('[output,strong,Warning]: Hostname Lookup Error') %]</div>

            <div>[% locale.maketext('The system failed to determine if its hostname ([_1]) resolves locally.', data.hostname.html()) %]</div>

            <div>[% data.hostname_err.html() %]</div>
        </section>
    [% ELSIF !data.hostname_resolves -%]
        <section id="hostnameWarning" class="callout callout-warning hostname-warning">
            <div id="hostnameWarningHeader" class="callout-heading">[% locale.maketext('[output,strong,Warning]: Hostname Resolution Mismatch') %]</div>

            <div>
                [% locale.maketext('The system’s hostname ([_1]) does not resolve locally. Because of this, [output,url,_2,Live Transfers,target,_blank] are disabled.', data.hostname.html(), 'https://go.cpanel.net/livetransfers') %]
            </div>
            <div>
                [% locale.maketext('Run the “[output,url,_1,_2,target,_blank]” script to assign your server an automatically-resolving hostname.', 'https://go.cpanel.net/cprapid', '/scripts/ensure_hostname_resolves') -%]
            </div>
        </section>
    [% END -%]

    <div class="row" ng-if="!main.PAGE.local.available_ips.length">
        <div class="col-sm-6">
            <div class="alert alert-warning">
                <span class="glyphicon glyphicon-exclamation-sign"></span>
                <div class="alert-message">
                    [% locale.maketext('[output,strong,Warning]: You have no available [asis,IP] addresses on your local machine.') %]
                </div>
            </div>
        </div>
    </div>

    <uib-tabset class="server-configuration-tabset">
        <uib-tab select="setAcctTabActive(true)">
            <uib-tab-heading>
                [% locale.maketext('Accounts') %]
                <span ng-if="main.selectedAccounts.length" class="label label-info" ng-bind="main.selectedAccounts.length"></span>
            </uib-tab-heading>
            <div class="tab-content">
                <section class="section-body">
                    [% PROCESS "transfer_tool/_select_accounts.tmpl" %]
                </section>
            </div>
        </uib-tab>
        <uib-tab select="setAcctTabActive(false)">
            <uib-tab-heading>
                [% locale.maketext('Packages') %]
                <span ng-if="main.selectedPackages.length" class="label label-info" ng-bind="main.selectedPackages.length"></span>
            </uib-tab-heading>
            <div class="tab-content">
                <section class="section-body">
                    [% PROCESS "transfer_tool/_select_packages.tmpl" %]
                </section>
            </div>
        </uib-tab>
        <uib-tab select="setAcctTabActive(false)">
            <uib-tab-heading>
                [% locale.maketext('Service Configurations') %]
                <span ng-if="main.selectedConfigurations.length" class="label label-info" ng-bind="main.selectedConfigurations.length"></span>
            </uib-tab-heading>
            <div class="tab-content">
                <section class="section-body">
                    [% PROCESS "transfer_tool/_select_configurations.tmpl" %]
                </section>
            </div>
        </uib-tab>
    </uib-tabset>


    <div class="row" ng-if="main.SERVER_MAX_USERS && (newSelectedUserList = (main.selectedAccounts | filter:main.overwriteIsDefault) ).length > main.REMAINING_ACCOUNT_SLOTS">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Error]:') %]
                        {{ main.licenseOverloadMessage() }}
                    </p>
                    <p ng-if="main.REMAINING_ACCOUNT_SLOTS > 0">{{ main.licenseOverloadCancelMessage(newSelectedUserList.length - main.REMAINING_ACCOUNT_SLOTS) }}</p>
                </div>
            </div>
        </div>
    </div>

    <div class="row" ng-if="(overwriteableUserList = (main.selectedAccounts | existingUsers:true | filter:main.noUsernameChange | filter:main.overwriteIsDefault)).length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Error]:') %]
                        {{ main.accountConflictSelectedMessage(overwriteableUserList.length) }}
                    </p>
                    <ul>
                        <li ng-repeat="acct in overwriteableUserList | orderBy:'localuser'">{{ main.getExistingUserMessage(acct); }}</li>
                    </ul>
                    <p>
                        {{ main.accountOverwiteResolveMessage(overwriteableUserList.length) }}
                    </p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(overwriteableUserList, 'overwrite_type', main.overwriteOptions[1]); main.updateSelectedAccounts()">
                        {{ main.accountOverwriteConfirmMessage(overwriteableUserList.length) }}
                    </a></p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(overwriteableUserList, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(overwriteableUserList.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(existingUserList = (main.selectedAccounts | existingUsers:false | filter:main.overwriteIsDefault)).length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Error]:') %]
                        {{ main.accountConflictSelectedMessage(existingUserList.length) }}
                    </p>
                    <ul>
                        <li ng-repeat="acct in existingUserList | orderBy:'localuser'">{{ main.getExistingUserMessage(acct); }}</li>
                    </ul>
                    <p>
                        {{ main.accountConflictResolveMessage(existingUserList.length) }}
                    </p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(existingUserList, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(existingUserList.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(reservedUserList = (main.selectedAccounts | filter:main.reservedUserFilter)).length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Error]:') %]
                        {{ main.accountConflictSelectedResolveMessage(reservedUserList.length) }}
                    </p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(reservedUserList, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(reservedUserList.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
     <div class="row" ng-if="(duplicateUserList = (main.selectedAccounts | filter:main.duplicateUserFilter)).length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Error]:') %]
                        {{
                            main.accountConflictNameResolveMessage(duplicateUserList.length)
                        }}
                        <ul>
                            <li ng-repeat="user in duplicateUserList | orderBy:'localuser'">{{ main.accountRenameMessage(user.remote_user, user.localuser) }}</li>
                        </ul>
                    </p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(duplicateUserList, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(duplicateUserList.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(invalidUsernamesList = (main.selectedAccounts | filter:main.invalidUsernameFilter)).length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Error]:') %]
                        {{ main.usernameValidationTitle(invalidUsernamesList.length) }}
                        <ul>
                            <li ng-repeat="user in invalidUsernamesList | orderBy:'localuser'">{{ user.localuser }}</li>
                        </ul>
                        {{ main.usenameValidationMessage(invalidUsernamesList.length) }}
                    </p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(invalidUsernamesList, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.usernameValidationAction(invalidUsernamesList.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(invalidDomainList = (main.selectedAccounts | filter:main.invalidDomainFilter)).length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p ng-bind-html="main.existingDomainWarning(invalidDomainList.length)"></p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(invalidDomainList, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(invalidDomainList.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(selectedAcctsWithNewDedicatedIp = (main.selectedAccounts | filter:main.newDedicatedIpFilter )).length > main.PAGE.local.available_ips.length">
        <div class="col-sm-12">
            <div class="alert alert-danger">
                <span class="glyphicon glyphicon-remove-sign"></span>
                <div class="alert-message">
                    <p ng-bind-html="main.dedicatedIpAddrWarning(selectedAcctsWithNewDedicatedIp.length, main.PAGE.local.available_ips.length)"></p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(selectedAcctsWithNewDedicatedIp, 'dedicated_ip', 0)">
                        {{ main.dedicatedIPDeselectAction(selectedAcctsWithNewDedicatedIp.length) }}
                    </a></p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(selectedAcctsWithNewDedicatedIp, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(selectedAcctsWithNewDedicatedIp.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(acctsWithUnselectedIp = (main.selectedAccounts | filter:{existing_dedicated_ip:1, dedicated_ip:0} )).length">
        <div class="col-sm-12">
            <div class="alert alert-warning">
                <span class="glyphicon glyphicon-exclamation-sign"></span>
                <div class="alert-message">
                    <p ng-bind-html="main.unusedDedicatedIpWarning(acctsWithUnselectedIp.length)"></p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(acctsWithUnselectedIp, 'dedicated_ip', 1)">
                        {{ main.dedicatedIPReselectAction(acctsWithUnselectedIp.length) }}
                    </a></p>
                    <p><a href="" ng-click="main.toggleCheckAllAndReValidate(acctsWithUnselectedIp, 'selected', 0); main.updateSelectedAccounts()">
                        {{ main.accountConflictCancelMessage(acctsWithUnselectedIp.length) }}
                    </a></p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(resellerNoCopyList = (main.selectedAccounts | filter:main.resellerNoCopyFilter )).length">
        <div class="col-sm-12">
            <div class="alert alert-warning">
                <span class="glyphicon glyphicon-exclamation-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Warning]:') %]
                        {{ main.resellerNoCopyTitle(resellerNoCopyList.length) }}
                    </p>
                    <ul>
                        <li ng-repeat="user in resellerNoCopyList | orderBy:'localuser'">{{ user.localuser }}</li>
                    </ul>
                    <p ng-bind-html="main.resellerNoCopyMessage(resellerNoCopyList.length)"></p>
                    <p>
                        <a href="" ng-if="!main.PAGE.restricted_restore" ng-click="main.toggleCheckAllAndReValidate(resellerNoCopyList, 'copy_reseller_privs', 1); main.updateSelectedAccounts()">
                            {{ main.resellerNoCopyFixMessage(resellerNoCopyList.length) }}
                        </a>
                    </p>
                </div>
            </div>
        </div>
    </div>
    <div class="row" ng-if="(canNotTransferTempDomain = (main.selectedAccounts | filter:main.canNotTransferTempDomainFilter ).length)">
        <div class="col-sm-12">
            <div class="alert alert-warning">
                <span class="glyphicon glyphicon-exclamation-sign"></span>
                <div class="alert-message">
                    <p>
                        [% locale.maketext('[output,strong,Warning]:') %]
                        {{ main.canNotTransferTempDomainTitle(canNotTransferTempDomain) }}
                    </p>
                    <p ng-bind-html="main.canNotTransferTempDomainMessage(canNotTransferTempDomain)"></p>
                    <ul>
                        <li ng-repeat="domain in (main.selectedAccounts | filter:main.canNotTransferTempDomainFilter )">{{ domain.domain }}</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <!-- summary -->
    <div class="row" ng-if="(canSubmit = main.canSubmitForm([overwriteableUserList,existingUserList,reservedUserList,duplicateUserList,invalidUsernamesList,invalidDomainList],selectedAcctsWithNewDedicatedIp,newSelectedUserList,canNotTransferTempDomain))">
        <div class="col-sm-12">
            <div class="alert alert-info">
                <div class="alert-message" ng-bind-html="main.submitSummaryMessage()"></div>
            </div>
        </div>
    </div>

    <form ng-if="showTable()" method=POST action="maincopy" name="secform" class="form">
        <input type="hidden" name="transfer_session_id" value="{{main.PAGE.transfer_session_id}}">
        <input type="hidden" name="transfer_accts" value="{{ main.selectedAccounts | json}}">
        <input type="hidden" name="transfer_pkgs" value="{{ main.selectedPackages | json}}">
        <input ng-repeat="(module_name, module) in main.PAGE.configuration_modules" type="hidden" name="{{ module_name + '_enable' }}" value="{{ module.selected ? 1 : 0 }}">
        <button type="submit" class="btn btn-primary"
                click-once
                id="form_submit_button"
                ng-disabled="!canSubmit" ng-bind="main.getCopyButtonLabel()">

        </button>
    </form>

    <script id="directives/accountExpandPanel.ptt" type="text/ng-template">
        [%- PROCESS "transfer_tool/directives/accountExpandPanel.ptt" -%]
    </script>

    <script id="overwriteWithDeleteDescription.ptt" type="text/ng-template">
        [%- PROCESS "transfer_tool/overwriteWithDeleteDescription.ptt" -%]
    </script>
</div>
<script type="text/javascript">
    var PAGE = PAGE || {};

    PAGE = [% JSON.stringify(data) %];
    /* TODO: refactor to be stand-alone username js validation */
    PAGE.local.reserved_username_patterns = [% JSON.stringify(CPUsername.get_reserved_username_patterns()) %];
    PAGE.local.reserved_usernames = [% JSON.stringify(CPUsername.get_reserved_usernames()) %];
    PAGE.USERNAME_UNIQUE_LENGTH = parseInt( [% JSON.stringify(CpanelDB.PREFIX_LENGTH) %], 10 );
    PAGE.MAX_USERNAME_LENGTH = parseInt( [% JSON.stringify(CPUsername.get_max_username_length()) %], 10 );
    PAGE.USERNAME_TRANSFER_REGEXP = [% JSON.stringify(CPUsername.make_strict_regexp_str(1)) %]
    PAGE.USERNAME_REGEXP = [% JSON.stringify(CPUsername.make_strict_regexp_str(0)) %]
    PAGE.UN_TRIM_REG_EXP = new RegExp("^\\s*(.{1," + PAGE.USERNAME_UNIQUE_LENGTH + "}).*$", "i");
    PAGE.transfer_session_id = [% data.transfer_session_id.json(); %];
    PAGE.configuration_modules = [% data.modules.json(); %];
    PAGE.REMAINING_ACCOUNT_SLOTS = [% Whostmgr.get_max_users() - Whostmgr.get_users_count() %];
    PAGE.SERVER_MAX_USERS = [% Whostmgr.get_max_users() %];
    PAGE.all_possible_page_sizes = [
        10,
        50,
        200,
        500,
        1000
    ];
    PAGE.locale_is_rtl = [% locale_is_rtl.json() %];
    PAGE.liveTransfersNoticeIsDismissed = [% NVData.get('live_transfers_notice_is_dismissed') ? 'true' : 'false' %];
    PAGE.liveTransfersPre90NoticeIsDismissed = [% NVData.get('live_transfers_pre_90_notice_is_dismissed') ? 'true' : 'false' %];
    PAGE.disable_live_transfers = [% data.disable_live_transfers ? 'true' : 'false' %];
    PAGE.restricted_restore = [% data.restricted_restore ? 'true' : 'false' %];
</script>

<!-- CPANEL-1946: The CPANEL.PAGE JSON.stringify can take a long time with a large account list.
     We need to load angular after to ensure we avoid this race condition -->
<!-- TODO: Once user finishes updating, make remote call to check if good then update accordingly-->
[% PROCESS 'master_templates/cjt2_header_include.tt' %]


[% END #wrapper -%]
Back to Directory File Manager