summaryrefslogtreecommitdiff
path: root/src/lib-archboot/setup-packages
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib-archboot/setup-packages')
-rw-r--r--src/lib-archboot/setup-packages364
1 files changed, 364 insertions, 0 deletions
diff --git a/src/lib-archboot/setup-packages b/src/lib-archboot/setup-packages
new file mode 100644
index 0000000..e13afec
--- /dev/null
+++ b/src/lib-archboot/setup-packages
@@ -0,0 +1,364 @@
+#!/bin/sh
+
+getsource() {
+ S_SRC=0
+ if [ "$MODE" = "cd" ]; then
+ DIALOG --menu "You can either install packages from an Arch Linux CD, or you can switch to another VC and manually mount the source media under /src. If you manually mount to /src, make sure the packages are available under /src/core-$(uname -m)/pkg.\n\n" \
+ 15 55 2 \
+ "CD" "Mount the CD-ROM and install from there" \
+ "SRC" "I have manually mounted the source media" 2>$ANSWER || return 1
+ case $(cat $ANSWER) in
+ "CD")
+ select_cdrom
+ ;;
+ "SRC")
+ ;;
+ esac
+ if [ ! -d /src/core-$(uname -m)/pkg ]; then
+ DIALOG --msgbox "Package directory /src/core-$(uname -m)/pkg is missing!" 0 0
+ return 1
+ fi
+ fi
+
+ if [ "$MODE" = "ftp" ]; then
+ select_mirror
+ fi
+ S_SRC=1
+}
+
+# select_mirror()
+# Prompt user for preferred mirror and set $SYNC_URL
+#
+# args: none
+# returns: nothing
+select_mirror() {
+ DIALOG --msgbox "Keep in mind ftp.archlinux.org is throttled.\nPlease select another mirror to get full download speed." 18 70
+ # FIXME: this regex doesn't honor commenting
+ MIRRORS=$(egrep -o '((ftp)|(http))://[^/]*' "${MIRRORLIST}" | sed 's|$| _|g')
+ DIALOG --menu "Select an FTP/HTTP mirror" 14 55 7 \
+ $MIRRORS \
+ "Custom" "_" 2>$ANSWER || return 1
+ local _server=$(cat $ANSWER)
+ if [ "${_server}" = "Custom" ]; then
+ DIALOG --inputbox "Enter the full URL to core repo." 8 65 \
+ "ftp://ftp.archlinux.org/core/os/i686" 2>$ANSWER || return 1
+ SYNC_URL=$(cat $ANSWER)
+ else
+ SYNC_URL=$(egrep -o "${_server}.*" "${MIRRORLIST}" | sed 's/\$repo/core/g')
+ fi
+}
+
+prepare_pacman() {
+ cd /tmp
+ if [ "$MODE" = "cd" ]; then
+ local serverurl="${FILE_URL}"
+ elif [ "$MODE" = "ftp" ]; then
+ local serverurl="${SYNC_URL}"
+ fi
+ # Setup a pacman.conf in /tmp
+ cat << EOF > /tmp/pacman.conf
+[options]
+CacheDir = ${DESTDIR}/var/cache/pacman/pkg
+CacheDir = /src/core-$(uname -m)/pkg
+
+[core]
+Server = ${serverurl}
+EOF
+
+ # Set up the necessary directories for pacman use
+ [ ! -d "${DESTDIR}/var/cache/pacman/pkg" ] && mkdir -m 755 -p "${DESTDIR}/var/cache/pacman/pkg"
+ [ ! -d "${DESTDIR}/var/lib/pacman" ] && mkdir -m 755 -p "${DESTDIR}/var/lib/pacman"
+
+ DIALOG --infobox "Refreshing package database..." 6 45
+ # FIXME: if sync fails. this function needs to fail.
+ $PACMAN -Sy >$LOG 2>&1
+}
+
+selectpkg() {
+ if ! [ "$S_SRC" = "1" ]; then
+ DIALOG --msgbox "Error:\nYou must select Source first." 0 0
+ return 1
+ fi
+ # Archboot setup CD Mode uses packages.txt!
+ if [ "$MODE" = "cd" ]; then
+ DIALOG --msgbox "Package selection is split into two stages. First you will select package categories that contain packages you may be interested in. Then you will be presented with a full list of packages in your selected categories, allowing you to fine-tune your selection.\n\nNOTE: It is recommended that you install the BASE category from this setup, SUPPORT contains additional useful packages for networking and filesystems, DEVEL contains software building tools." 18 70
+ # set up our install location if necessary and sync up
+ # so we can get package lists
+ prepare_pacman
+ PKGS="/src/core-$(uname -m)/pkg/packages.txt"
+ if ! [ -f /tmp/.pkgcategory ]; then
+ CHKLIST="base ^ ON"
+ for category in $(cat $PKGS | sed 's|/.*$||g' | uniq | grep -v base | grep -v kernels); do
+ CHKLIST="$CHKLIST $category - OFF"
+ done
+ else
+ CHKLIST=
+ for i in $(cat /tmp/.pkgcategory | sed 's|\"||g'); do
+ CHKLIST="$CHKLIST $i ^ ON"
+ done
+ for category in $(cat $PKGS | sed 's|/.*$||g' | uniq | grep -v kernels); do
+ grep $category /tmp/.pkgcategory > /dev/null 2>&1 || CHKLIST="$CHKLIST $category - OFF"
+ done
+ fi
+ DIALOG --checklist "Select Package Categories" 19 55 12 $CHKLIST 2>/tmp/.pkgcategory || return 1
+ SELECTALL="no"
+ DIALOG --yesno "Select all packages by default?" 0 0 && SELECTALL="yes"
+ CHKLIST=
+ for category in $(cat /tmp/.pkgcategory | sed 's|"||g'); do
+ if [ "$category" = "x11-drivers" ]; then
+ DIALOG --msgbox "NOTE:\n-------\nxf86-video-via and xf86-video-unichrome are disabled by default, please select the correct package you need and don't choose both! Else installation will fail!" 0 0
+ fi
+ tag="OFF"
+ if [ "$SELECTALL" = "yes" ]; then
+ tag="ON"
+ fi
+ list=$(cat $PKGS | grep "$category/" | grep -v 'xf86-video-unichrome' | grep -v 'xf86-video-via' | sed 's|^[a-z0-9-]*/||g' | sed "s|.pkg.tar.gz$| ($category) $tag|g" | sort)
+ CHKLIST="$CHKLIST $list"
+ tag="OFF"
+ list=$(cat $PKGS | grep "$category/" | grep 'xf86-video-unichrome' | sed 's|^[a-z0-9-]*/||g' | sed "s|.pkg.tar.gz$| ($category) $tag|g" | sort)
+ CHKLIST="$CHKLIST $list"
+ list=$(cat $PKGS | grep "$category/" | grep 'xf86-video-via' | sed 's|^[a-z0-9-]*/||g' | sed "s|.pkg.tar.gz$| ($category) $tag|g" | sort)
+ CHKLIST="$CHKLIST $list"
+ done
+ DIALOG --checklist "Select Packages to install. Use SPACE to select." 19 60 12 $CHKLIST 2>/tmp/.pkglist || return 1
+ fi
+ # Use default ftp install routine from arch livecd
+ if [ "$MODE" = "ftp" ]; then
+ DIALOG --msgbox "Package selection is split into two stages. First you will select package categories that contain packages you may be interested in. Then you will be presented with a full list of packages with your categories already selected, allowing you to fine-tune.\n\nNOTE: The BASE category is always installed, and its packages will not appear in this menu." 18 70
+ # set up our install location if necessary and sync up
+ # so we can get package lists
+ prepare_pacman
+ # category selection hasn't been done before
+ if ! [ -f /tmp/.pkgcategory ]; then
+ CATLIST=""
+ for i in $($PACMAN -Sg | sed "s/^base$/ /g"); do
+ CATLIST="${CATLIST} ${i} - OFF"
+ done
+ else
+ # category selection was already run at least once
+ CATLIST=""
+ for i in $(cat /tmp/.pkgcategory | sed 's|\"||g'); do
+ CATLIST="$CATLIST $i ^ ON"
+ done
+ for i in $($PACMAN -Sg | sed "s/^base$/ /g"); do
+ grep $i /tmp/.pkgcategory > /dev/null 2>&1 || CATLIST="$CATLIST $i - OFF"
+ done
+ fi
+ DIALOG --checklist "Select Package Categories" 19 55 12 $CATLIST 2>/tmp/.pkgcategory || return 1
+
+ # mash up the package lists
+ COREPKGS=$($PACMAN -Sl core | cut -d' ' -f2)
+
+ # remove base packages from the selectable list
+ for i in $($PACMAN -Sg base | tail +2); do
+ COREPKGS=$(echo ${COREPKGS} | sed "s/\(^${i} \| ${i} \| ${i}$\)/ /g")
+ done
+ # assemble a list of pre-selected packages
+ for i in $(cat /tmp/.pkgcategory | sed 's|"||g'); do
+ CATPKGS="$CATPKGS $($PACMAN -Sg ${i} | tail +2)"
+ done
+ # put together the menu list
+ PKGLIST=""
+ for i in ${COREPKGS}; do
+ # if the package was preselected, check it
+ if [ -n "$(echo $CATPKGS | grep "\(^${i} \| ${i} \| ${i}$\)")" ]; then
+ PKGLIST="$PKGLIST ${i} ^ ON"
+ else
+ PKGLIST="$PKGLIST ${i} - OFF"
+ fi
+ done
+ DIALOG --checklist "Select Packages To Install." 19 60 12 $PKGLIST 2>/tmp/.pkglist || return 1
+ fi
+ S_SELECT=1
+}
+
+doinstall()
+{
+ # begin install
+ rm -f /tmp/pacman.log
+ # all pacman output goes to /tmp/pacman.log, which we tail into a dialog
+ ( \
+ echo "Installing Packages..." >/tmp/pacman.log ; echo >>/tmp/pacman.log ; \
+ touch /tmp/setup-pacman-running ; \
+ $PACMAN -S $(echo $* | sed 's|"||g') >>/tmp/pacman.log 2>&1 ; \
+ echo $? >/tmp/.pacman.retcode; \
+ echo >>/tmp/pacman.log; \
+
+ if [ "$(cat /tmp/.pacman.retcode)" -gt 0 ]; then
+ echo "Package Installation FAILED." >>/tmp/pacman.log
+ else
+ echo "Package Installation Complete." >>/tmp/pacman.log
+ fi
+ rm /tmp/setup-pacman-running
+ ) &
+
+ sleep 2
+ dialog --backtitle "$TITLE" --title " Installing... Please Wait " \
+ --no-kill --tailboxbg "/tmp/pacman.log" 18 70 2>/tmp/.pid
+ while [ -f /tmp/setup-pacman-running ]; do
+ sleep 1
+ done
+ kill $(cat /tmp/.pid)
+ if [ "$(cat /tmp/.pacman.retcode)" -gt 0 ]; then
+ result="Installation Failed (see errors below)"
+ retcode=1
+ else
+ result="Installation Complete"
+ retcode=0
+ fi
+ # disabled for now
+ #dialog --backtitle "$TITLE" --title " $result " \
+ # --exit-label "Continue" --textbox "/tmp/pacman.log" 18 70
+ # fix the stair-stepping that --tailboxbg leaves us with
+ stty onlcr
+
+ rm -f /tmp/.pacman.retcode
+ return $retcode
+}
+
+installpkg() {
+ if ! [ "$S_SRC" = "1" ]; then
+ DIALOG --msgbox "Error:\nYou must select Source first." 0 0
+ return 1
+ fi
+ if [ "$MODE" = "cd" ]; then
+ if [ ! -f /tmp/.pkglist -o "$S_SELECT" != "1" ]; then
+ DIALOG --msgbox "You must select packages first." 0 0
+ return 1
+ fi
+ fi
+ if [ "$S_MKFS" != "1" -a "$S_MKFSAUTO" != "1" ]; then
+ getdest
+ fi
+
+ DIALOG --msgbox "Package installation will begin now. You can watch the output in the progress window. Please be patient." 0 0
+ if [ "$MODE" = "cd" ]; then
+ LIST=
+ # fix pacman list!
+ sed -i -e 's/-i686//g' -e 's/-x86_64//g' /tmp/.pkglist
+ for pkg in $(cat /tmp/.pkglist); do
+ pkgname=${pkg%-*-*}
+ LIST="$LIST $pkgname"
+ done
+ fi
+ if [ "$MODE" = "ftp" ]; then
+ LIST="base" # always install base
+ for pkg in $(cat /tmp/.pkglist); do
+ LIST="$LIST $pkg"
+ done
+ fi
+ # for a CD install, we don't need to download packages first
+ if [ "$MODE" = "ftp" ]; then
+ DIALOG --infobox "Downloading packages. See $LOG for output." 6 55
+ $PACMAN -Sw $(echo $LIST | sed 's|"||g') >$LOG 2>&1
+ if [ $? -gt 0 ]; then
+ DIALOG --msgbox "One or more packages failed to download. You can try again by re-selecting Install Packages from the main menu." 12 65
+ return 1
+ fi
+ fi
+ # mount proc/sysfs first, so initcpio can use auto-detection if it wants
+ ! [ -d $DESTDIR/proc ] && mkdir $DESTDIR/proc
+ ! [ -d $DESTDIR/sys ] && mkdir $DESTDIR/sys
+ ! [ -d $DESTDIR/dev ] && mkdir $DESTDIR/dev
+ mount -t proc none $DESTDIR/proc
+ mount -t sysfs none $DESTDIR/sys
+ mount -o bind /dev $DESTDIR/dev
+ doinstall $LIST
+ if [ $? -gt 0 ]; then
+ DIALOG --msgbox "One or more packages failed to install. You can try again by re-selecting Install Packages from the main menu." 12 65
+ return 1
+ fi
+ dialog --backtitle "$TITLE" --title " $result " \
+ --exit-label "Continue" --textbox "/tmp/pacman.log" 18 70
+ if [ $? -gt 0 ]; then
+ return 1
+ fi
+ S_INSTALL=1
+ # add archboot addons if activated
+ if [ -d /tmp/packages ]; then
+ DO_ADDON=""
+ DIALOG --yesno "Would you like to install your addons packages to installed system?" 0 0 && DO_ADDON="yes"
+ if [ "$DO_ADDON" = "yes" ] ; then
+ DIALOG --infobox "Installing the addons packages..." 0 0
+ $PACMAN -U /tmp/packages/*
+ fi
+ fi
+ umount $DESTDIR/proc $DESTDIR/sys $DESTDIR/dev
+ sync
+ # Modify fstab
+ if [ "$S_MKFS" = "1" -o "$S_MKFSAUTO" = "1" ]; then
+ if [ -f /tmp/.fstab ]; then
+ # clean fstab first from /dev entries
+ sed -i -e '/^\/dev/d' $DESTDIR/etc/fstab
+ # clean /media from old floppy,cd,dvd entries
+ rm -r $DESTDIR/media/cd*
+ rm -r $DESTDIR/media/dvd*
+ rm -r $DESTDIR/media/fl*
+ # add floppy,cd and dvd entries first
+ for i in $(ls -d /dev/cdro* | grep -v "0"); do
+ k=$(echo $i | sed -e 's|/dev/||g')
+ echo "$i /media/$k auto ro,user,noauto,unhide 0 0" >>$DESTDIR/etc/fstab
+ # create dirs in /media
+ mkdir -p $DESTDIR/media/$k
+ done
+ for i in $(ls -d /dev/dvd* | grep -v "0"); do
+ k=$(echo $i | sed -e 's|/dev/||g')
+ echo "$i /media/$k auto ro,user,noauto,unhide 0 0" >>$DESTDIR/etc/fstab
+ # create dirs in /media
+ mkdir -p $DESTDIR/media/$k
+ done
+ for i in $(ls -d /dev/fd[0-9] | grep -v "[0-9][0-9][0-9]"); do
+ k=$(echo $i | sed -e 's|/dev/||g')
+ echo "$i /media/$k auto user,noauto 0 0" >>$DESTDIR/etc/fstab
+ # create dirs in /media
+ mkdir -p $DESTDIR/media/$k
+ done
+ sort /tmp/.fstab >>$DESTDIR/etc/fstab
+ fi
+ fi
+}
+
+select_source()
+{
+ if ! [ $(which $DLPROG) ]; then
+ DIALOG --menu "Please select an installation source" 10 35 3 \
+ "1" "CD-ROM or OTHER SOURCE" 2>$ANSWER || return 1
+ else
+ DIALOG --menu "Please select an installation source" 10 35 3 \
+ "1" "CD-ROM or OTHER SOURCE" \
+ "2" "FTP/HTTP" 2>$ANSWER || return 1
+ fi
+
+ case $(cat $ANSWER) in
+ "1")
+ MODE="cd"
+ ;;
+ "2")
+ MODE="ftp"
+ ;;
+ esac
+
+ if [ "$MODE" = "cd" ]; then
+ TITLE="Arch Linux CDROM or OTHER SOURCE Installation"
+ getsource
+ else
+ TITLE="Arch Linux FTP/HTTP Installation"
+ DIALOG --msgbox "If you wish to load your ethernet modules manually, please do so now (consoles 1 thru 6 are active)." 12 65
+ while $(/bin/true); do
+ DIALOG --menu "FTP Installation" 10 35 3 \
+ "0" "Setup Network" \
+ "1" "Choose Mirror" \
+ "2" "Return to Main Menu" 2>$ANSWER
+
+ case "$(cat $ANSWER)" in
+ "0")
+ donetwork ;;
+ "1")
+ getsource ;;
+ *)
+ break ;;
+ esac
+ done
+ fi
+}
+