forked from AlmaLinux/leapp-repository
-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add suport for cloudlinux versions to run_on_cloudlinux decorator
- Loading branch information
relkaboussi
committed
Nov 14, 2024
1 parent
1697d35
commit bd5af6e
Showing
2 changed files
with
120 additions
and
62 deletions.
There are no files selected for viewing
130 changes: 75 additions & 55 deletions
130
repos/system_upgrade/cloudlinux/actors/handleelspackages/files/els_script_handler.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,110 +1,130 @@ | ||
#!/bin/bash | ||
|
||
OS_VERSION="$(rpm -q --qf '%{version}' $(rpm -q --whatprovides redhat-release 2>/dev/null) 2>/dev/null | cut -c 1)" | ||
BACKUP="/etc/cl-elevate-saved" | ||
log=/var/log/elevate_els_packages.log | ||
RUNNING_KERNEL=$(uname -r) | ||
|
||
# Create log directory if it doesn't exist | ||
mkdir -p "$(dirname "$log")" | ||
touch "$log" | ||
|
||
# Start logging | ||
echo "Starting ELS package handling at $(date)" | tee -a "${log}" | ||
echo "Starting ELS package handling" | ||
echo "Running kernel: ${RUNNING_KERNEL}" | ||
|
||
mkdir -p "${BACKUP}" 2>/dev/null || { | ||
echo "Failed to create backup directory ${BACKUP}" | tee -a "${log}" | ||
echo "Failed to create backup directory ${BACKUP}" | ||
exit 1 | ||
} | ||
|
||
# Only proceed for CentOS 7 | ||
if [[ "$OS_VERSION" != "7" ]]; then | ||
echo "Not Cloudlinux 7, skipping ELS processing" | tee -a "${log}" | ||
exit 0 | ||
fi | ||
|
||
# Check if ELS repositories are present | ||
if ! ls /etc/yum.repos.d/centos*els*.repo &> /dev/null; then | ||
echo "No ELS repositories found, skipping processing" | tee -a "${log}" | ||
echo "No ELS repositories found, skipping processing" | ||
exit 0 | ||
fi | ||
|
||
echo "ELS repositories detected. Processing ELS packages before conversion..." | tee -a "${log}" | ||
echo "ELS repositories detected. Processing ELS packages before conversion..." | ||
|
||
# Create package backup list | ||
rpm -qa | sort > "${BACKUP}/els_packages_backup_$(date +%Y%m%d_%H%M%S).txt" || { | ||
echo "Warning: Failed to create package backup list" | tee -a "${log}" | ||
echo "Warning: Failed to create package backup list" | ||
} | ||
|
||
# Function to check if kernel is in use | ||
is_kernel_in_use() { | ||
local kernel_pkg=$1 | ||
local kernel_ver=$(rpm -q --queryformat '%{VERSION}-%{RELEASE}' "$kernel_pkg") | ||
[[ "$kernel_ver" == "$RUNNING_KERNEL" ]] | ||
} | ||
|
||
# Prevent ELS packages from being reinstalled | ||
if ! grep -q "exclude=\*.tuxcare.els\*" /etc/yum.conf; then | ||
{ | ||
echo | ||
echo "# Added by elevate" | ||
echo "# Added by cloudlinux Elevate" | ||
echo "exclude=*.tuxcare.els*" | ||
} >> /etc/yum.conf || echo "Warning: Failed to add exclusion to yum.conf" | tee -a "${log}" | ||
} >> /etc/yum.conf || echo "Warning: Failed to add exclusion to yum.conf" | ||
fi | ||
|
||
# Save and disable ELS repos | ||
cp /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1 | tee -a "${log}" || true | ||
echo "Disabling ELS repositories..." | tee -a "${log}" | ||
yum-config-manager --disable centos7-els 2>&1 | tee -a "${log}" || true | ||
cp /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1 | ||
echo "Disabling ELS repositories..." | ||
yum-config-manager --disable centos7-els 2>&1 | ||
for i in {1..6}; do | ||
yum-config-manager --disable centos7els-rollout-$i 2>&1 | tee -a "${log}" || true | ||
yum-config-manager --disable centos7els-rollout-$i 2>&1 | ||
done | ||
|
||
# Remove els-define package first if present | ||
if rpm -q els-define &> /dev/null; then | ||
yum remove -y els-define 2>&1 | tee -a "${log}" || echo "Warning: Failed to remove els-define" | tee -a "${log}" | ||
yum remove -y els-define 2>&1 || echo "Warning: Failed to remove els-define" | ||
fi | ||
|
||
# Get list of installed ELS packages | ||
echo "Checking for ELS packages..." | tee -a "${log}" | ||
echo "Checking for ELS packages..." | ||
els_pkgs=$(rpm -qa | grep -E '\.tuxcare\.els[0-9]') || true | ||
|
||
if [ -n "$els_pkgs" ]; then | ||
echo "Found ELS packages:" | tee -a "${log}" | ||
echo "$els_pkgs" | tee -a "${log}" | ||
|
||
# Create a yum shell script to handle the transaction | ||
TMPFILE=$(mktemp) | ||
echo "# yum shell commands" > "$TMPFILE" | ||
|
||
# Process each package | ||
while read -r pkg; do | ||
base_name=$(echo "$pkg" | awk -F'-[0-9]' '{print $1}') | ||
if [ -n "$base_name" ]; then | ||
echo "remove $pkg" >> "$TMPFILE" | ||
echo "install $base_name" >> "$TMPFILE" | ||
fi | ||
done <<< "$els_pkgs" | ||
echo "Found ELS packages:" | ||
echo "$els_pkgs" | ||
|
||
# Handle kernel packages separately and more aggressively | ||
els_kernel_pkgs=$(echo "$els_pkgs" | grep "^kernel") || true | ||
if [ -n "$els_kernel_pkgs" ]; then | ||
echo "Found ELS kernel packages:" | ||
echo "$els_kernel_pkgs" | ||
|
||
# Remove all ELS kernel packages, regardless of running kernel | ||
# since we already have the LVE kernel installed | ||
echo "Removing all ELS kernel packages since LVE kernel is present..." | ||
for kernel_pkg in $els_kernel_pkgs; do | ||
echo "Removing ELS kernel package: $kernel_pkg" | ||
rpm -e --nodeps "$kernel_pkg" 2>&1 || { | ||
echo "Warning: Failed to remove $kernel_pkg" | ||
# If rpm -e fails, try with yum as fallback | ||
yum remove -y "$kernel_pkg" 2>&1 | ||
} | ||
done | ||
fi | ||
|
||
echo "run" >> "$TMPFILE" | ||
echo "exit" >> "$TMPFILE" | ||
# Process remaining non-kernel ELS packages | ||
non_kernel_els_pkgs=$(echo "$els_pkgs" | grep -v "^kernel") || true | ||
if [ -n "$non_kernel_els_pkgs" ]; then | ||
echo "Processing non-kernel ELS packages..." | ||
|
||
# Execute the yum shell script | ||
echo "Replacing ELS packages with base versions..." | tee -a "${log}" | ||
if ! yum shell -y "$TMPFILE" 2>&1 | tee -a "${log}"; then | ||
echo "Trying alternative approach..." | tee -a "${log}" | ||
while read -r pkg; do | ||
# Create a yum shell script for batch processing | ||
TMPFILE=$(mktemp) | ||
echo "# yum shell commands" > "$TMPFILE" | ||
|
||
echo "$non_kernel_els_pkgs" | while read -r pkg; do | ||
base_name=$(echo "$pkg" | awk -F'-[0-9]' '{print $1}') | ||
if [ -n "$base_name" ]; then | ||
yum downgrade -y "$base_name" 2>&1 | tee -a "${log}" || true | ||
echo "remove $pkg" >> "$TMPFILE" | ||
echo "install $base_name" >> "$TMPFILE" | ||
fi | ||
done <<< "$els_pkgs" | ||
done | ||
|
||
echo "run" >> "$TMPFILE" | ||
echo "exit" >> "$TMPFILE" | ||
|
||
# Execute the yum shell script | ||
echo "Replacing non-kernel ELS packages with base versions..." | ||
if ! yum shell -y "$TMPFILE" 2>&1; then | ||
echo "Trying alternative approach for non-kernel packages..." | ||
echo "$non_kernel_els_pkgs" | while read -r pkg; do | ||
base_name=$(echo "$pkg" | awk -F'-[0-9]' '{print $1}') | ||
if [ -n "$base_name" ]; then | ||
yum downgrade -y "$base_name" 2>&1 | ||
fi | ||
done | ||
fi | ||
rm -f "$TMPFILE" | ||
fi | ||
rm -f "$TMPFILE" | ||
fi | ||
|
||
# Move ELS repo files to backup and clean up | ||
mv -f /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1 | tee -a "${log}" || true | ||
mv -f /etc/yum.repos.d/centos*els*.repo "${BACKUP}/" 2>&1 | ||
|
||
# Remove TuxCare GPG key if it exists | ||
if [ -f "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" ]; then | ||
mv -f "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" "${BACKUP}/" 2>&1 | tee -a "${log}" || true | ||
mv -f "/etc/pki/rpm-gpg/RPM-GPG-KEY-TuxCare" "${BACKUP}/" 2>&1 | ||
fi | ||
|
||
# Clean yum cache | ||
yum clean all 2>&1 | tee -a "${log}" || true | ||
yum clean all 2>&1 | ||
|
||
echo "ELS package handling complete" | tee -a "${log}" | ||
echo "ELS package handling complete" | ||
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,49 @@ | ||
import functools | ||
from leapp.libraries.common.config import version | ||
|
||
def run_on_cloudlinux(func_or_version=None): | ||
""" | ||
Decorator that runs a function only on specified CloudLinux versions. | ||
def run_on_cloudlinux(func): | ||
@functools.wraps(func) | ||
def wrapper(*args, **kwargs): | ||
if (version.current_version()[0] != "cloudlinux"): | ||
return | ||
return func(*args, **kwargs) | ||
return wrapper | ||
Can be used as: | ||
@run_on_cloudlinux # Runs on any CloudLinux version | ||
@run_on_cloudlinux('7') # Runs only on CloudLinux 7 | ||
@run_on_cloudlinux(['7', '8']) # Runs on CloudLinux 7 or 8 | ||
""" | ||
|
||
# If used without parentheses | ||
if callable(func_or_version): | ||
@functools.wraps(func_or_version) | ||
def direct_wrapper(*args, **kwargs): | ||
if version.current_version()[0] != "cloudlinux": | ||
return None | ||
return func_or_version(*args, **kwargs) | ||
return direct_wrapper | ||
|
||
# If used with version specification | ||
versions = func_or_version | ||
def decorator(func): | ||
@functools.wraps(func) | ||
def wrapper(*args, **kwargs): | ||
release_id, version_id = version.current_version() | ||
|
||
# Check if running on CloudLinux | ||
if release_id != "cloudlinux": | ||
return None | ||
|
||
# If no versions specified, run on any CloudLinux version | ||
if versions is None: | ||
return func(*args, **kwargs) | ||
|
||
# Convert versions to list if string was provided | ||
version_list = [versions] if isinstance(versions, str) else versions | ||
|
||
# Compare only major version number | ||
current_major = version.get_major_version(version_id) | ||
if current_major in version_list: | ||
return func(*args, **kwargs) | ||
|
||
return None | ||
|
||
return wrapper | ||
return decorator |