From 4f36ce43a53a579940a8521a98f4f0ce28235055 Mon Sep 17 00:00:00 2001 From: Carter Peel Date: Mon, 3 May 2021 14:26:13 -0400 Subject: [PATCH 1/3] Added logging facility --- centos2rocky.sh | 77 +++++++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 32 deletions(-) mode change 100644 => 100755 centos2rocky.sh diff --git a/centos2rocky.sh b/centos2rocky.sh old mode 100644 new mode 100755 index 0ed3599..92ec3e4 --- a/centos2rocky.sh +++ b/centos2rocky.sh @@ -14,6 +14,9 @@ fi export LANG=en_US.UTF-8 +# Add logfile for debugging later down the line +logfile=/var/log/centos2rocky.log + SUPPORTED_RELEASE="8.3" SUPPORTED_MAJOR="8" current_url="https://dl.rockylinux.org/pub/rocky/${SUPPORTED_RELEASE}/BaseOS/x86_64/os/Packages" @@ -39,6 +42,7 @@ convert_info_dir=/root/convert reinstall_all_rpms=false verify_all_rpms=false + usage() { echo "Usage: ${0##*/} [OPTIONS]" echo @@ -53,7 +57,7 @@ usage() { exit_message() { echo "$1" - final_message + log final_message exit 1 } >&2 @@ -68,7 +72,7 @@ bin_hash() { 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." + log exit_message "'${1}' command not found. Please ensure you are running bash or that your PATH is set correctly." fi } @@ -102,17 +106,17 @@ package_swaps() { dnf config-manager --set-enabled ${list_enabled[@]} || { echo "Repo name missing?" ; exit 25; } dnf distro-sync -y else - exit_message "We failed to install the release package." + log exit_message "We failed to install the release package." fi popd } sig_swaps() { - exit_message "Not Available" + log exit_message "Not Available" } module_check() { - echo "Finding our modules that are enabled" + echo "Finding our modules that are enabled" &2>1 | tee -a $logfile for module in "${enabled_modules[@]}"; do case ${module} in container-tools|go-toolset|jmc|llvm-toolset|rust-toolset|virt) @@ -124,13 +128,13 @@ module_check() { done if [ ${#unknown_modules[@]} -gt 0 ]; then for x in "${unknown_modules[@]}"; do - echo "${x}" + echo "${x}" &2>1 | tee -a $logfile done - 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)?" + 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)?" &2>1 | tee -a $logfile select yn in "Yes" "No"; do case $yn in Yes) - echo "Ensure how to switch modules, so we are leaving." + echo "Ensure how to switch modules, so we are leaving." &2>1 | tee -a $logfile exit 1 ;; No) @@ -144,22 +148,31 @@ module_check() { # 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}" + dnf module reset -y "${module}" &2>1 | tee -a $logfile case ${module} in container-tools|go-toolset|jmc|llvm-toolset|rust-toolset|virt) - dnf module install "${module}" -y + dnf module install "${module}" -y &2>1 | tee -a $logfile ;; *) - echo "Unsure how to deal with the module presented." + echo "Unsure how to deal with the module presented." &2>1 | tee -a $logfile ;; esac # Final update - dnf update -y + dnf update -y &2>1 | tee -a $logfile done } ## End actual work +# Pipe output of script to $logfile +log(){ +printf "\e[1;34m$(date): \e[0m$@\n" >> "$logfile" + "$@" 2>> "$logfile" +} + + + + while getopts "hrVR" option; do case "$option" in h) @@ -175,71 +188,71 @@ while getopts "hrVR" option; do reinstall_all_rpms=true ;; *) - echo "Invalid switch." + echo "Invalid switch." &2>1 | tee -a $logfile usage ;; esac done -echo "Ensuring rpm, yum, and wget are here." +echo "Ensuring rpm, yum, and wget are here." &2>1 | tee -a $logfile for pkg in rpm yum wget curl; do - bin_check "${pkg}" + log bin_check "${pkg}" done -echo "Ensuring your version of CentOS is supported" +echo "Ensuring your version of CentOS is supported" &2>1 | tee -a $logfile if ! old_release=$(rpm -q --whatprovides /etc/redhat-release); then - exit_message "You are not running a supported distribution." + log 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." + log 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." + log 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 + log generate_rpm_info begin fi case "${old_release}" in centos-linux-release*);; rocky-release*) - exit_message "You are already running Rocky." + log exit_message "You are already running Rocky." ;; *) - exit_message "You are running an unsupported distribution. Good bye." + log 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 +log 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 !!" + echo "!! THIS MAY CAUSE ISSUES WITH YOUR SYSTEM !!" &2>1 | tee -a $logfile 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 + echo "Reinstalling rpms: ${rpm_list[*]}" &2>1 | tee -a $logfile + dnf reinstall "${rpm_list[@]}" -y &2>1 | tee -a $logfile 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[@]}" + 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" &2>1 | tee -a $logfile + printf '\t%s\n' "${non_rocky_rpm[@]}" &2>1 | tee -a $logfile 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" + log generate_rpm_info finish + echo "You may review the following files:" &2>1 | tee -a $logfile + find /root/convert -type f -name "$(hostname)-rpms-*.log" &2>1| tee -a $logfile fi -echo "Done, please reboot your system." +echo "Done, please reboot your system." &2>1 | tee -a $logfile From 626cef11abab2465a93b73ed002731c17516c74e Mon Sep 17 00:00:00 2001 From: Carter Peel Date: Mon, 3 May 2021 16:47:10 -0400 Subject: [PATCH 2/3] Added log output and Wget/Curl sanity checks --- centos2rocky.sh | 114 ++++++++++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 47 deletions(-) diff --git a/centos2rocky.sh b/centos2rocky.sh index 92ec3e4..527535c 100755 --- a/centos2rocky.sh +++ b/centos2rocky.sh @@ -4,18 +4,28 @@ ## Rocky is RC status. Using this script means you accept all risks of system instability. +( +# Pass everything to a subshell so the output can be piped to /var/log/centos2rocky.log + set -e unset CDPATH -if [ "$(id -u)" -ne 0 ]; then +if [[ "$(id -u)" -ne 0 ]]; then echo "You must run this script as root." echo "Either use sudo or 'su -c ${0}'" fi -export LANG=en_US.UTF-8 +if [[ "$(wget 2>/dev/null || echo $?)" == 127 ]]; then + echo "Wget is not installed! Installing it..." + dnf -y install wget +fi -# Add logfile for debugging later down the line -logfile=/var/log/centos2rocky.log +if [[ "$(curl 2>/dev/null || echo $?)" == 127 ]]; then + echo "Curl is not installed! Installing it..." + dnf -y install curl libcurl +fi + +export LANG=en_US.UTF-8 SUPPORTED_RELEASE="8.3" SUPPORTED_MAJOR="8" @@ -42,7 +52,6 @@ convert_info_dir=/root/convert reinstall_all_rpms=false verify_all_rpms=false - usage() { echo "Usage: ${0##*/} [OPTIONS]" echo @@ -57,12 +66,17 @@ usage() { exit_message() { echo "$1" - log final_message + 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." + logmessage +} + +logmessage(){ +echo "A log of this installation can be found at /var/log/centos2rocky.log" } ## The actual work @@ -72,7 +86,8 @@ bin_hash() { bin_check() { if ! bin_hash "$1"; then - log exit_message "'${1}' command not found. Please ensure you are running bash or that your PATH is set correctly." + exit_message "'${1}' command not found. Please ensure you are running bash or that your PATH is set correctly." + logmessage fi } @@ -89,7 +104,7 @@ package_swaps() { pushd /root/release for x in "${release_to_install[@]}"; do - wget -q "${current_url}/${x}" || { echo "failed to download ${x}" ; exit 20; } + wget -q "${current_url}/${x}" || { echo "failed to download ${x}" && logmessage ; exit 20; } done # Remove packages we need to swap @@ -106,17 +121,19 @@ package_swaps() { dnf config-manager --set-enabled ${list_enabled[@]} || { echo "Repo name missing?" ; exit 25; } dnf distro-sync -y else - log exit_message "We failed to install the release package." + exit_message "We failed to install the release package." + logmessage fi + popd } sig_swaps() { - log exit_message "Not Available" + exit_message "Not Available" } module_check() { - echo "Finding our modules that are enabled" &2>1 | tee -a $logfile + 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) @@ -128,13 +145,14 @@ module_check() { done if [ ${#unknown_modules[@]} -gt 0 ]; then for x in "${unknown_modules[@]}"; do - echo "${x}" &2>1 | tee -a $logfile + echo "${x}" done - 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)?" &2>1 | tee -a $logfile + 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." &2>1 | tee -a $logfile + echo "Unsure how to switch modules, so we are leaving." + logmessage exit 1 ;; No) @@ -148,31 +166,24 @@ module_check() { # 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}" &2>1 | tee -a $logfile + dnf module reset -y "${module}" case ${module} in container-tools|go-toolset|jmc|llvm-toolset|rust-toolset|virt) - dnf module install "${module}" -y &2>1 | tee -a $logfile + dnf module install "${module}" -y ;; *) - echo "Unsure how to deal with the module presented." &2>1 | tee -a $logfile + echo "Unsure how to deal with the module presented." + logmessage ;; esac # Final update - dnf update -y &2>1 | tee -a $logfile + dnf update -y done } + ## End actual work -# Pipe output of script to $logfile -log(){ -printf "\e[1;34m$(date): \e[0m$@\n" >> "$logfile" - "$@" 2>> "$logfile" -} - - - - while getopts "hrVR" option; do case "$option" in h) @@ -188,71 +199,80 @@ while getopts "hrVR" option; do reinstall_all_rpms=true ;; *) - echo "Invalid switch." &2>1 | tee -a $logfile + echo "Invalid switch." usage ;; esac done -echo "Ensuring rpm, yum, and wget are here." &2>1 | tee -a $logfile +echo "Ensuring rpm, yum, and wget are here." for pkg in rpm yum wget curl; do - log bin_check "${pkg}" + bin_check "${pkg}" done -echo "Ensuring your version of CentOS is supported" &2>1 | tee -a $logfile +echo "Ensuring your version of CentOS is supported" if ! old_release=$(rpm -q --whatprovides /etc/redhat-release); then - log exit_message "You are not running a supported distribution." + exit_message "You are not running a supported distribution." + logmessage fi if [ "$(echo "${old_release}" | wc -l)" -ne 1 ]; then - log exit_message "You seem to have package issues. More than one package provides redhat-release." + exit_message "You seem to have package issues. More than one package provides redhat-release." + logmessage fi if ! grep ${SUPPORTED_RELEASE} -q /etc/redhat-release; then - log exit_message "${SUPPORTED_RELEASE} is only supported for conversion at this time. Stream is not supported." + exit_message "${SUPPORTED_RELEASE} is only supported for conversion at this time. Stream is not supported." + logmessage fi if "${verify_all_rpms}"; then - log generate_rpm_info begin + generate_rpm_info begin fi case "${old_release}" in centos-linux-release*);; rocky-release*) - log exit_message "You are already running Rocky." + exit_message "You are already running Rocky." + logmessage ;; *) - log exit_message "You are running an unsupported distribution. Good bye." + exit_message "You are running an unsupported distribution. Good bye." + logmessage esac # Check our modules before a swap module_check # Actually do the swap and distro-sync -log package_swaps +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 !!" &2>1 | tee -a $logfile + 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[*]}" &2>1 | tee -a $logfile - dnf reinstall "${rpm_list[@]}" -y &2>1 | tee -a $logfile + 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" &2>1 | tee -a $logfile - printf '\t%s\n' "${non_rocky_rpm[@]}" &2>1 | tee -a $logfile + 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 - log generate_rpm_info finish - echo "You may review the following files:" &2>1 | tee -a $logfile - find /root/convert -type f -name "$(hostname)-rpms-*.log" &2>1| tee -a $logfile + 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." &2>1 | tee -a $logfile +echo "Done, please reboot your system." +logmessage + +) | tee /var/log/centos2rocky.log +# Pipe output to /var/log/centos2rocky.log From 4e106093d344092f94a56e15b1b0fcf7c50bb720 Mon Sep 17 00:00:00 2001 From: Carter Peel Date: Mon, 3 May 2021 17:03:52 -0400 Subject: [PATCH 3/3] Changed shebang to "#!/usr/bin/env bash" --- centos2rocky.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/centos2rocky.sh b/centos2rocky.sh index 527535c..3c65b9b 100755 --- a/centos2rocky.sh +++ b/centos2rocky.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # label # Supports only CentOS 8.3