Current File : //cpanel_installer/CpanelMySQL.pm |
package CpanelMySQL;
# cpanel - CpanelMySQL.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 Common (); # read_config
use CpanelLogger;
# Determine whether mysql-version set in config is MariaDB
sub version_is_mariadb {
my ($version) = @_;
if ( $version && $version =~ m{^([0-9]{1,2})(?:\.[0-9])?} ) {
return ( $1 >= 10.0 ? 1 : 0 );
}
return 0;
}
sub get_db_identifiers {
my ($db_version) = @_;
if ( version_is_mariadb($db_version) ) {
return ( 'plain' => 'mariadb', 'stylized' => 'MariaDB' );
}
return ( 'plain' => 'mysql', 'stylized' => 'MySQL®' );
}
sub get_max_allowed_db_version {
my ( $cpanel_version, $db_type ) = @_;
# cpver is the first cpanel version that allows the database version defined by dbver
# For example, v87 is the first version that allows MySQL 8 to be installed.
# All cPanel versions lower than 87 will allow up to MySQL 5.7.
my %max_combos = (
mysql => [
{
cpver => '87',
dbver => '8.0'
},
{
cpver => '1',
dbver => '5.7',
},
],
mariadb => [
{
cpver => '97',
dbver => '10.5',
},
{
cpver => '99',
dbver => '10.6',
},
{
cpver => '1',
dbver => '10.3',
},
],
);
my ($max) = sort { $b->{'cpver'} <=> $a->{'cpver'} } grep { my $ver = $_; $cpanel_version >= $ver->{cpver} } @{ $max_combos{$db_type} };
return $max->{'dbver'};
}
sub get_min_allowed_db_version {
my ( $cpversion, $osver, $type ) = @_;
# If OS Version is 8 or higher, enforce MySQL 8/Maria 10.3 as default.
# Otherwise, use 5.5, 5.6 or 5.7 as is outlined in our version matrix.
my %at_least_req_combos = (
'mariadb' => [
{
'osver' => 8,
'cpver' => 91,
'dbver' => '10.3',
},
{
'osver' => 6,
'cpver' => 48,
'dbver' => '10.3', # MariaDB 10.3 reaches EOL May 25, 2023
},
],
'mysql' => [
{
'osver' => 8,
'cpver' => 91,
'dbver' => '8.0',
},
{
'osver' => 6,
'cpver' => 80,
'dbver' => '5.6',
},
{
'osver' => 6,
'cpver' => 48,
'dbver' => '5.5',
},
],
);
# Choose the possible combo with the cpversion "closest" to passed in.
# Sorting the grep result will enable this rather straightforwardly.
my ($winning_combo) = sort { $b->{'cpver'} <=> $a->{'cpver'} } grep {
my $hr = $_;
$osver >= $hr->{'osver'} && $cpversion >= $hr->{'cpver'}
} @{ $at_least_req_combos{$type} };
return $winning_combo->{'dbver'};
}
sub get_db_version_advice {
my ( $db_version, $cpanel_version, $os_version, $db_type ) = @_;
my $max = get_max_allowed_db_version( $cpanel_version, $db_type );
my $min = get_min_allowed_db_version( $cpanel_version, $os_version, $db_type );
my $advice;
my $rec_version;
if ( $db_version < $min ) {
$advice = 'higher';
$rec_version = $min;
}
elsif ( $db_version > $max ) {
$advice = 'lower';
$rec_version = $max;
}
return { action => $advice, ver => $rec_version };
}
1;