0
     7�Æ¿Ë      7File not found.
  #   9ˆl–Ðz¾”Jj"TÒ�zàœ¸”Å£Ï„Ÿ ?ÀÌ ?÷     9#!/usr/local/cpanel/3rdparty/bin/perl

# cpanel - scripts/quotacheck                      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

package scripts::quotacheck;

use strict;
use warnings;

use Cpanel::Config::LoadCpConf           ();
use Cpanel::Debug                        ();
use Cpanel::AccessIds::ReducedPrivileges ();

exit main(@ARGV) unless caller;

my $debug;
my $cpconf_ref;
my $force_disk_emails = 0;    # devel aid, MUST be 0 for production

sub main {
    my (@args) = @_;

    $debug = @args && grep( /debug/, @args ) ? 1 : 0;

    $cpconf_ref = Cpanel::Config::LoadCpConf::loadcpconf_not_copy();
    if ( exists $cpconf_ref->{'skipdiskcheck'} && $cpconf_ref->{'skipdiskcheck'} eq '1' && exists $cpconf_ref->{'skipboxcheck'} && $cpconf_ref->{'skipboxcheck'} eq '1' ) {
        Cpanel::Debug::log_info('Quota checks and notifications disabled for mail accounts and disk usage per Tweak Settings.');
        return 0;
    }

    require Cpanel::IONice;
    if ( Cpanel::IONice::ionice( 'best-effort', exists $cpconf_ref->{'ionice_quotacheck'} ? $cpconf_ref->{'ionice_quotacheck'} : 6 ) ) {
        print "[quotacheck] Setting I/O priority to reduce system load: " . Cpanel::IONice::get_ionice() . "\n";
    }

    require Cpanel::OSSys;
    Cpanel::OSSys::nice(10);

    require Cpanel::Hostname;
    require Cpanel::ContactInfo;
    require Cpanel::Config::LoadUserDomains;
    require Cpanel::Email::DiskUsage;
    require Cpanel::Config::LoadCpUserFile;
    require Cpanel::Config::HasCpUserFile;
    require Cpanel::Config::LoadConfig;
    require Cpanel::Config::FlushConfig;
    require Cpanel::PwCache::Helpers;
    require Cpanel::PwCache::Build;

    Cpanel::PwCache::Helpers::no_uid_cache();    #uid cache only needed if we are going to make lots of getpwuid calls
    Cpanel::PwCache::Build::init_passwdless_pwcache();

    require Cpanel::Unix::PID::Tiny;

    my $pidfile = '/var/run/quotacheck.pid';
    my $upid    = Cpanel::Unix::PID::Tiny->new();

    if ( !$upid->pid_file($pidfile) ) {
        my $pid = $upid->get_pid_from_pidfile($pidfile);
        print "Another instance of quotacheck appears to be running at PID '$pid'.\n";
        return 0;
    }

    my $quotawarnedfile = '/var/cpanel/quotawarned';
    my $hostname        = Cpanel::Hostname::gethostname();

    my %ALL_ACCOUNTS;
    my %TRUE_USER_DOMAINS;
    Cpanel::Config::LoadUserDomains::loadtrueuserdomains( \%TRUE_USER_DOMAINS, 1 );

    my $do_disk_check = ( !exists $cpconf_ref->{'skipdiskcheck'} || $cpconf_ref->{'skipdiskcheck'} ne '1' ) ? 1 : 0;

    my ( $user_info, %CPD ) = load_user_info( \%TRUE_USER_DOMAINS );

    my ( $warned_ref, $rCONTACT_INFO, $rUSED, $rLIMIT, $quota_version, $inodes_used, $inodes_limit );
    require Cpanel::SysQuota;
    $TRUE_USER_DOMAINS{'root'} = '(system)';                # required because we check root for notification fallback
    $user_info->{'root'}{'cpuser'} = { 'DOMAINS' => [] };
    ( $rUSED, $rLIMIT, $quota_version, $inodes_used, $inodes_limit ) = Cpanel::SysQuota::analyzerepquotadata();
    print "Fetching contact info...." if $debug;
    $rCONTACT_INFO = Cpanel::ContactInfo::fetch_contactinfo( \%TRUE_USER_DOMAINS, \%CPD, 1, 1 );
    print "Done\n" if $debug;
    $warned_ref = Cpanel::Config::LoadConfig::loadConfig( $quotawarnedfile, -1, ':' );
    delete $warned_ref->{''};                               # remove empty entries

    foreach my $user ( sort keys %TRUE_USER_DOMAINS ) {
        print "Checking user $user\n" if $debug;
        my $domain  = $TRUE_USER_DOMAINS{$user};
        my $homedir = $user_info->{$user}{'homedir'};
        my $cpuser  = $user_info->{$user}{'cpuser'};

        {
            no warnings 'once';
            $Cpanel::homedir = $homedir;    #for email disk usage
        }

 