#!/bin/sh
# This script has been written from scratch and dedicated to the public
# domain by its author: Didier Spaier, 5 place Violet 75015 Paris.
# Anyone is free to copy, modify, publish, use, sell, or distribute it
# for any purpose, commercial or non-commercial, and by any means.
#
# In jurisdictions that recognize copyright laws, the author or authors
# of this software dedicate any and all copyright interest in the
# software to the public domain. We make this dedication for the benefit
# of the public at large and to the detriment of our heirs and
# successors. We intend this dedication to be an overt act of
# relinquishment in perpetuity of all present and future rights to this
# software under copyright law.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
#
# For more information, please refer to
export TEXTDOMAIN=auto
. gettext.sh
SLINTREPO=http://slackware.uk/slint/x86_64/slint-15.0
# Directory /patches of a Slackware repository
PATCHESREPO=http://slackware.uk/slackware/slackware64-15.0/patches
export SLINTVERSION=15.0
ISOVERSION=15.0-2
ISOLABEL="SLINT$ISOVERSION"
# Installed RAM in kilobytes
KRAM=$(sed -n 1p /proc/meminfo|sed "s/[ ]\{1,\}/ /"|cut -d" " -f2)
BRAM=$((KRAM*1024))
GIGA=1073741824
MEGA=1048576
GUIDLINUXDOS=0x83
GUIDLINUXGPT=0fc63daf-8483-4772-8e79-3d69d8477de4
BIOSBOOTMINSIZE=3000000
# Name of the key file written if user wants an encrypted drive
KEYFILE=crypto_keyfile.bin
# minimum size in gigabytes of a drive allowed to install Slint in guided mode
GCOUNT=50
# minimum available room in megabytes in a ESP in manual mode
MINSIZE=$((GCOUNT*GIGA))
MINAVAILESP=$((MEGA*32))
# If EFI is not empty the machine booted in EFI mode
EFI=$(ls /sys/firmware|grep efi)
# $SLINT is the mount point of the root partition of the new system
SLINT="/SLINT"
# $ISO is the mountpoint of the device hosting the installer and packages
# which can be either a DVD or a disk drive, usually an USB stick
ISO="/ISO"
# INSTALL is the directory where this script will store its temporary files.
INSTALL="/INSTALLER"
# MINPARTSIZE is the minimum number of megabytes for an added partition
# in auto partitioning mode
# current size of the file system for which we allow to shrink it.
MINPARTSIZE=2
MINSIZE=$((GIGA*GCOUNT)) # Minimum free size in G to install Slint
MINFREESIZE=$((MINSIZE+(MINPARTSIZE*GIGA))) # Min free size for one partition beyond /
# RESERVED is the list of directories which should not be mounted on separate
# partitions.
RESERVED="bin boot dev etc home lib lib64 media mnt proc root run sbin srv sys usr"
MSGNOLINUX=$(eval_gettext "There don't seem to be any partitions on this machine
of type Linux and size at least \${GCOUNT}G. You need one to install Linux.
For more information, choose 'doc' from the menu.")
MSGNOSUITABLESP=$(gettext "This machine booted in EFI mode but no big enough EFI System Partition found.
For more information. choose 'doc' from the menu.")
MSGMISFITROOTBIOSBOOT=$(gettext "If the root partition is in a drive with a GPT, GRUB needs a BIOS boot
partition on the same drive, of size at least 3M. We didn't find such a
configuration.")
MSGNOSUITABLEDRIVE=$(eval_gettext "We didn't find a drive of size at least \${GCOUNT}G and no mounted
partition, so the automatic partitioning is not possible.")
MSGMISFITROOTEFI=$(gettext "The machine booted in EFI mode but we did not find a potential root partition
with an EFI system partition on the same drive so the manual partitioning
mode is not possible.")
# List of locales for which the installer is translated.
LOCALES=" de_DE.utf8 el_GR.utf8 en_US.utf8 es_CR.utf8 fr_FR.utf8 it_IT.utf8 \
nb_NO.utf8 nl_NL.utf8 pl_PL.utf8 pt_BR.utf8 pt_PT.utf8 ru_RU.utf8 sv_SE.utf8 \
tr_TR.utf8 uk_UA.utf8 "
# Convert user input case insensitive to lower case
to_lower() {
echo "$1"|tr '[:upper:]' '[:lower:]'
}
clear_stdin() {
old_tty_settings=$(stty -g)
stty -icanon min 0 time 0
while read none; do :; done
stty "$old_tty_settings"
}
giveup() {
echo giveup >>$INSTALL/log
gettext "Press Enter to go back to the menu "
read >$INSTALL/log
clear
echo "$ARG"
giveup
}
displaydescription() {
SOURCEDIR=$1
package=$2
( cd $SOURCEDIR
if [ -f ${package%t?z}desc ]; then
sed -n "1p" ${package%t?z}desc
elif [ -f ${package%t?z}txt ]; then
sed -n "1{s/[^:]\{1,\}://;p}" ${package%t?z}txt
else
echo "${package%.t?z} (no available description)"
fi
)
}
trytoget() {
rm -f "$(basename $1)"
FAILED=""
MYFILE="$(basename $1)"
wget -q $1
if [ $(cat $MYFILE|wc -l) -eq 0 ]; then
FAILED=1
fi
}
# Hints displayed when user types h for help.
hintmode() {
# We are called by welcome
gettext "In manual partitioning mode you partition and format the drive
where you want to install Slint to your liking, using utilities it includes.
This gives you more choices of partitions layout and file systems but needs
to be acquainted to Linux and the command line (but you may also have used
a tool like gparted live before starting the installer, or from another system)."
echo
gettext "In auto mode the installer do it for you, but chooses the
partition layout and the file system."
echo
gettext "In both modes you will be given a chance to indicate existing
partitions (not needed by Slint) that you want to access from Slint."
echo
echo && gettext "Press Enter to continue" && read && clear
}
hintpartname(){
# We are called by setotherlinux or addpartition or setmountpoint
eval_gettext "These directories should not be mounted on separate partitions:
\$RESERVED
or use arbitrary directory names, for instance to mount other Linux systems.
"
echo && gettext "Press Enter to continue" && read && clear
}
hintrootsize() {
# Arguments $GMINFREESIZE $GAVAILABLE
ARG1=$1
ARG2=$2
eval_gettext "You may dedicate all the space available on the drive (\${ARG2}G) to the root
Slint partition, or make this partition smaller (at least \${ARG1}G) to reserve
some space for a future use, like setting up a partition shared across OS or
installing later another OS alongside Slint.
To dedicate all the available space to the root Slint partition, set its size to
\${ARG2}G."
echo && gettext "Press Enter to continue" && read && clear
}
hintlinuxfilesystems() {
gettext "brtfs is the most advanced and flexible linux file system, offering
snapshots, subvolumes support, online check and repair, RAID. Using these
features needs some learning.
ex4 is the most common Linux file system and is very reliable.
xfs can be preferred to ext if you have very large storage requirements with
large files"
echo && gettext "Press Enter to continue" && read && clear
}
hintencryptornot() {
gettext "Encrypt a drive prevents theft of the data it contains in case of loss
or theft of the drive itself or of the machine where it is installed.
If you decide to encrypt it, you will need to type a so called \"passphrase\"
to unlock it every time you boot Slint.
Be aware that if you forget the passphrase all data in the drive will be
irrecoverably lost! So write it down carefully on a safe place.
We will ask you to type the passphrase later using a \"us\" keyboard map."
KEYMAP=$(cat /tmp/Pkeymap|cut -d. -f1)
if [ ! "$KEYMAP" = "us" ]; then
eval_gettext "
As you are currently using a \"\$KEYMAP\" keyboard map, we will spell each
character of the passphrase you type, which may differ from the one engraved
on the keyboard key.
"
fi
echo
echo && gettext "Press Enter to continue" && read && clear
}
hintpassphrase() {
gettext "The passphrase should have at least 8 characters. Only ASCII printable
characters are allowed. This includes non accented lower case and capital
letters, digits from 0 to 9, space and following punctuation characters:"
echo
echo " ' ! \" # $ % & ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ \` { | } ~ "
echo && gettext "Press Enter to continue" && read && clear
}
hintloginmode() {
gettext "If you choose C (Console) Slint will start in text mode, in a console
where you type commands at the prompt. It will first ask your login name then
your password. After that you can type commands or start a graphical
environment just typing: 'startx' without the quotes.
If instead you choose G (Graphical) you will type your login name then your
password in a window, then the graphical environment will be displayed."
echo
echo && gettext "Press Enter to continue" && read && clear
}
hintlinks() {
gettext "In the links web browser you navigate with the keyboard:
To go to the next or previous fields press the up or down arrow keys
To quit press q then confirm pressing Enter
To display the key bindings press F1
to display the menu press Esc then navigate with the arrow keys"
echo
echo && gettext "Press Enter to continue." && read && clear
}
addsetting() {
# this function completes one of the partitions lists written by
# probepartitions appending to the record indexed by $PARTNUM a setting
# that will be used in createfilesystem() and fstab()
rm -f $INSTALL/newtable
QPARTUUID=$1
KIND="$2" # can be root, linux, efi or windows
SETTING="$3" # like MOUNTPOINT of FSTYPE or OPTIONS
VALUE="$4"
# We rewrite $INSTALL/${KIND}partitions with the requested setting
# added to the record with the matching partition number.
rm -rf $INSTALL/newtable
while read record; do
echo $record >$INSTALL/setting
. $INSTALL/setting
if [ "$QPARTUUID" = "$PARTUUID" ]; then
record="$record $SETTING=\"$VALUE\""
fi
echo "$record" >>$INSTALL/newtable
done < $INSTALL/${KIND}partitions
mv $INSTALL/newtable $INSTALL/${KIND}partitions
}
displaypartitions() {
# We are called by setotherlinux, setwindows, setroot
# We display only partitions for which no mount point has yet been set
# and, if called by setroot, big enough.
KIND=$1 # KIND can be root, linux or windows.
if [ "$AUTO" ]; then
SERIAL=$(cat $INSTALL/serial)
grep "SERIAL=\"$SERIAL\"" $INSTALL/drives > $INSTALL/drive
. $INSTALL/drive
DRIVENAME=$NAME
fi
rm -f $INSTALL/display$KIND
rm -f $INSTALL/${KIND}partitionsnew
touch $INSTALL/${KIND}partitionsnew
while read partition; do
unset MOUNTPOINT
echo "$partition" > $INSTALL/partition
. $INSTALL/partition
if [ $SIZE -lt $MINSIZE ] && [ "$KIND" = "root" ]; then
continue
fi
if [ "$MOUNTPOINT" ]; then
continue
fi
# In auto mode, if we are going use the full drive do not propose
# on setotherlinux or setwindows to re-use partitions that we
# are going to destroy.
[ "$AUTO" ] && [ ! "$KIND" = "root" ] && [ "$PKNAME" = "$DRIVENAME" ] && continue
GSIZE=$((SIZE/GIGA))
if [ "$KIND" = "root" ]; then
echo "$PARTNUM $NAME (${GSIZE}G)" >> $INSTALL/display$KIND
else
echo "$PARTNUM $NAME (${GSIZE}G) $FSTYPE" >> $INSTALL/display$KIND
fi
echo "$partition" >> $INSTALL/${KIND}partitionsnew
done < $INSTALL/${KIND}partitions
mv $INSTALL/${KIND}partitionsnew $INSTALL/${KIND}partitions
}
setmountpoint(){
# We are called by setotherlinux or setwindows with a partition number as
# argument.
# The chosen mount point will be recorded as MOUNTPOINT among the variables
# associated to this partition in the table $INSTALL/linuxpartitions
# category can be linux or windows
# Note: we do not allow to bail out in this function, so if user has
# chosen to set a mount point this can only be reverted denying to
# confirm the configuration of the installation as a whole.
QPARTUUID=$1
KIND=$2
grep "PARTUUID=\"$QPARTUUID\"" $INSTALL/${KIND}partitions > $INSTALL/partition
. $INSTALL/partition
echo
if [ "$KIND" = "windows" ]; then
eval_gettext "Please choose mount point for \$NAME.
Use only lower case letters and do not choose a directory name reserved in Linux
or in other OS from which this partition will be accessed."
echo
fi
while true; do
eval_gettext "Type the mount point for \$NAME, or h for help: "
clear_stdin
read MOUNTPOINT
MOUNTPOINT="${MOUNTPOINT#/}"
# In manual mode we allow a separate partition for /home, but not
# reusing one.
if [ "$(to_lower $MOUNTPOINT)" = "h" ]; then
clear
hintpartname
elif [ "$MOUNTPOINT" ]; then
if echo $RESERVED|sed 's/ /\n/g'|grep -q $MOUNTPOINT; then
echo
eval_gettext "\$MOUNTPOINT is a reserved directory name."
echo
fi
# Do not use the same mount point for two partitions.
for KINDS in linux windows; do
if [ -f ${KINDS}usedpart ] && [ $(cat ${KINDS}usedpart|wc -l) -gt 0 ]; then
if grep -q "MOUNTPOINT=\"/$MOUNTPOINT\"" ${KINDS}usedpart; then
gettext "This mount point is already in use."
echho
continue 2
fi
fi
done
case $MOUNTPOINT in
*[!*a-z/]*)
echo
gettext "Only lower case letters and \"/\" are allowed."
echo ;;
*)
addsetting $QPARTUUID $KIND MOUNTPOINT "/$MOUNTPOINT"
break
esac
fi
done
}
mounttheiso() {
echo mounttheiso >>$INSTALL/log
INSTALLMEDIAFOUND=$(blkid -L $ISOLABEL)
if [ ! "$INSTALLMEDIAFOUND" ]; then
gettext "No installation media found.
Please restart leaving it inserted or plugged in."
echo
exit
fi
mount $INSTALLMEDIAFOUND $ISO 2>$INSTALL/mountisoerror
if [ $? -ne 0 ]; then
MOUNTSRCERROR=$(cat $INSTALL/mountisoerror)
eval_gettext "We could not mount the installer for this reason:
\$MOUNTSRCERROR"
echo
exit
fi
}
initlocales() {
echo initlocales >>$INSTALL/log
if [ -f /tmp/.SlintInstallationLANG ]; then
LANG=$(cat /tmp/.SlintInstallationLANG)
ll_TT=${LANG%.*}
fi
}
probedrives() {
echo probedrives >>$INSTALL/log
# We want to know ASAP for each drive if/how Slint can be installed on it
# 1. Dedicated to Slint
# 2. On the free space on a drive
# The documentation tells the user how to allow dual booting
# Requirements:
# 1 drive size at least MINSIZE, drive should not be mounted
# 2: free space at least MINSIZE, gpt, efi
# We store in $INSTALL/drives one line for each drive's usable in 'auto' mode.
# We need to know:
# . Whether the installer booted in EFI mode? look for efi on /sys/firmware
# And for each drive connected or plugged-in to the machine:
# . The drive name => lsblk, field name
# . Whether the partition table is of type gpt => lsblk, field pttype
# . The hotplug attributes of the drive => lsblk, field hotplug
# . The transport attribute of the drive => lsblk, field tran
# . The size of the drive => lsblk, field size
# . The vendor of the drive => lsblk, field vendor
# . the model of the drive => lsblk, field model
# . The last partition's path => parted, LASTPARTPATH
# . The disk serial number of the drive => lsblk, field serial
# if $EFI is not null the machine booted in EFI mode
# options of lsblk: b=size in bytes, p=display the full path, P= display as pairs, o=output [fields]
LANG=C lsblk -bpPo name,hotplug,tran,type,pttype,size,vendor,model,serial \
| grep 'TYPE="disk"' \
| grep -v -e /dev/zram -e /dev/xvd -e /dev/md -e /dev/fd -e /dev/sr > $INSTALL/alldrives
rm -f $INSTALL/drives
touch $INSTALL/drives
# To make sure it be numeric, just in case nothing sets it later ...
echo 0 > $INSTALL/available
# In this loop we categorize the drives.
MOUNTEDDRIVES=$(lsblk -lno pkname,mountpoint|grep /|cut -d" " -f1|sort|uniq)
while read drive; do
rm -f $INSTALL/fitforauto
echo "$drive" > $INSTALL/drive
. $INSTALL/drive
DRIVEPATH=$NAME
DRIVESIZE=$SIZE
SHORTNAME=$(echo $DRIVEPATH|sed s,/dev/,,)
if echo "$MOUNTEDDRIVES"|grep -q "$SHORTNAME"; then
continue
fi
if [ $DRIVESIZE -lt $MINSIZE ]; then
continue
fi
echo "$drive" >> $INSTALL/drives
done < "$INSTALL/alldrives"
unset FITFORAUTO
if [ "$(cat $INSTALL/drives|wc -l)" -gt 0 ]; then
FITFORAUTO="yes"
else
return
fi
# Now let's number the drives we allow to use to install Slint in "auto" mode
i=0
rm -f $INSTALL/numbereddrives
while read drive; do
i=$((i+1))
echo "DRIVENUM=\"$i\" $drive" >>$INSTALL/numbereddrives
done < $INSTALL/drives
mv $INSTALL/numbereddrives $INSTALL/drives
}
probepartitions() {
echo probepartitions >>$INSTALL/log
# We characterize the partitions setting variables, Other variables will
# be set later to indicate the associated mount points and file systems
# when set. We number partitions to ease designating them by the user and
# also to ease associating each additional settings to the proper partition
# designating it by its number.
# We exclude the LUKS encrypted partitions.
# The partitions recorded in $INSTALL/rootpartitions can, in manual mode,
# be used as root system partitions as they are of type Linux and big
# enough. We do not require that they be formatted as they will be
# reformatted anyway to avoid that they contain stale files
# We number them to easily refer to each
# The partitions recorded in $INSTALL/linuxpartitions can, in both auto
# and manual modes, be recorded in /etc/fstab associated with a mount
# point that will be chosen by the user to be automatically mounted at
# boot, as they are of type Linux and formatted and with one of the
# file system types btrfs, ext2, ext4, f2fs, jfs, reiserfs or xfs
# We number them to easily refer to each.
LANG=C lsblk -bpPo name,pttype,parttype,parttypename,size,pkname,partuuid,fstype,type \
| grep -e 'TYPE="part"' \
| grep -e 'PARTTYPE="0x83"' -e 'PARTTYPE="0fc63daf-8483-4772-8e79-3d69d8477de4"' \
> $INSTALL/partitionsmaybeoftypelinux
# We exclude partitions /dev/partname if for any partition
# /dev/pkname = /dev/partname as then /dev/partname is a container
# like a crypto_LUKS device.
rm -f $INSTALL/partitionsoftypelinux
if [ -f $INSTALL/partitionsmaybeoftypelinux ]; then
while read candidate; do
echo "$candidate" > $INSTALL/partition
. $INSTALL/partition
if ! lsblk -lo pkname|sed "s@.*@/dev/&@"|grep -q $NAME; then
echo "$candidate" >> $INSTALL/partitionsoftypelinux
fi
done < $INSTALL/partitionsmaybeoftypelinux
fi
if [ -f $INSTALL/partitionsoftypelinux ]; then
i=0
while read partition; do
echo "$partition" > $INSTALL/partition
. $INSTALL/partition
if [ $SIZE -ge $MINSIZE ]; then
i=$((i+1))
echo "PARTNUM=\"$i\" $partition" >>$INSTALL/rootpartitions
fi
done <$INSTALL/partitionsoftypelinux
i=O
# We consider as a linux partition any partition with a Linux filesystem
# regardless of its partition type.
LANG=C lsblk -bpPo name,pttype,parttype,parttypename,size,pkname,partuuid,fstype,type \
| grep -e 'TYPE="part"' > $INSTALL/allpartitions
while read partition; do
echo "$partition" > $INSTALL/partition
. $INSTALL/partition
if [ "$FSTYPE" = "ext2" ] || [ "$FSTYPE" = "ext3" ] || [ "$FSTYPE" = "ext4" ] \
|| [ "$FSTYPE" = "btrfs" ] || [ "$FSTYPE" = "xfs" ] || [ "$FSTYPE" = "f2fs" ] \
|| [ "$FSTYPE" = "jfs" ] || [ "$FSTYPE" = "reiserfs" ]; then
i=$((i+1))
echo "PARTNUM=\"$i\" $partition" >>$INSTALL/linuxpartitions
fi
done <$INSTALL/allpartitions
fi
# We assume that the partitions of fstype ntfs, exfat and vfat are
# "windows" partitions the the user may want to mount at boot. We
# will not reformat them.
# We exclude EFI partitions from the list of Windows partitions as we do
# not expect that they contain user data.
# Even if no Windows partition has been found, do this to simplify
# testing their number as $($INSTALL/windowspartitions|wc -l)
touch $INSTALL/windowspartitions
LANG=C lsblk -bpPo name,pttype,parttype,parttypename,size,pkname,partuuid,fstype \
|grep -e 'FSTYPE="ntfs"' -e 'FSTYPE="exfat"' -e 'FSTYPE="vfat"' \
|grep -v -e 'PARTTYPE="c12a7328-f81f-11d2-ba4b-00a0c93ec93b"' -e 'PARTTYPE="0xef"' \
> $INSTALL/windowspartitionslist
i=0
if [ -f $INSTALL/windowspartitionslist ]; then
while read partition; do
i=$((i+1))
echo "PARTNUM=\"$i\" $partition" >>$INSTALL/windowspartitions
done <$INSTALL/windowspartitionslist
fi
LANG=C lsblk -bpPo name,pttype,parttype,parttypename,size,pkname,partuuid,fstype \
| grep -e 'PARTTYPE="0657fd6d-a4ab-43c4-84e5-0933c84b4f4f"' -e 'PARTTYPE="0x82"' \
> $INSTALL/swappartitionslist
if [ -f $INSTALL/swappartitionslist ]; then
while read partition; do
i=$((i+1))
echo "PARTNUM=\"$i\" $partition" >>$INSTALL/swappartitions
done <$INSTALL/swappartitionslist
fi
LANG=C lsblk -bpPo name,pttype,parttype,parttypename,size,pkname,partuuid,fstype \
| grep -e 'PARTTYPE="c12a7328-f81f-11d2-ba4b-00a0c93ec93b"' -e 'PARTTYPE="0xef"' \
> $INSTALL/efipartitionslist
if [ -f $INSTALL/efipartitionslist ] && [ "$(cat $INSTALL/efipartitionslist|wc -l)" -ne 0 ] ; then
while read partition; do
i=$((i+1))
echo "PARTNUM=\"$i\" $partition" >>$INSTALL/efipartitions
done <$INSTALL/efipartitionslist
# We discard the EFI partitions in which the free space is too small.
# The minimum accepted size is set as MINAVAILESP in top of this script.
mkdir $INSTALL/esp
while read efipart; do
echo $efipart > $INSTALL/efipart
. $INSTALL/efipart
# If the partition is not formatted, we consider its size, else
# the available size on it file system. If this file system is
# not vfat, we discard it.
if [ "$FSTYPE" = "" ]; then
if [ $SIZE -lt $MINAVAILESP ]; then
sed "\@NAME=\"$NAME\"@d" $INSTALL/efipartitions > bof
mv bof $INSTALL/efipartitions
fi
else
mount $NAME $INSTALL/esp
if [ ! "$FSTYPE" = "vfat" ]; then
sed "\@NAME=\"$NAME\"@d" $INSTALL/efipartitions > bof
mv bof $INSTALL/efipartitions
else
FSSIZE=$(lsblk -lnbo fsavail $NAME)
if [ $FSSIZE -lt $MINAVAILESP ]; then
sed "\@NAME=\"$NAME\"@d" $INSTALL/efipartitions > bof
mv bof $INSTALL/efipartitions
fi
fi
umount $INSTALL/esp
fi
done < $INSTALL/efipartitions
rmdir $INSTALL/esp
NBESP=$(cat $INSTALL/efipartitions|wc -l)
else
NBESP=0
fi
# We register the not formatted partitions big enough for GRUB
LANG=C lsblk -bpPo name,pkname,parttypename,size,fstype \
| grep -e 'PARTTYPENAME="BIOS boot"' -e 'PARTTYPENAME="BIOS boot partition"' \
| grep -e 'FSTYPE=""' \
> $INSTALL/biosbootpartitions
if [ -f $INSTALL/biosbootpartitions ] && [ "$(cat $INSTALL/biosbootpartitions|wc -l)" -ne 0 ]; then
while read partition; do
echo "$partition" > $INSTALL/partition
. $INSTALL/partition
if [ "$SIZE" -ge "$BIOSBOOTMINSIZE" ]; then
echo "$partition" >> $INSTALL/biosbootpartitions.new
fi
done < $INSTALL/biosbootpartitions
mv $INSTALL/biosbootpartitions.new $INSTALL/biosbootpartitions
NBBIOSBOOT=$(cat $INSTALL/biosbootpartitions|wc -l)
else
NBBIOSBOOT=0
fi
}
choosemanualorauto() {
echo choosemanualorauto >>$INSTALL/log
clear
gettext "The Slint installer proposes installation options and let you choose
what you prefer, through question/answer dialogues, then it installs and
configure Slint. After installation you may customize the system through
simple commands listed in the included documentation."
echo
gettext "You can chose between a manual or auto partitioning."
echo
gettext "If you prefer manual (custom) partitioning but did not do the partitioning yet,
press q to quit now. You will type 'start' again when ready."
echo
unset AUTO MANUAL
while true; do
gettext "Press m for manual, a for auto, h for help or q to quit: " && clear_stdin && read ANSWER
case $(to_lower $ANSWER) in
m) MANUAL="yes"; break;;
a) AUTO="yes"; break;;
h) clear; hintmode;;
q) clear; backtomenu "$(gettext "Type 'start' again when you will be ready.")";;
*) clear
eval_gettext "\$ANSWER is not a valid answer."
echo
esac
done
}
checkinstallationmodes() {
echo checkinstallationmodes >>$INSTALL/log
# We check that conditions are met to allow the manual installation or
# an auto installation selected by the user. We could do this checking
# before choosing emanual or auto instead but the user would then not
# know why the choice between manual and auto is not proposed.
# we need in manual mode:
# A big enough ESP (al least 100M available in it) if booted in EFI mode
# A big enough Linux partition for / (size at least 50G)
# A BIOS Boot partition size at least 4M if the drive has a GPT, to
# satisfy GRUB's requirement and be able to boot in Legacy mode, as
# requested by GRUB.
# The BIOS boot partition (if needed) and the ESP should be on the
# same drive as the root partition, else we will not propose the root
# partition so that SLINT be portable if connected through USB and
#
# In auto mode we just need a big enough drive
[ "$AUTO" ] && [ ! "$FITFORAUTO" ] && backtomenu "$MSGNOSUITABLEDRIVE"
if [ "$MANUAL" ]; then
# We need a big enough Linux partition
[ ! -f $INSTALL/rootpartitions ] && backtomenu "$MSGNOLINUX"
# in EFI mode we need an ESP.
# If there is none on the same drive as any candidate root
# partition, output an error message.
# Re-write the candidate root partitions including only the ones
# that fit the bill.
if [ $EFI ]; then
[ "$NBESP" -eq 0 ] && backtomenu "$MSGNOSUITABLESP"
while read rootpart; do
echo "$rootpart" > /tmp/part
. /tmp/part
DRIVEROOT="$PKNAME"
while read efipart; do
echo "$efipart" > /tmp/part
. /tmp/part
DRIVEEFI="$PKNAME"
if [ "$DRIVEROOT" = "$DRIVEEFI" ]; then
EFIROOTSAMEDRIVE="yes"
echo "$rootpart" >> $INSTALL/rootpartitions.new
fi
done <$INSTALL/efipartitions
done < $INSTALL/rootpartitions
cp $INSTALL/rootpartitions.new $INSTALL/rootpartitions
[ ! $EFIROOTSAMEDRIVE ] && backtomenu "$MSGMISFITROOTEFI"
fi
# In case of a GPT we require that a BIOS boot partition on the
# same drive as the root partition.
# We will re-write $INSTALL/rootpartitions including only the
# ones that meet this spec.
[ "$PTTYPE" = "gpt" ] && [ $NBBIOSBOOT -eq 0 ] && backtomenu "$MSGMISFITROOTBIOSBOOT"
rm -f $INSTALL/rootpartitions.new
while read rootpart; do
echo "$rootpart" > /tmp/part
. /tmp/part
if [ "$PTTYPE" = "gpt" ]; then
DRIVEROOT="$PKNAME"
while read biosbootpart; do
echo "$biosbootpart" > /tmp/part
. /tmp/part
DRIVEBIOSBOOT="$PKNAME"
if [ "$DRIVEROOT" = "$DRIVEBIOSBOOT" ]; then
echo "$rootpart" >> $INSTALL/rootpartitions.new
fi
done < $INSTALL/biosbootpartitions
else
echo "$rootpart" >> $INSTALL/rootpartitions.new
fi
done < $INSTALL/rootpartitions
if [ -f $INSTALL/rootpartitions.new ]; then
mv $INSTALL/rootpartitions.new $INSTALL/rootpartitions
else
[ ! $BIOSBOOTROOTSAMEDRIVE ] && backtomenu "$MSGMISFITROOTBIOSBOOT"
fi
fi
}
choosetargetdrive() {
[ "$MANUAL" ] && return
echo choosetargetdrive >>$INSTALL/log
# First inform the user about his or her options.
# If a drive has a GPT and the installer booted in EFI mode, we propose to
# install Slint in the biggest free space of a drive, if big enough.
echo
if [ "$(wc -l $INSTALL/drives|sed "s/ .*//")" = "1" ]; then
# Only one drive is fit for installation in auto mode
cp $INSTALL/drives $INSTALL/drive
. $INSTALL/drive
GSIZE=$((SIZE/GIGA))
echo "$SERIAL" >$INSTALL/serial
SHORTNAME=$(echo $NAME|sed s,/dev/,,)
gettext "Slint can be installed on this drive:"
echo
VEND=$(echo $VENDOR|sed "s/[[:space:]]//g")
MOD=$(echo $MODEL|sed "s/[[:space:]]//g")
echo "$NAME $VEND $MOD (${GSIZE}G)"
gettext "To install Slint on this drive we need to wipe all data in it"
echo
else
# User can choose the target drive
CHOSEN=no
# We will check that the drive number typed by the user is among the
# available ones
NUMBEROFDRIVES=$(cat $INSTALL/drives|wc -l)
while [ "$CHOSEN" = "no" ]; do
gettext "Slint can be installed on one of the drives listed below."
echo
while read drive; do
echo "$drive" > $INSTALL/drive
. $INSTALL/drive
GSIZE=$((SIZE/GIGA))
SHORTNAME=$(echo $NAME|sed s,/dev/,,)
VEND=$(echo $VENDOR|sed "s/[[:space:]]//g")
MOD=$(echo $MODEL|sed "s/[[:space:]]//g")
echo "$DRIVENUM $NAME $VEND $MOD (${GSIZE}G)"
printf " "
gettext "To install Slint on this drive we need to wipe all data in it"
echo
done <$INSTALL/drives
echo
# Now let the user choose the drive and record it according
# to its serial number rather than to its name, which could
# change before we ask for confirmation, for instance if a
# drive is inserted or removed.
gettext "Please type the chosen drive's number, or q to quit: "
clear_stdin
read ANSWER
if [ "$ANSWER" = "q" ]; then
giveup
fi
if [ "$ANSWER" ] && \
! echo "$ANSWER" | grep -q "[^123456789]" && \
[ $ANSWER -ge 1 ] && \
[ $ANSWER -le $NUMBEROFDRIVES ]; then
CHOSEN="yes"
grep "DRIVENUM=\"$ANSWER\"" $INSTALL/drives > $INSTALL/drive
. $INSTALL/drive
echo "$SERIAL" > $INSTALL/serial
fi
done
fi
}
createbiosbootandefipartitions() {
[ "$MANUAL" ] && return
echo createbiosbootandefipartitions >>$INSTALL/log
grep "SERIAL=\"$(cat $INSTALL/serial)\"" $INSTALL/drives > $INSTALL/drive
. $INSTALL/drive
DRIVESIZE=$SIZE
ANSWER=""
echo
SIZEG=$((SIZE/GIGA))
gettext "Slint would be installed on this drive:"
echo
echo "$NAME $VENDOR $MODEL SIZE: ${SIZEG}G"
echo
if [ "$LASTPARTPATH" ]; then
eval_gettext "To dedicate \$NAME, size \${SIZEG}G to Slint we need to delete all data
stored on this drive, including existing OS case occurring.
Here are its current partitions:"
echo
echo
lsblk -lp -o name,size,fstype,type $NAME|grep -v disk|sed 's/TYPE$//;s/part$//'
echo
while [ ! "$(to_lower $ANSWER)" = "yes" ] && [ ! "$(to_lower $ANSWER)" = "no" ]; do
eval_gettext "Do you want to delete all data on \$NAME then install Slint on it?"
echo
gettext "Type yes or no: " && clear_stdin && read ANSWER
done
if [ ! "$(to_lower $ANSWER)" = "yes" ]; then
giveup
fi
else
while [ ! "$(to_lower $ANSWER)" = "yes" ] && [ ! "$(to_lower $ANSWER)" = "no" ]; do
gettext "Do you want to install Slint on it?"
echo
gettext "Type yes or no: " && clear_stdin && read ANSWER
done
if [ ! "$(to_lower $ANSWER)" = "yes" ]; then
giveup
fi
fi
echo 'SERIAL=$(cat $INSTALL/serial)' >>$INSTALL/preparedrive
echo 'grep "SERIAL=\"$SERIAL\"" $INSTALL/drives >$INSTALL/drive' >>$INSTALL/preparedrive
echo '. $INSTALL/drive' >>$INSTALL/preparedrive
echo 'DRIVEPATH=$NAME' >>$INSTALL/preparedrive
echo 'sgdisk --zap-all $DRIVEPATH >>$INSTALL/log' >>$INSTALL/preparedrive
echo 'wipefs --all --force $DRIVEPATH >>$INSTALL/log' >>$INSTALL/preparedrive
echo 'parted -s $DRIVEPATH mklabel gpt' >>$INSTALL/preparedrive
echo 'FIRSTAVAIL=$(sgdisk -f $DRIVEPATH)' >>$INSTALL/preparedrive
echo 'parted -s $DRIVEPATH -a none mkpart BiosGrub 1MiB 4MiB' >>$INSTALL/preparedrive
echo 'parted -s $DRIVEPATH set 1 bios_grub on' >>$INSTALL/preparedrive
echo 'BIOSBOOTPARTPATH=$(sfdisk -lo device $DRIVEPATH|grep ^/dev|tail -n1)' >>$INSTALL/preparedrive
echo 'wipefs --all --force $BIOSBOOTPARTPATH >>$INSTALL/log' >>$INSTALL/preparedrive
echo 'parted -s $DRIVEPATH mkpart ESP 4MiB 100MiB' >>$INSTALL/preparedrive
echo 'parted -s $DRIVEPATH set 2 esp on' >>$INSTALL/preparedrive
echo 'EFIPARTPATH=$(sfdisk -lo device $DRIVEPATH|grep ^/dev|tail -n1)' >>$INSTALL/preparedrive
echo 'mkfs.fat $EFIPARTPATH 1>>$INSTALL/log 2>>$INSTALL/errors' >>$INSTALL/preparedrive
echo 'echo "$EFIPARTPATH" >$INSTALL/esppath' >>$INSTALL/preparedrive
ROOTNUM=3
echo $ROOTNUM >>$INSTALL/rootnum
echo $((SIZE-(100*MEGA))) >$INSTALL/available
}
createrootpartition() {
[ "$MANUAL" ] && return
echo drivetail >>$INSTALL/log
# We are called with number if the root Slint partition and the available
# space at the end of the drive in bytes.
AVAILABLE=$(cat $INSTALL/available)
GAVAILABLE=$((AVAILABLE/GIGA))
GMINFREESIZE=$((MINFREESIZE/GIGA))
if [ $GAVAILABLE -ge $GMINFREESIZE ]; then
# if the available size is bigger than or equal to the minimum size + 2G
# we allow to keep a free space after the root partition, optionally
# used to add a partition after it...
GROOTSIZE=0
echo
eval_gettext "You can dedicate all the available space: \${GAVAILABLE}G to Slint's root partition,
or keep part of it for another usage.
The size of the Slint root partition should be between \${GCOUNT}G and \${GAVAILABLE}G."
echo
while true; do
gettext "Size of the Slint root partition (h for help): "
clear_stdin
read ANSWER
GROOTSIZE=$(echo $ANSWER|sed "s/[ ]\{1,\}g//;s/[Gg]//;s/[.].*//")
if [ "$(to_lower $ANSWER)" = "h" ]; then
GROOTSIZE=0
clear
hintrootsize $GMINFREESIZE $GAVAILABLE
continue
fi
if echo $GROOTSIZE|grep -q "[^[:digit:]]" || [ ! "$GROOTSIZE" ]; then
eval_gettext "\$GROOTSIZE is not a number."
echo
GROOTSIZE=0
continue
fi
if [ $GROOTSIZE -lt $GCOUNT ] || [ $GROOTSIZE -gt $GAVAILABLE ]; then
eval_gettext "\$GROOTSIZE is not a number between \$GCOUNT and \$GAVAILABLE."
echo
continue
echo
fi
break
done
else
# if the available space is smaller than the minimum size +2G, the root
# partition will be allocated the whole available space.
GROOTSIZE=$GAVAILABLE
echo 0 >$INSTALL/available
fi
echo "GROOTSIZE=$GROOTSIZE" >>$INSTALL/preparedrive
echo "$GROOTSIZE" >$INSTALL/rootsize
ROOTNUM=$(cat $INSTALL/rootnum)
echo "ROOTNUM=$ROOTNUM" >>$INSTALL/preparedrive
if [ $GROOTSIZE -eq $GAVAILABLE ]; then
echo 'sgdisk -a 4 -N $ROOTNUM -t ${ROOTNUM}:8200 $DRIVEPATH 1>>$INSTALL/log 2>>$INSTALL/log' >>$INSTALL/preparedrive
echo 0 >$INSTALL/available
else
echo 'sgdisk -a 4 -n ${ROOTNUM}:0:+${GROOTSIZE}G -t ${ROOTNUM}:8200 $DRIVEPATH 1>>$INSTALL/log 2>>$INSTALL/log' >>$INSTALL/preparedrive
echo $((AVAILABLE-(GROOTSIZE*GIGA))) >$INSTALL/available
fi
echo 'partprobe $DRIVEPATH 2>>$INSTALL/errors' >>$INSTALL/preparedrive
echo 'ROOTPARTPATH=$(sfdisk -lo device $DRIVEPATH|grep ^/dev|tail -n1)' >>$INSTALL/preparedrive
echo 'LANG=C wipefs --all --force $ROOTPARTPATH >>$INSTALL/log' >>$INSTALL/preparedrive
echo 'partprobe $DRIVEPATH 2>>$INSTALL/errors' >>$INSTALL/preparedrive
echo 'echo "$ROOTPARTPATH" > $INSTALL/rootpartpath' >>$INSTALL/preparedrive
echo 'ROOTPARTUUID=$(lsblk -lno partuuid $ROOTPARTPATH)' >> $INSTALL/preparedrive
echo 'echo "$ROOTPARTUUID" > $INSTALL/rootpartuuid' >>$INSTALL/preparedrive
}
createadditionalpartition() {
[ "$MANUAL" ] && return
echo createadditionalpartition >>$INSTALL/log
. $INSTALL/drive
# Just in the unlikely case a drive has been (un)plugged...
SERIAL=$SERIAL
grep "SERIAL=\"$SERIAL\"" $INSTALL/drives > $INSTALL/drive
. $INSTALL/drive
DRIVEPATH=$NAME
# Add a partition if requested.
# We are called by drivetail, that sets PARTNUM to its number and MREMAINING
# and GREMAINING as the sizes in megabytes and gigabytes of the remaining
# free space after the root Slint partition.
AVAILABLE=$(cat $INSTALL/available)
if [ $AVAILABLE -eq 0 ]; then
return
fi
MREMAINING=$((AVAILABLE/MEGA))
GREMAINING=$((AVAILABLE/GIGA))
GADDEDSIZE=-1
echo
eval_gettext "There remains \${GREMAINING}G of free space in \$DRIVEPATH. You may allocate all
or part of it to an additional partition. If you want an additional partition
type its size below (at most \${GREMAINING}G), else just press Enter."
echo
while true; do
eval_gettext "Size of the added partition (h for help): "
clear_stdin
read ANSWER
GADDEDSIZE=$(echo $ANSWER|sed "s/[ ]\{1,\}g//;s/[Gg]//;s/[.].*//")
if [ "$(to_lower $GADDEDSIZE)" = "h" ]; then
GADDEDSIZE=-1
clear
hintaddedsize $GREMAINING
continue
fi
if [ ! "$GADDEDSIZE" ]; then
GADDEDSIZE=0
elif echo $GADDEDSIZE|grep -q "[^[:digit:]]"; then
GADDEDSIZE=-1
fi
if [ $GADDEDSIZE -lt 0 ] || [ $GADDEDSIZE -gt $GREMAINING ]; then
eval_gettext "The size should be at most \${GREMAINING}G."
echo
continue
fi
break
done
if [ $GADDEDSIZE -eq 0 ]; then
return
fi
echo
gettext "Please choose a name for the new partition; like \"data\". Use only lower case
letters and do not choose a reserved directory name in Linux or in other OS from
which this partition will be accessed."
echo
while true; do
gettext "Type the name of the new partition, or h for help: "
clear_stdin
read NEWPARTNAME
if [ "$(to_lower $NEWPARTNAME)" = "h" ]; then
clear
hintpartname
elif [ "$NEWPARTNAME" ]; then
if echo $RESERVED|sed 's/ /\n/g'|grep -q $NEWPARTNAME; then
echo
eval_gettext "\$NEWPARTNAME is a reserved directory name."
echo
elif echo $NEWPARTNAME|grep -q "[^[:lower:]]"; then
echo
gettext "Only lower case letters are allowed"
echo
else
break
fi
fi
done
echo "$NEWPARTNAME" >$INSTALL/addedpartname
# We want the size of the added partition to be a whole number of gigabytes
# as set by the user, adjust the remaining free space in megabytes
# accordingly unless it would be less that 1G in which case allocate all
# the remaining space to the added partition.
echo "$GADDEDSIZE" > $INSTALL/addedpartsize
MREMAINING=$((MREMAINING-(GADDEDSIZE*1024)))
ADDPARTNUM=$(($(cat $INSTALL/rootnum) +1))
echo "ADDPARTNUM=$ADDPARTNUM" >> $INSTALL/preparedrive
if [ $MREMAINING -lt 1024 ]; then
echo 'sgdisk -a 4 -N $ADDPARTNUM -t ${ADDPARTNUM}:8200 $DRIVEPATH' >>$INSTALL/preparedrive
echo 0 > $INSTALL/available
else
echo "GADDEDSIZE=$GADDEDSIZE" >>$INSTALL/preparedrive
echo 'sgdisk -a 4 -n ${ADDPARTNUM}:0:+${GADDEDSIZE}G -t ${ADDPARTNUM}:8200 $DRIVEPATH' >>$INSTALL/preparedrive
REMAINING=$((AVAILABLE-(GADDEDSIZE*GIGA)))
echo $REMAINING >$INSTALL/available
fi
echo 'partprobe $DRIVEPATH 2>>$INSTALL/errors' >>$INSTALL/preparedrive
echo 'ADDEDPARTPATH=$(sfdisk -lo device $DRIVEPATH|grep ^/dev|tail -n1)' >>$INSTALL/preparedrive
echo 'wipefs --all --force $ADDEDPARTPATH >>$INSTALL/log' >>$INSTALL/preparedrive
echo 'echo "$ADDEDPARTPATH" > $INSTALL/addedpartpath' >>$INSTALL/preparedrive
echo 'ADDEDPARTUUID=$(lsblk -lno partuuid $ADDEDPARTPATH)' >> $INSTALL/preparedrive
echo 'echo "$ADDEDPARTUUID" > $INSTALL/addedpartuuid' >>$INSTALL/preparedrive
}
setroot() {
[ "$AUTO" ] && return
echo setroot >>$INSTALL/log
# We allow the user to choose which partitions to become the root or "/"
# Slint partition. This partition will be formatted.
# As the name of the partition can change if a drive is (dis)connected
# during installation we will refer to it by its partuuid, which won't
# change. We do not use the uuid as it is set only for formatted
# partitions, and we allow registering not yet formatted ones.
NBROOTPART=$(cat $INSTALL/rootpartitions|wc -l)
# If only one partition meets the specs of a root partition...
if [ $NBROOTPART -eq 1 ]; then
. $INSTALL/rootpartitions
GSIZE=$((SIZE/GIGA))
# ROOTPARTNUM seems unused
# ROOTPARTNUM=$PARTNUM
ROOTNAME=$NAME
ROOTPKNAME=$PKNAME
ROOTPARTUUID=$PARTUUID
echo
gettext "You have chosen the \"manual\" partitioning mode."
echo
gettext "We need to identify the root Slint partition, to be mounted as \"/\".
We will later format this partition, which will erase its content."
echo
eval_gettext "We have found only one Linux partition big enough to install Slint:
\${ROOTNAME}, size \${GSIZE}G."
echo
while true; do
eval_gettext "Do you want to install Slint on \$ROOTNAME?"
echo
gettext "Please type yes to confirm or no to quit: "
clear_stdin
read ANSWER
CHOICE=$(to_lower $ANSWER)
case $CHOICE in
yes)
echo $ROOTPARTUUID > $INSTALL/rootpartuuid
break;;
no)
giveup;;
*)
:
esac
done
addsetting $ROOTPARTUUID root MOUNTPOINT "/"
FILESYSTEMS="btrfs ext4 xfs"
gettext "Allowed file system types for linux partitions are:"
echo
echo "$FILESYSTEMS"
echo
while true; do
eval_gettext "Type the file system type for \$NAME or h for help: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
btrfs|ext4|xfs)
FSTYPE=$(to_lower $ANSWER)
break;;
h)
clear
hintlinuxfilesystems;;
*) :
esac
done
echo "$FSTYPE" > $INSTALL/rootfstype
# We re-read the settings to make sure we record the right name
# of the partition and of the drive which contains it.
cp $INSTALL/rootpartitions $INSTALL/partition
. $INSTALL/partition
ROOTNAME=$NAME
echo $ROOTNAME >$INSTALL/rootpartpath
grep "NAME=\"$ROOTPKNAME\"" $INSTALL/drives > $INSTALL/drive
# Remove this partition from the list of Linux partitions as
# it should be mounted only once (as /).
cp $INSTALL/partition $INSTALL/rootusedpart
if [ -f $INSTALL/linuxpartitions ]; then
mv $INSTALL/linuxpartitions $INSTALL/linuxpartitions.prev
while read part; do
echo "$part" > $INSTALL/part
. $INSTALL/part
if [ ! "$PARTUUID" = "$ROOTPARTUUID" ]; then
cat $INSTALL/part >> $INSTALL/linuxpartitions
fi
done <$INSTALL/linuxpartitions.prev
fi
return
fi
# If we got there, several partitions meet the specs of a root partition...
displaypartitions root
echo
gettext "You have chosen the \"manual\" partitioning mode."
echo
gettext "We need to identify the root Slint partition, to be mounted as \"/\".
We will later format this partition, which will erase its content."
echo
gettext "You can select the root partition among these:"
echo
echo
cat $INSTALL/displayroot
unset CHOSEN
while [ ! "$CHOSEN" ]; do
echo
gettext "Please type the root partitions's number, or q to quit: "
clear_stdin
read ANSWER
[ "$(to_lower $ANSWER)" = "q" ] && giveup
if ! grep -q "PARTNUM=\"$ANSWER\"" $INSTALL/rootpartitions; then
eval_gettext "\$ANSWER is not a listed partition number."
echo
continue
fi
grep "PARTNUM=\"$ANSWER\"" $INSTALL/rootpartitions > $INSTALL/partition
. $INSTALL/partition
ROOTPARTUUID=$PARTUUID
addsetting $ROOTPARTUUID root MOUNTPOINT "/"
grep "PARTNUM=\"$ANSWER\"" $INSTALL/rootpartitions > $INSTALL/partition
. $INSTALL/partition
FILESYSTEMS="btrfs ext4 xfs"
gettext "Allowed file system types for linux partitions are:"
echo
echo "$FILESYSTEMS"
echo
while true; do
eval_gettext "Type the file system type for \$NAME or h for help: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
btrfs|ext4|xfs)
FSTYPE=$(to_lower $ANSWER)
break;;
h)
clear
hintlinuxfilesystems;;
*) :
esac
done
echo "$FSTYPE" > $INSTALL/rootfstype
grep "PARTUUID=\"$ROOTPARTUUID\"" $INSTALL/rootpartitions > $INSTALL/partition
. $INSTALL/partition
ROOTNAME=$NAME
echo $NAME >$INSTALL/rootpartpath
grep "NAME=\"$PKNAME\"" $INSTALL/drives > $INSTALL/drive
# Remove this partitions from the list of Linux partitions as
# it should be mounted only as /.
grep "PARTUUID=\"$ROOTPARTUUID\"" $INSTALL/rootpartitions > $INSTALL/rootusedpart
if [ -f $INSTALL/linuxpartitions ]; then
mv $INSTALL/linuxpartitions $INSTALL/linuxpartitions.prev
while read part; do
echo "$part" > $INSTALL/part
. $INSTALL/part
if [ ! "$PARTUUID" = "$ROOTPARTUUID" ]; then
cat $INSTALL/part >> $INSTALL/linuxpartitions
fi
done <$INSTALL/linuxpartitions.prev
fi
break
done
}
setotherlinux() {
[ ! -f $INSTALL/linuxpartitions ] && return
[ $(cat $INSTALL/linuxpartitions|wc -l) -eq 0 ] && return
displaypartitions linux
[ ! -f $INSTALL/displaylinux ] && return
echo setotherlinux >>$INSTALL/log
# After having set the root partition "/" we allow the user to select other
# linux partitions and for each set a mount point, then create a file
# system unless an existing one that the user want to preserved.
# We stop as soon as the user quits or there is no more available
# and not yet selected partition, or the user is done selecting
# Linux partitions
# We record the partition as used in $INSTALL/linuxusedpart then
# remove it from $INSTALL/linuxpartitions to not a partition to several
# mount points.
# As the name of the partitions can change if a drive is (dis)connected
# during installation we will refer to them by their partuuid, which won't
# change. We do not use the uuid as it is set only for formatted
# partitions, and we allow registering not yet formatted ones.
echo
gettext "You can associate a mount point to each partition listed below.
You will first select a partition typing its number, then its mount point.
Type d when done, l to display the list again, or q to quit."
echo
echo
cat $INSTALL/displaylinux
while [ -f $INSTALL/linuxpartitions ] && [ $(cat $INSTALL/linuxpartitions|wc -l) -gt 0 ]; do
displaypartitions linux
echo
gettext "Partition number? (or l to display the list, d when done, q to quit): "
clear_stdin
read ANSWER
CHOICE=$(to_lower $ANSWER)
[ "$CHOICE" = "d" ] && return
[ "$CHOICE" = "q" ] && clear && backtomenu "$(gettext "Type 'start' again when you will be ready.")"
if [ "$CHOICE" = "l" ]; then
echo
displaypartitions linux
cat $INSTALL/displaylinux
continue
fi
[ ! "$CHOICE" ] && continue
if ! grep -q "PARTNUM=\"$CHOICE\"" $INSTALL/linuxpartitions; then
eval_gettext "\$ANSWER is not a listed partition number."
echo
else
OTHERPARTNUM=$ANSWER
grep "PARTNUM=\"$OTHERPARTNUM\"" $INSTALL/linuxpartitions > $INSTALL/partition
. $INSTALL/partition
LINUXPARTUUID=$PARTUUID
setmountpoint $LINUXPARTUUID linux
grep "PARTUUID=\"$LINUXPARTUUID\"" $INSTALL/linuxpartitions > $INSTALL/partition
. $INSTALL/partition
addsetting $LINUXPARTUUID linux FSTYPE "$FSTYPE"
grep "PARTUUID=\"$LINUXPARTUUID\"" $INSTALL/linuxpartitions >>$INSTALL/linuxusedpart
mv $INSTALL/linuxpartitions $INSTALL/linuxpartitions.prev
while read part; do
echo "$part" > $INSTALL/part
. $INSTALL/part
if [ ! "$PARTUUID" = "$LINUXPARTUUID" ]; then
cat $INSTALL/part >> $INSTALL/linuxpartitions
fi
done <$INSTALL/linuxpartitions.prev
fi
done
}
setwindows() {
[ ! -f $INSTALL/windowspartitions ] && return
[ $(cat $INSTALL/windowspartitions|wc -l) -eq 0 ] && return
displaypartitions windows
[ ! -f $INSTALL/displaywindows ] && return
echo setwindows >>$INSTALL/log
# We will propose to mount automatically partitions formatted with one of
# theses file systems, according to lsblk: exfat, ntfs, vfat.
# As the name of the partitions can change if a drive is (dis)connected
# during installation we will refer to them by their partuuid, which won't
# change. We will use the partuuid rather than the the uuid to refer to
# them consitency with the root and other linux, though in this case
# the (file system) uuid be always set as we select only formatted
# partitions.
echo
gettext "We will now list the partitions found on this machine with one of the file systems
exfat, ntfs, vfat, used by Windows. You will now type the numbers of those you want
to be automatically mounted at boot time, either read-only or read-write."
echo
echo
cat $INSTALL/displaywindows
while [ -f $INSTALL/windowspartitions ] && [ $(cat $INSTALL/windowspartitions|wc -l) -gt 0 ]; do
displaypartitions windows
gettext "Partition number? (l to display the list, d when done, h for help):"
clear_stdin
read ANSWER
CHOICE=$(to_lower $ANSWER)
[ "$CHOICE" = "d" ] && return
if [ "$CHOICE" = "h" ]; then
clear
hintsetwindows
continue
fi
if [ "$CHOICE" = "l" ]; then
echo
displaypartitions windows
cat $INSTALL/displaywindows
continue
fi
if ! grep -q "PARTNUM=\"$ANSWER\"" $INSTALL/windowspartitions; then
eval_gettext "\$ANSWER is not a listed partition number"
echo
else
WINDOWSPARTNUM=$ANSWER
grep "PARTNUM=\"$WINDOWSPARTNUM\"" $INSTALL/windowspartitions >> $INSTALL/part
. $INSTALL/part
WINPARTUUID=$PARTUUID
setmountpoint $WINPARTUUID windows
grep "PARTUUID=\"$WINPARTUUID\"" $INSTALL/windowspartitions >> $INSTALL/windowsusedpart
mv $INSTALL/windowspartitions $INSTALL/windowspartitions.prev
while read part; do
echo "$part" > $INSTALL/part
. $INSTALL/part
if [ ! "$PARTUUID" = "$WINPARTUUID" ]; then
cat $INSTALL/part >> $INSTALL/windowspartitions
fi
done <$INSTALL/windowspartitions.prev
fi
done
}
setefimanual() {
[ "$AUTO" ] && return
[ "$NBESP" -eq 0 ] && return
# We have checked in checkinstallationmodes that there is an ESP in
# the drive where is the root partition
echo setefimanual >>$INSTALL/log
# Select the first found big enough ESP in the same drive as the root
# partition
. $INSTALL/rootusedpart
DRIVEPATH=$PKNAME
grep "PKNAME=\"$DRIVEPATH\"" $INSTALL/efipartitions > $INSTALL/efipreferred
head -n 1 $INSTALL/efipreferred > $INSTALL/efiusedpart
. $INSTALL/efiusedpart
echo "$NAME" > $INSTALL/esppath
}
encryptornot() {
# I am unsure if we should allow encrypting the root Slint partition
# in all cases, but let's do so for now as the alternative would be to
# only allow that in case of auto partitioning of a dedicated drive
# which seems too restrictive.
# In auto partitioning mode if an additional partition has been set up
# encrypt it too.
echo encryptornot >>$INSTALL/log
if [ "$AUTO" ]; then
SERIAL=$(cat $INSTALL/serial)
grep "SERIAL=\"$SERIAL\"" $INSTALL/drives > $INSTALL/drive
. $INSTALL/drive
DRIVEPATH=$NAME
else
. $INSTALL/rootusedpart
grep "PARTUUID=\"$PARTUUID\"" $INSTALL/partitionsoftypelinux >$INSTALL/part
DRIVEPATH=$PKNAME
fi
echo
KEYMAP=$(cat /tmp/Pkeymap|cut -d. -f1)
eval_gettext "The root Slint partition can be encrypted to prevent data
steal in case of loss or theft of the machine or the drive where Slint is
installed. Then you will type a so-called \"passphrase\" to unlock the Slint
partition, giving access to the boot menu. We will record this passphrase"
if [ ! "$KEYMAP" = "us" ]; then
eval_gettext " using a \"us\" keyboard map"
fi
echo "."
unset ENCRYPT
while true; do
eval_gettext "Do you want to encrypt \$NAME? type yes, no or h for help."
echo
clear_stdin
read ANSWER
case "$(to_lower $ANSWER)" in
yes) ENCRYPT="yes"; break;;
no) break;;
h) clear; hintencryptornot;;
*) :
esac
done
}
confirm() {
echo confirm >>$INSTALL/log
if [ "$AUTO" ]; then
. $INSTALL/drive
VEND=$(echo $VENDOR|sed "s/[[:space:]]//g")
MOD=$(echo $MODEL|sed "s/[[:space:]]//g")
CHOSEN="no"
echo
SIZEG=$((SIZE/GIGA))
eval_gettext "We are ready to do what you requested:
Install Slint on this drive:
\$NAME \$VEND \$MOD size \${SIZEG}G"
echo
gettext "All data previously stored on it will be deleted."
echo
else
. $INSTALL/rootusedpart
SIZEG=$((SIZE/GIGA))
FSTYPE=$(cat $INSTALL/rootfstype)
eval_gettext "We are ready to do what you requested:
Install Slint on this partition:
\$NAME, size \${SIZEG}G, file system \$FSTYPE
All data previously stored on it will be deleted but the contents of
other partitions on \$PKNAME will be preserved."
echo
fi
if [ "$ENCRYPT" ]; then
gettext "The root partition will be encrypted."
echo
fi
if [ "$AUTO" ]; then
echo "btrfs" > $INSTALL/rootfstype
ROOTSIZE=$(cat $INSTALL/rootsize)
eval_gettext "The Slint system partition will have a size of \${ROOTSIZE}G."
echo
if [ -f $INSTALL/addedpartsize ]; then
ADDEDPARTSIZE=$(cat $INSTALL/addedpartsize)
ADDEDPARTNAME=$(cat $INSTALL/addedpartname)
eval_gettext "A \"\$ADDEDPARTNAME\" partition of size \${ADDEDPARTSIZE}G will be set up."
echo
fi
if [ $(cat $INSTALL/available) -ne 0 ]; then
AVAILABLE=$(cat $INSTALL/available)
GAVAILABLE=$((AVAILABLE/GIGA))
eval_gettext "A space of size \${GAVAILABLE}G will stay free after the last partition."
echo
fi
fi
if [ -f $INSTALL/windowsusedpart ] || [ -f $INSTALL/linuxusedpart ]; then
gettext "Partitions listed below will be accessible:"
echo
unset root linux windows
[ -f $INSTALL/rootusedpart ] && root=$root
[ -f $INSTALL/windowsusedpart ] && windows=windows
[ -f $INSTALL/linuxusedpart ] && linux=linux
for KIND in $root $linux $windows; do
DRIVES=""
while read partition; do
unset FORMAT
echo "$partition" > $INSTALL/partition
. $INSTALL/partition
if ! echo "$DRIVES" | grep -q "$PKNAME "; then
DRIVES="$DRIVES $PKNAME "
fi
GSIZE=$((SIZE/GIGA))
[ "$KIND" = "root" ] && MOUNTPOINT="/"
echo "$KIND $NAME (${GSIZE}G) $MOUNTPOINT $FSTYPE"
done < $INSTALL/${KIND}usedpart
done
fi
echo
gettext "If you confirm these settings they will be applied,
else you will go back to the greeting screen of the installer."
echo
while true; do
gettext "To confirm these settings type yes, else type no: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
yes)
echo "Version of ISO used for installation: $ISOVERSION" >>$INSTALL/log
break 2;;
no) backtomenu "$(gettext "You can redo a configuration.")";;
*) :
esac
done
}
preparethedrive() {
[ "$MANUAL" ] && return
echo preparethedrive >>$INSTALL/log
echo
eval_gettext "We prepare \$DRIVEPATH to install Slint..."
echo
. $INSTALL/preparedrive
}
encryptthedrive() {
[ ! "$ENCRYPT" ] && return
echo encryptthedrive >>$INSTALL/log
echo
saveterm="$(stty -g)"
eval_gettext "We will now record the passphrase to use to unlock the drive \$DRIVEPATH"
echo
gettext "It should include at least one capital letter, one lower case letter,
one digit and one punctuation sign and have at least 8 characters.
Write it in a safe place first!"
KEYMAP=$(cat /tmp/Pkeymap|cut -d. -f1)
BKEYMAP=$(sed s/map/bmap/ /tmp/Pkeymap)
tar xf /etc/keymaps.tar.gz $BKEYMAP
tar xf /etc/keymaps.tar.gz us.bmap
if [ ! "$KEYMAP" = "us" ]; then
echo
eval_gettext "
You are currently using a \"\$KEYMAP\" keyboard map, but when you will type the
passphrase to unlock the drive a \"us\" keyboard map will be set up. For this
reason we will now display the typed characters using an \"us\" keyboard map.
"
fi
echo
while true; do
gettext "Passphrase (h for help): "
loadkmap < us.bmap
clear_stdin
read PASS
loadkmap < $BKEYMAP
case $PASS in
h) clear; hintpassphrase; continue 2;;
*[!\ 0-9a-zA-Z\'!\"#\$%\&\(\)*+,./:\;\<=\>?@[\]^_\`\{\|\}~\\-]*)
gettext "The passphrase may only contain ASCII characters"
echo
continue 2;;
*) :
esac
if [ ${#PASS} -lt 8 ]; then
echo
gettext "The passphrase should have at least 8 characters."
echo
continue
fi
if ! echo $PASS|grep -q "[a-z]"; then
echo
gettext "The passphrase should include at least one lower case letter."
echo
continue
fi
if ! echo $PASS|grep -q "[A-Z]"; then
echo
gettext "The passphrase should include at least one capital letter."
echo
continue
fi
if ! echo $PASS|grep -q "[0-9]"; then
echo
gettext "The passphrase should include at least one digit."
echo
continue
fi
if ! echo $PASS|grep -q "[[:punct:]]"; then
echo
gettext "The passphrase should include at least one punctuation character."
echo
continue
fi
echo
eval_gettext "Please type again the passphrase, to check: "
loadkmap < us.bmap
clear_stdin
read NEWPASS
loadkmap < $BKEYMAP
if [ ! "$PASS" = "$NEWPASS" ]; then
echo
gettext "Passphrases do not match. please try again."
echo
continue
fi
break
done
echo
gettext "Encrypting the root Slint partition..."
echo
# creating /run/cryptsetup avoid this harmless warning when using luks2
# WARNING: locking directory /run/cryptsetup is missing!
# cf. https://lists.debian.org/debian-boot/2019/02/msg00100.html
# For now we use luks1 but this could change
mkdir -p /run/cryptsetup
chmod 700 /run/cryptsetup
wipefs -af $(cat $INSTALL/rootpartpath)
printf "%s" "$PASS" | cryptsetup luksFormat --type luks1 $(cat $INSTALL/rootpartpath) -
printf "%s" "$PASS" | cryptsetup open $(cat $INSTALL/rootpartpath) cryptroot -
cryptsetup luksUUID $(cat $INSTALL/rootpartpath) >$INSTALL/rootcryptuuid
echo /dev/mapper/cryptroot >$INSTALL/rootpartpath
# If an additional partition was set up in auto mode, we'll encrypt it
# using the same passphrase. Maybe use the argon2i key derival function later.
if [ -f "$INSTALL/addedpartpath" ]; then
printf "%s" "$PASS" | cryptsetup luksFormat --type luks1 $(cat $INSTALL/addedpartpath) -
printf "%s" "$PASS" | cryptsetup open $(cat $INSTALL/addedpartpath) cryptadd -
cryptsetup luksUUID $(cat $INSTALL/addedpartpath) >$INSTALL/addedcryptuuid
echo /dev/mapper/cryptadd >$INSTALL/addedpartpath
fi
# In case of other Linux partitions on the same drive as root one, encrypt
# using the same passphrase those for which a mount point has been set.
}
formatpartitionsandsetswapfile() {
# We will record the UUID of each partition we format so to ease
# writing $SLINT/etc/fstab
echo formatpartitions >>$INSTALL/log
# In case of encryption NAME=/dev/mapper/
ROOTNAME=$(cat $INSTALL/rootpartpath)
FSTYPE=$(cat $INSTALL/rootfstype)
[ "$MANUAL" ] && [ ! "$ENCRYPT" ] && wipefs -fa $ROOTNAME
if [ "$FSTYPE" = "btrfs" ]; then
mkfs.btrfs -L root $ROOTNAME 1>/dev/null 2>>$INSTALL/errors
sleep 1
lsblk -lno uuid $ROOTNAME > $INSTALL/rootuuid
mount -o compress=zstd:3,noatime $ROOTNAME $SLINT
btrfs subvolume create $SLINT/@
btrfs subvolume create $SLINT/@home
btrfs subvolume create $SLINT/@swap
umount $SLINT
mount -o subvol=/@,compress=zstd:3,noatime $ROOTNAME $SLINT
mkdir $SLINT/home
mkdir $SLINT/swap
mount -o subvol=/@home,compress=zstd:3,noatime $ROOTNAME $SLINT/home
if [ -f "$INSTALL/addedpartname" ]; then
ADDEDPARTPATH=$(cat $INSTALL/addedpartpath)
mkfs.btrfs -L added $ADDEDPARTPATH 1>/dev/null 2>>$INSTALL/errors
sleep 1
lsblk -lno uuid $ADDEDPARTPATH > $INSTALL/addeduuid
fi
mount -o subvol=/@swap,compress=zstd:3,noatime $ROOTNAME $SLINT/swap
truncate -s 0 $SLINT/swap/swapfile
# +C=no copy-on-write
# +m=no compression
chattr +C +m $SLINT/swap/swapfile
dd if=/dev/zero of=$SLINT/swap/swapfile bs=${MEGA}c count=1024 status=none
chmod 0600 $SLINT/swap/swapfile
mkswap $SLINT/swap/swapfile
else
label='-L root'
mkfs.$FSTYPE -q $label $ROOTNAME 1>/dev/null
lsblk -lno uuid $ROOTNAME > $INSTALL/rootuuid
mount -o noatime $ROOTNAME $SLINT
dd if=/dev/zero of=$SLINT/swapfile bs=${MEGA}c count=1024 status=none
chmod 600 $SLINT/swapfile
mkswap $SLINT/swapfile 1>>$INSTALL/log
fi
}
installaaabaseandfixperms() {
echo "installaaabaseandfixperms" >> $INSTALL/log
# Until I fix the perms in the aaa_base package...
spkg --root $SLINT -qq -i $ISO/slint/aaa_base*txz
(cd $SLINT
ls |while read dir; do chown -R root:root $dir; done
chown root:mail var/spool/mail
chmod 1777 tmp
chmod 1777 var/spool/mail
)
}
setmountpoints() {
echo "setmountpoints" >>$INSTALL/log
if [ -f "$INSTALL/addedpartname" ]; then
mkdir -p $SLINT/$(cat $INSTALL/addedpartname)
fi
[ ! -f $INSTALL/windowsusedpart ] && return
echo $0 >>$INSTALL/log
while read windowspart; do
echo "$windowspart" > $INSTALL/partition
. $INSTALL/partition
mkdir -p $SLINT/$MOUNTPOINT
done < $INSTALL/windowsusedpart
[ ! -f $INSTALL/linuxusedpart ] && return
while read linuxpart; do
unset FORMAT
echo "$linuxpart" > $INSTALL/partition
. $INSTALL/partition
mkdir -p $SLINT/$MOUNTPOINT
done < $INSTALL/linuxusedpart
}
installfirstpackages() {
echo "installfirtspackages" >>$INSTALL/log
echo
PKGLISTS=/tmp/PKGLISTS
mkdir -p $PKGLISTS
echo $0 >>$PKGLISTS/loginstall
SRCPATH=$ISO/slint || exit 1
(cd $SRCPATH
Liste="devs \
aaa_libraries \
aaa_terminfo \
coreutils \
etc \
bash \
glibc-solibs \
glibc-zoneinfo \
glibc \
glibc-i18n \
shadow \
brltty \
dhcpcd \
ncurses \
dialog \
findutils \
grep \
gettext \
gettext-tools \
sed \
salixtools \
slint-user-settings \
sysvinit-scripts \
pam \
pam-krb5"
gettext "Installing the first software packages..."
echo
for i in $Liste; do
PKG=$(ls|grep "${i}-[^-]*-[^-]*-[^-]*.t.z")
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint $PKG
spkg --root $SLINT -qq --no-gtk-update-icon-cache -i $PKG 1>>$PKGLISTS/loginstall 2>>$PKGLISTS/loginstall
done
echo
)
}
installkeyfile() {
[ ! "$ENCRYPT" ] && return
echo "installkeyfile" >>$INSTALL/log
# We will just use the passphrase as keyfile, thus if the keyfile is lost
# or damaged the user can still unlock the partition typing the passphrase.
gettext "Generating a decryption keyfile..."
echo
mkdir -p $SLINT/etc/keys
dd if=/dev/random of=$SLINT/etc/keys/$KEYFILE bs=512 count=1 1>>$INSTALL/log 2>/dev/null
chmod 600 $SLINT/etc/keys/$KEYFILE
# We won't need $SLINT/etc/keys/$KEYFILE to unlock /, as we'll store the
# key in the initramfs to unlock the file system, but will copy it
# in the initrd and it will serve to open other Linux partitions than /
# in the drive to which / belongs.
cat <<-EOF >$SLINT/etc/keys/WARNING
Do not touch the files in the directory else you will need to type a
passphrase to unlock each partition.
EOF
cp $SLINT/etc/keys/$KEYFILE $SLINT/etc/keys/root$KEYFILE
printf "%s" "$PASS" | cryptsetup luksAddKey /dev/disk/by-uuid/$(cat $INSTALL/rootcryptuuid) $SLINT/etc/keys/root$KEYFILE -
chmod 600 $SLINT/etc/keys/root$KEYFILE
echo /dev/mapper/cryptroot > $INSTALL/rootpart
if [ -f "$INSTALL/addedpartpath" ]; then
cp $SLINT/etc/keys/$KEYFILE $SLINT/etc/keys/add$KEYFILE
printf "%s" "$PASS" | cryptsetup luksAddKey /dev/disk/by-uuid/$(cat $INSTALL/addedcryptuuid) $SLINT/etc/keys/add$KEYFILE -
chmod 600 $SLINT/etc/keys/add$KEYFILE
echo /dev/mapper/cryptadd > $INSTALL/addedpartpath
fi
}
fstab() {
echo fstab >>$INSTALL/log
FSTAB=$SLINT/etc/fstab
touch /etc/fstab
if [ -f $INSTALL/esppath ]; then
ESPPATH=$(cat $INSTALL/esppath)
UUID=$(lsblk -nlo uuid $ESPPATH)
echo "# Initially $ESPPATH" >>$FSTAB
echo "UUID=$UUID /boot/efi vfat defaults 1 0" >>$FSTAB
fi
ROOTPARTPATH=$(cat $INSTALL/rootpartpath)
UUID=$(blkid -s UUID -o value $ROOTPARTPATH)
FSTYPE=$(cat $INSTALL/rootfstype)
if [ "$FSTYPE" = "btrfs" ]; then
echo "# Initially $ROOTPARTPATH" >>$FSTAB
echo "UUID=$UUID / btrfs subvol=/@,compress=zstd:3,noatime 0 0" >>$FSTAB
echo "# Initially $ROOTPARTPATH" >>$FSTAB
echo "UUID=$UUID /home btrfs subvol=/@home,compress=zstd:3,noatime 0 0" >>$FSTAB
echo "# Initially $ROOTPARTPATH" >>$FSTAB
echo "UUID=$UUID /swap btrfs subvol=/@swap,compress=zstd:3,noatime 0 0" >>$FSTAB
echo "/swap/swapfile none swap pri=5 0 0" >>$FSTAB
if [ -f $INSTALL/addedpartname ]; then
ADDEDPARTPATH=$(cat $INSTALL/addedpartpath)
UUID=$(blkid -s UUID -o value $ADDEDPARTPATH)
echo "# Initially $ADDEDPARTPATH" >>$FSTAB
echo "UUID=$UUID /$ADDEDPARTNAME btrfs compress=zstd:3,noatime 0 0" >>$FSTAB
mkdir -p $SLINT/$ADDEDPARTNAME
fi
else
FSTYPE=$(cat $INSTALL/rootfstype)
echo "# Initially $NAME" >>$FSTAB
echo "UUID=$UUID / $FSTYPE noatime 1 1" >>$FSTAB
echo "/swapfile none swap pri=5 0 0" >>$FSTAB
fi
if [ -f $INSTALL/linuxusedpart ] \
&& [ $(cat $INSTALL/linuxusedpart|wc -l) -ne 0 ]; then
while read linuxpart; do
echo "$linuxpart" > $INSTALL/partition
MOUNTPOINT=""
. $INSTALL/partition
[ ! "$MOUNTPOINT" ] && continue
UUID=$(lsblk -nlo uuid $NAME)
FSTYPE=$(lsblk -nlo fstype $NAME)
if [ "$FSTYPE" = "btrfs" ]; then
echo "# Initially $NAME" >>$FSTAB
echo "UUID=$UUID $MOUNTPOINT $FSTYPE compress=zstd:3,noatime 0 0" >>$FSTAB
elif [ "$FSTYPE" = "f2fs" ]; then
echo "# Initially $NAME" >>$FSTAB
echo "UUID=$UUID $MOUNTPOINT $FSTYPE noatime,fsync_mode=strict 1 2" >>$FSTAB
else
echo "# Initially $NAME" >>$FSTAB
echo "UUID=$UUID $MOUNTPOINT $FSTYPE noatime 1 2" >>$FSTAB
fi
mkdir -p $SLINT/$MOUNTPOINT
done < $INSTALL/linuxusedpart
fi
if [ -f $INSTALL/windowsusedpart ]; then
while read windowspart; do
MOUNTPOINT=""
echo "$windowspart" > $INSTALL/partition
. $INSTALL/partition
[ ! "$MOUNTPOINT" ] && continue
UUID=$(lsblk -nlo uuid $NAME)
FSTYPE=$(lsblk -nlo fstype $NAME)
[ "$FSTYPE" = "ntfs" ] && FSTYPE=ntfs3
echo "# Initially $NAME" >>$FSTAB
echo "UUID=$UUID $MOUNTPOINT $FSTYPE noatime,$OPTIONS 1 2" >>$FSTAB
done < $INSTALL/windowsusedpart
fi
echo "devpts /dev/pts devpts gid=5,mode=620 0 0" >>$FSTAB
echo "proc /proc proc defaults 0 0" >>$FSTAB
echo "tmpfs /dev/shm tmpfs nosuid,nodev,noexec 0 0" >>$FSTAB
echo "tmpfs /tmp tmpfs rw,nodev,nosuid,mode=1777 0 0" >>$FSTAB
}
crypttab() {
if [ "$ENCRYPT" ] && [ -f $INSTALL/addedpartpath ]; then
echo "crypttab" >>$INSTALL/log
echo "cryptadd UUID=$(cat $INSTALL/addedcryptuuid) /etc/keys/add$KEYFILE luks" >$SLINT/etc/crypttab
fi
}
a11ysettings() {
echo a11ysettings >>$INSTALL/log
# Create the group braille for brlapi.
# We do this as soon as bash is installed (so we can chroot) and shadow
# is installed (so can we run groupadd through chroot)
chroot $SLINT ldconfig
chroot $SLINT groupadd -fg 610 braille
# Create the group and user lightdm for lightdm.
chroot $SLINT groupadd -fg 620 lightdm
chroot $SLINT useradd -c "Light Display Manager" -d /var/lib/lightdm -u 620 -g lightdm -G audio,braille -s /sbin/nologin lightdm
# Make gdm a member of the audio and braille groups
chroot $SLINT usermod -a -G audio,braille gdm
# Set the sound card that was probed in rc.S
if [ -f /tmp/asound.conf ]; then
cp /tmp/asound.conf $SLINT/etc/
chroot $SLINT chmod 644 /etc/asound.conf
fi
}
setpasswd() {
echo setpasswd >>$INSTALL/log
echo
saveterm="$(stty -g)"
if [ $# -eq 0 ]; then
THISUSER="root"
rm -f /tmp/u
gettext "The user \"root\" has all rights on the system, including to wipe it.
This status should be accessed only with a good password."
echo
else
THISUSER="$1"
fi
while true; do
eval_gettext "Please type the password for \$THISUSER: "
stty -echo 2>/dev/null
trap "stty $saveterm" EXIT
clear_stdin
read ANSWER
stty $saveterm
if [ ${#ANSWER} -lt 6 ]; then
echo
gettext "The password should have at least 6 characters."
continue
fi
echo
eval_gettext "Please type again the password for \$THISUSER, to check: "
stty -echo 2>/dev/null
trap "stty $saveterm" EXIT
clear_stdin
read NEWANSWER
stty $saveterm
if [ ! "$ANSWER" = "$NEWANSWER" ]; then
echo
gettext "Passwords do not match. please try again."
echo
continue
fi
break
done
echo "$THISUSER:$ANSWER" >> /tmp/u
unset -v THISUSER ANSWER
}
createregularuser() {
echo createregularuser >>$INSTALL/log
echo
echo
ADDGROUPS="audio,braille,cdrom,floppy,input,lp,netdev,plugdev,polkitd,power,scanner,video,wheel"
gettext "We will now set up an account for a regular user.
Other user accounts can be set up after installation.
We need to know under which name this user will log in to access Slint."
echo
# requirements for a portable user name: portable file name not beginning qith a :
# https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_437
# https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282
# In addition we 'useradd' e do not allow a nor capital letters.
while true; do
gettext "Login name of the first registered user: "
clear_stdin
read LOGIN
case $LOGIN in
"") continue;;
_*) gettext "The username should not begin with a '_'"; echo; continue;;
h) clear; hintusername; continue;;
*[!0-9a-z_-]*)
gettext "The user name should only contains non accented lower case letters, digits
from 0 to 9, '_' or '-'"; echo; continue;;
*) break
esac
done
chroot $SLINT /usr/sbin/useradd -s /bin/bash -g 100 -G $ADDGROUPS -m -k /etc/skel -u 1000 $LOGIN
echo $LOGIN>$INSTALL/firstuserlogin
setpasswd "$LOGIN"
chroot $SLINT chmod 711 /home/$LOGIN
echo
}
brlttyornot() {
echo brlttyornot >>$INSTALL/log
echo
gettext "Blind users can run Slint with a Braille device or a screen reader."
echo
while true; do
gettext "Will you use a Braille device? Please answer yes or no: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
yes) chroot $SLINT chmod 0755 /etc/rc.d/rc.brltty; break;;
no) chroot $SLINT chmod 0644 /etc/rc.d/rc.brltty; break;;
*) :
esac
done
echo
}
startupmode() {
echo startupmode >>$INSTALL/log
# Choose the startup mode
gettext "Do you want to start Slint in a console or in graphical mode?"
echo
while true; do
gettext "Type c for console or g for graphical, or h for help then press Enter: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
c) sed "/:initdefault:/s/.*/id:3:initdefault:/" $SLINT/etc/inittab > bof
mv bof $SLINT/etc/inittab
break;;
g) sed "/:initdefault:/s/.*/id:4:initdefault:/" $SLINT/etc/inittab > bof
mv bof $SLINT/etc/inittab
break;;
h) clear; hintloginmode;;
*) :
esac
done
}
defaultlocale() {
# Set the default locale for the installed system,
if echo "$LOCALES"|grep -q " $LANG " && [ ! "$LANG" = "en_US.utf8" ]; then
chroot $SLINT /usr/sbin/localesetup $LANG 1>>$INSTALL/log
else
gettext "In the next dialog, you will choose the language for your Slint System."
echo
gettext "Press Enter to continue:"
chroot $SLINT /usr/sbin/localesetup
echo "chroot $SLINT /usr/sbin/localesetup $LANG" >>$INSTALL/log
clear
gettext "Please wait..."
fi
InstalledLang=$(sed -n "/^export LANG=/s/.*=\(.*\)/\1/p" $SLINT/etc/profile.d/lang.sh)
ll_TT=${InstalledLang%.*}
}
noipv6() {
echo noipv6 >>$INSTALL/log
if ! grep -q ^ipv4only /etc/dhcpcd.conf; then
echo "ipv4only" >> /etc/dhcpcd.conf
fi
}
wired() {
echo wired >>$INSTALL/log
rm -f /tmp/connected
LISTETH=$(for i in $(ls /sys/class/net/|grep -v lo); do
if [ ! -d /sys/class/net/$i/wireless ]; then
echo $i;
fi
done)
NUMETH=$(echo "$LISTETH"|wc -l)
if [ $NUMETH -eq 0 ]; then
return
elif [ $NUMETH -eq 1 ]; then
dhcpcd -k $LISTETH 2>/dev/null
dhcpcd -t 10 $LISTETH 1>/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
touch /tmp/connected
fi
else
echo "$LISTETH"|while read ETH; do
dhcpcd -t 10 $ETH 1>/dev/null 2>/dev/null
if [ $? -eq 0 ]; then
touch /tmp/connected
fi
done
fi
if [ ! -f /tmp/connected ]; then
FAILED=1
return
else
trytoget $SLINTREPO/GPG-KEY
if [ "$FAILED" ]; then
rm -f /tmp/connected
echo "Wired connection failed" >> $INSTALL/errors
fi
fi
}
wireless() {
[ -f /tmp/connected ] && return
echo wireless >>$INSTALL/log
echo "wireless" >>$INSTALL/log
echo
gettext "An internet connection would allow to get software packages newer than
those shipped with the installer, but we couldn't get a wired connection."
echo
while true; do
gettext "Should we try to get a wifi connection? Please type yes or no: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
yes) break ;;
no) return 1 ;;
*) :
esac
done
rm -rf .links
# Just in case
killall NetworkManager 2>/dev/null
rfkill unblock all
killall wpa_supplicant 2>/dev/null
gettext "Scanning the wifi networks..."
echo
IFACELIST=$(for dir in /sys/class/net/*/wireless; do
if [ -d "$dir" ]; then
basename "$(dirname "$dir")"
fi
done)
for IFACE in $IFACELIST; do
dhcpcd -k $IFACE 1>>$INSTALL/log 2>>$INSTALL/log
ifconfig $IFACE down
# To avoid timeouts waiting for a carrier (ArchWiki)
iwconfig $IFACE channel auto
ifconfig $IFACE up
iwlist $IFACE scanning 1>$INSTALL/raw
if grep -q "No scan results" $INSTALL/raw; then
echo "No wifi networks found" >>$INSTALL/raw
return 1
fi
echo "Scan of $IFACE done" >> $INSTALL/log
echo >> $INSTALL/log
tac $INSTALL/raw > $INSTALL/war
grep -e Address -e ESSID -e Encryption -e PSK $INSTALL/war|sed 's/^[[:space:]]\{1,\}//' > $INSTALL/dummy
ENCKEY=0
PSK=0
while read line; do
if echo $line|grep -q Address; then
if [ "$NETWORK" ]; then
ADDRESS=$(echo $line|grep Address|sed "s/.*Address: //")
echo "ADDRESS=\"$ADDRESS\" SSID=\"$NETWORK\" ENCKEY=$ENCKEY PSK=$PSK" >> $INSTALL/netlist$IFACE
ENCKEY=0
PSK=0
fi
fi
if echo $line|grep -q ESSID; then
NETWORK="$(echo $line|sed 's/ESSID://;s/"//g')"
fi
if echo $line|grep -q "Encryption key:on"; then
ENCKEY=1
fi
if echo $line|grep -q "PSK"; then
PSK=1
fi
done < $INSTALL/dummy
sed "s/.\{1,\}/& IFACE=$IFACE/" $INSTALL/netlist$IFACE >>$INSTALL/netlist
done
if [ ! -s $INSTALL/netlist ]; then
gettext "No wifi network detected."
return 1
fi
SSID=""
while true; do
gettext "SSID (network name) or l to get a list: "
# backspace works only in the current line of input.
setterm --linewrap off
clear_stdin
read ANSWER
setterm --linewrap on
if [ "$(to_lower $ANSWER)" = "l" ]; then
sort $INSTALL/netlist|uniq|cut -d'"' -f4
elif grep -q \"$ANSWER\" $INSTALL/netlist; then
SSID="$ANSWER"
grep \"$SSID\" $INSTALL/netlist|head -n 1 > $INSTALL/network
break
else
gettext "Wrong SSID."
echo
gettext "Press Enter to try again or type q to give up: "
read ANSWER
if [ "$(to_lower ANSWER)" = "q" ]; then
return 1
fi
fi
done
. $INSTALL/network
if [ $PSK -eq 1 ]; then
while true; do
gettext "Passphrase: "
if [ "$DISPLAYPASS" = "no" ]; then
stty -echo
trap 'stty +echo' EXIT
fi
clear_stdin
read ANSWER
if [ "$DISPLAYPASS" = "no" ]; then
echo
stty +echo
fi
if [ "$(to_lower $ANSWER)" = "q" ]; then
return 1
fi
if [ ${#ANSWER} -lt 8 ] || [ ${#ANSWER} -gt 63 ]; then
gettext "A WPA passphrase should have between 8 and 63 characters"
echo
continue
fi
wpa_passphrase "$SSID" "$ANSWER"|sed '
/#/d
/{/i\
ap_scan=1
/psk/i\
scan_ssid=1' > $INSTALL/wpa
wpa_supplicant -B -i $IFACE -Dnl80211,wext -c $INSTALL/wpa 1>>$INSTALL/log 2>>$INSTALL/log
if [ $? -ne 0 ]; then
gettext "Wrong passphrase. Press Enter to try again or type q to quit: "
clear_stdin
read ANSWER
if [ "$(to_lower $ANSWER)" = "q" ]; then
return 1
fi
clear
fi
gettext "Please wait..."
echo
dhcpcd $IFACE 1>>$INSTALL/log 2>>$INSTALL/log
if [ $? -ne 0 ]; then
gettext "Wifi connection failed. Wrong passphrase?"
echo
eval_gettext "Press Enter to try again or type q to quit: "
clear_stdin
read ANSWER
if [ "$(to_lower $ANSWER)" = "q" ]; then
return 1
else
killall wpa_supplicant 2>/dev/null
continue
fi
fi
touch /tmp/connected
return
done
elif [ $ENCKEY -eq 0 ]; then
iwconfig $IFACE essid "$SSID" 1>>$INSTALL/log 2>>$INSTALL/log
iwconfig $IFACE key off
iwconfig $IFACE ap $ADDRESS
dhcpcd $IFACE 1>>$INSTALL/log 2>>$INSTALL/log
if [ $? -ne 0 ]; then
echo "Wifi connection failed" >> $INSTALL/log
return 1
fi
unset ANSWER
while true; do
eval_gettext "Are credentials requested to use \$SSID? Type yes or no: "
clear_stdin
read ANSWER
case "$(to_lower $ANSWER)" in
yes) break;;
no) wget --spider ipinfo.io
if [ $? -eq 0 ]; then
touch /tmp/connected
return
else
gettext "Wifi connection failed."
echo
return
fi;;
*) continue
esac
done
gettext "You will now type the credentials in a web browser."
echo
gettext "When done press Q to quit the browser."
echo
while true; do
gettext "Press Enter to start the browser or type h for help on its usage: "
clear_stdin
read ANSWER
if [ "$(to_lower $ANSWER)" = "h" ]; then
clear
hintlinks
continue
fi
links -ssl.certificates 0
break
done
wget --spider ipinfo.io
if [ $? -eq 0 ]; then
touch /tmp/connected
fi
return
else
while true; do
while true; do
eval_gettext "Please type the password for \$SSID, or q to give up using wifi: "
if [ "$DISPLAYPASS" = "no" ]; then
stty -echo
trap 'stty +echo' EXIT
fi
# backspace works only in the current line of input.
setterm --linewrap off
clear_stdin
read ANSWER
setterm --linewrap on
if [ "$DISPLAYPASS" = "no" ]; then
echo
stty +echo
fi
if [ "$(to_lower $ANSWER)" = "q" ]; then
return 1
fi
if [ ! "$ANSWER" ]; then
gettext "A password is requested."
echo
fi
break
done
iwconfig $IFACE essid "$SSID"
iwconfig $IFACE key $ANSWER 2>$INSTALL/keyerror
if grep -q Encode $INSTALL/keyerror; then
gettext "Wrong password. Try again."
echo
continue
fi
break
done
unset ANSWER
iwconfig $IFACE ap $ADDRESS
dhcpcd $IFACE 1>>$INSTALL/log 2>>$INSTALL/log
if [ $? -ne 0 ]; then
echo "Wifi connection failed."
return
fi
if ! grep -q nameserver /etc/resolv.conf; then
echo "Wifi connection failed."
return
fi
touch /tmp/connected
fi
}
settimezone() {
echo settimezone >>$INSTALL/log
echo
gettext "Setting of the time zone."
echo
unset PROPOSEDTZ
if [ -f /tmp/connected ]; then
PROPOSEDTZ=$(wget -O - ipinfo.io 2>/dev/null|grep "timezone"|cut -d'"' -f4)
fi
if [ "$PROPOSEDTZ" ]; then
while true; do
eval_gettext "Is \$PROPOSEDTZ the current time zone? type yes or no: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
yes) rm -f $SLINT/localtime-copied-from
rm -f $SLINT/localtime
ln -sf $SLINT/usr/share/zoneinfo/$PROPOSEDTZ $SLINT/etc/localtime-copied-from
cp $SLINT/etc/localtime-copied-from $SLINT/etc/localtime
echo "# This file just says if localtime or UTC is set." >$SLINT/etc/hardwareclock
echo "# Do not edit it manually, use clocksetup or gtkclocksetup instead." >>$SLINT/etc/hardwareclock
echo >>$SLINT/etc/hardwareclock
echo UTC >>$SLINT/etc/hardwareclock
return;;
no) break ;;
*) :
esac
done
else
gettext "You can set the time zone now, or accept the default value (UTC) and modify
this setting after installation."
echo
while true; do
gettext "To set the time zone now type yes, else type no: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
yes) chroot $SLINT clocksetup -c -z; return;;
no) rm -f $SLINT/localtime-copied-from
rm -f localtime
ln -sf $SLINT/usr/share/zoneinfo/UTC $SLINT/etc/localtime-copied-from
cp $SLINT/etc/localtime-copied-from $SLINT/etc/localtime
echo "# This file just says if localtime or UTC is set." >$SLINT/etc/hardwareclock
echo "# Do not edit it manually, use clocksetup or gtkclocksetup instead." >>$SLINT/etc/hardwareclock
echo >>$SLINT/etc/hardwareclock
echo UTC >>$SLINT/etc/hardwareclock
return;;
*) :
esac
done
fi
}
setlocales () {
echo setlocales >>$INSTALL/log
ll_TT=${LANG%.*}
case $ll_TT in
de_DE) lo="de";asp="de";;
el_GR) lo="el";asp="el";;
en_US) lo="";asp="";;
es_CR) lo="es";asp="es";;
fr_FR) lo="fr";asp="fr";;
it_IT) lo="it";asp="it";;
nb_NO) lo="nb";asp="nb";; # Norwegian Bokmal
nl_NL) lo="nl";asp=n"l";;
pl_PL) lo="pl";asp="pl";;
pt_BR) lo="pt-BR";asp="pt_BR";;
pt_PT) lo="pt";asp="pt_PT" ;;
ru_RU) lo="ru";asp="ru";;
sv_SE) lo="sv";asp="sv";;
tr_TR) lo="tr";asp="tr";;
uk_UA) lo="uk";asp="uk";;
af*) lo="";asp="af";; # Afrikaans
ar_MA) lo="ar";asp="";; # Arabic (Morocco)
ar_SY) lo="ar";asp="";; # Arabic (Syria)
ar*) lo="ar";asp="";; # Arabic
ast*) lo="ast";asp="ast";; # Asturian (Asturianu)
az*) lo="";asp="az";; # Azerbaidjani
bg*) lo="bg";asp="bg";; # Bulgarian
bs*) lo="bs";asp="";; # Bosnian
ca*) lo="ca";asp="ca";; # Catalan
csb*) lo="";asp="csb";; # Kashubian (Kaszëbsczi)
cs*) lo=cs;asp="cs";; # Czech
cy*) lo="";asp="cy";; # Welsh
da*) lo="da";asp="de";; # Danish
de_AT) lo=d"e";asp="de";; # German (Austria)
de_CH) lo="de";asp="de";; # German (Switzerland)
de*) lo="de";asp="de";; # German
el*) lo="el";asp="el";; # Greek
en_GB) lo="en-GB";asp="";; # English (Great Britain)
en_NG) lo="";asp="";; # English (Nigeria)
en_ZA) lo=e"n_ZA";asp="";; # English (South Africa)
eo) lo="eo";asp="eo";; # Esperanto
es_ES) lo="es";asp="es";; # Spanish (Spain)
es_US) lo="es";asp="es";; # Spanish (USA)
es*) lo"=es";XKBLAYOUT="latam";asp="es";; # Spanish (Others territories, i. e. Latin America)
et*) lo="et";asp="et";; # Estonian
fa*) lo="";asp="fa";; # Farsi aka Persian
fi_*) lo="fi";asp="fi";; # Finnish
fr_CA) lo="fr";asp="fr";; # French (Canada)
fr*) lo="fr";asp="fr";; # French
fy*) lo="";asp="fy";; # Frisian (Frysk)
ga*) lo="";asp="ga";; # Irish (Gaeilge)
gd*) lo="";asp="gd";; # Scottish Gaelic (Gàidhlig)
gl*) lo="gl";asp="gl";; # Galician (Galego)
grc*) lo="";asp=grc;; # Ancient Greek (but no matching locale in glibc)
gu*) lo="gu";asp="gu";; # Gujarati (ગુજરાતી)
gv*) lo="";asp="gv";; # Manx Gaelic
hi*) lo="hi";asp="hi";; # Hindi (mostly India)
hr*) lo="hr";asp="hr";; # Croatian
hus*) lo="";asp="hus";; # Huastec (Tenek) (but no matching locale in glibc)
hu*) lo="hu";asp="hu";; # Hungarian
hy*) lo="";asp="hy";; # Armenian
ia*) lo="";asp="ia";; # Interlingua
id*) lo="id";asp="id";; # Indonesian
is*) lo="is";asp="is";; # Icelandic
ja*) lo="ja";asp="";; # Japanese
kk*) lo="kk";asp="";; # Kazakh
km*) lo="km";asp="";; # Central Khmer
kn*) lo="";asp="kn";; # Kannada
ko_*) lo="ko";asp="";; # Korean
ku*) lo="";asp="ku";; # Kurdi
ky*) lo="";asp="";; # Kyrgyz
a*) lo="";asp="la";; # Latin
lo*) lo="lo";asp="";; # Laotian
lt*) lo="lt";asp="l"t;; # Lithuanian
lv*) lo="lv";asp="lv";; #Latvian
lzh*) lo="zh-TW";asp="";; # Literary Chinese (Republic of China)
mg*) lo="";asp="mg";; # Malagasy
mi*) lo="";asp="mi";; # Maori
mk*) lo="mk";asp="mk";; # Macedonian
ml*) lo="";asp="ml";; # Malayalam
mn_*) lo="mn";asp="mn";; # Mongolian
mr*) lo="";asp="mr";; # Marathi (मराठी)
ms*) lo="";asp=ms;; # Malay
mt*) lo="";asp=mt;; # Maltese
ne*) lo="ne";asp="";; # Nepali
nb*) lo="nb";asp="nb";; # Norwegian (assumed oy be Bokmal)
nds*) lo="";asp="nds";; # Low Saxon
nl*) lo="nl";asp="nl";; # Dutch
nn*) lo="nn";asp="nn";; # Norwegian Nynorsk
ny*) lo="";asp="ny";; # Chichewa (e.g. in Malawi) (but no matching locale in glibc)
or*) lo="";asp="or";; # Oriya (ଓଡ଼ିଆ)
pa*) lo="";asp="pa";; # Punjabi
quz*) lo="";asp="qu";; # Quechua (Runasimi (qheshwa))
ro*) lo="ro";asp="ro";; # Romanian
ru*) lo="ru";asp="ru";; # Russian
sk*) lo="sk";asp="sk";; # Slovak
sl*) lo="sl";asp="sl";; # Slovenian
sr_RS) lo="sr";asp="sr";; # Serbian
rw*) lo="";asp="rw";; # Kinyarwanda
sc*) lo="";asp="sc";; # Sardinia
sv*) lo="sv";asp="sv";; # Swedish
sw_KE) lo="";asp="sw";; # Swahili (Kenya)
sw_TZ) lo="";asp="sw";; # Swahili (Tanzania)
ta*) lo="ta";asp="ta";; # Tamil
tet*) lo=""; asp="tet";; # Tetum (East Timor) (but no matching locale in glibc)
te*) lo="";asp="te";; # Telugu
th*) lo="";asp="";; # Thai
tk*) lo=""; asp="tk";; # Turkmen
tl*) lo="";asp="tl";;# Tagalog
tr*) lo="tr";asp="tr";; # Turkish
ug*) lo="ug";asp="";; # Uighur
ur_PK) lo="";asp="";; # Urdu (Pakistan)
uz*) lo="";asp="uz";; # Uzbek
vi*) lo="vi";asp="vi";; # Vietnamese
wa*) lo="";asp="wa";; # Walloon
yy*) lo="";asp="yi";; # Yiddish
wo_SN) lo="";asp="";; # Wolof (Senegal)
zh_CN) lo="zh-CN";asp="";; # Chinese (P.R.C.)
zh_TW) lo="zh-TW";asp="";; # Chinese (Taiwan R.O.C.)
zu*) lo="";asp="zu";; # Zulu
*) lo="en-US";asp="";;
esac
}
displaydescornot() {
echo displaydescornot >>$INSTALL/log
echo
gettext "We will now install all packages. This takes about 10 to 40 minutes."
echo
while true; do
gettext "Do you want a short description of each package during its installation?"
echo
gettext "Please type yes or no: "
clear_stdin
read ANSWER
case $(to_lower $ANSWER) in
yes) DISPLAYNAME=1; break;;
no) echo
gettext "Installing the packages. Please be patient."
echo
break;;
*) :
esac
done
echo
}
installfromweb() {
echo installfromweb >>$INSTALL/log
echo installfromweb >>$PKGLISTS/loginstall
FAILED=""
# The files whose name end in pkg contains paths to the packages in:
# isoslackpkg: the ISO (Slackware packages)
# isoslintpkg: the ISO (Slint packages)
# slintpkg: the Slint repository
# patchespkg: the Slackware repository in /patches
#
# If an internet connection is available we install:
# 1) from patchespkg packages with the same short name in isoslackpkg
# 2) from webslintpkg packages with the same shortname in isoslintpkg and
# packages added since the ISO was released (shortname not found in isoslint),
# 3) from isoslackpkg the packages not installed from patchespkg
# 4) from isoslintpkg the packages not installed from slintpkg, unless removed
# (short name not found in slintpkg)
# We will also upgrade already installed packages, case occurring.
# We won't handle removals and additions of packages in Slackware, as this
# occurs very rarely if ever in the life span of a Slackware release.
# If no internet connection is available we'll just install all packages from
# $ISO, but those already installed.
if [ ! -f /tmp/connected ]; then
FAILED=1
return
else
[ "$DISPLAYNAME" ] && gettext "Preparing packages installation..." && echo
fi
cd $PKGLISTS
trytoget $SLINTREPO/CHECKSUMS.md5
[ "$FAILED" ] && return
mv CHECKSUMS.md5 SLINTREPO.md5
trytoget $PATCHESREPO/CHECKSUMS.md5
[ "$FAILED" ] && return
mv CHECKSUMS.md5 PATCHESREPO.md5
# Exclude the packages in /extra /voices and /locales not shipped in
# isoslintpkg below
grep "txz$" SLINTREPO.md5|grep -v -e "/extra/" -e "/voices/" -e "/locales/" |sed "s@[^.]*[.]@@" > reposlintpkg
while read PKG; do
basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//" >>reposlintbase
done patchespkg
while read PKG; do
basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//" >>patchesbase
done isoslintpkg
cp isoslintpkg isoslintpkg.orig
while read PKG; do
basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//" >>isoslintbase
done isoslackpkg
cp isoslackpkg isoslackpkg.orig
# list the Slackware packages in /patches at another version than in
# the ISO and remove them from the list isoslackpkg
while read PKG; do
BASE=$(basename $PKG)
SHORT=$(echo $BASE|sed "s/-[^-]*-[^-]*-[^-]*$//")
if grep -q "^${SHORT}$" patchesbase && ! grep -q $BASE patchespkg; then
sed -n "/${SHORT}-[^-]*-[^-]*-[^-]*$/p" patchespkg >>webpatchespkg
sed "/${SHORT}-[^-]*-[^-]*-[^-]*$/d" isoslackpkg >bof
mv bof isoslackpkg
fi
done >webslintpkg
sed "/${SHORT}-[^-]*-[^-]*-[^-]*$/d" isoslintpkg >bof
mv bof isoslintpkg
fi
done >webslintpkg
fi
done bof
mv bof isoslintpkg
fi
done < isoslintpkg
#
#echo "Done computing the packages lists, now install the packages"
# First the packages you will get from a remote repository
if [ -s webslintpkg ]; then
echo
while read PKG; do
PKGBASE=${PKG%.t?z}
if ls $SLINT/var/lib/pkgtools/packages|grep -q $PKGBASE; then
echo "$PKG is already installed" >>$PKGLISTS/loginstall
continue
fi
if echo "$PKG"|grep -q "libreoffice-l10n"; then
continue
fi
if echo "$PKG"|grep -q "libreoffice-help"; then
continue
fi
echo "fetching $PKG" >>$PKGLISTS/loginstall
BASE=$(basename $PKG)
trytoget $SLINTREPO/slint/$BASE
if [ "$FAILED" ]; then
rm -f *txz
return
fi
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg --root $SLINT -qq --no-gtk-update-icon-cache --no-ldconfig -i --install-new --reinstall $BASE
if [ $? -ne 0 ]; then
FAILED=1
rm -f *txz
return
fi
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
rm -f *txz
done >$PKGLISTS/loginstall
spkg -i --root $SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
rm -f *txz
FAILED=1
return
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
rm -f *txz
fi
fi
PKG=$(grep "libreoffice-help_${lo}-*t?z" webslintpkg)
if [ "$PKG" ]; then
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
BASE=$(basename $PKG)
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint/locales $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg -i --root $SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
rm -f *txz
FAILED=1
return
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
fi
fi
fi
if [ -s webpatchespkg ]; then
echo
while read PKG; do
BASE=$(basename $PKG)
if ls $SLINT/var/lib/pkgtools/packages|grep -q $BASE; then
echo "$PKG is already installed" >>$PKGLISTS/loginstall
continue
fi
echo "fetching $PKG" >>$PKGLISTS/loginstall
trytoget $PATCHESREPO/$PKG
if [ "$FAILED" ]; then
rm -f *txz
return
fi
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
PKGBASE=${PKG%.t?z}
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg --root $SLINT -qq --no-gtk-update-icon-cache --no-ldconfig -i --install-new --reinstall $BASE 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
SPKGERROR=$(cat $PKGLISTS/spkgerror)
if [ $? -ne 0 ]; then
FAILED=1
rm -f *txz
return
fi
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
rm -f *txz
done
BASE=$(basename $PKG)
SHORT=$(echo $BASE|sed "s/-[^-]*-[^-]*-[^-]*$//")
if [ "$SHORT" = "kernel-huge" ]; then
continue
fi
PKGBASE=${PKG%.t?z}
if ls $SLINT/var/lib/pkgtools/packages|grep -q $PKGBASE; then
echo "$PKG is already installed" >>$PKGLISTS/loginstall
continue
fi
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg --root $SLINT -qq --no-gtk-update-icon-cache --no-ldconfig -i --install-new --reinstall $ISO/slint/$PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >$PKGLISTS/installerror
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerror
gettext "Slint installation can't continue" >>$PKGLISTS/installerror
echo >>$PKGLISTS/installerrors
backtomenu "$(cat $PKGLISTS/installerror)"
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
fi
done
while read PKG; do
# the variable $lo is set according to the language/region by SeTlocales
if echo $PKG|grep -q locales/; then
continue
fi
PKGBASE=${PKG%.t?z}
if ls $SLINT/var/lib/pkgtools/packages|grep -q $PKGBASE; then
echo "$PKG is already installed" >>$PKGLISTS/loginstall
continue
fi
BASE=$(basename $PKG)
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
PKGBASE=${PKG%.t?z}
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg --root $SLINT -qq --no-gtk-update-icon-cache --no-ldconfig -i --install-new --reinstall $ISO/slint/$PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >$PKGLISTS/installerror
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerror
gettext "Slint installation can't continue" >>$PKGLISTS/installerror
echo >>$PKGLISTS/installerrors
backtomenu "$(cat $PKGLISTS/installerror)"
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
fi
done >$PKGLISTS/loginstall
spkg -i --root $SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
FAILED=1
return
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
fi
fi
PKG=$(find $ISO/slint/locales -name "libreoffice-help-${lo}-*t?z")
if [ "$PKG" ]; then
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
BASE=$(basename $PKG)
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint/locales $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg -i --root $SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
FAILED=1
return
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
fi
fi
PKG=$(find $ISO/slint/locales -name "aspell-${asp}-*t?z")
if [ "$PKG" ]; then
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
BASE=$(basename $PKG)
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint/locales $BASE
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg -i --root $SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
FAILED=1
return
else
echo "Installation of $PKG succeeded." >>$PKGLISTS/loginstall
fi
fi
}
installfromiso() {
if [ ! "$FAILED" ]; then
echo "no need to install from ISO" >>$INSTALL/log
return
fi
echo installfromiso >>$INSTALL/log
echo installfromiso >>$PKGLISTS/loginstall
echo
ls $SLINT/var/lib/pkgtools/packages|while read i; do
basename $i|sed "s/-[^-]*-[^-]*-[^-]*$//" >> $PKGLISTS/installed;
done
ls -1 $ISO/slint/*txz|while read PKG; do
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint $PKG
echo "installing $PKG" >>$PKGLISTS/loginstall
spkg --root=$SLINT -qq --no-gtk-update-icon-cache --no-ldconfig -i --install-new --reinstall $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
clear
eval_gettext "Installation of \$PKG failed for this reason:"
echo
echo "$SPKGERROR"
gettext "Therefore, Slint installation is not possible."
echo
gettext "Check the integrity of the installation media."
echo
exit
fi
done
PKG=$(find $ISO/slint/locales -name "libreoffice-l10n-${lo}-*t?z")
if [ "$PKG" ]; then
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
if ! grep -q "^${SHORT}$" $PKGLISTS/installed; then
echo "installing $PKG" >>$PKGLISTS/loginstall
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint/locales $PKG
spkg -i --root=$SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 1>>$PKGLISTS/loginstall 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
return
fi
fi
fi
PKG=$(find $ISO/slint/locales -name "libreoffice-help-${lo}-*t?z")
if [ "$PKG" ]; then
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
if ! grep -q "^${SHORT}$" $PKGLISTS/installed; then
echo "installing $PKG" >>$PKGLISTS/loginstall
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint/locales $PKG
spkg -i --root=$SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
return
fi
fi
fi
PKG=$(find $ISO/slint/locales -name "aspell-${asp}-*t?z")
if [ "$PKG" ]; then
SHORT=$(basename $PKG|sed "s/-[^-]*-[^-]*-[^-]*$//")
if ! grep -q "^${SHORT}$" $PKGLISTS/installed; then
echo "installing $PKG" >>$PKGLISTS/loginstall
[ "$DISPLAYNAME" ] && displaydescription $ISO/slint/locales $PKG
spkg -i --root=$SLINT -qq --no-ldconfig --no-gtk-update-icon-cache $PKG 2>$PKGLISTS/spkgerror
if [ $? -ne 0 ]; then
SPKGERROR=$(cat $PKGLISTS/spkgerror)
echo
eval_gettext "Installation of \$PKG failed for this reason:" >>$PKGLISTS/installerrors
echo >>$PKGLISTS/installerrors
echo "$SPKGERROR" >>$PKGLISTS/installerrors
return
fi
fi
fi
}
bindrootslint() {
echo bindrootslint >>$INSTALL/log
rm -rf /boot
ln -s $SLINT/boot /boot
mount -B /dev $SLINT/dev
mount -B /proc $SLINT/proc
mount -B /sys $SLINT/sys
}
passwords() {
echo passwords >>$INSTALL/log
while read r; do echo $r|chpasswd -R $SLINT; done >$INSTALL/log
# If speech was used during installation, start orca for the registered user
# in graphical desktops.
LOGIN=$(cat $INSTALL/firstuserlogin)
if [ ! -f /tmp/noespeakup ]; then
(cd $SLINT/home/$LOGIN/.config/autostart
sed s/Hidden=true/Hidden=false/ startorca.desktop > bof
mv bof startorca.desktop
cat $SLINT/usr/share/orca/orcaprofile >> $SLINT/home/$LOGIN/.profile
)
chroot $SLINT chown ${LOGIN}: \
/home/$LOGIN/.config/autostart/startorca.desktop
chroot $SLINT chown ${LOGIN}: /home/$LOGIN/.profile
fi
# console and Xkeybord settings
KMAP="$(cat /tmp/Pkeymap)"
chroot $SLINT keyboardsetup -k ${KMAP%.map} 1>>/$INSTALL/log
# write the network configuration files, set Network Manager as connection
# method
echo
gettext "Please type the machine name or \"hostname\" and press Enter or just
press Enter to accept the default name \"slint\"."
echo
gettext "Machine name[slint]: "
clear_stdin
read HOSTNM
export HOSTNM
cp /sbin/nmconfig $SLINT/sbin
chroot $SLINT chmod 0755 /sbin/nmconfig
chroot $SLINT /sbin/nmconfig
# Provide various initial settings
zzz-settings
# Braille settings
if grep -q "brltty=" /proc/cmdline ; then
# If a Braille display was set up in the command line, lets'
# convey these settings in the installed system.
sh /usr/sbin/setup/bp2cf -u -p "$brltty" -f $SLINT/etc/brltty.conf
fi
# Set the graphical session
for filename in $SLINT/usr/share/xsessions/*; do
! grep -q safe $filename && echo ${filename%.*}|sed "s@.*/@@"
done > listesessions
while true; do
gettext "Please select a default desktop among those listed below.
mate is the most accessible with a screen reader."
echo
cat listesessions
gettext "Your choice: "
clear_stdin
read CHOICE
[ ! "$CHOICE" ] && clear && continue
session=$(echo "$CHOICE"|tr '[:upper:]' '[:lower:]')
grep -q $session listesessions && break
clear
gettext "$session is not an available desktops."
sleep 1
clear
done
echo "$session has been chosen."
echo '[Desktop]' > $SLINT/home/$LOGIN/.dmrc
echo "Session=$session" >> $SLINT/home/$LOGIN/.dmrc
case $session in
plasma) xinit=kde;;
lxqt) xinit=lxqt;;
xfce) xinit=xfce;;
mate) xinit=mate;;
wmaker) xinit=wmaker;;
blackbox) xinit=blackbox;;
fvwm) xinit=fvwm2;;
ratpoison) xinit=ratpoison;;
esac
# This is for startx
cp $SLINT/etc/X11/xinit/xinitrc.$xinit $SLINT/home/$LOGIN/.xinitrc
cp $SLINT/etc/X11/xinit/xinitrc.$xinit $SLINT/home/$LOGIN/.xsession
# We need to run setxkbmap just after having started X, so that $DISPLAY
# be set. But in some cases that is easier to do live than when building
# the window manager or desktop.
case $session in
lxqt|mate|ratpoison|xfce) (cd $SLINT/home/$LOGIN
sed '/exec/i \
/usr/bin/setxkbmap' .xinitrc > bof
mv bof .xinitrc);;
*) (cd $SLINT/home/$LOGIN
sed '/DESKTOP_SESSION/i \
/usr/bin/setxkbmap' .xinitrc > bof
mv bof .xinitrc)
esac
chroot $SLINT chown $LOGIN: /home/$LOGIN/.dmrc
chroot $SLINT chown $LOGIN: /home/$LOGIN/.xsession
chroot $SLINT chown $LOGIN: /home/$LOGIN/.xinitrc
echo "Running update_all. Please be patient..."
cp /sbin/update-all $SLINT/sbin
chroot $SLINT chmod 0755 /usr/sbin/update-all
chroot $SLINT /sbin/update-all
mkdir -p $SLINT/boot/efi
# grub will need to access the ESP
chroot $SLINT mount /boot/efi
# set lightdm by default as graphical login manager
chmod 755 $SLINT/usr/sbin/lightdm
echo \
"if [ -x /usr/sbin/lightdm ]; then
if [ -f /var/log/lightdm/startlightdm.log ]; then
mv /var/log/lightdm/startlightdm.log /var/log/lightdm/startlightdm.log.old
fi
exec /usr/sbin/lightdm 2>/var/log/lightdm/startlightdm.log
fi" > $SLINT/etc/rc.d/rc.4.local
chmod 755 $SLINT/etc/rc.d/rc.4.local
echo
}
bootingsetup() {
echo bootingsetup >>$INSTALL/log
# We install in both Legacy and EFI modes.
if [ "$AUTO" ]; then
SERIAL=$(cat $INSTALL/serial)
grep "SERIAL=\"$SERIAL\"" $INSTALL/drives > $INSTALL/drive
. $INSTALL/drive
DRIVEPATH=$NAME
else
. $INSTALL/rootusedpart
grep "PARTUUID=\"$PARTUUID\"" $INSTALL/partitionsoftypelinux >$INSTALL/part
DRIVEPATH=$PKNAME
fi
rootdelay=1
if [ "$(to_lower $TRAN)" = "usb" ]; then
rootdelay=10
fi
gettext "building an initramfs..."
echo
KVER=$(find $SLINT/boot -type f -name "vmlinuz*"|sed "s/.*-//")
if [ $(echo "$KVER"|wc -l) -gt 1 ]; then
echo "Several kernels are installed. Something should be wrong."
exit
fi
if [ ! -d $SLINT/lib/modules/$KVER ]; then
echo "No modules found for the kernel ${KVER}, so no intramfs cannot be built."
exit
fi
if [ "$ENCRYPT" ]; then
sed "/#GRUB_ENABLE_CRYPTODISK/s/.*/GRUB_ENABLE_CRYPTODISK=y/
/GRUB_PRELOAD_MODULES/s/.*/GRUB_PRELOAD_MODULES=\"luks cryptodisk\"/
/^GRUB_DISABLE_LINUX_PARTUUID/s/.*/GRUB_DISABLE_LINUX_PARTUUID=true/
/^GRUB_DISABLE_LINUX_UUID/s/.*/GRUB_DISABLE_LINUX_UUID=false/" $SLINT/etc/default/grub >bof
mv bof $SLINT/etc/default/grub
chroot $SLINT dracut --kver $KVER --zstd -q --install " /etc/keys/$KEYFILE " 2>>$INSTALL/errors
args="rootdelay=$rootdelay rd.luks.key=/etc/keys/$KEYFILE:/ rd.luks.uuid=$(cat $INSTALL/rootcryptuuid)"
else
chroot $SLINT dracut --kver $KVER --zstd -q 2>>$INSTALL/errors
args="rootdelay=$rootdelay"
fi
gettext "Installing the GRUB bootloader..."
echo
chroot $SLINT grub-install --target=i386-pc $DRIVEPATH 1>>$INSTALL/log 2>>$INSTALL/errors
if [ "$EFI" ]; then
chroot $SLINT grub-install --target=x86_64-efi --bootloader-id=slint $DRIVEPATH 1>>$INSTALL/log 2>>$INSTALL/errors
mkdir -p $SLINT/boot/efi/EFI/BOOT
cp $SLINT/boot/efi/EFI/slint/grubx64.efi $SLINT/boot/efi/EFI/BOOT/BOOTx64.EFI
echo "EFI\slint\grubx64" > /SLINT/boot/efi/startup.nsh
fi
echo "GRUB_CMDLINE_LINUX=\"$args\"" >> $SLINT/etc/default/grub
gettext "Building the GRUB boot menu..."
echo
chroot $SLINT /usr/sbin/update-grub 1>>$INSTALL/log 2>>$INSTALL/errors
}
byebye() {
echo byebye >>$INSTALL/log
echo "store in $SLINT/var/log/$INSTALL stuff useful to investigate a booting issue..." >>$INSTALL/log
echo "running alsa-info.sh" >>$INSTALL/log
alsa-info.sh --no-upload --output $INSTALL/alsa-info.out --no-dialog 1>/dev/null 2>>$INSTALL/errors
echo "copying the directory $INSTALL in $SLINT/var/log" >>$INSTALL/log
cp -r $INSTALL $SLINT/var/log/
# Do not store passwords in the installed system ;)
rm -f /tmp/u
echo "coyping /tmp in $SLINT/var/log/$INSTALL" >>$INSTALL/log
cp -r /tmp $SLINT/var/log/$INSTALL/
echo "copying installation scripts in $SLINT/var/log/$INSTALL/installation-scripts" >>$INSTALL/log
mkdir -p $SLINT/var/log/$INSTALL/installation-scripts
cp -f /sbin/functions /sbin/start $SLINT/var/log/$INSTALL/installation-scripts/
echo "copying /var/log/syslog in $SLINT/var/log/$INSTALL/" >>$INSTALL/log
cp /var/log/syslog $SLINT/var/log/$INSTALL/
echo "compressing the directory $INSTALL in /SLINT/var/log/" >>$INSTALL/log
( cd $SLINT/var/log/
tar --use-compress-program xz -cf INSTALLER.xz INSTALLER
)
echo
gettext "Installation and initial configuration of Slint are complete.
If you want a preview of the boot menu displayed after rebooting, type now:
chroot /SLINT list_boot_entries
To exit press q (not Alt+F4 in this context) then y.
To quit the installer and start your new Slint remove the installation media
then type 'reboot' or press Ctrl+Alt+Del."
echo
echo
}