????

Your IP : 18.218.213.240


Current Path : /proc/326615/root/scripts/
Upload File :
Current File : //proc/326615/root/scripts/migrate-api-tokens-for-service

#!/usr/local/cpanel/3rdparty/bin/perl

# cpanel - scripts/migrate-api-tokens-for-service  Copyright 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

package scripts::migrate_api_tokens_for_service;

use strict;
use warnings;
use autodie;

#----------------------------------------------------------------------

=encoding utf-8

=head1 USAGE

    migrate-api-tokens-for-service [ --help ]

=head1 DESCRIPTION

This script migrates the API token datastore schema for v80.
It runs automatically on update to v80; there should be no need
to run it manually.

=cut

#----------------------------------------------------------------------

use parent qw( Cpanel::HelpfulScript );

use Cpanel::CommandQueue                                ();
use Cpanel::FileUtils::Dir                              ();
use Cpanel::Security::Authn::APITokens::Write::whostmgr ();

use constant _OPTIONS => ();

our $_OLD_DIR = '/var/cpanel/authn/api_tokens';

__PACKAGE__->new(@ARGV)->run() if !caller;

sub run {
    my $self = shift;

    # This is a one-time migration needed for the v78 -> v80 upgrade.

    my $whm_dir = Cpanel::Security::Authn::APITokens::Write::whostmgr->_base_dir();

    my $has_old_data = Cpanel::FileUtils::Dir::directory_has_nodes_if_exists($_OLD_DIR);
    my $has_new_data = Cpanel::FileUtils::Dir::directory_has_nodes_if_exists($whm_dir);

    # The following isn’t fully race-safe but has the advantage that
    # it leaves the existing “api_tokens” directory in place, which
    # avoids breakage in currently-running daemons that use API tokens.
    if ( $has_old_data && !$has_new_data ) {

        # This will create the new directory structure if needed.
        Cpanel::Security::Authn::APITokens::Write::whostmgr->_create_base_dirs();

        my $cq = Cpanel::CommandQueue->new();

        my $tmp_dirpath;

        $cq->add(
            sub {
                $tmp_dirpath = "$whm_dir.tmp2." . time;
                rename $whm_dir => $tmp_dirpath;
            },
            sub {
                rename $tmp_dirpath => $whm_dir;
            },
        );

        $cq->add(
            sub {
                symlink $_OLD_DIR, $whm_dir;

                $self->say('API Tokens datastore migration is complete.');

                CORE::rmdir($tmp_dirpath) or warn "rmdir($tmp_dirpath): $!";
            },
        );

        $cq->run();
    }

    return;
}

1;