2021-04-25 17:08:19 +00:00
#!/bin/bash
# label <label@rockylinux.org>
# Supports only CentOS 8.3
2021-05-02 12:15:39 +00:00
## Rocky is RC status. Using this script means you accept all risks of system instability.
2021-04-25 17:08:19 +00:00
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
2021-05-02 16:50:33 +00:00
export LANG = en_US.UTF-8
2021-05-03 18:26:13 +00:00
# Add logfile for debugging later down the line
logfile = /var/log/centos2rocky.log
2021-04-25 17:08:19 +00:00
SUPPORTED_RELEASE = "8.3"
SUPPORTED_MAJOR = "8"
2021-05-02 01:06:53 +00:00
current_url = " https://dl.rockylinux.org/pub/rocky/ ${ SUPPORTED_RELEASE } /BaseOS/x86_64/os/Packages "
2021-04-25 17:08:19 +00:00
# These are packages that can be swapped safely over and will have more added over time.
packages_to_swap = (
centos-backgrounds \
centos-indexhtml \
2021-04-30 16:39:30 +00:00
centos-linux-repos \
2021-04-25 17:08:19 +00:00
centos-logos \
centos-gpg-keys \
centos-linux-release)
2021-05-02 01:06:53 +00:00
packages_that_exist = ( $( rpm -q --queryformat= "%{NAME}\n" " ${ packages_to_swap [@] } " | grep -v "not installed" ) )
2021-05-02 17:47:22 +00:00
release_to_install = ( $( curl -L -s ${ current_url } | awk -F '"' '/rocky-repos|rocky-gpg-keys|rocky-release/ {print $2}' ) )
2021-05-02 01:06:53 +00:00
2021-04-25 17:08:19 +00:00
# Release packages that are part of SIG's should be listed below when they are available.
#sigs_to_swap=()
# Defaults
2021-05-02 17:30:19 +00:00
list_enabled = ( " $( dnf repolist enabled | awk '!/repo/ {print $1}' ) " )
2021-04-25 17:08:19 +00:00
enabled_modules = ( " $( dnf module list --enabled | grep rhel | awk '{print $1}' ) " )
convert_info_dir = /root/convert
reinstall_all_rpms = false
verify_all_rpms = false
2021-05-03 18:26:13 +00:00
2021-04-25 17:08:19 +00:00
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 "
2021-05-03 18:26:13 +00:00
log final_message
2021-04-25 17:08:19 +00:00
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
2021-05-03 18:26:13 +00:00
log exit_message " ' ${ 1 } ' command not found. Please ensure you are running bash or that your PATH is set correctly. "
2021-04-25 17:08:19 +00:00
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( ) {
2021-05-02 01:06:53 +00:00
mkdir /root/release
pushd /root/release
for x in " ${ release_to_install [@] } " ; do
wget -q " ${ current_url } / ${ x } " || { echo " failed to download ${ x } " ; exit 20; }
done
# Remove packages we need to swap
rpm -e --nodeps " ${ packages_that_exist [@] } "
# Install our release
rpm -ihv " ${ release_to_install [@] } "
# Distrosync if the above succeeded
2021-04-25 17:08:19 +00:00
if [ $? -eq 0 ] ; then
echo "Removing dnf cache"
rm -rf /var/cache/{ yum,dnf}
echo "Ensuring repos are enabled before the package swap"
2021-05-02 17:30:19 +00:00
dnf config-manager --set-enabled ${ list_enabled [@] } || { echo "Repo name missing?" ; exit 25; }
2021-04-25 17:08:19 +00:00
dnf distro-sync -y
else
2021-05-03 18:26:13 +00:00
log exit_message "We failed to install the release package."
2021-04-25 17:08:19 +00:00
fi
2021-05-02 01:06:53 +00:00
popd
2021-04-25 17:08:19 +00:00
}
sig_swaps( ) {
2021-05-03 18:26:13 +00:00
log exit_message "Not Available"
2021-04-25 17:08:19 +00:00
}
module_check( ) {
2021-05-03 18:26:13 +00:00
echo "Finding our modules that are enabled" & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
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
2021-05-02 01:06:53 +00:00
for x in " ${ unknown_modules [@] } " ; do
2021-05-03 18:26:13 +00:00
echo " ${ x } " & 2>1 | tee -a $logfile
2021-05-02 01:06:53 +00:00
done
2021-05-03 18:26:13 +00:00
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
2021-04-25 17:08:19 +00:00
select yn in "Yes" "No" ; do
case $yn in
Yes)
2021-05-03 18:26:13 +00:00
echo "Ensure how to switch modules, so we are leaving." & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
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
2021-05-03 18:26:13 +00:00
dnf module reset -y " ${ module } " & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
case ${ module } in
container-tools| go-toolset| jmc| llvm-toolset| rust-toolset| virt)
2021-05-03 18:26:13 +00:00
dnf module install " ${ module } " -y & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
; ;
*)
2021-05-03 18:26:13 +00:00
echo "Unsure how to deal with the module presented." & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
; ;
esac
# Final update
2021-05-03 18:26:13 +00:00
dnf update -y & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
done
}
## End actual work
2021-05-03 18:26:13 +00:00
# Pipe output of script to $logfile
log( ) {
printf " \e[1;34m $( date) : \e[0m $@ \n " >> " $logfile "
" $@ " 2>> " $logfile "
}
2021-04-25 17:08:19 +00:00
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
; ;
*)
2021-05-03 18:26:13 +00:00
echo "Invalid switch." & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
usage
; ;
esac
done
2021-05-03 18:26:13 +00:00
echo "Ensuring rpm, yum, and wget are here." & 2>1 | tee -a $logfile
2021-05-02 01:06:53 +00:00
for pkg in rpm yum wget curl; do
2021-05-03 18:26:13 +00:00
log bin_check " ${ pkg } "
2021-04-25 17:08:19 +00:00
done
2021-05-03 18:26:13 +00:00
echo "Ensuring your version of CentOS is supported" & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
if ! old_release = $( rpm -q --whatprovides /etc/redhat-release) ; then
2021-05-03 18:26:13 +00:00
log exit_message "You are not running a supported distribution."
2021-04-25 17:08:19 +00:00
fi
if [ " $( echo " ${ old_release } " | wc -l) " -ne 1 ] ; then
2021-05-03 18:26:13 +00:00
log exit_message "You seem to have package issues. More than one package provides redhat-release."
2021-04-25 17:08:19 +00:00
fi
if ! grep ${ SUPPORTED_RELEASE } -q /etc/redhat-release; then
2021-05-03 18:26:13 +00:00
log exit_message " ${ SUPPORTED_RELEASE } is only supported for conversion at this time. Stream is not supported. "
2021-04-25 17:08:19 +00:00
fi
if " ${ verify_all_rpms } " ; then
2021-05-03 18:26:13 +00:00
log generate_rpm_info begin
2021-04-25 17:08:19 +00:00
fi
case " ${ old_release } " in
centos-linux-release*) ; ;
rocky-release*)
2021-05-03 18:26:13 +00:00
log exit_message "You are already running Rocky."
2021-04-25 17:08:19 +00:00
; ;
*)
2021-05-03 18:26:13 +00:00
log exit_message "You are running an unsupported distribution. Good bye."
2021-04-25 17:08:19 +00:00
esac
# Check our modules before a swap
module_check
# Actually do the swap and distro-sync
2021-05-03 18:26:13 +00:00
log package_swaps
2021-04-25 17:08:19 +00:00
# Fix up modules
module_fix
# Warning, this is potentially dangerous.
if " ${ reinstall_all_rpms } " ; then
2021-05-03 18:26:13 +00:00
echo "!! THIS MAY CAUSE ISSUES WITH YOUR SYSTEM !!" & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
rpm_list = ( " $( rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE} %{VENDOR}\n" | grep CentOS | awk '{print $1}' ) " )
if [ [ -n " ${ rpm_list [*] } " ] ] ; then
2021-05-03 18:26:13 +00:00
echo " Reinstalling rpms: ${ rpm_list [*] } " & 2>1 | tee -a $logfile
dnf reinstall " ${ rpm_list [@] } " -y & 2>1 | tee -a $logfile
2021-04-25 17:08:19 +00:00
fi
non_rocky_rpm = ( " $( rpm -qa --qf "%{NAME}-%{VERSION}-%{RELEASE}|%{VENDOR}|%{PACKAGER}\n" | grep -iv Rocky) " )
if [ [ -n ${ non_rocky_rpm [*] } ] ] ; then
2021-05-03 18:26:13 +00:00
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
2021-04-25 17:08:19 +00:00
fi
fi
if " ${ verify_all_rpms } " ; then
2021-05-03 18:26:13 +00:00
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
2021-04-25 17:08:19 +00:00
fi
2021-05-03 18:26:13 +00:00
echo "Done, please reboot your system." & 2>1 | tee -a $logfile