Skip to content

Commit 4d49e3d

Browse files
prilrclaude
andcommitted
Rebuild fatpacked elevate-cpanel for CLOS-4301
Embeds 5e9e336 (CLOS-4301 selector + FPM service state restore, with INI-section-aware defaults.cfg parsing and the cloudlinux-selector --json flag required by the CLI's current contract) on top of the CLOS-4340 + CLOS-3763 fixes already built in 998895e. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent c2a463a commit 4d49e3d

1 file changed

Lines changed: 113 additions & 0 deletions

File tree

elevate-cpanel

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,6 +2184,8 @@ EOS
21842184
}
21852185

21862186
sub pre_distro_upgrade ($self) {
2187+
$self->run_once('_snapshot_user_php_selectors');
2188+
$self->run_once('_snapshot_php_fpm_services');
21872189
$self->run_once('_cleanup_rpm_db');
21882190
$self->_remove_ea4_repo();
21892191
return;
@@ -2195,6 +2197,8 @@ EOS
21952197
$self->run_once('_restore_ea_addons');
21962198
$self->run_once('_restore_non_ea_prefix_packages');
21972199
$self->run_once('_restore_ea_prefix_packages');
2200+
$self->run_once('_restore_user_php_selectors');
2201+
$self->run_once('_restore_php_fpm_services');
21982202

21992203
$self->run_once('_restore_config_files');
22002204

@@ -2274,6 +2278,115 @@ EOS
22742278
return;
22752279
}
22762280

2281+
sub _snapshot_user_php_selectors ($self) {
2282+
2283+
my @selector_files = sort glob('/home/*/.cl.selector/defaults.cfg');
2284+
return unless scalar @selector_files;
2285+
2286+
my %user_versions;
2287+
for my $path (@selector_files) {
2288+
next unless $path =~ m{^/home/([^/]+)/};
2289+
my $user = $1;
2290+
open my $fh, '<', $path or next;
2291+
my $in_versions = 0;
2292+
while ( my $line = <$fh> ) {
2293+
if ( $line =~ /^\s*\[(\S+)\]\s*$/ ) {
2294+
$in_versions = ( $1 eq 'versions' ) ? 1 : 0;
2295+
next;
2296+
}
2297+
next unless $in_versions;
2298+
if ( $line =~ /^\s*php\s*=\s*(\S+)\s*$/ ) {
2299+
my $version = $1;
2300+
$user_versions{$user} = $version if $version ne 'native';
2301+
last;
2302+
}
2303+
}
2304+
close $fh;
2305+
}
2306+
2307+
return unless scalar keys %user_versions;
2308+
2309+
INFO( sprintf( 'Snapshot %d user(s) with non-native PHP Selector versions.', scalar keys %user_versions ) );
2310+
Elevate::StageFile::update_stage_file( { 'user_php_selectors' => \%user_versions } );
2311+
return;
2312+
}
2313+
2314+
sub _restore_user_php_selectors ($self) {
2315+
2316+
my $user_versions = Elevate::StageFile::read_stage_file('user_php_selectors');
2317+
return unless ref $user_versions eq 'HASH' && scalar keys %$user_versions;
2318+
2319+
my $cli = '/usr/sbin/cloudlinux-selector';
2320+
unless ( -x $cli ) {
2321+
WARN("Cannot restore PHP Selector versions: $cli is not executable on the target OS.");
2322+
return;
2323+
}
2324+
2325+
INFO( sprintf( 'Restoring PHP Selector versions for %d user(s).', scalar keys %$user_versions ) );
2326+
2327+
my @failed;
2328+
for my $user ( sort keys %$user_versions ) {
2329+
my $version = $user_versions->{$user};
2330+
my $rc = system $cli, 'set', '--json', '--interpreter=php',
2331+
"--current-version=$version", "--user=$user";
2332+
push @failed, "$user (php $version, rc=" . ( $rc >> 8 ) . ")" if $rc != 0;
2333+
}
2334+
2335+
if ( scalar @failed ) {
2336+
my $list = join "\n", map { " - $_" } @failed;
2337+
WARN("Failed to restore PHP Selector versions for some users:\n$list");
2338+
Elevate::Notify::add_final_notification(
2339+
"elevate-cpanel could not restore PHP Selector versions for these users (alt-php's %postun reset them to 'native' during stage 2):\n$list\n\nPlease run 'cloudlinux-selector set --current-version=<v> --user=<u>' for each.",
2340+
1
2341+
);
2342+
}
2343+
2344+
return;
2345+
}
2346+
2347+
sub _snapshot_php_fpm_services ($self) {
2348+
2349+
my @lines = `systemctl list-unit-files --no-legend --no-pager 'alt-php*-fpm.service' 'ea-php*-php-fpm.service' 2>/dev/null`;
2350+
2351+
my @enabled;
2352+
for my $line (@lines) {
2353+
chomp $line;
2354+
next unless $line =~ /^(\S+)\s+enabled\b/;
2355+
push @enabled, $1;
2356+
}
2357+
2358+
return unless scalar @enabled;
2359+
2360+
INFO( sprintf( 'Snapshot %d PHP-FPM service(s) currently enabled.', scalar @enabled ) );
2361+
Elevate::StageFile::update_stage_file( { 'php_fpm_services_enabled' => [ sort @enabled ] } );
2362+
return;
2363+
}
2364+
2365+
sub _restore_php_fpm_services ($self) {
2366+
2367+
my $services = Elevate::StageFile::read_stage_file('php_fpm_services_enabled');
2368+
return unless ref $services eq 'ARRAY' && scalar @$services;
2369+
2370+
INFO( sprintf( 'Re-enabling %d PHP-FPM service(s).', scalar @$services ) );
2371+
2372+
my @failed;
2373+
for my $unit (@$services) {
2374+
my $rc = system 'systemctl', 'enable', $unit;
2375+
push @failed, "$unit (rc=" . ( $rc >> 8 ) . ")" if $rc != 0;
2376+
}
2377+
2378+
if ( scalar @failed ) {
2379+
my $list = join "\n", map { " - $_" } @failed;
2380+
WARN("Failed to re-enable PHP-FPM services:\n$list");
2381+
Elevate::Notify::add_final_notification(
2382+
"elevate-cpanel could not re-enable these PHP-FPM services (disabled by RPM %preun during stage 2):\n$list\n\nPlease enable them manually with 'systemctl enable <unit>'.",
2383+
1
2384+
);
2385+
}
2386+
2387+
return;
2388+
}
2389+
22772390
sub _remove_ea4_repo ($self) {
22782391
unlink '/etc/yum.repos.d/EA4.repo';
22792392
return;

0 commit comments

Comments
 (0)