Skip to content

Commit 2404384

Browse files
author
relkaboussi
committed
handle leftover tuxcare els packages during the elevation
1 parent 1697d35 commit 2404384

File tree

2 files changed

+120
-62
lines changed

2 files changed

+120
-62
lines changed
Lines changed: 75 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,110 +1,130 @@
11
#!/bin/bash
22

3-
OS_VERSION="$(rpm -q --qf '%{version}' $(rpm -q --whatprovides redhat-release 2>/dev/null) 2>/dev/null | cut -c 1)"
43
BACKUP="/etc/cl-elevate-saved"
5-
log=/var/log/elevate_els_packages.log
4+
RUNNING_KERNEL=$(uname -r)
65

7-
# Create log directory if it doesn't exist
8-
mkdir -p "$(dirname "$log")"
9-
touch "$log"
10-
11-
# Start logging
12-
echo "Starting ELS package handling at $(date)" | tee -a "${log}"
6+
echo "Starting ELS package handling"
7+
echo "Running kernel: ${RUNNING_KERNEL}"
138

149
mkdir -p "${BACKUP}" 2>/dev/null || {
15-
echo "Failed to create backup directory ${BACKUP}" | tee -a "${log}"
10+
echo "Failed to create backup directory ${BACKUP}"
1611
exit 1
1712
}
1813

19-
# Only proceed for CentOS 7
20-
if [[ "$OS_VERSION" != "7" ]]; then
21-
echo "Not Cloudlinux 7, skipping ELS processing" | tee -a "${log}"
22-
exit 0
23-
fi
24-
2514
# Check if ELS repositories are present
2615
if ! ls /etc/yum.repos.d/centos*els*.repo &> /dev/null; then
27-
echo "No ELS repositories found, skipping processing" | tee -a "${log}"
16+
echo "No ELS repositories found, skipping processing"
2817
exit 0
2918
fi
3019

31-
echo "ELS repositories detected. Processing ELS packages before conversion..." | tee -a "${log}"
20+
echo "ELS repositories detected. Processing ELS packages before conversion..."
3221

3322
# Create package backup list
3423
rpm -qa | sort > "${BACKUP}/els_packages_backup_$(date +%Y%m%d_%H%M%S).txt" || {
35-
echo "Warning: Failed to create package backup list" | tee -a "${log}"
24+
echo "Warning: Failed to create package backup list"
25+
}
26+
27+
# Function to check if kernel is in use
28+
is_kernel_in_use() {
29+
local kernel_pkg=$1
30+
local kernel_ver=$(rpm -q --queryformat '%{VERSION}-%{RELEASE}' "$kernel_pkg")
31+
[[ "$kernel_ver" == "$RUNNING_KERNEL" ]]
3632
}
3733

3834
# Prevent ELS packages from being reinstalled
3935
if ! grep -q "exclude=\*.tuxcare.els\*" /etc/yum.conf; then
4036
{
4137
echo
42-
echo "# Added by elevate"
38+
echo "# Added by cloudlinux Elevate"
4339
echo "exclude=*.tuxcare.els*"
44-
} >> /etc/yum.conf || echo "Warning: Failed to add exclusion to yum.conf" | tee -a "${log}"
40+
} >> /etc/yum.conf || echo "Warning: Failed to add exclusion to yum.conf"
4541
fi
4642

4743
# Save and disable ELS repos
48-
cp /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1 | tee -a "${log}" || true
49-
echo "Disabling ELS repositories..." | tee -a "${log}"
50-
yum-config-manager --disable centos7-els 2>&1 | tee -a "${log}" || true
44+
cp /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1
45+
echo "Disabling ELS repositories..."
46+
yum-config-manager --disable centos7-els 2>&1
5147
for i in {1..6}; do
52-
yum-config-manager --disable centos7els-rollout-$i 2>&1 | tee -a "${log}" || true
48+
yum-config-manager --disable centos7els-rollout-$i 2>&1
5349
done
5450

5551
# Remove els-define package first if present
5652
if rpm -q els-define &> /dev/null; then
57-
yum remove -y els-define 2>&1 | tee -a "${log}" || echo "Warning: Failed to remove els-define" | tee -a "${log}"
53+
yum remove -y els-define 2>&1 || echo "Warning: Failed to remove els-define"
5854
fi
5955

6056
# Get list of installed ELS packages
61-
echo "Checking for ELS packages..." | tee -a "${log}"
57+
echo "Checking for ELS packages..."
6258
els_pkgs=$(rpm -qa | grep -E '\.tuxcare\.els[0-9]') || true
6359

6460
if [ -n "$els_pkgs" ]; then
65-
echo "Found ELS packages:" | tee -a "${log}"
66-
echo "$els_pkgs" | tee -a "${log}"
67-
68-
# Create a yum shell script to handle the transaction
69-
TMPFILE=$(mktemp)
70-
echo "# yum shell commands" > "$TMPFILE"
71-
72-
# Process each package
73-
while read -r pkg; do
74-
base_name=$(echo "$pkg" | awk -F'-[0-9]' '{print $1}')
75-
if [ -n "$base_name" ]; then
76-
echo "remove $pkg" >> "$TMPFILE"
77-
echo "install $base_name" >> "$TMPFILE"
78-
fi
79-
done <<< "$els_pkgs"
61+
echo "Found ELS packages:"
62+
echo "$els_pkgs"
63+
64+
# Handle kernel packages separately and more aggressively
65+
els_kernel_pkgs=$(echo "$els_pkgs" | grep "^kernel") || true
66+
if [ -n "$els_kernel_pkgs" ]; then
67+
echo "Found ELS kernel packages:"
68+
echo "$els_kernel_pkgs"
69+
70+
# Remove all ELS kernel packages, regardless of running kernel
71+
# since we already have the LVE kernel installed
72+
echo "Removing all ELS kernel packages since LVE kernel is present..."
73+
for kernel_pkg in $els_kernel_pkgs; do
74+
echo "Removing ELS kernel package: $kernel_pkg"
75+
rpm -e --nodeps "$kernel_pkg" 2>&1 || {
76+
echo "Warning: Failed to remove $kernel_pkg"
77+
# If rpm -e fails, try with yum as fallback
78+
yum remove -y "$kernel_pkg" 2>&1
79+
}
80+
done
81+
fi
8082

81-
echo "run" >> "$TMPFILE"
82-
echo "exit" >> "$TMPFILE"
83+
# Process remaining non-kernel ELS packages
84+
non_kernel_els_pkgs=$(echo "$els_pkgs" | grep -v "^kernel") || true
85+
if [ -n "$non_kernel_els_pkgs" ]; then
86+
echo "Processing non-kernel ELS packages..."
8387

84-
# Execute the yum shell script
85-
echo "Replacing ELS packages with base versions..." | tee -a "${log}"
86-
if ! yum shell -y "$TMPFILE" 2>&1 | tee -a "${log}"; then
87-
echo "Trying alternative approach..." | tee -a "${log}"
88-
while read -r pkg; do
88+
# Create a yum shell script for batch processing
89+
TMPFILE=$(mktemp)
90+
echo "# yum shell commands" > "$TMPFILE"
91+
92+
echo "$non_kernel_els_pkgs" | while read -r pkg; do
8993
base_name=$(echo "$pkg" | awk -F'-[0-9]' '{print $1}')
9094
if [ -n "$base_name" ]; then
91-
yum downgrade -y "$base_name" 2>&1 | tee -a "${log}" || true
95+
echo "remove $pkg" >> "$TMPFILE"
96+
echo "install $base_name" >> "$TMPFILE"
9297
fi
93-
done <<< "$els_pkgs"
98+
done
99+
100+
echo "run" >> "$TMPFILE"
101+
echo "exit" >> "$TMPFILE"
102+
103+
# Execute the yum shell script
104+
echo "Replacing non-kernel ELS packages with base versions..."
105+
if ! yum shell -y "$TMPFILE" 2>&1; then
106+
echo "Trying alternative approach for non-kernel packages..."
107+
echo "$non_kernel_els_pkgs" | while read -r pkg; do
108+
base_name=$(echo "$pkg" | awk -F'-[0-9]' '{print $1}')
109+
if [ -n "$base_name" ]; then
110+
yum downgrade -y "$base_name" 2>&1
111+
fi
112+
done
113+
fi
114+
rm -f "$TMPFILE"
94115
fi
95-
rm -f "$TMPFILE"
96116
fi
97117

98118
# Move ELS repo files to backup and clean up
99-
mv -f /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1 | tee -a "${log}" || true
119+
mv -f /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1
100120

101121
# Remove TuxCare GPG key if it exists
102122
if [ -f "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" ]; then
103-
mv -f "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" "${BACKUP}/" 2>&1 | tee -a "${log}" || true
123+
mv -f "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" "${BACKUP}/" 2>&1
104124
fi
105125

106126
# Clean yum cache
107-
yum clean all 2>&1 | tee -a "${log}" || true
127+
yum clean all 2>&1
108128

109-
echo "ELS package handling complete" | tee -a "${log}"
129+
echo "ELS package handling complete"
110130
exit 0
Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,49 @@
11
import functools
22
from leapp.libraries.common.config import version
33

4+
def run_on_cloudlinux(func_or_version=None):
5+
"""
6+
Decorator that runs a function only on specified CloudLinux versions.
47
5-
def run_on_cloudlinux(func):
6-
@functools.wraps(func)
7-
def wrapper(*args, **kwargs):
8-
if (version.current_version()[0] != "cloudlinux"):
9-
return
10-
return func(*args, **kwargs)
11-
return wrapper
8+
Can be used as:
9+
@run_on_cloudlinux # Runs on any CloudLinux version
10+
@run_on_cloudlinux('7') # Runs only on CloudLinux 7
11+
@run_on_cloudlinux(['7', '8']) # Runs on CloudLinux 7 or 8
12+
"""
13+
14+
# If used without parentheses
15+
if callable(func_or_version):
16+
@functools.wraps(func_or_version)
17+
def direct_wrapper(*args, **kwargs):
18+
if version.current_version()[0] != "cloudlinux":
19+
return None
20+
return func_or_version(*args, **kwargs)
21+
return direct_wrapper
22+
23+
# If used with version specification
24+
versions = func_or_version
25+
def decorator(func):
26+
@functools.wraps(func)
27+
def wrapper(*args, **kwargs):
28+
release_id, version_id = version.current_version()
29+
30+
# Check if running on CloudLinux
31+
if release_id != "cloudlinux":
32+
return None
33+
34+
# If no versions specified, run on any CloudLinux version
35+
if versions is None:
36+
return func(*args, **kwargs)
37+
38+
# Convert versions to list if string was provided
39+
version_list = [versions] if isinstance(versions, str) else versions
40+
41+
# Compare only major version number
42+
current_major = version.get_major_version(version_id)
43+
if current_major in version_list:
44+
return func(*args, **kwargs)
45+
46+
return None
47+
48+
return wrapper
49+
return decorator

0 commit comments

Comments
 (0)