2023-07-17 09:28:52 +02:00
#!/usr/bin/env bash
2023-08-11 17:19:18 +02:00
# SPDX-License-Identifier: GPL-3.0-or-later
2023-07-17 09:28:52 +02:00
# created by Tobias Powalowski <tpowa@archlinux.org>
2023-09-03 22:02:48 +02:00
. /usr/lib/archboot/common.sh
2023-10-09 21:19:18 +02:00
_TITLE = " Archboot ${ _RUNNING_ARCH } | $( uname -r) | Basic Setup | Pacman Configuration "
2023-07-17 09:28:52 +02:00
2023-08-31 10:28:44 +02:00
_task_download_mirror( ) {
2023-09-04 15:23:29 +02:00
${ _DLPROG } -o /tmp/pacman_mirrorlist.txt " https://www.archlinux.org/mirrorlist/?country= ${ _COUNTRY } &protocol=https&ip_version=4&ip_version=6&use_mirror_status=on "
2023-08-31 10:28:44 +02:00
rm /.archboot
}
_download_mirror( ) {
: > /.archboot
_task_download_mirror &
_progress_wait "0" "99" " ${ _DOWNLOAD } " "0.01"
2023-08-02 08:17:59 +02:00
_progress "100" " ${ _DOWNLOAD } "
sleep 2
}
2023-07-17 09:28:52 +02:00
_select_mirror( ) {
2023-07-22 10:44:56 +02:00
# Download updated mirrorlist, if possible (only on x86_64)
2023-07-17 09:28:52 +02:00
if [ [ " ${ _RUNNING_ARCH } " = = "x86_64" ] ] ; then
2023-09-04 14:58:39 +02:00
_COUNTRY = " $( ${ _DLPROG } "http://ip-api.com/csv/?fields=countryCode" ) "
2023-08-02 08:19:39 +02:00
_DOWNLOAD = " Downloading latest mirrorlist for Region ${ _COUNTRY } ... "
2023-08-03 16:02:14 +02:00
_download_mirror | _dialog --title " Pacman Configuration " --no-mouse --gauge " ${ _DOWNLOAD } " 6 70 0
2023-07-21 21:48:14 +02:00
if grep -q '#Server = https:' /tmp/pacman_mirrorlist.txt; then
2023-09-06 10:28:59 +02:00
mv " ${ _PACMAN_MIRROR } " " ${ _PACMAN_MIRROR } .bak "
cp /tmp/pacman_mirrorlist.txt " ${ _PACMAN_MIRROR } "
2023-07-17 09:28:52 +02:00
fi
fi
2023-07-22 10:44:56 +02:00
# This regex doesn't honor commenting
2023-09-06 10:28:59 +02:00
_MIRRORS = $( grep -E -o '(https)://[^/]*' " ${ _PACMAN_MIRROR } " | sed 's|$| _|g' )
[ [ -z ${ _MIRRORS } ] ] && _MIRRORS = $( grep -E -o '(http)://[^/]*' " ${ _PACMAN_MIRROR } " | sed 's|$| _|g' )
2023-07-21 22:17:43 +02:00
_SYNC_URL = ""
while [ [ -z " ${ _SYNC_URL } " ] ] ; do
#shellcheck disable=SC2086
2023-09-06 09:27:01 +02:00
_dialog --cancel-label " ${ _LABEL } " --title " Package Mirror " --menu "" 13 55 7 \
2023-07-22 14:23:11 +02:00
"Custom Mirror" "_" ${ _MIRRORS } 2>${ _ANSWER } || _abort
2023-07-21 22:17:43 +02:00
#shellcheck disable=SC2155
local _SERVER = $( cat " ${ _ANSWER } " )
2023-07-22 14:23:11 +02:00
if [ [ " ${ _SERVER } " = = "Custom Mirror" ] ] ; then
2023-09-06 09:09:26 +02:00
_dialog --inputbox "Enter the full URL to repositories." 8 65 \
2023-07-21 22:17:43 +02:00
"" 2>" ${ _ANSWER } " || _SYNC_URL = ""
_SYNC_URL = $( cat " ${ _ANSWER } " )
else
# Form the full URL for our mirror by grepping for the server name in
# our mirrorlist and pulling the full URL out. Substitute 'core' in
# for the repository name, and ensure that if it was listed twice we
# only return one line for the mirror.
2023-09-06 10:28:59 +02:00
_SYNC_URL = $( grep -E -o " ${ _SERVER } .* " " ${ _PACMAN_MIRROR } " | head -n1)
2023-07-21 22:17:43 +02:00
fi
done
2023-07-17 09:28:52 +02:00
echo " Using mirror: ${ _SYNC_URL } " >" ${ _LOG } "
2023-07-22 19:41:52 +02:00
# comment already existing entries
sed -i -e 's|^Server|#Server|g' /etc/pacman.d/mirrorlist
2023-07-17 09:28:52 +02:00
#shellcheck disable=SC2027,SC2086
echo "Server = " ${ _SYNC_URL } "" >> /etc/pacman.d/mirrorlist
return 0
}
_enable_testing( ) {
if ! grep -q "^\[.*testing\]" /etc/pacman.conf; then
_DOTESTING = ""
2023-07-21 11:12:10 +02:00
_dialog --title " Testing Repositories " --defaultno --yesno "Do you want to enable testing repositories?\n\nOnly enable this if you need latest\navailable packages for testing purposes!" 8 50 && _DOTESTING = 1
2023-07-17 09:28:52 +02:00
if [ [ -n " ${ _DOTESTING } " ] ] ; then
sed -i -e '/^#\[core-testing\]/ { n ; s/^#// }' /etc/pacman.conf
sed -i -e '/^#\[extra-testing\]/ { n ; s/^#// }' /etc/pacman.conf
sed -i -e 's:^#\[core-testing\]:\[core-testing\]:g' -e 's:^#\[extra-testing\]:\[extra-testing\]:g' /etc/pacman.conf
fi
2023-08-01 20:49:02 +02:00
else
_DOTESTING = 1
2023-07-17 09:28:52 +02:00
fi
}
2023-08-31 14:50:10 +02:00
_task_pacman_keyring_install( ) {
2023-07-17 12:06:01 +02:00
# pacman-key process itself
while pgrep -x pacman-key & >" ${ _NO_LOG } " ; do
sleep 1
done
# gpg finished in background
while pgrep -x gpg & >" ${ _NO_LOG } " ; do
sleep 1
done
[ [ -e /etc/systemd/system/pacman-init.service ] ] && systemctl stop pacman-init.service
_KEYRING = "archlinux-keyring"
[ [ " ${ _RUNNING_ARCH } " = = "aarch64" ] ] && _KEYRING = " ${ _KEYRING } archlinuxarm-keyring "
#shellcheck disable=SC2086
2023-08-31 14:29:14 +02:00
pacman -Sy --noconfirm --noprogressbar ${ _KEYRING } & >" ${ _LOG } "
rm /.archboot
}
_prepare_pacman( ) {
: > /.archboot
_task_pacman_keyring_install &
2023-09-02 08:35:23 +02:00
_progress_wait "0" "99" "Updating Arch Linux keyring..." "0.15"
2023-08-31 14:29:14 +02:00
_progress "100" "Arch Linux keyring is ready."
sleep 2
2023-07-17 12:06:01 +02:00
}
2023-08-31 14:39:08 +02:00
_task_update_environment( ) {
2023-07-17 10:52:11 +02:00
_UPDATE_ENVIRONMENT = ""
_LOCAL_KERNEL = ""
_ONLINE_KERNEL = ""
2023-08-01 21:22:23 +02:00
pacman -Sy & >" ${ _LOG } "
#shellcheck disable=SC2086
2023-10-07 22:01:11 +02:00
_LOCAL_KERNEL = " $( pacman -Qi ${ _KERNELPKG } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
2023-08-01 21:22:23 +02:00
if [ [ " ${ _RUNNING_ARCH } " = = "aarch64" ] ] ; then
#shellcheck disable=SC2086
2023-10-07 22:01:11 +02:00
_ONLINE_KERNEL = " $( pacman -Si ${ _KERNELPKG } -${ _RUNNING_ARCH } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
2023-08-01 21:22:23 +02:00
else
if [ [ -n " ${ _DOTESTING } " ] ] ; then
#shellcheck disable=SC2086
2023-10-07 22:01:11 +02:00
_ONLINE_KERNEL = " $( pacman -Si core-testing/${ _KERNELPKG } 2>${ _NO_LOG } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
2023-08-01 21:22:23 +02:00
fi
if [ [ -z " ${ _ONLINE_KERNEL } " ] ] ; then
2023-08-01 21:03:13 +02:00
#shellcheck disable=SC2086
2023-10-07 22:01:11 +02:00
_ONLINE_KERNEL = " $( pacman -Si ${ _KERNELPKG } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
2023-07-17 09:28:52 +02:00
fi
fi
2023-10-07 22:01:11 +02:00
echo " ${ _LOCAL_KERNEL } local kernel version and ${ _ONLINE_KERNEL } online kernel version. " >" ${ _LOG } "
if ! [ [ " ${ _LOCAL_KERNEL } " = = " ${ _ONLINE_KERNEL } " ] ] ; then
echo " ${ _ONLINE_KERNEL } " > /.new_kernel
fi
2023-08-31 14:39:08 +02:00
rm /.archboot
}
_update_environment( ) {
: > /.archboot
_task_update_environment &
2023-08-31 18:14:35 +02:00
_progress_wait "0" " 97" "Checking on new online kernel version..." "0.025"
2023-10-07 22:01:11 +02:00
if ! [ [ -f "/.new_kernel" ] ] ; then
2023-08-01 21:22:23 +02:00
_progress "98" "No new kernel online available. Skipping update environment."
2023-08-31 10:39:09 +02:00
sleep 1
2023-08-03 15:58:29 +02:00
_progress "100" "Pacman configuration completed successfully."
sleep 2
2023-08-03 15:53:56 +02:00
else
2023-08-03 15:58:29 +02:00
_progress "100" "New kernel online available. Asking for update..."
2023-08-03 15:56:23 +02:00
sleep 2
2023-08-01 21:22:23 +02:00
fi
2023-07-17 09:28:52 +02:00
}
_check
2023-07-20 08:58:10 +02:00
if [ [ ! -e "/var/cache/pacman/pkg/archboot.db" ] ] ; then
2023-08-25 12:19:47 +02:00
if ! ping -c1 www.google.com & >" ${ _NO_LOG } " ; then
2023-07-28 17:06:26 +02:00
_dialog --title " ERROR " --no-mouse --infobox "Your network is not working. Please reconfigure it." 3 60
2023-07-20 08:58:10 +02:00
sleep 5
_abort
fi
2023-07-19 07:48:29 +02:00
fi
2023-07-17 09:28:52 +02:00
while true; do
2023-07-20 08:55:10 +02:00
if [ [ -e "/var/cache/pacman/pkg/archboot.db" ] ] ; then
2023-08-03 16:02:14 +02:00
_dialog --title " Pacman Configuration " --no-mouse --infobox "Setting local mirror..." 3 40
2023-07-20 09:03:00 +02:00
_PACMAN_CONF = "/etc/pacman.conf"
2023-07-21 15:44:34 +02:00
cat << EOF > " ${ _PACMAN_CONF } "
[ options]
Architecture = auto
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
[ archboot]
Server = file:///var/cache/pacman/pkg
EOF
2023-07-20 09:06:43 +02:00
pacman -Sy >>" ${ _LOG } "
2023-07-22 07:14:16 +02:00
sleep 2
2023-07-20 08:55:10 +02:00
break
2023-08-01 21:46:44 +02:00
else
if [ [ " ${ _RUNNING_ARCH } " = = "x86_64" ] ] ; then
_enable_testing
fi
_select_mirror
2023-07-20 08:55:10 +02:00
fi
2023-08-31 14:51:51 +02:00
if _prepare_pacman | _dialog --title " Pacman Configuration " --no-mouse --gauge "Update Arch Linux keyring..." 6 70 0; then
2023-07-17 12:31:55 +02:00
break
else
2023-07-28 17:06:26 +02:00
_dialog --title " ERROR " --no-mouse --infobox "Please reconfigure pacman." 3 40
2023-08-01 20:53:53 +02:00
sleep 3
2023-07-17 12:31:55 +02:00
fi
2023-07-17 09:28:52 +02:00
done
2023-08-01 21:22:23 +02:00
if [ [ ! -e "/var/cache/pacman/pkg/archboot.db" ] ] && \
update | grep -q '\-latest' && \
[ [ " $( grep -w MemTotal /proc/meminfo | cut -d ':' -f2 | sed -e 's# ##g' -e 's#kB$##g' ) " -gt "2571000" ] ] && \
! [ [ " ${ _RUNNING_ARCH } " = = "riscv64" ] ] ; then
2023-08-31 14:39:08 +02:00
_update_environment | _dialog --title " Pacman Configuration " --no-mouse --gauge "Checking on new online kernel version..." 6 70 0
2023-08-03 15:53:56 +02:00
if [ [ -e /.new_kernel ] ] ; then
2023-08-03 15:56:23 +02:00
_dialog --title " New Kernel Available " --defaultno --yesno " Do you want to update the Archboot Environment to $( cat /.new_kernel) ?\n\nATTENTION:\nThis will reboot the system using kexec! " 9 60 && _UPDATE_ENVIRONMENT = 1
2023-08-03 15:53:56 +02:00
if [ [ -n " ${ _UPDATE_ENVIRONMENT } " ] ] ; then
_run_update_environment
fi
2023-09-20 20:08:59 +02:00
_dialog --title " Success " --no-mouse --infobox "Pacman configuration completed successfully." 3 60
2023-08-03 16:04:32 +02:00
sleep 2
2023-08-03 15:53:56 +02:00
rm /.new_kernel
2023-08-03 15:42:29 +02:00
fi
2023-08-01 21:22:23 +02:00
_cleanup
2023-07-20 08:55:10 +02:00
fi
2023-09-20 20:08:59 +02:00
_dialog --title " Success " --no-mouse --infobox "Pacman configuration completed successfully." 3 60
2023-07-22 07:14:16 +02:00
sleep 2
2023-07-17 09:28:52 +02:00
_cleanup
# vim: set ft=sh ts=4 sw=4 et: