#!/bin/sh
#
# Copyright 1993,1994,1999 Patrick Volkerding, Moorhead, Minnesota USA
# Copyright 2001, 2003, 2004 Slackware Linux, Inc., Concord, CA
# Copyright 2006, 2007 Patrick Volkerding, Sebeka, Minnesota USA
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# As always, bug reports, suggestions, etc: volkerdi@slackware.com
#
# Modifications 2016, 2017, 2019, 2020 by Eric Hameleers <alien@slackware.com>
#
# -------------------------------------------- #
# Slackware Live Edition - check the media #
# -------------------------------------------- #
# The Slackware setup depends on english language settings because it
# parses program output like that of "fdisk -l". So, we need to override
# the Live user's local language settings here:
export LANG=C
export LC_ALL=C
# The script defaults to curses dialog but Xdialog is a good alternative:
DIALOG=${DIALOG:-"dialog"}
# Script needs to be run as root:
if [ ${EUID} -ne 0 ]; then
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--title "NOT ROOT" --msgbox "\
\n\
You must be root to run this program!" 7 68
exit 1
fi
# The terminal window needs to be sufficiently large for cgdisk to fit:
if [ $(tput cols) -lt 80 ] || [ $(tput lines) -lt 24 ]; then
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--title "TERMINAL TOO SMALL" --msgbox "\
\n\
Before you continue, re-size your terminal\nso it measures at least 80 x 24 characters.\n\
Otherwise you will not be able to use disk partition tools." 11 68
fi
if [ ! -d /mnt/livemedia/@LIVEMAIN@/system ]; then
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--title "LIVE MEDIA NOT ACCESSIBLE" --msgbox "\
\n\
Before you can install software, complete the following tasks:\n\
\n\
1. Mount your Live media partition on /mnt/livemedia." 16 68
exit 1
fi
# ------------------------------------------------ #
# Slackware Live Edition - end check the media #
# ------------------------------------------------ #
TMP=/var/log/setup/tmp
if [ ! -d $TMP ]; then
mkdir -p $TMP
fi
# Wipe the probe md5sum to force rescanning partitions if setup is restarted:
rm -f $TMP/SeTpartition.md5
rm -f $TMP/SeT*
# If a keymap was set up, restore that data:
if [ -r $TMP/Pkeymap ]; then
cp $TMP/Pkeymap $TMP/SeTkeymap
fi
echo "on" > $TMP/SeTcolor # turn on color menus
PATH="$PATH:/usr/share/@LIVEMAIN@"
export PATH;
export COLOR=on
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" --infobox "\n
Scanning your system for partition information...\n
\n" 5 55
# In case the machine is full of fast SSDs:
sleep 1
# Before probing, activate any LVM partitions
# that may exist from before the boot:
vgchange -ay 1> /dev/null 2> /dev/null
if probe -l 2> /dev/null | grep -E 'Linux$' 1> /dev/null 2> /dev/null ; then
RUNPART=no
probe -l 2>/dev/null |grep -E 'Linux$' |sort |uniq 1>$TMP/SeTplist 2>/dev/null
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--title "LINUX PARTITIONS DETECTED" \
--yes-label "Continue" --no-label "Skip" --defaultno \
--yesno "Setup detected partitions on this machine of type Linux.\n\
You probably created these before running '$(basename $0)'. Great!\n\n\
If you would like to re-consider your partitioning scheme, \
you can click 'Continue' now to start 'cfdisk' (MBR disk) \
and/or 'cgdisk' (GPT disk) for all your hard drives.\n\
Otherwise, select 'Skip' to skip disk partitioning and go on with the setup." \
12 64
if [ $? -eq 0 ]; then
RUNPART=yes
fi
else
RUNPART=yes
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--title "NO LINUX PARTITIONS DETECTED" \
--msgbox "There don't seem to be any partitions on this machine of type \
Linux. You'll need to make at least one of these to install Linux. \
To do this, you'll get a chance to make these partitions now using \
'cfdisk' (MBR partitions) or 'cgdisk' (GPT partitions)." 10 64
fi
if [ -d /sys/firmware/efi ]; then
# First, let's make sure that efivarfs is active:
if [ "$(/bin/ls /sys/firmware/efi/efivars 2> /dev/null | wc -l)" = "0" ]; then
mount -t efivarfs none /sys/firmware/efi/efivars
fi
if ! probe -l 2> /dev/null | grep "EFI System Partition" 1> /dev/null 2> /dev/null ; then
RUNPART=yes
${DIALOG} --backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--title "NO EFI SYSTEM PARTITION DETECTED" \
--msgbox "This machine appears to be using EFI/UEFI, but no EFI System \
Partition was found. You'll need to make an EFI System Partition in order \
to boot from the hard drive. In the next step, using cfdisk/cgdisk, \
make a 100MB partition of type EF00." 10 64
fi
fi
if [ "$RUNPART" = "yes" ]; then
# ------------------------------------------------------- #
# Slackware Live Edition - find/partition the disk(s) #
# ------------------------------------------------------- #
SeTudiskpart
if [ ! $? = 0 ]; then
# No disks found or user canceled, means: abort.
exit 1
fi
# ----------------------------------------------------------- #
# Slackware Live Edition - end find/partition the disk(s) #
# ----------------------------------------------------------- #
fi # End RUNPART = yes
T_PX="/setup2hd"
mkdir -p ${T_PX}
echo "$T_PX" > $TMP/SeTT_PX
ROOT_DEVICE="`mount | grep "on / " | cut -f 1 -d ' '`"
echo "$ROOT_DEVICE" > $TMP/SeTrootdev
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then # clear source location:
# In case of bind mounts, try to unmount them first:
umount -R /var/log/mount/dev 2> /dev/null
umount -R /var/log/mount/proc 2> /dev/null
umount -R /var/log/mount/sys 2> /dev/null
# Unmount target partition:
umount -R /var/log/mount
fi
# Anything mounted on /var/log/mount now is a fatal error:
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then
echo "Can't umount /var/log/mount. Reboot machine and run setup again."
exit
fi
# If the mount table is corrupt, the above might not do it, so we will
# try to detect Linux and FAT32 partitions that have slipped by:
if [ -d /var/log/mount/lost+found -o -d /var/log/mount/recycled \
-o -r /var/log/mount/io.sys ]; then
echo "Mount table corrupt. Reboot machine and run setup again."
exit
fi
rm -f /var/log/mount 2> /dev/null
rmdir /var/log/mount 2> /dev/null
mkdir /var/log/mount 2> /dev/null
MAINSELECT="ADDSWAP"
while [ 0 ]; do
${DIALOG} --title "@CDISTRO@ Linux Setup (version @SL_VERSION@)" \
--backtitle "@CDISTRO@ Linux Setup (Live Edition)" \
--default-item "$MAINSELECT" \
--menu "Welcome to @CDISTRO@ Linux Setup (Live Edition).\n\
Select an option below using the UP/DOWN keys and SPACE or ENTER.\n\
Alternate keys may also be used: '+', '-', and TAB." 14 72 5 \
"ADDSWAP" "Set up your swap partition(s)" \
"TARGET" "Set up your target partitions" \
"INSTALL" "Install @CDISTRO@ to disk" \
"CONFIGURE" "Reconfigure your Linux system" \
"EXIT" "Exit @CDISTRO@ Linux Setup" 2> $TMP/hdset
if [ ! $? = 0 ]; then
rm -f $TMP/hdset $TMP/SeT*
exit
fi
MAINSELECT="`cat $TMP/hdset`"
rm $TMP/hdset
# Start checking what to do. Some modules may reset MAINSELECT to run the
# next item in line.
if [ "$MAINSELECT" = "ADDSWAP" ]; then
SeTswap
if [ -r $TMP/SeTswap ]; then
MAINSELECT="TARGET"
elif [ -r $TMP/SeTswapskip ]; then
# Go ahead to TARGET without swap space:
MAINSELECT="TARGET"
fi
fi
if [ "$MAINSELECT" = "TARGET" ]; then
SeTpartitions
SeTEFI
SeTDOS
if [ -r $TMP/SeTnative ]; then
MAINSELECT="SOURCE"
fi
fi
if [ "$MAINSELECT" = "SOURCE" ]; then
SeTumedia
if [ -r $TMP/SeTsource ]; then
if [ -r $TMP/SeTlive ]; then
MAINSELECT="INSTALL"
else
MAINSELECT="SELECT"
fi
fi
fi
if [ "$MAINSELECT" = "SELECT" ]; then
if [ -r /var/log/mount/isolinux/setpkg ]; then
sh /var/log/mount/isolinux/setpkg
else
SeTPKG
fi
if [ -r $TMP/SeTSERIES ]; then
MAINSELECT="INSTALL"
fi
fi
if [ "$MAINSELECT" = "INSTALL" ]; then
if [ -r $TMP/SeTlive ]; then
source setup.liveslak
else
source setup.slackware
fi
fi
if [ "$MAINSELECT" = "CONFIGURE" ]; then
# Patch (e)liloconfig on the target systems to remove hardcoded /mnt:
if [ -f /sbin/liloconfig -a -f $T_PX/sbin/liloconfig ]; then
cat /sbin/liloconfig > $T_PX/sbin/liloconfig
fi
if [ -f /usr/sbin/eliloconfig -a -f $T_PX/usr/sbin/eliloconfig ]; then
cat /usr/sbin/eliloconfig > $T_PX/usr/sbin/eliloconfig
fi
# Make bind mounts for /dev, /proc, and /sys:
mount -o rbind /dev $T_PX/dev 2> /dev/null
mount -o rbind /proc $T_PX/proc 2> /dev/null
mount -o rbind /sys $T_PX/sys 2> /dev/null
SeTconfig
REPLACE_FSTAB=Y
if [ -r $TMP/SeTnative ]; then
if [ -r $T_PX/etc/fstab ]; then
${DIALOG} --title "REPLACE /etc/fstab?" --yesno "You already have an \
/etc/fstab on your install partition. If you were just adding software, \
you should probably keep your old /etc/fstab. If you've changed your \
partitioning scheme, you should use the new /etc/fstab. Do you want \
to replace your old /etc/fstab with the new one?" 10 58
if [ ! $? = 0 ]; then
REPLACE_FSTAB=N
fi
fi
if [ "$REPLACE_FSTAB" = "Y" ]; then
cat /dev/null > $T_PX/etc/fstab
if [ -r $TMP/SeTswap ]; then
cat $TMP/SeTswap > $T_PX/etc/fstab
fi
cat $TMP/SeTnative >> $T_PX/etc/fstab
if [ -r $TMP/SeTDOS ]; then
cat $TMP/SeTDOS >> $T_PX/etc/fstab
fi
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "#/dev/cdrom" "/mnt/cdrom" "auto" "noauto,owner,ro,comment=x-gvfs-show" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/fd0" "/mnt/floppy" "auto" "noauto,owner" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "devpts" "/dev/pts" "devpts" "gid=5,mode=620" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "proc" "/proc" "proc" "defaults" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "tmpfs" "/dev/shm" "tmpfs" "defaults" "0" "0" >> $T_PX/etc/fstab
fi
${DIALOG} --title "SETUP COMPLETE" --msgbox "System configuration \
and installation is complete. \
\n\nYou may now reboot your system." 7 55
MAINSELECT="DONE"
fi
fi
if [ "$MAINSELECT" = "EXIT" ]; then
break
fi
if [ "$MAINSELECT" = "DONE" ]; then
MAINSELECT="EXIT"
fi
done # end of main loop
sync
chmod 755 $T_PX
if [ -d $T_PX/tmp ]; then
chmod 1777 $T_PX/tmp
fi
if mount | grep /var/log/mntiso 1> /dev/null 2> /dev/null ; then
umount -f /var/log/mntiso
fi
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then
umount -R /var/log/mount
fi
# Anything mounted on /var/log/mount now is a fatal error:
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then
exit
fi
# If the mount table is corrupt, the above might not do it, so we will
# try to detect Linux and FAT32 partitions that have slipped by:
if [ -d /var/log/mount/lost+found -o -d /var/log/mount/recycled \
-o -r /var/log/mount/io.sys ]; then
exit
fi
rm -f /var/log/mount 2> /dev/null
rmdir /var/log/mount 2> /dev/null
mkdir /var/log/mount 2> /dev/null
chmod 755 /var/log/mount
# An fstab file is indicative of an OS installation, rather than
# just loading the "setup" script and selecting "EXIT"
if [ -f ${T_PX}/etc/fstab ]; then
# umount CD:
if [ -r $TMP/SeTCDdev ]; then
if mount | grep iso9660 > /dev/null 2> /dev/null ; then
umount `mount | grep iso9660 | cut -f 1 -d ' '`
fi
eject -s `cat $TMP/SeTCDdev`
# Tell the user to remove the disc, if one had previously been mounted
# (it should now be ejected):
${DIALOG} \
--clear \
--title "@CDISTRO@ Linux Setup is complete" "$@" \
--msgbox "\nPlease remove the installation disc.\n" 7 40
fi
# Sign off to the user:
${DIALOG} \
--clear \
--title "@CDISTRO@ Linux Setup is complete" "$@" \
--msgbox "\nInstallation is complete.\n\n
You can reboot your system whenever you like,\n
but don't forget to remove this Live medium first.\n" 11 50
fi
# Fix the date:
fixdate
# final cleanup
rm -f $TMP/tagfile $TMP/temp* $TMP/tmp* $TMP/SeT* $TMP/tar-error $TMP/unsquash_output $TMP/unsquash_error $TMP/PKGTOOL_REMOVED $TMP/LILO* $TMP/avail*
rm -f /var/log/mount/treecache
rmdir /var/log/mntiso 2>/dev/null
rm -rf $TMP/treecache
rm -rf $TMP/pkgcache
rmdir ${T_PX}/tmp/orbit-root 2> /dev/null
# If the OS had been installed and the user elected to reboot:
if [ -f /reboot ]; then
clear
echo "** Starting reboot **"
sleep 1
reboot
fi
# end slackware setup script