Skip to content

Commit

Permalink
add suport for cloudlinux versions to run_on_cloudlinux decorator
Browse files Browse the repository at this point in the history
  • Loading branch information
relkaboussi committed Nov 14, 2024
1 parent 1697d35 commit bd5af6e
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 62 deletions.
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
52 changes: 45 additions & 7 deletions repos/system_upgrade/cloudlinux/libraries/cllaunch.py
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

0 comments on commit bd5af6e

Please sign in to comment.