My configuration and packages for Slackware
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
3.4 KiB

6 years ago
#!/bin/sh
set -eu
if [ "$(id -u)" != 0 ]; then
echo "This script needs root permissions!" 1>&2
exit 1
fi
if [ "$#" -lt 2 ]; then
echo "Usage: $0 [-a arch] [-v version] [-m mirror] [-b localmirror]" 1>&2
exit 1
fi
version='14.2'
arch="$(uname -m)"
mirror='https://mirrors.slackware.com/slackware'
base=''
# Minimal amount of packages required to run installpkg, removepkg and upgradepkg
# bzip2 and gzip are optional, but required to support .tgz and .tbz packages
# All of these exist in the 'a' package set
packages_pkgtools='
aaa_base
aaa_elflibs
bash
bzip2
coreutils
etc
findutils
glibc-solibs
grep
gzip
pkgtools
sed
tar
util-linux
xz
'
# Minimal amount of packages required to run slackpkg without the dialog interface
# gnupg is optional, but required to verify the GPG signatures of packages
# ca-certificates, openssl, bin and perl are optional, but required for HTTPS support
# These exist over the 'a', 'ap' and 'n' package sets
# perl exists in the 'd' package set
# openssl and ca-certificates need to be installed last (after perl and bin, at least) for the doinst.sh to run correctly
packages_slackpkg='
bin
diffutils
gawk
gnupg
openssl-solibs
perl
slackpkg
wget
which
openssl
ca-certificates
'
# Parse arguments
while getopts "v:a:m:b:" opt; do
case "$opt" in
v) version="$OPTARG" ;;
a) arch="$OPTARG" ;;
m) mirror="$OPTARG" ;;
b) base="$(realpath "$OPTARG")" # Path to local mirror, to get the files from.
esac
done
# Build final variables
case "$arch" in
x86_64)
pkgmain='slackware64'
;;
*)
pkgmain='slackware'
;;
esac
release="$pkgmain-$version"
initrd='isolinux/initrd.img'
checksums='CHECKSUMS.md5'
# Create working directory
temp="$(mktemp -d -t "$(basename "$0")".XXXXXX)"
trap "rm -rf '$temp'" EXIT
destdir="$PWD"
cd "$temp"
# Function to download (or copy) a file
get() {
if [ "$base" ]; then
cp "$base/$1" "$2"
else
wget "$mirror/$release/$1" -O "$2"
fi
}
# Function to verify files based on the checksums file
check() {
printf '%s' "$(tail +13 CHECKSUMS.md5 | grep "^[0-9a-f]* ./$1$" | cut -d ' ' -f 1) $2" | md5sum -c --quiet -
}
# Get the full path to a package
package() {
tail +13 CHECKSUMS.md5 | grep "^[0-9a-f]* ./$pkgmain/[^/]*/$1-[^-]*-[^-]*-[^-]*\.t.z$" | cut -d ' ' -f 3- | cut -c 3-
}
# Download checksums
get "$checksums" CHECKSUMS.md5
# Download installer initrd.img
get "$initrd" initrd.img
check "$initrd" initrd.img
# Unpack and prepare the installer
zcat initrd.img | cpio -id
rm -rf initrd.img mnt pkg
mkdir -p mnt/pkg pkg
# Download packages
for pkg in $packages_pkgtools; do
path="$(package "$pkg")"
name="$(basename "$path")"
get "$path" "pkg/$name"
check "$path" "pkg/$name"
echo "$name" >> pkg/_
done
for pkg in $packages_slackpkg; do
path="$(package "$pkg")"
name="$(basename "$path")"
get "$path" "mnt/pkg/$name"
check "$path" "mnt/pkg/$name"
echo "$name" >> mnt/pkg/_
done
# Bootstrap pkgtools and it's dependencies
env -i chroot . sh -l -c 'while read pkg; do /usr/lib/setup/installpkg --root /mnt --terse "/pkg/$pkg"; done < /pkg/_'
# Install slackpkg and it's dependencies
env -i chroot mnt sh -l -c 'while read pkg; do /sbin/installpkg --terse "/pkg/$pkg"; done < /pkg/_'
# Configuration
printf '%s\n' "$mirror/$release/" >> mnt/etc/slackpkg/mirrors
# Compress the package
tar cvJf "$destdir/$release.tar.xz" --sort=name --exclude=./pkg -C mnt .