402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe # ˆl–Ðz¾” Jj"TÒ�zàœ¸”ţŠƒxwÄ¿ÇG #!/usr/local/cpanel/3rdparty/bin/perl # cpanel - scripts/vps_optimizer 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::vps_optimzer; use strict; use warnings; use Try::Tiny; use Pod::Usage (); use Getopt::Long (); use Cpanel::LoadFile (); use Cpanel::Exception (); use Cpanel::ArrayFunc::Uniq (); use Cpanel::FileUtils::TouchFile (); use Cpanel::Transaction::File::LoadConfig (); our $version = '2.0'; our $CPSPAMD_PATH = '/etc/cpspamd.conf'; exit __PACKAGE__->new()->run_from_command_line(@ARGV) unless caller(); sub new { my $class = shift; return bless {}, $class; } sub run_from_command_line { my ( $self, @cmdline_args ) = @_; die Cpanel::Exception::create('RootRequired')->to_string_no_id() unless ( $> == 0 && $< == 0 ); $self->{'opts'} = _parse_and_validate_opts( \@cmdline_args ); # -1 to get the right exit code return Pod::Usage::pod2usage( -exitval => 'NOEXIT', -output => \*STDOUT, -verbose => 99, -sections => [qw(NAME DESCRIPTION SYNOPSIS)] ) - 1 if $self->{'opts'}->{'help'}; return 1 if !$self->_validate_environment(); return 0 if !$self->_should_run_on_environment(); my $changes = $self->determine_changes_to_be_made(); my $restarts = $self->make_changes($changes); $self->_restart_services($restarts); $self->_mark_run_complete(); return 0; } sub determine_changes_to_be_made { my $self = shift; # defaults used in the previous version my $changes = { 'conserve_memory' => 1, 'spamd_config' => { 'maxspare' => 1, 'maxchildren' => 3, } }; require Cpanel::Sys::Hardware::Memory; my $mem_on_system = Cpanel::Sys::Hardware::Memory::get_installed(); # returns MiB if ( $mem_on_system > 1500 ) { $changes->{'conserve_memory'} = 0; if ( $mem_on_system < 2500 ) { $changes->{'spamd_config'}->{'maxspare'} = 2; $changes->{'spamd_config'}->{'maxchildren'} = 6; } elsif ( $mem_on_system < 4000 ) { $changes->{'spamd_config'}->{'maxspare'} = 3; $changes->{'spamd_config'}->{'maxchildren'} = 9; } else { $changes->{'spamd_config'}->{'maxspare'} = 3; $changes->{'spamd_config'}->{'maxchildren'} = 12; } } return $changes; } sub make_changes { my ( $self, $changes_hr ) = @_; if ( $changes_hr->{'conserve_memory'} ) { print '[*] Enabling conserve_memory options... '; Cpanel::FileUtils::TouchFile::touchfile('/var/cpanel/conserve_memory') if !$self->{'opts'}->{'dry-run'}; print "Done\n"; } elsif ( -e '/var/cpanel/conserve_memory' ) { print '[*] Disabling conserve_memory options... '; unlink '/var/cpanel/conserve_memory' if !$self->{'opts'}->{'dry-run'}; print "Done\n"; } require Cpanel::Config::Services; my $restarts = [qw/exim dovecot tailwatchd/]; if ( Cpanel::Config::Services::service_enabled('spamd') ) { $self->update_spamd_config( $changes_hr->{'spamd_config'} ); unshift @{$restarts}, 'spamd'; } return $restarts; } sub update_spamd_config { my ( $self, $spamd_config ) = @_; my $ex; require Cpanel::Transaction::File::LoadConfig; try { my $cpspamd_txn = Cpanel::Transaction::File::LoadConfig->new( 'path' => $CPSPAMD_PATH, 'delimiter' => '=', 'permissions' => 0644 ); my $cur_spamd_config = $cpspamd_txn->get_data(); foreach my $directive ( sort ( Cpanel::ArrayFunc::Uniq::uniq( keys %{$spamd_config}, keys %{$cur_spamd_config} ) ) ) {