From 4738f10cfc0f66329775b14cec6adb1882a1f62d Mon Sep 17 00:00:00 2001 From: nazunalika Date: Sun, 25 Apr 2021 10:08:19 -0700 Subject: [PATCH] init --- README.md | 4 + centos2rocky.sh | 222 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 README.md create mode 100644 centos2rocky.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..08395b0 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +Rocky Tools +=========== + +Various scripts and tools that we find useful, whether we use them or they are made for public consumption. diff --git a/centos2rocky.sh b/centos2rocky.sh new file mode 100644 index 0000000..2bf5106 --- /dev/null +++ b/centos2rocky.sh @@ -0,0 +1,222 @@ +#!/bin/bash +# label +# Supports only CentOS 8.3 +set -e +unset CDPATH + +if [ "$(id -u)" -ne 0 ]; then + echo "You must run this script as root." + echo "Either use sudo or 'su -c ${0}'" +fi + +SUPPORTED_RELEASE="8.3" +SUPPORTED_MAJOR="8" +current_url=https://mirror.rockylinux.org/rocky +# These are packages that can be swapped safely over and will have more added over time. +packages_to_swap=( + centos-backgrounds \ + centos-indexhtml \ + centos-repos \ + centos-logos \ + centos-gpg-keys \ + centos-linux-release) + +# Release packages that are part of SIG's should be listed below when they are available. +#sigs_to_swap=() + +# Defaults +list_enabled=("$(yum repolist enabled | awk '!/repo/ {print $1}')") +enabled_modules=("$(dnf module list --enabled | grep rhel | awk '{print $1}')") +convert_info_dir=/root/convert +reinstall_all_rpms=false +verify_all_rpms=false + +usage() { + echo "Usage: ${0##*/} [OPTIONS]" + echo + echo "Options:" + echo "-h displays this help" + echo "-r Converts to rocky" + echo "-V Verifies switch" + echo "-R Reinstall all packages" + echo " !! USE WITH CAUTION !!" + exit 1 +} >&2 + +exit_message() { + echo "$1" + final_message + exit 1 +} >&2 + +final_message() { + echo "An error occurred while we were attempting to convert your system to Rocky Linux. Your system may be unstable. Script will now exit to prevent possible damage." +} + +## The actual work +bin_hash() { + hash "$1" >/dev/null 2>&1 +} + +bin_check() { + if ! bin_hash "$1"; then + exit_message "'${1}' command not found. Please ensure you are running bash or that your PATH is set correctly." + fi +} + +generate_rpm_info() { + mkdir /root/convert + echo "Creating a list of RPMs installed: $1" + rpm -qa --qf "%{NAME}|%{VERSION}|%{RELEASE}|%{INSTALLTIME}|%{VENDOR}|%{BUILDTIME}|%{BUILDHOST}|%{SOURCERPM}|%{LICENSE}|%{PACKAGER}\n" | sort > "${convert_info_dir}/$(hostname)-rpm-list-$1.log" + echo "Verifying RPMs installed against RPM database: $1" + rpm -Va | sort -k3 > "${convert_info_dir}/$(hostname)-rpm-list-verified-$1.log" +} + +package_swaps() { + rpm -e --nodeps "${packages_to_swap[@]}" + rpm -ihv ${current_url}/${SUPPORTED_RELEASE}/BaseOS/x86_64/os/Packages/rocky-release-${SUPPORTED_RELEASE}-1.el8.x86_64.rpm \ + ${current_url}/${SUPPORTED_RELEASE}/BaseOS/x86_64/os/Packages/rocky-repos-${SUPPORTED_MAJOR}-1.el8.x86_64.rpm + if [ $? -eq 0 ]; then + echo "Removing dnf cache" + rm -rf /var/cache/{yum,dnf} + echo "Ensuring repos are enabled before the package swap" + dnf config-manager --set-enabled "${list_enabled[@]}" + dnf distro-sync -y + else + exit_message "We failed to install the release package." + fi +} + +sig_swaps() { + exit_message "Not Available" +} + +module_check() { + echo "Finding our modules that are enabled" + for module in "${enabled_modules[@]}"; do + case ${module} in + container-tools|go-toolset|jmc|llvm-toolset|rust-toolset|virt) + ;; + *) + unknown_modules+=("${module}") + ;; + esac + done + if [ ${#unknown_modules[@]} -gt 0 ]; then + echo "There are some modules that are unsure of how to handle. This normally shouldn't happen. Do you want to resolve this yourself (Yes) or continue (No)?" + select yn in "Yes" "No"; do + case $yn in + Yes) + echo "Ensure how to switch modules, so we are leaving." + exit 1 + ;; + No) + break + ;; + esac + done + fi +} + +# This is just in case. There is a likelihood this will have to be done. +module_fix() { + for module in "${enabled_modules[@]}"; do + dnf module reset -y "${module}" + case ${module} in + container-tools|go-toolset|jmc|llvm-toolset|rust-toolset|virt) + dnf module install "${module}" -y + ;; + *) + echo "Unsure how to deal with the module presented." + ;; + esac + # Final update + dnf update -y + done +} + +## End actual work + +while getopts "hrVR" option; do + case "$option" in + h) + usage + ;; + r) + reinstall_all_rpms=true + ;; + V) + verify_all_rpms=true + ;; + R) + reinstall_all_rpms=true + ;; + *) + echo "Invalid switch." + usage + ;; + esac +done + +echo "Ensuring rpm, yum, and curl are here." +for pkg in rpm yum curl; do + bin_check "${pkg}" +done + +echo "Ensuring your version of CentOS is supported" +if ! old_release=$(rpm -q --whatprovides /etc/redhat-release); then + exit_message "You are not running a supported distribution." +fi + +if [ "$(echo "${old_release}" | wc -l)" -ne 1 ]; then + exit_message "You seem to have package issues. More than one package provides redhat-release." +fi + +if ! grep ${SUPPORTED_RELEASE} -q /etc/redhat-release; then + exit_message "${SUPPORTED_RELEASE} is only supported for conversion at this time. Stream is not supported." +fi + +if "${verify_all_rpms}"; then + generate_rpm_info begin +fi + +case "${old_release}" in + centos-linux-release*);; + rocky-release*) + exit_message "You are already running Rocky." + ;; + *) + exit_message "You are running an unsupported distribution. Good bye." +esac + +# Check our modules before a swap +module_check + +# Actually do the swap and distro-sync +package_swaps + +# Fix up modules +module_fix + +# Warning, this is potentially dangerous. +if "${reinstall_all_rpms}"; then + echo "!! THIS MAY CAUSE ISSUES WITH YOUR SYSTEM !!" + rpm_list=("$(rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE} %{VENDOR}\n" | grep CentOS | awk '{print $1}')") + if [[ -n "${rpm_list[*]}" ]]; then + echo "Reinstalling rpms: ${rpm_list[*]}" + dnf reinstall "${rpm_list[@]}" -y + fi + non_rocky_rpm=("$(rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}|%{VENDOR}|%{PACKAGER}\n" |grep -iv Rocky)") + if [[ -n ${non_rocky_rpm[*]} ]]; then + echo "Non-Rocky packages are installed. This is generally not an issue. If you see centos packages, you may need to address them and file a bug report at https://bugs.rockylinux.org" + printf '\t%s\n' "${non_rocky_rpm[@]}" + fi +fi + +if "${verify_all_rpms}"; then + generate_rpm_info finish + echo "You may review the following files:" + find /root/convert -type f -name "$(hostname)-rpms-*.log" +fi + +echo "Done, please reboot your system."