Current File : //cpanel_installer/InstallerUbuntu.pm
package InstallerUbuntu;

# cpanel - installd/InstallerUbuntu.pm             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

use strict;
use warnings;

use CpanelLogger;

use Installer ();
our @ISA = qw/Installer/;

sub distro_type { return 'debian' }

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

    $self->SUPER::check_system_support;

    my $distro_name  = $self->distro_name;
    my $distro_major = $self->distro_major;

    if ( $distro_name eq 'ubuntu' ) {
        ( grep { $distro_major == $_ } qw/20/ ) or $self->invalid_system("cPanel, L.L.C. does not support Ubuntu version $distro_major.");
    }
    else {
        return $self->invalid_system("cPanel, L.L.C. does not support $distro_major for new installations.");
    }

    return;
}

sub check_networking_scripts {

    # We don't do this check on ubuntu??
    return;
}

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

    $self->SUPER::check_system_files;

    # Unset the kernel flag that prevents even root from accessing other users files in /tmp
    Common::ssystem( "sysctl", "fs.protected_regular=0" );

    # Then configure this to be the default upon reboot
    my $prot_file = '/usr/lib/sysctl.d/protect-links.conf';
    my @orig_prot_file_contents;
    if ( -f $prot_file ) {
        open( my $prot_rd_fh, '<', $prot_file );
        while (<$prot_rd_fh>) {
            push( @orig_prot_file_contents, $_ );
        }
        close($prot_rd_fh);
        open( my $prot_wr_fh, '>', $prot_file );
        foreach my $line (@orig_prot_file_contents) {
            if ( $line =~ m/fs\.protected_regular/ ) {
                print $prot_wr_fh "fs.protected_regular = 0\n";
            }
            else {
                print $prot_wr_fh "$line";
            }
        }
        close($prot_wr_fh);
    }
    verify_usrmerge_is_installed();

    # Configure alternate temp dir for debconf since /tmp is often mounted noexec
    mkdir '/root/tmp';
    open( my $debconf_fh, '>>', '/etc/apt/apt.conf.d/50extracttemplates' );
    print $debconf_fh "APT\n{\n ExtractTemplates\n\t\{\n\t\tTempDir /root/tmp;\n\t};\n};\n";
    close($debconf_fh);

    my $out = `/usr/bin/dpkg -s libc6 2>&1`;    ## no critic(ProhibitQxAndBackticks)
    if ( $out !~ m/Installed\-Size:\s/ ) {
        ERROR( q{Your operating system's package update method } . qq{(apt) could not locate the libc6 package. } . q{This is an indication of an improper setup. } . q{You must correct this error before you proceed. } );
        DEBUG($out);
        FATAL("\n\n");
    }

    # This package is needed for File::FcntlLock, used by installd/apt-get-wait
    $self->apt_nohang_ssystem( '/usr/bin/apt-get', 'install', '-y', 'libfile-fcntllock-perl' );

    return;
}

# This system clobbers resolv.conf even if you update it manually.
sub setup_and_check_resolv_conf {
    my ($self) = @_;

    print "Disabling systemd-resolved if it is enabled...";
    my $needs_action = `systemctl list-unit-files | grep systemd-resolved`;
    Common::ssystem(qw{systemctl disable --now systemd-resolved}) if $needs_action;

    # Remove the symlink and put a viable one in place
    if ( -l '/etc/resolv.conf' ) {
        unlink '/etc/resolv.conf';
        if ( open( my $fh, '>', '/etc/resolv.conf' ) ) {
            print $fh "nameserver 1.1.1.1\nnameserver 8.8.8.8\n";
            close($fh);
        }
        else {
            WARN( 'Could not create new /etc/resolv.conf : ' . $! );
        }
    }

    return $self->SUPER::setup_and_check_resolv_conf;
}

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

    INFO("Installing packages needed to download and run the cPanel initial install.");

    # Assure wget/bzip2/gpg are installed for centhat. These packages are needed prior to sysup
    my @packages_to_install = qw/wget bzip2 gpg-agent xz-utils nscd psmisc python3 rdate cron sysstat net-tools debconf-utils libnet-ssleay-perl/;

    $self->apt_nohang_ssystem( './apt-get-wait', '-y', 'install', @packages_to_install );

    return;
}

# we need to call update first to ensure we have a full package list, otherwise it won't be able to find packages for install
sub update_apt {
    my ($self) = @_;
    return unless $self->{'update_apt'}++ == 0;    # Run once.
    $self->apt_nohang_ssystem( '/usr/bin/apt-get', 'update' );
    return;
}

sub apt_nohang_ssystem {
    my ( $self, @cmd ) = @_;

    $self->update_apt;                             #circular but it's ok because we bumped $update_apt already.

    my $failcount = 0;
    my $result    = 1;
    while ($result) {                              # While apt is failing.
        $result = Common::ssystem(@cmd);
        last if ( !$result );                      # apt came back clean. Stop re-trying

        $failcount++;
        if ( $failcount > 5 ) {
            FATAL("apt failed $failcount times. The installation process cannot continue.");
        }
    }

    return;
}

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

    my @remove_pkgs = qw(
      apache2-utils
      dovecot-core
      dovecot-imapd
      dovecot-lmtpd
      dovecot-pop3d
      exim4
      mysql-server
      mysql-server-8.0
      mysql-server-core-8.0
      mysql-common
      libmysqlclient21
      mysql-client
      mysql-client-8.0
      mysql-client-core-8.0
      portreserve
      postfix
      sendmail
      spamassassin
      libapache2-mod-perl2
      mariadb-client
      mariadb-client-10.3
      mariadb-client-core-10.3
      mariadb-common
      mariadb-plugin-connect
      mariadb-server
      mariadb-server-10.3
      mariadb-server-core-10.3
      mariadb-test
      mycli
      pure-ftpd
      proftpd-basic
    );

    INFO('Ensuring that conflicting services are not installed...');
    Common::ssystem( '/usr/bin/dpkg', '-r', '--force-depends', @remove_pkgs, { ignore_errors => 1 } );

    return;
}

# MySQL version 8.0 is the only MySQL supported in Ubuntu at this time. This class hard codes much of what Rhel tries to advise on.
sub verify_mysql_version {
    my ( $self, $cpanel_config ) = @_;

    my $mysql_version = $cpanel_config->{'mysql-version'};

    return unless length $mysql_version;

    # The only supported installable versions are:
    # 5.7, 8.0, 10.2, 10.3, 10.5 10.6
    # The following will recommend a specific version in error output:
    # 5.5, 5.6, 10.0, 10.1
    my $supported_versions = qr{^(?:
        | 8(?:\.0)?
    )$}x;
    unless ( $mysql_version =~ m/$supported_versions/ ) {
        FATAL('The mysql-version value in /var/cpanel/cpanel.config is either invalid or references an unsupported MySQL/MariaDB version for Ubuntu.');
    }

    return;
}

# These packages are needed for MySQL later in the install
# By downloading them now we do not have to wait for them later
sub background_download_packages_used_during_initial_install {
    my ($self) = @_;

    my @sysup_packages_to_install         = qw{quota expat libexpat1-dev};
    my @ea4_packages_to_install           = qw{elinks libssh2-1 libssh2-1-dev libvpx6 libvpx-dev libwww-perl libkrb5-dev libcompress-raw-bzip2-perl libcompress-raw-zlib-perl autoconf automake};
    my @mysql_support_packages_to_install = qw{libnuma1 grep libuser coreutils libdbi-perl};
    my @packages_to_install               = ( @mysql_support_packages_to_install, @sysup_packages_to_install, @ea4_packages_to_install );

    return $self->run_in_background( sub { $self->apt_nohang_ssystem( './apt-get-wait', '--download-only', '-y', 'install', @packages_to_install ); } );
}

sub verify_usrmerge_is_installed {
    my $required_symlinks = {
        '/bin'  => 'usr/bin',
        '/sbin' => 'usr/sbin',
        '/lib'  => 'usr/lib',
    };

    foreach my $link ( keys %{$required_symlinks} ) {
        my $target = readlink $link;
        if ( !length $target || $target ne $required_symlinks->{$link} ) {
            my $errmsg = "You can only install cPanel & WHM on a fresh installation of Ubuntu 20.04 or higher.";
            FATAL($errmsg);
        }
    }
    return;
}

1;
Seguro Celular
Home business sonyw300 6 de febrero de 2020
SEGURO PARA CUALQUIER MOMENTO
Evita cualquier situación con nuestro seguro para celular.

Contar con un seguro para celular te brinda una protección integral contra situaciones comunes como robo, accidentes y pérdida. No solo te ahorrará dinero en reparaciones o reemplazos, sino que también te proporcionará la tranquilidad de saber que estás respaldado en caso de cualquier eventualidad. Es una inversión inteligente para salvaguardar tu dispositivo, tus datos y tu tranquilidad.

De viaje
Protegido siempre ante cualquier imprevisto
Contratar ahora!
Robo
Asegura tu equipo ante un posible robo
Contratar ahora!
Accidentes
No pases un mal momento, protege tu dispositivo
Contratar ahora!
Previous slide
Next slide
¿Porqué seguro celular es para ti?
Nos comprometemos en brindarte la mejor protección para tu dispositivo
Cobertura mundial

Sea cual sea el problema estamos aquí para proteger tu inversión y brindarte la tranquilidad que necesitas.

Proceso de reclamación fácil y rápido

Sabemos que necesitas una solución rápida en caso de cualquier incidente.

Opciones personalizadas:

Ofrecemos opciones flexibles que se adaptan a tus requisitos individuales.

Atención al cliente excepcional

Estamos disponible para responder y brindarte asistencia personalizada en todo momento.

Tu tranquilidad está a
solo un clic de distancia

Protege tu dispositivo de cualquier imprevisto
TESTIMONIOS
¿Qué dicen nuestros
valiosos clientes?
"¡Increíble servicio de seguro para celular! Rápido, eficiente y confiable. Mi reclamo fue procesado sin problemas y recibí un reemplazo de mi teléfono en tiempo récord. ¡Gracias por brindar una excelente protección para mis dispositivos!"
male1085054890319
Herman Miller
"Me encanta la tranquilidad que me brinda su servicio de seguro para celular. Sé que mi dispositivo está protegido contra cualquier daño accidental o robo. Además, el proceso de reclamación es sencillo. Super recomendado!
female1021755931884
Sofia Millan
"Me ha salvado en más de una ocasión. El personal siempre está dispuesto a ayudar y resolver cualquier problema que surja. Gracias a su servicio, puedo disfrutar de mi teléfono sin preocupaciones.
male20131085934506012
Alexander Rodriguez