0
  "   	ˆl–Ãa¾”ªClÊq@†ãNÜTÅ£ÃƒqÁ7ÀÅ á    	#!/usr/local/cpanel/3rdparty/bin/perl

#                                      Copyright 2026 WebPros International, LLC
#                                                           All rights reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited.

package scripts::find_outdated_services;

=encoding utf-8

=head1 NAME

F<scripts/find_outdated_services>

=head1 USAGE

    find_outdated_services [ --always-restart | --never-restart | --auto ]

    find_outdated_services --help

=head1 DESCRIPTION

This command examines your system and identifies any services that are
â€œoutdatedâ€�â€”i.e., that depend on libraries that are no longer present
on the system. This can often happen when such libraries receive updates,
e.g., from C<yum>.

Normal behavior is to ask you whether youâ€™d like to restart the outdated
service(s); however, you can specify the C<--always-restart> or
C<--never-restart> flags
to bypass this prompt and either restart or not, respectively.

The C<--auto> flag is specified when this script is run automatically from
maintenance.  By default, it acts as C<--always-restart>; however, if
C</var/cpanel/disabled/auto-restart-services> exists, it acts as
C<--never-restart> instead.

=head1 EXCLUSION OF INDIVIDUAL SERVICES

You can make this script ignore a given service by including the service
name in F</etc/cpanel/local/ignore_outdated_services>. This file is
newline-delimited. Use a pound character (C<#>) at the start of a line
to indicate a comment. For example, to exclude the services C<cloud-init>
and C<cloud-final>, your file might look thus:

    # Prevent cPanel from checking about the cloud-init service
    cloud-init
    cloud-final

=cut

use strict;
use warnings;

use Try::Tiny;

use IO::Prompt ();

use Cpanel::Alarm                  ();
use Cpanel::ProcessCheck::Outdated ();
use Cpanel::Services::Restart      ();
use Cpanel::SysPkgs                ();

use parent qw( Cpanel::HelpfulScript );

use constant _OPTIONS => (
    'always-restart',
    'never-restart',
    'auto',
);

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

sub run {
    my ($self) = @_;

    my $alarm = Cpanel::Alarm->new( 90 * 3600 );    #90 minutes

    $self->say_maketext('Looking for outdated services â€¦');

    my $err;
    my $error_handled;                              # set by catch handlers that resolve the error themselves
    my @services;
    try {

        #For CPANEL-39432: clean and rebuild package manager cache
        Cpanel::SysPkgs->new->clean;
        @services = grep( !m/^httpd\.service$|^cpinit\.service$/, _get_outdated_services() );    # yum hooks already restart apache when needed
    }
    catch {
        $err = $_;
        if ( $err =~ qr/PID \d+ does not belong to any loaded unit/ ) {

            # https://bugzilla.redhat.com/show_bug.cgi?id=2122587
            # TL;DR - systemd-libs got updated so now dbus can't find its hat.
            # As such just say that we need a reboot (phrases were taken
            # from securityadvisor, but since this is a CLI tool, the URL
            # anchor building bits were omitted).
            $self->say_maketext('The systemâ€™s core libraries or services have been updated.');
            $self->say_maketext('Reboot the server to ensure the system benefits from these updates.');
            $error_handled = 1;
            return;
        }
        elsif ( $err =~ qr/This system is receiving updates from CloudLinux Network server/ ) {

            # This is caused by a temporary yum failure due to the spacewalk plugin
            # that CloudLinux uses.  Just ignore it for now since needs-restarting
            # is likely to complete successfully next time it executes
            #
            # https://cloudlinux.zendesk.com/hc/en-us/articles/4627231056668-Failed-to-check-whether-running-executables-are-up-to-date-The-system-received-unexpected-output-from-usr-bin-needs-restarting-This-system-is-re