JFIF$        dd7 

Viewing File: /usr/local/cpanel/scripts/fastmail

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

# cpanel - scripts/fastmail                        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::fastmail;

use strict;
use warnings;

use Cpanel::ServerTasks                  ();
use Cpanel::PwCache::Helpers             ();
use Cpanel::PwCache::Build               ();
use Cpanel::Config::LoadCpConf           ();
use Cpanel::AccessIds::ReducedPrivileges ();
use Cpanel::Config::Users                ();

my $MIN_INOTIFY_NEEDED       = 4096;
my $MIN_INOTIFY_QUEUE_NEEDED = 16384;

__PACKAGE__->script(@ARGV) unless caller();

sub script {    ## no critic qw(Subroutines::ProhibitExcessComplexity)
    my ( $self, @args ) = @_;

    # TODO: This modulino needs to have its core functionality moved to
    # a module and have its test coverage improved.  Once done the
    # install/* scripts should call the module directly instead of
    # loading this modulino.
    if ( grep( /auto|daemonize/, @args ) ) {
        if ( fork() ) { exit; }
    }
    my $cpconf_ref = Cpanel::Config::LoadCpConf::loadcpconf_not_copy();

    if ( -w '/proc/sys/fs/inotify/max_user_instances' || -w '/proc/sys/filesystem/inotify/max_user_instances' ) {
        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();

        my $pwcache_ref = Cpanel::PwCache::Build::fetch_pwcache();

        my $inotify_needed       = 128;
        my $inotify_queue_needed = 16384;
        my %CPUSERS              = map { $_ => 1 } Cpanel::Config::Users::getcpusers();

        foreach my $pwref (@$pwcache_ref) {
            my $current_inotify_needed = 0;
            next if !$CPUSERS{ $pwref->[0] };
            my $homedir = (@$pwref)[7];
            my $privs   = $pwref->[2] ? Cpanel::AccessIds::ReducedPrivileges->new( $pwref->[2], $pwref->[3] ) : 0;
            if ( -e $homedir . '/.cpanel/email_accounts.json' && ( stat(_) )[7] < 1000000 && open( my $email_account_fh, '<', $homedir . '/.cpanel/email_accounts.json' ) ) {
                while ( readline($email_account_fh) ) {
                    $current_inotify_needed += 10 while (m/"diskused":/gs);
                }
                close($email_account_fh);

                $inotify_queue_needed += $current_inotify_needed;

                $current_inotify_needed += 128;

                if ( $current_inotify_needed > $inotify_needed ) {
                    $inotify_needed = $current_inotify_needed;
                }
            }
        }

        $inotify_queue_needed += $inotify_needed;

        if ( $inotify_needed < $MIN_INOTIFY_NEEDED ) {
            $inotify_needed = $MIN_INOTIFY_NEEDED;
        }

        if ( $inotify_queue_needed < $MIN_INOTIFY_QUEUE_NEEDED ) {
            $inotify_queue_needed = $MIN_INOTIFY_QUEUE_NEEDED;
        }

        foreach my $key ( 'fs', 'filesystem' ) {
            if ( -w '/proc/sys/' . $key . '/inotify/max_user_instances' && open( my $inotify_proc, '>', '/proc/sys/' . $key . '/inotify/max_user_instances' ) ) {
                print {$inotify_proc} $inotify_needed . "\n";
                close($inotify_proc);
            }
            if ( -w '/proc/sys/' . $key . '/inotify/max_queued_events' && open( my $inotify_proc, '>', '/proc/sys/' . $key . '/inotify/max_queued_events' ) ) {
                print {$inotify_proc} $inotify_queue_needed . "\n";
                close($inotify_proc);
            }

        }

        if ( $cpconf_ref->{'mailserver'} eq 'dovecot' ) {
            if ( open( my $fastmail_fh, '>', '/var/cpanel/fastmail' ) ) {
                print {$fastmail_fh} '2';
                close($fastmail_fh);
            }
        }
        else {
            unlink('/var/cpanel/fastmail');
        }

    }
    else {
        require Cpanel::CachedDataStore;
        my $conf_dir        = '/var/cpanel/conf/dovecot';
        my $conf_file       = $conf_dir . '/main';
        my $dovecot_conf_hr = {};

        # Usage is safe as we own the dir and file
        $dovecot_conf_hr = Cpanel::CachedDataStore::fetch_ref($conf_file) if ( -e $conf_file );

        my $restart = 0;
        if ( !exists $dovecot_conf_hr->{'mailbox_idle_check_interval'} ) {
            $dovecot_conf_hr->{'mailbox_idle_check_interval'} = 30;
            $restart = 1;
        }

        if ($restart) {
            mkdir $conf_dir, 0755 if !-e $conf_dir;

            # Usage is safe as we own the dir and file
            Cpanel::CachedDataStore::store_ref( $conf_file, $dovecot_conf_hr );
            system('/usr/local/cpanel/scripts/builddovecotconf');
            Cpanel::ServerTasks::schedule_task( ['CpServicesTasks'], 1, "restartsrv dovecot" );
        }

        if ( $cpconf_ref->{'mailserver'} eq 'dovecot' ) {
            if ( open( my $fastmail_fh, '>', '/var/cpanel/fastmail' ) ) {
                print {$fastmail_fh} '1';
                close($fastmail_fh);
            }
        }
        else {
            unlink('/var/cpanel/fastmail');
        }
    }
    return;
}
Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg