#!/bin/bash
#
# Copyright 1993, 1994, 1999  Patrick Volkerding, Moorhead, Minnesota USA
# Copyright 2001, 2003, 2004  Slackware Linux, Inc., Concord, CA
# Copyright 2006, 2007, 2018, 2021, 2022, 2023  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
#
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
## FLOPPY? Comment out this obsolete code. We ain't gonna need it.
## Use /tmp on floppy for now:
#/usr/lib/setup/unmigrate.sh
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/lib/setup"
export PATH;
export COLOR=on

# 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
 probe -l 2> /dev/null | grep -E 'Linux$' | sort | uniq 1> $TMP/SeTplist 2> /dev/null
fi
T_PX="/mnt"
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 /var/log/mount/dev 2> /dev/null
 umount /var/log/mount/proc 2> /dev/null
 umount /var/log/mount/sys 2> /dev/null
 # Unmount target partition:
 umount /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

while [ 0 ]; do

 dialog --title "Absolute Linux Setup (version 15.1)" \
--menu \
"\nWelcome to Absolute Linux Setup.\n\
Select your choices below using the UP/DOWN keys,\nand SPACE or ENTER.\n\
SPACEBAR will toggle later choices ON or OFF.\n\
************************** WARNING ***************************\n\
This install will PARTITION and FORMAT your entire hard drive" 16 69 2 \
"AUTOSETUP" "Auto partition and install with few options" \
"EXIT" "Exit Absolute 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" = "AUTOSETUP" ]; then
  rm -f $TMP/isAuto
  . autoinstall 2>/dev/null
 fi

 if [ "$MAINSELECT" = "INSTALL" ]; then
  SERIES="#A##AP##D##K##L##N##TCL##X##XAP##Y#"
  SOURCE_DEVICE="`cat $TMP/SeTsource`"
  IGNORE_TAGFILES="-ignore_tagfiles"
  echo "terse" > $TMP/SeTpmode
  MODE="terse"
  dialog --infobox "Absolute will now install all packages.\n\n Hang on..." 7 68
  
  #Back to original script   ####################################################

  export MAKETAG;
  sleep 1
  # On a new system, make /etc/mtab a symlink to /proc/mounts:
  if [ ! -r $T_PX/etc/mtab ]; then
    mkdir -p $T_PX/etc
    ( cd $T_PX/etc ; ln -sf /proc/mounts mtab )
  fi
  
  # Do the package install:
  slackinstall --device noremount --promptmode $MODE --srcpath `cat $TMP/SeTDS` --mountpoint /var/log/mount --target $T_PX --series $SERIES

  # Run ldconfig on the newly installed system:
  if [ -x $T_PX/sbin/ldconfig ]; then
    $T_PX/sbin/ldconfig -r $T_PX
  fi
  if [ $MODE = terse ]; then
    # Let's pause a moment and then restore the terminal settings
    sleep 1
    setterm -background black -foreground white -blank 0
  fi
  MAINSELECT="CONFIGURE"
 fi

 if [ "$MAINSELECT" = "CONFIGURE" ]; then
  # Make bind mounts for /dev, /proc, and /sys:
  mount -o bind /dev $T_PX/dev 2> /dev/null
  mount -o bind /proc $T_PX/proc 2> /dev/null
  mount -o bind /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" "nosuid,nodev,noexec" "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
  fi
 fi

 if [ "$MAINSELECT" = "EXIT" ]; then
  break
 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 /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 "Absolute Linux Setup is complete" "$@" \
     --msgbox "\nPlease remove the installation disc.\n" 7 40
  fi

  # Prompt the user to unplug the USB stick containing the Absolute
  # media:
  mountpoint -q /usb-stick && {
    # Try to umount the USB stick, but ignore any errors (errors would typically be
    # occur if the user has a shell open within the USB stick's mount point), since
    # we'll be shutting down soon anyway.
    sync
    umount /usb-stick > /dev/null 2>&1
    dialog \
      --title "Unplug Absolute Installation Media USB Stick" \
      --msgbox \
        "\nYou may now physically unplug the Absolute Installation Media USB stick from the USB port.\n" 8 60
  }

  # Prompt the user to unplug the bootable USB stick containing
  # A-i-O (All in One Offline) partition.
  mountpoint -q /slack-all-in-one && {
    # Try to umount the A-i-O partition, but ignore any errors (errors would typically be
    # occur if the user has a shell open within the USB stick's mount point), since
    # we'll be shutting down soon anyway.
    sync
    umount /slack-all-in-one > /dev/null 2>&1
    # Don't suggest disconnection if it's on ARM, because the A-i-O partition
    # is on the same SD card that is converted from being the Installer to the
    # OS's /boot partition.
    [[ ! "$( uname -m )" =~ a(rm*|arch64) ]] && {
       dialog \
          --title "Unplug Absolute Installation USB Stick" \
          --msgbox \
            "\nYou may now physically unplug the Absolute Installation USB stick from the USB port.\n" 8 60 ;}
  }

  # Offer to reboot or drop to shell or power off.
  exec 3>&1
  installerexittype=$( dialog \
     --clear \
     --title "Absolute Linux Setup is complete" "$@" \
     --default-item Reboot "$@" \
     --menu "Absolute Linux setup is complete.
             \n\nYou may now reboot your machine into the Absolute OS.\n
             \nIf you have some post-installation tweaks you'd like to make manually, you can open a shell.\n
             \
             \nIf you want to make some changes to the hardware before booting the
               Absolute OS, you may wish to power off computer.\n" \
             17 80 3 \
	     Shell	 "" \
	     Reboot	 "" \
	     "Power Off" "" \
   2>&1 1>&3 )
   retval=$?
   exec 3>&-
fi

# Fix the date:
/sbin/fixdate

# Final cleanup
rm -f $TMP/tagfile $TMP/SeT* $TMP/tar-error $TMP/PKGTOOL_REMOVED
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
sync

# Handle installer exit types:
case "$installerexittype" in
   "Reboot")
       clear
       printf "\n** Starting reboot **\n\n"
       sleep 1.5
       reboot ;;
   "Power Off")
       clear
       printf "\n** Powering off **\n\n"
       sleep 1.5
       poweroff ;;
   "Shell")
       # Note: the shell the user receives at this point is the parent from which
       # they entered this 'setup' script.  This is why we don't explictly open a shell here.
       clear
       printf "\nYou may now reboot your system once you are ready.\n"
       printf "You can issue the 'reboot' command; or if your system has\n"
       printf "a keyboard attached, you can use the key combination: control+alt+delete\n\n" ;;
esac

# End of Absolute setup script
