#!/usr/local/cpanel/3rdparty/bin/perl
# cpanel - autofixer2/check_tar_and_xz_binaries    Copyright 2021 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 autofixer2::check_tar_and_xz_binaries;

use strict;
use warnings;

use Cpanel::FindBin         ();
use Cpanel::SafeRun::Object ();

exit( run(@ARGV) ) if !caller();

sub run {
    return 0 unless is_rpm_based();

    my $tarpkg = 'tar';
    my $xzpkg  = 'xz';

    my $rpmbin    = Cpanel::FindBin::findbin('rpm') || die "Unable to find ‘rpm’ binary\n";
    my $pkgmgrbin = Cpanel::FindBin::findbin('yum');
    $pkgmgrbin = Cpanel::FindBin::findbin('dnf') unless $pkgmgrbin;
    die "Unable to find package manager (yum or dnf) binary\n" unless $pkgmgrbin;

    my @needs_reinstall;

    my $tarbin = Cpanel::FindBin::findbin($tarpkg);
    my $xzbin  = Cpanel::FindBin::findbin($xzpkg);

    my $rpmargs = ['-V'];
    $tarbin ? push @$rpmargs, $tarpkg : push @needs_reinstall, $tarpkg;
    $xzbin  ? push @$rpmargs, $xzpkg  : push @needs_reinstall, $xzpkg;
    my $runrpm = Cpanel::SafeRun::Object->new(
        program => $rpmbin,
        args    => $rpmargs,
    );

    my @lines = split /\n/, $runrpm->stdout();
    foreach my $line (@lines) {
        push @needs_reinstall, $tarpkg if ( $tarbin && $line =~ m{\Q$tarbin\E$} );
        push @needs_reinstall, $xzpkg  if ( $xzbin  && $line =~ m{\Q$xzbin\E$} );
    }

    _reinstall_pkgs( $pkgmgrbin, \@needs_reinstall );
    return 0;
}

sub is_rpm_based {
    return ( -e '/etc/redhat-release' && Cpanel::FindBin::findbin('rpm') ) ? 1 : 0;
}

sub _reinstall_pkgs {
    my ( $pkgmgr, $pkgs ) = @_;
    return unless $pkgmgr;
    return unless ref($pkgs) eq 'ARRAY' && scalar @$pkgs > 0;

    my $args = [
        '-y',
        'reinstall',
    ];
    push @$args, @$pkgs;
    my $run = Cpanel::SafeRun::Object->new(
        program => $pkgmgr,
        args    => $args,
    );

    if ( $run->CHILD_ERROR() ) {
        my $pkg_string = join ' ', @$pkgs;
        warn "Unable to resolve issues with the following packages:  $pkg_string\n";
    }

    return;
}
