2023-07-17 09:28:52 +02:00
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
. /usr/lib/archboot/basic-common.sh
_TITLE = " Archboot ${ _RUNNING_ARCH } | Basic Setup | Pacman Configuration "
_select_mirror( ) {
## Download updated mirrorlist, if possible (only on x86_64)
if [ [ " ${ _RUNNING_ARCH } " = = "x86_64" ] ] ; then
_dialog --infobox "Downloading latest mirrorlist..." 3 40
${ _DLPROG } "https://www.archlinux.org/mirrorlist/?country=all&protocol=http&protocol=https&ip_version=4&ip_version=6&use_mirror_status=on" -O /tmp/pacman_mirrorlist.txt
if grep -q '#Server = http:' /tmp/pacman_mirrorlist.txt; then
mv " ${ _MIRRORLIST } " " ${ _MIRRORLIST } .bak "
cp /tmp/pacman_mirrorlist.txt " ${ _MIRRORLIST } "
fi
fi
# FIXME: this regex doesn't honor commenting
_MIRRORS = $( grep -E -o '((http)|(https))://[^/]*' " ${ _MIRRORLIST } " | sed 's|$| _|g' )
#shellcheck disable=SC2086
2023-07-19 07:48:29 +02:00
_dialog --cancel-label "Exit" --title " Package Mirror " --menu "" 13 55 7 \
2023-07-19 07:54:45 +02:00
"Custom" "_" ${ _MIRRORS } 2>${ _ANSWER } || _abort
2023-07-17 09:28:52 +02:00
#shellcheck disable=SC2155
local _SERVER = $( cat " ${ _ANSWER } " )
if [ [ " ${ _SERVER } " = = "Custom" ] ] ; then
_dialog --inputbox "Enter the full URL to repositories." 8 65 \
"" 2>" ${ _ANSWER } " || return 1
_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.
_SYNC_URL = $( grep -E -o " ${ _SERVER } .* " " ${ _MIRRORLIST } " | head -n1)
fi
echo " Using mirror: ${ _SYNC_URL } " >" ${ _LOG } "
#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:09:30 +02:00
_dialog --title " [core-testing] And [extra-testing] " --defaultno --yesno "Do you want to enable [*-testing] repositories?\n\nOnly enable this if you need latest\navailable packages for testing purposes!" 9 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
fi
}
2023-07-17 12:06:01 +02:00
_prepare_pacman( ) {
_dialog --infobox "Waiting for Arch Linux keyring initialization..." 3 40
# 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
2023-07-17 12:19:24 +02:00
_dialog --infobox "Update Arch Linux keyring..." 3 50
2023-07-17 12:06:01 +02:00
_KEYRING = "archlinux-keyring"
[ [ " ${ _RUNNING_ARCH } " = = "aarch64" ] ] && _KEYRING = " ${ _KEYRING } archlinuxarm-keyring "
#shellcheck disable=SC2086
if ! pacman -Sy --noconfirm --noprogressbar ${ _KEYRING } & >" ${ _LOG } " ; then
_dialog --title " ERROR " --infobox " Keyring update failed! Check ${ _LOG } for errors. " 3 60
sleep 5
return 1
fi
}
2023-07-17 09:28:52 +02:00
_update_environment( ) {
2023-07-17 10:52:11 +02:00
_UPDATE_ENVIRONMENT = ""
_LOCAL_KERNEL = ""
_ONLINE_KERNEL = ""
if update | grep -q '\-latest' ; then
2023-07-17 09:28:52 +02:00
if [ [ " $( grep -w MemTotal /proc/meminfo | cut -d ':' -f2 | sed -e 's# ##g' -e 's#kB$##g' ) " -gt "2571000" ] ] ; then
if ! [ [ " ${ _RUNNING_ARCH } " = = "riscv64" ] ] ; then
2023-07-17 12:18:13 +02:00
_dialog --infobox "Refreshing package database..." 3 50
2023-07-17 09:28:52 +02:00
pacman -Sy & >" ${ _LOG } "
sleep 1
2023-07-17 12:16:46 +02:00
_dialog --infobox "Checking on new online kernel version..." 3 50
2023-07-17 09:28:52 +02:00
#shellcheck disable=SC2086
_LOCAL_KERNEL = " $( pacman -Qi ${ _KERNELPKG } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
if [ [ " ${ _RUNNING_ARCH } " = = "aarch64" ] ] ; then
#shellcheck disable=SC2086
2023-07-17 10:52:11 +02:00
_ ONLINE_KERNEL = " $( pacman -Si ${ _KERNELPKG } -${ _RUNNING_ARCH } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
2023-07-17 09:28:52 +02:00
else
if [ [ -n " ${ _DOTESTING } " ] ] ; then
#shellcheck disable=SC2086
_ONLINE_KERNEL = " $( pacman -Si core-testing/${ _KERNELPKG } 2>${ _NO_LOG } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
fi
if [ [ -z " ${ _ONLINE_KERNEL } " ] ] ; then
#shellcheck disable=SC2086
_ONLINE_KERNEL = " $( pacman -Si ${ _KERNELPKG } | grep Version | cut -d ':' -f2 | sed -e 's# ##' ) "
fi
fi
echo " ${ _LOCAL_KERNEL } local kernel version and ${ _ONLINE_KERNEL } online kernel version. " >" ${ _LOG } "
sleep 2
if [ [ " ${ _LOCAL_KERNEL } " = = " ${ _ONLINE_KERNEL } " ] ] ; then
2023-07-17 12:18:13 +02:00
_dialog --infobox "No new kernel online available. Skipping update environment." 3 70
2023-07-17 09:28:52 +02:00
sleep 3
else
2023-07-17 12:21:52 +02:00
_dialog --title " New Kernel Available " --defaultno --yesno " Do you want to update the Archboot Environment to ${ _ONLINE_KERNEL } ?\n\nATTENTION:\nThis will reboot the system using kexec! " 9 60 && _UPDATE_ENVIRONMENT = 1
2023-07-17 09:28:52 +02:00
if [ [ -n " ${ _UPDATE_ENVIRONMENT } " ] ] ; then
2023-07-18 07:32:48 +02:00
_run_update_environment
2023-07-17 09:28:52 +02:00
fi
fi
fi
fi
fi
}
_check
2023-07-20 08:58:10 +02:00
if [ [ ! -e "/var/cache/pacman/pkg/archboot.db" ] ] ; then
if ! ping -c1 www.google.com & >/dev/null; then
_dialog --title " ERROR " --infobox "Your network is not working. Please reconfigure it." 3 60
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-07-20 09:10:36 +02:00
_dialog --infobox "Setting local mirror..." 3 40
2023-07-20 09:03:00 +02:00
_PACMAN_CONF = "/etc/pacman.conf"
2023-07-20 09:00:48 +02:00
echo "[options]" > " ${ _PACMAN_CONF } "
2023-07-20 08:55:10 +02:00
echo "Architecture = auto" >> " ${ _PACMAN_CONF } "
echo "SigLevel = Required DatabaseOptional" >> " ${ _PACMAN_CONF } "
echo "LocalFileSigLevel = Optional" >> " ${ _PACMAN_CONF } "
echo "[archboot]" >> " ${ _PACMAN_CONF } "
echo "Server = file:///var/cache/pacman/pkg" >> " ${ _PACMAN_CONF } "
2023-07-20 09:06:43 +02:00
pacman -Sy >>" ${ _LOG } "
2023-07-20 09:10:36 +02:00
sleep 3
2023-07-20 08:55:10 +02:00
break
fi
2023-07-17 10:52:11 +02:00
_enable_testing
2023-07-19 07:48:29 +02:00
_select_mirror || exit 1
2023-07-17 12:31:55 +02:00
if _prepare_pacman; then
break
else
2023-07-17 12:35:45 +02:00
_dialog --title " ERROR " --infobox "Please reconfigure pacman." 3 40
2023-07-17 12:31:55 +02:00
sleep 5
fi
2023-07-17 09:28:52 +02:00
done
2023-07-20 08:55:10 +02:00
if [ [ ! -e "/var/cache/pacman/pkg/archboot.db" ] ] ; then
_update_environment
fi
2023-07-17 12:35:45 +02:00
_dialog --infobox "Pacman configuration completed successfully." 3 60
2023-07-17 12:31:55 +02:00
sleep 3
2023-07-17 09:28:52 +02:00
_cleanup
# vim: set ft=sh ts=4 sw=4 et: