From 7f237871ba784fde14e260c7ce215eac485eba30 Mon Sep 17 00:00:00 2001 From: Ilia Ross Date: Fri, 28 Aug 2026 14:46:07 +0200 Subject: [PATCH] Add shared server section lookup https://github.com/webmin/webmin/pull/2827#pullrequestreview-5047577760 --- mysql/edit_binlogs.cgi | 6 +----- mysql/edit_cnf.cgi | 6 +----- mysql/mysql-lib.pl | 13 +++++++++++++ mysql/save_binlogs.cgi | 6 +----- mysql/save_cnf.cgi | 6 +----- t/mysql-lib.t | 17 +++++++++++++++++ 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/mysql/edit_binlogs.cgi b/mysql/edit_binlogs.cgi index 219fd1957..be0999e21 100755 --- a/mysql/edit_binlogs.cgi +++ b/mysql/edit_binlogs.cgi @@ -14,11 +14,7 @@ if (!$conf) { &ui_print_footer("", $text{'index_return'}); exit; } -# Prefer the main server section over generic MariaDB sections that can -# belong to a plugin-specific include file -($mysqld) = grep { $_->{'name'} eq 'mysqld' } @$conf; -($mysqld) = grep { $_->{'name'} eq 'mariadbd' } @$conf if (!$mysqld); -($mysqld) = grep { $_->{'name'} eq 'mariadb' } @$conf if (!$mysqld); +$mysqld = &get_mysqld_config_section($conf); $mysqld || &error($text{'cnf_emysqld'}); $mems = $mysqld->{'members'}; $local = &is_mysql_local(); diff --git a/mysql/edit_cnf.cgi b/mysql/edit_cnf.cgi index eaa35b820..678de88c8 100755 --- a/mysql/edit_cnf.cgi +++ b/mysql/edit_cnf.cgi @@ -13,11 +13,7 @@ if (!$conf) { &ui_print_footer("", $text{'index_return'}); exit; } -# Prefer the main server section over generic MariaDB sections that can -# belong to a plugin-specific include file -($mysqld) = grep { $_->{'name'} eq 'mysqld' } @$conf; -($mysqld) = grep { $_->{'name'} eq 'mariadbd' } @$conf if (!$mysqld); -($mysqld) = grep { $_->{'name'} eq 'mariadb' } @$conf if (!$mysqld); +$mysqld = &get_mysqld_config_section($conf); $mysqld || &error($text{'cnf_emysqld'}); $mems = $mysqld->{'members'}; diff --git a/mysql/mysql-lib.pl b/mysql/mysql-lib.pl index 3c29f7420..455555e96 100755 --- a/mysql/mysql-lib.pl +++ b/mysql/mysql-lib.pl @@ -1358,6 +1358,19 @@ if (!scalar(@mysql_config_cache)) { return \@mysql_config_cache; } +# get_mysqld_config_section(&config) +# Returns the preferred server section from a parsed MySQL configuration, +# avoiding generic MariaDB sections when a dedicated server section exists +sub get_mysqld_config_section +{ +my ($conf) = @_; +foreach my $name ('mysqld', 'mariadbd', 'mariadb') { + my ($section) = grep { $_->{'name'} eq $name } @$conf; + return $section if ($section); + } +return undef; +} + # parse_mysql_config(file) # Reads one MySQL config file sub parse_mysql_config diff --git a/mysql/save_binlogs.cgi b/mysql/save_binlogs.cgi index cea2a1703..e8fdac4ad 100755 --- a/mysql/save_binlogs.cgi +++ b/mysql/save_binlogs.cgi @@ -12,11 +12,7 @@ foreach my $l (&get_all_mysqld_files()) { &lock_file($l); } $conf = &get_mysql_config(); -# Prefer the main server section over generic MariaDB sections that can -# belong to a plugin-specific include file -($mysqld) = grep { $_->{'name'} eq 'mysqld' } @$conf; -($mysqld) = grep { $_->{'name'} eq 'mariadbd' } @$conf if (!$mysqld); -($mysqld) = grep { $_->{'name'} eq 'mariadb' } @$conf if (!$mysqld); +$mysqld = &get_mysqld_config_section($conf); $mysqld || &error($text{'cnf_emysqld'}); $mems = $mysqld->{'members'}; diff --git a/mysql/save_cnf.cgi b/mysql/save_cnf.cgi index 27dea08dc..f70327a75 100755 --- a/mysql/save_cnf.cgi +++ b/mysql/save_cnf.cgi @@ -11,11 +11,7 @@ foreach my $l (&get_all_mysqld_files()) { &lock_file($l); } $conf = &get_mysql_config(); -# Prefer the main server section over generic MariaDB sections that can -# belong to a plugin-specific include file -($mysqld) = grep { $_->{'name'} eq 'mysqld' } @$conf; -($mysqld) = grep { $_->{'name'} eq 'mariadbd' } @$conf if (!$mysqld); -($mysqld) = grep { $_->{'name'} eq 'mariadb' } @$conf if (!$mysqld); +$mysqld = &get_mysqld_config_section($conf); $mysqld || &error($text{'cnf_emysqld'}); $mems = $mysqld->{'members'}; diff --git a/t/mysql-lib.t b/t/mysql-lib.t index 025d6bce4..ec69984e1 100644 --- a/t/mysql-lib.t +++ b/t/mysql-lib.t @@ -153,4 +153,21 @@ subtest 'retention maximum is variant specific' => sub { 'the MariaDB maximum displays as 99 days'); }; +subtest 'preferred MySQL server configuration section' => sub { + my $mariadb = { 'name' => 'mariadb' }; + my $mariadbd = { 'name' => 'mariadbd' }; + my $mysqld = { 'name' => 'mysqld' }; + my $client = { 'name' => 'client' }; + + is(main::get_mysqld_config_section( + [ $mariadb, $mariadbd, $mysqld ]), $mysqld, + 'mysqld is preferred regardless of file order'); + is(main::get_mysqld_config_section([ $mariadb, $mariadbd ]), $mariadbd, + 'mariadbd is preferred when mysqld is absent'); + is(main::get_mysqld_config_section([ $client, $mariadb ]), $mariadb, + 'mariadb is used as the final server-section fallback'); + ok(!defined(main::get_mysqld_config_section([ $client ])), + 'no server section returns undef'); +}; + done_testing();