slackware-current/source/installer/sources/initrd/sbin/probe
Patrick J Volkerding 3452074d08 Thu Sep 21 19:32:42 UTC 2023
a/gettext-0.22.2-x86_64-1.txz:  Upgraded.
ap/cups-2.4.7-x86_64-1.txz:  Upgraded.
  This update fixes bugs and a security issue:
  Fixed Heap-based buffer overflow when reading Postscript in PPD files.
  For more information, see:
    https://www.cve.org/CVERecord?id=CVE-2023-4504
  (* Security fix *)
d/cmake-3.27.6-x86_64-1.txz:  Upgraded.
d/gettext-tools-0.22.2-x86_64-1.txz:  Upgraded.
l/dconf-editor-45.0.1-x86_64-1.txz:  Upgraded.
l/gst-plugins-bad-free-1.22.6-x86_64-1.txz:  Upgraded.
l/gst-plugins-base-1.22.6-x86_64-1.txz:  Upgraded.
l/gst-plugins-good-1.22.6-x86_64-1.txz:  Upgraded.
l/gst-plugins-libav-1.22.6-x86_64-1.txz:  Upgraded.
l/gstreamer-1.22.6-x86_64-1.txz:  Upgraded.
l/gtk4-4.12.2-x86_64-1.txz:  Upgraded.
l/imagemagick-7.1.1_17-x86_64-1.txz:  Upgraded.
n/bind-9.18.19-x86_64-1.txz:  Upgraded.
  This update fixes bugs and security issues:
  Limit the amount of recursion that can be performed by isccc_cc_fromwire.
  Fix use-after-free error in TLS DNS code when sending data.
  For more information, see:
    https://kb.isc.org/docs/cve-2023-3341
    https://www.cve.org/CVERecord?id=CVE-2023-3341
    https://kb.isc.org/docs/cve-2023-4236
    https://www.cve.org/CVERecord?id=CVE-2023-4236
  (* Security fix *)
n/stunnel-5.71-x86_64-1.txz:  Upgraded.
x/mesa-23.1.8-x86_64-1.txz:  Upgraded.
x/xorg-server-xwayland-23.2.1-x86_64-1.txz:  Upgraded.
xap/freerdp-2.11.2-x86_64-1.txz:  Upgraded.
xap/mozilla-thunderbird-115.2.3-x86_64-1.txz:  Upgraded.
  This is a bugfix release.
  For more information, see:
    https://www.mozilla.org/en-US/thunderbird/115.2.3/releasenotes/
xap/seamonkey-2.53.17.1-x86_64-1.txz:  Upgraded.
  This update contains security fixes and improvements.
  For more information, see:
    https://www.seamonkey-project.org/releases/seamonkey2.53.17.1
    https://www.cve.org/CVERecord?id=CVE-2023-4863
  (* Security fix *)
2023-09-21 22:14:37 +02:00

487 lines
15 KiB
Bash
Executable file

#!/bin/bash
# This is 'probe', a wrapper for using fdisk to gather drive info for
# the Slackware setup scripts. I hate to bounce this much garbage through
# a tmpdir, but it looks like large variables can make ash crash...
# Many thanks to Vincent Rivellino for contributing the patches to support
# Mylex and Compaq RAID controllers.
# Regularize output that will be parsed:
unset LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY \
LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT \
LC_IDENTIFICATION LC_ALL
LANG=C
export LANG
TMP=/var/log/setup/tmp
# Use cached results if they exist and /proc/partitions has not changed:
if [ -r $TMP/SeTpartition.md5 -a -r $TMP/SeTfdisk ]; then
if [ "$(cat $TMP/SeTpartition.md5)" = "$(md5sum /proc/partitions)" ]; then
cat $TMP/SeTfdisk
exit 0
fi
fi
# First run, or /proc/partitions has changed.
# Make a checksum for later comparison:
md5sum /proc/partitions > $TMP/SeTpartition.md5
# Wipe any previously existing results:
rm -f $TMP/SeTfdisk
# listide major minor hd1 hd2 (2 base devs for major)
list_ide() {
if [ "$2" = "0" ]; then
fdisk -l /dev/$3 >> $TMP/SeTfdisk
elif [ "$2" = "64" ]; then
fdisk -l /dev/$4 >> $TMP/SeTfdisk
fi
}
list_scsi() {
# find drive # 0 - 15
DRV=`expr $1 / 16`
NUM=`expr $1 % 16`
if [ ! "$NUM" = "0" ]; then
return
fi
if [ "$DRV" = "0" ]; then
fdisk -l /dev/sda >> $TMP/SeTfdisk
elif [ "$DRV" = "1" ]; then
fdisk -l /dev/sdb >> $TMP/SeTfdisk
elif [ "$DRV" = "2" ]; then
fdisk -l /dev/sdc >> $TMP/SeTfdisk
elif [ "$DRV" = "3" ]; then
fdisk -l /dev/sdd >> $TMP/SeTfdisk
elif [ "$DRV" = "4" ]; then
fdisk -l /dev/sde >> $TMP/SeTfdisk
elif [ "$DRV" = "5" ]; then
fdisk -l /dev/sdf >> $TMP/SeTfdisk
elif [ "$DRV" = "6" ]; then
fdisk -l /dev/sdg >> $TMP/SeTfdisk
elif [ "$DRV" = "7" ]; then
fdisk -l /dev/sdh >> $TMP/SeTfdisk
elif [ "$DRV" = "8" ]; then
fdisk -l /dev/sdi >> $TMP/SeTfdisk
elif [ "$DRV" = "9" ]; then
fdisk -l /dev/sdj >> $TMP/SeTfdisk
elif [ "$DRV" = "10" ]; then
fdisk -l /dev/sdk >> $TMP/SeTfdisk
elif [ "$DRV" = "11" ]; then
fdisk -l /dev/sdl >> $TMP/SeTfdisk
elif [ "$DRV" = "12" ]; then
fdisk -l /dev/sdm >> $TMP/SeTfdisk
elif [ "$DRV" = "13" ]; then
fdisk -l /dev/sdn >> $TMP/SeTfdisk
elif [ "$DRV" = "14" ]; then
fdisk -l /dev/sdo >> $TMP/SeTfdisk
elif [ "$DRV" = "15" ]; then
fdisk -l /dev/sdp >> $TMP/SeTfdisk
fi
}
# List Mylex RAID device
list_rd() {
# find drive
DRV=`expr $2 / 8`
NUM=`expr $2 % 8`
if [ ! "$NUM" = "0" ]; then
return
fi
fdisk -l /dev/rd/c$1d$DRV >> $TMP/SeTfdisk
#output_gpt_partitions /dev/rd/c$1d$DRV >> $TMP/SeTfdisk
}
# List Cpq SMART/2 RAID device
list_ida() {
# find drive
DRV=`expr $2 / 16`
NUM=`expr $2 % 16`
if [ ! "$NUM" = "0" ]; then
return
fi
fdisk -l /dev/ida/c$1d$DRV >> $TMP/SeTfdisk
#output_gpt_partitions /dev/ida/c$1d$DRV >> $TMP/SeTfdisk
}
list_cciss() {
# find drive
DRV=`expr $2 / 16`
NUM=`expr $2 % 16`
if [ ! "$NUM" = "0" ]; then
return
fi
fdisk -l /dev/cciss/c$1d$DRV >> $TMP/SeTfdisk
#output_gpt_partitions /dev/cciss/c$1d$DRV >> $TMP/SeTfdisk
}
list_ataraid() {
# find drive
DRV=`expr $2 / 16`
NUM=`expr $2 % 16`
if [ "$NUM" = "0" ]; then
fdisk -l /dev/ataraid/d$DRV >> $TMP/SeTfdisk
#output_gpt_partitions /dev/ataraid/d$DRV >> $TMP/SeTfdisk
else
return
fi
}
list_amiraid() {
# find drive
DRV=`expr $2 / 16`
NUM=`expr $2 % 16`
if [ "$NUM" = "0" ]; then
fdisk -l /dev/amiraid/ar$DRV >> $TMP/SeTfdisk
#output_gpt_partitions /dev/amiraid/ar$DRV >> $TMP/SeTfdisk
else
return
fi
}
list_mmc() {
local device
# Filter out any partitions on the block device, as we'll use
# fdisk to capture those:
grep -qE 'mmcblk[0-9]' /proc/partitions && {
lsblk -o name,type -Mripnd /dev/mmcblk* | grep -E 'disk$' | awk '{print $1}' | while read device ; do
fdisk -l $device >> $TMP/SeTfdisk
done ;}
}
list_nvme() {
fdisk -l | grep $1 >> $TMP/SeTfdisk 2> /dev/null
}
is_swap() {
HEADER=$(dd if="$1" bs=1 skip=4086 count=10 2>/dev/null | strings)
if [ "$HEADER" = "SWAPSPACE2" -o "$HEADER" = "SWAP_SPACE" ]; then
return 0
else
return 1
fi
}
list_md() {
if ( is_swap "/dev/$2" ); then TYPE="Linux swap"; else TYPE="Linux"; fi
echo "/dev/$2 1 2 $1 kk $TYPE" >> $TMP/SeTfdisk
}
list_lvm() {
lvscan 2>/dev/null | grep "ACTIVE" | while read line ; do
SMASHED_LINE=$line
if [ "$SMASHED_LINE" = "" ]; then
break;
fi
DEV=`echo $SMASHED_LINE | cut -f2 -d"'"`
SIZE=`lvdisplay $DEV -C --units k --noheadings --separator : | cut -f4 -d':' | sed -e 's/^\([0-9]*\)[^0-9].*/\1/'`
TYPE="Linux"
if ( is_swap "$DEV" ); then TYPE="Linux swap"; fi
echo "$DEV 0 0 $SIZE lv $TYPE" >> $TMP/SeTfdisk
done
}
# List any volumes created by cryptsetup
list_crypt() {
for i in $(/bin/ls /dev/mapper/); do
if cryptsetup status $i 2>/dev/null | grep -wq "cipher:" ; then
DEV=$(cryptsetup status $i | head -n 1 | cut -f 1 -d ' ')
SIZE=$(fdisk -s $(cryptsetup status $i | grep "device:" | cut -f 2 -d : | tr -d ' '))
echo "$DEV 0 0 $SIZE lc Linux" >> $TMP/SeTfdisk
fi
done
}
# List virtual partitions
list_virt() {
fdisk -l /dev/$1 >> $TMP/SeTfdisk
#output_gpt_partitions /dev/$1 >> $TMP/SeTfdisk
}
output_gpt_partitions() {
# First, make sure the device is GPT:
if fdisk -l $1 2> /dev/null | grep -wq -e "GPT" -e "Disklabel type: gpt" ; then
unset output
# In the case of some RAID device like Mylex we will need to delimit the
# partition number. We will set a partition delimiter variable P set
# either to an empty string (default) or the needed delimiter.
TESTRAID="$(echo $1 | cut -f 2 -d /)"
case "$TESTRAID" in
'amiraid' )
P="p"
;;
'ataraid' )
P="p"
;;
'cciss' )
P="p"
;;
'ida' )
P="p"
;;
'rd' )
P="p"
;;
*)
P=""
;;
esac
gdisk -l $1 | tr -d '*' | while read parse ; do
if [ ! -z $output ]; then
line=$parse
if [ ! "$(echo $line | cut -b1)" = "" ]; then
gptpartition=${1}${P}$(echo $line | cut -f 1 -d ' ')
gpttype="$(echo $line | cut -f 6 -d ' ')"
if [ "$gpttype" = "8200" ]; then
fdisktype="Linux swap"
elif [ "$gpttype" = "0700" ]; then
if dd if=$gptpartition bs=1K count=1 2> /dev/null | grep -wq NTFS ; then
fdisktype="HPFS/NTFS"
elif dd if=$gptpartition bs=1K count=1 2> /dev/null | grep -wq EXFAT ; then
fdisktype="exFAT"
else
fdisktype="W95 FAT32"
fi
elif [ "$gpttype" = "AF00" ]; then
fdisktype="HFS+"
elif [ "$gpttype" = "EF00" ]; then
fdisktype="EFI System Partition"
elif [ "$gpttype" = "8300" ]; then
fdisktype=Linux
else
fdisktype="Unknown hex code $gpttype"
fi
sectorsize="$(gdisk -l $1 | tr -d '*' | grep "Logical sector size" | cut -f 2 -d : | cut -f 2 -d ' ')"
gptstart="$(expr $(echo $line | cut -f 2 -d ' ') \* $sectorsize / 1024)"
gptend="$(expr $(echo $line | cut -f 3 -d ' ') \* $sectorsize / 1024)"
gptsize="$(expr $gptend - $gptstart)"
echo $gptpartition $gptstart $gptend $gptsize $gpttype $fdisktype
fi
fi
if echo $parse | grep -q "^Number" ; then
output=true
fi
done
fi
}
list_scsi_gpt() {
# find drive # 0 - 15
DRV=`expr $1 / 16`
NUM=`expr $1 % 16`
if [ ! "$NUM" = "0" ]; then
return
fi
if [ "$DRV" = "0" ]; then
output_gpt_partitions /dev/sda
elif [ "$DRV" = "1" ]; then
output_gpt_partitions /dev/sdb
elif [ "$DRV" = "2" ]; then
output_gpt_partitions /dev/sdc
elif [ "$DRV" = "3" ]; then
output_gpt_partitions /dev/sdd
elif [ "$DRV" = "4" ]; then
output_gpt_partitions /dev/sde
elif [ "$DRV" = "5" ]; then
output_gpt_partitions /dev/sdf
elif [ "$DRV" = "6" ]; then
output_gpt_partitions /dev/sdg
elif [ "$DRV" = "7" ]; then
output_gpt_partitions /dev/sdh
elif [ "$DRV" = "8" ]; then
output_gpt_partitions /dev/sdi
elif [ "$DRV" = "9" ]; then
output_gpt_partitions /dev/sdj
elif [ "$DRV" = "10" ]; then
output_gpt_partitions /dev/sdk
elif [ "$DRV" = "11" ]; then
output_gpt_partitions /dev/sdl
elif [ "$DRV" = "12" ]; then
output_gpt_partitions /dev/sdm
elif [ "$DRV" = "13" ]; then
output_gpt_partitions /dev/sdn
elif [ "$DRV" = "14" ]; then
output_gpt_partitions /dev/sdo
elif [ "$DRV" = "15" ]; then
output_gpt_partitions /dev/sdp
fi
}
# List the LVM volumes:
list_lvm
# List CRYPT volumes:
list_crypt
# List MMC (e.g. SD cards) partitions:
list_mmc
## This is obsolete, since fdisk handles GPT now.
## List GPT partitions:
#cat /proc/partitions | while read line ; do
# SMASHED_LINE=$line
# MAJOR=`echo $SMASHED_LINE | cut -f 1 -d ' '`
# MINOR=`echo $SMASHED_LINE | cut -f 2 -d ' '`
# if [ "$MAJOR" = "8" ]; then
# list_scsi_gpt $MINOR
# fi
#done
# Other partitions:
if cat /proc/partitions | grep -E '/|[0-9]' 1>/dev/null 2>/dev/null ; then # new
cat /proc/partitions | grep -E '/|[0-9]' | while read line ; do
SMASHED_LINE=$line
MAJOR=`echo $SMASHED_LINE | cut -f 1 -d ' '`
MINOR=`echo $SMASHED_LINE | cut -f 2 -d ' '`
DEVNAME=`echo $SMASHED_LINE | cut -f 4 -d ' '`
if [ "$MAJOR" = "3" ]; then
list_ide $MAJOR $MINOR hda hdb
elif [ "$MAJOR" = "8" ]; then
list_scsi $MINOR
elif [ "$MAJOR" = "9" ]; then
list_md `echo $SMASHED_LINE | cut -f 3 -d ' ' | tr -d '/'` \
`echo $SMASHED_LINE | cut -f 4 -d ' '`
elif [ "$MAJOR" = "22" ]; then
list_ide $MAJOR $MINOR hdc hdd
elif [ "$MAJOR" = "33" ]; then
list_ide $MAJOR $MINOR hde hdf
elif [ "$MAJOR" = "34" ]; then
list_ide $MAJOR $MINOR hdg hdh
elif [ "$MAJOR" = "48" ]; then
list_rd 0 $MINOR
elif [ "$MAJOR" = "49" ]; then
list_rd 1 $MINOR
elif [ "$MAJOR" = "50" ]; then
list_rd 2 $MINOR
elif [ "$MAJOR" = "51" ]; then
list_rd 3 $MINOR
elif [ "$MAJOR" = "52" ]; then
list_rd 4 $MINOR
elif [ "$MAJOR" = "53" ]; then
list_rd 5 $MINOR
elif [ "$MAJOR" = "54" ]; then
list_rd 6 $MINOR
elif [ "$MAJOR" = "55" ]; then
list_rd 7 $MINOR
elif [ "$MAJOR" = "56" ]; then
list_ide $MAJOR $MINOR hdi hdj
elif [ "$MAJOR" = "57" ]; then
list_ide $MAJOR $MINOR hdk hdl
elif [ "$MAJOR" = "72" ]; then
list_ida 0 $MINOR
elif [ "$MAJOR" = "73" ]; then
list_ida 1 $MINOR
elif [ "$MAJOR" = "74" ]; then
list_ida 2 $MINOR
elif [ "$MAJOR" = "75" ]; then
list_ida 3 $MINOR
elif [ "$MAJOR" = "76" ]; then
list_ida 4 $MINOR
elif [ "$MAJOR" = "77" ]; then
list_ida 5 $MINOR
elif [ "$MAJOR" = "78" ]; then
list_ida 6 $MINOR
elif [ "$MAJOR" = "79" ]; then
list_ida 7 $MINOR
elif [ "$MAJOR" = "80" ]; then
list_ide $MAJOR $MINOR hdm hdn
elif [ "$MAJOR" = "89" ]; then
list_ide $MAJOR $MINOR hdo hdp
elif [ "$MAJOR" = "90" ]; then
list_ide $MAJOR $MINOR hdq hdr
elif [ "$MAJOR" = "91" ]; then
list_ide $MAJOR $MINOR hds hdt
elif [ "$MAJOR" = "101" ]; then
list_amiraid $MAJOR $MINOR
elif [ "$MAJOR" = "104" \
-o "$MAJOR" = "105" \
-o "$MAJOR" = "106" \
-o "$MAJOR" = "107" \
-o "$MAJOR" = "108" \
-o "$MAJOR" = "109" \
-o "$MAJOR" = "110" \
-o "$MAJOR" = "111" ]; then
list_cciss $(( $MAJOR - 104 )) $MINOR
elif [ "$MAJOR" = "114" ]; then
list_ataraid $MAJOR $MINOR
elif [ "$MAJOR" = "259" ]; then
if echo $line | grep -q p; then
list_nvme $DEVNAME
fi
elif [ $(expr $DEVNAME : 'x\?vd[^0-9]*$') -ne 0 ]; then
# The virtio devices have no set major dev number, so we have to search
# by name. Matches full drive names for KVM/lguest (vda) and Xen (xvda).
list_virt $DEVNAME
fi
done
else # old format and no RAID:
if cat /proc/partitions | grep md 1> /dev/null 2> /dev/null ; then
cat /proc/partitions | grep md | while read line ; do
SMASHED_LINE=$line
MAJOR=`echo $SMASHED_LINE | cut -f 1 -d ' '`
if [ "$MAJOR" = "9" ]; then
list_md `echo $SMASHED_LINE | cut -f 3 -d ' ' | tr -d '/'` \
`echo $SMASHED_LINE | cut -f 4 -d ' '`
fi
done
fi
fdisk -l 2> /dev/null >> $TMP/SeTfdisk
fi
# Change the names to be the same as what the old fdisk used:
sed -i -e "s/Linux filesystem/Linux/g" $TMP/SeTfdisk
sed -i -e "s/EFI System/EFI System Partition/g" $TMP/SeTfdisk
sed -i -e "s,EFI (FAT-12/16/32),EFI System Partition,g" $TMP/SeTfdisk
# Filter out reserved file system labels for Slackware ARM/AArch64 and the
# Slackware A-i-O (All in One Offline) Installer file systems.
# This prevents them from being offered as candidates for formatting/mounting
# during the installation.
#
# Labels:
#
# Used within the OS:
# -------------------
# SLKhwm_bw = Hardware Model Bootware - native Bootware for the RPi
# SLKefi = FAT32 file system, /boot/efi mountpoint within the OS for Hardware Models
# that use UEFI firmware.
#
# SLKins = Media (usually a USB stick) containing the Slackware install media
# This FS label isn't required to locate the media, but it's helpful
# as a way to exclude the media from the list of candidates.
# This label is included within the Installation Guide for the USB
# media installation option.
#
# Used only within the Slackware Installer environment
# ----------------------------------------------------
# SLKins_aio-pkgs =
# The label of the partition on the All-In-One Installer that contains the
# Slackware packages.
# SLKins_efi = FAT32 file system for the Installer EFI partition, for Hardware Models
# that use UEFI firmware.
# The contents of this are deployed by 'grub-install', which is called from
# the Hardware Model's 'sdcards.build' plugin.
# This is not used within the installed OS.
# SLKins_boot = ext4 file system containing the GRUB configuration to boot the
# Slackware Installer, for Hardware Models using UEFI firmware.
#
# 'SLKroot' is used to identify the OS root file system on ARM, but we don't
# filter it out because it's *supposed* to appear as a candidate within the
# menu. Whilst we don't ship any images that contain a file system with this label,
# the user might be reinstalling, thus would never be presented with the partition.
#
# SLKboot = Slackware OS /boot partition, but is only reserved only on ARM/AArch64:
[[ "$( uname -m )" =~ a(rm*|arch64) ]] && aexc="boot|"
awk '/^\/dev\// {print $1}' /var/log/setup/tmp/SeTfdisk | while read device; do
# The wrapping of e2label is because whilst it handles other file system types,
# it includes verbosity about the filesystem type; where as for ext filesystems
# it outputs only the label.
{ ( e2label ${device} 2>/dev/null | tail -n1 | rev \
| awk '{print $1}' | rev | tr -d "'" | \
grep -Eq "^SLK(${aexc}ins|ins_aio-pkgs|ins_efi|ins_boot|efi|hwm_bw)$" ) && sed -i '\|^'"${device}\s"'|d' $TMP/SeTfdisk ;}
done
# Dump the discovered storage:
cat $TMP/SeTfdisk