1 changed files with 148 additions and 0 deletions
			
			
		@ -0,0 +1,148 @@ | 
				
			|||
#!/bin/sh | 
				
			|||
set -eu | 
				
			|||
 | 
				
			|||
if [ "$(id -u)" != 0 ]; then | 
				
			|||
    echo "This script needs root permissions!" 1>&2 | 
				
			|||
    exit 1 | 
				
			|||
fi | 
				
			|||
 | 
				
			|||
if [ "$#" -lt 1 ]; then | 
				
			|||
    echo "Usage: $0 [-a arch] [-m mirror] <chroot>" 1>&2 | 
				
			|||
    exit 1 | 
				
			|||
fi | 
				
			|||
 | 
				
			|||
 | 
				
			|||
arch="$(uname -m)" | 
				
			|||
mirror='https://mirrors.slackware.com/slackware/slackware64-current' | 
				
			|||
 | 
				
			|||
# Minimal amount of packages required to run installpkg, removepkg, upgradepkg, explodepkg and makepkg | 
				
			|||
# All of these exist in the 'a' package set | 
				
			|||
packages_pkgtools=' | 
				
			|||
aaa_base | 
				
			|||
aaa_elflibs | 
				
			|||
bash | 
				
			|||
coreutils | 
				
			|||
etc | 
				
			|||
findutils | 
				
			|||
glibc-solibs | 
				
			|||
grep | 
				
			|||
pkgtools | 
				
			|||
sed | 
				
			|||
tar | 
				
			|||
util-linux | 
				
			|||
which | 
				
			|||
xz | 
				
			|||
' | 
				
			|||
 | 
				
			|||
# Minimal amount of packages required to run slackpkg without the dialog interface | 
				
			|||
# Supporting https, gpg, and upgrade-all. | 
				
			|||
# These exist over the 'a', 'ap', 'n' and 'l' package sets | 
				
			|||
# ca-certificates needs to be installed after openssl for the doinst.sh to run correctly | 
				
			|||
packages_extra=' | 
				
			|||
bzip2 | 
				
			|||
diffutils | 
				
			|||
gawk | 
				
			|||
gnupg | 
				
			|||
gzip | 
				
			|||
libpsl | 
				
			|||
libunistring | 
				
			|||
pcre2 | 
				
			|||
slackpkg | 
				
			|||
wget | 
				
			|||
 | 
				
			|||
openssl | 
				
			|||
ca-certificates | 
				
			|||
' | 
				
			|||
 | 
				
			|||
# Parse arguments | 
				
			|||
while getopts "a:m:" opt; do | 
				
			|||
    case "$opt" in | 
				
			|||
        a) arch="$OPTARG" ;; | 
				
			|||
        m) | 
				
			|||
            if [ -d "$OPTARG" ]; then | 
				
			|||
                mirror="$(realpath "$OPTARG")" | 
				
			|||
            else | 
				
			|||
                mirror="$OPTARG" | 
				
			|||
            fi | 
				
			|||
            ;; | 
				
			|||
    esac | 
				
			|||
done | 
				
			|||
shift $(expr $OPTIND - 1) | 
				
			|||
[ "$#" -ge 1 ] && [ "$1" = "--" ] && shift | 
				
			|||
 | 
				
			|||
# Build final variables | 
				
			|||
case "$arch" in | 
				
			|||
    x86_64) | 
				
			|||
        pkgmain='slackware64' | 
				
			|||
        ;; | 
				
			|||
 | 
				
			|||
    *) | 
				
			|||
        pkgmain='slackware' | 
				
			|||
        ;; | 
				
			|||
esac | 
				
			|||
initrd='isolinux/initrd.img' | 
				
			|||
checksums='CHECKSUMS.md5' | 
				
			|||
chroot="$(realpath "$1")" | 
				
			|||
 | 
				
			|||
# Create working directory | 
				
			|||
temp="$(mktemp -d -t "$(basename "$0")".XXXXXX)" | 
				
			|||
cleanup() { | 
				
			|||
    if mountpoint -q "$temp/mnt/pkg"; then | 
				
			|||
        umount "$temp/mnt/pkg" | 
				
			|||
        rmdir "$temp/mnt/pkg" | 
				
			|||
    fi | 
				
			|||
    mountpoint -q "$temp/mnt" && umount "$temp/mnt" | 
				
			|||
    rm -rf "$temp" | 
				
			|||
} | 
				
			|||
trap 'cleanup' EXIT | 
				
			|||
cd "$temp" | 
				
			|||
 | 
				
			|||
# Function to download (or copy) a file | 
				
			|||
get() { | 
				
			|||
    if [ -d "$mirror" ]; then | 
				
			|||
        cp "$mirror/$1" "$2" | 
				
			|||
    else | 
				
			|||
        wget "$mirror/$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 | 
				
			|||
xz -cd initrd.img | cpio -id | 
				
			|||
rm -f initrd.img | 
				
			|||
mkdir -p pkg "$chroot" | 
				
			|||
mount --bind "$chroot" mnt | 
				
			|||
mkdir -p mnt/pkg | 
				
			|||
mount --bind pkg mnt/pkg | 
				
			|||
 | 
				
			|||
# Download packages | 
				
			|||
for pkg in $packages_pkgtools $packages_extra; do | 
				
			|||
    path="$(package "$pkg")" | 
				
			|||
    name="$(basename "$path")" | 
				
			|||
    get "$path" "pkg/$name" | 
				
			|||
    check "$path" "pkg/$name" | 
				
			|||
done | 
				
			|||
for pkg in $packages_pkgtools; do echo "$(basename "$(package "$pkg")")" >> pkg/__; done | 
				
			|||
for pkg in $packages_extra; do echo "$(basename "$(package "$pkg")")" >> pkg/_; done | 
				
			|||
 | 
				
			|||
# Bootstrap pkgtools and its dependencies | 
				
			|||
env -i chroot . sh -l -c 'while read pkg; do /sbin/installpkg --root /mnt --terse "/pkg/$pkg"; done < /pkg/__' | 
				
			|||
 | 
				
			|||
# Install slackpkg and its dependencies | 
				
			|||
env -i chroot mnt sh -l -c 'while read pkg; do /sbin/installpkg --terse "/pkg/$pkg"; done < /pkg/_' | 
				
			|||
					Loading…
					
					
				
		Reference in new issue