archiso-zfs/init
2020-05-06 10:26:44 +02:00

141 lines
3.7 KiB
Bash
Executable file

#!/bin/bash
# This script load zfs kernel module for any archiso.
# github.com/eoli3n
# Thanks to CalimeroTeknik on #archlinux-fr, FFY00 on #archlinux-projects, JohnDoe2 on #regex
### Functions
print () {
echo -e "\n\033[1m> $1\033[0m\n"
}
search_package () {
# $1 is package name to search
# $2 is version to match
# Set regex to match package
regex='href="\K'"$1"'-[0-9].*?'"$2"'.*?(?!.+\.sig)x86_64[^\"]+'
# href=" # match href="
# \K # don't return anything matched prior to this point
# '"$1"'-[0-9] # find me package-# escaped by shell
# .*? # match anything but newlines 0 or more times, as few times as possible (non-greedy)
# '"$kernel_version"' # match version escaped by shell
# .*? # match anything but newlines 0 or more times, as few times as possible (non-greedy)
# (?![^"\n]+\.sig) # remove .sig matches
# x86_64 # now match architecture
# [^\n"]+ # continue matching anything but newlines and ", 1 or more times, until end
# Set archzfs URLs list
urls="http://archzfs.com/archzfs/x86_64/ http://archzfs.com/archive_archzfs/"
# Loop search
for url in $urls
do
print "Searching on $url..."
# Query url and try to match package
package=$(curl -s "$url" | grep -Po "$regex" | tail -n 1)
# If a package is found
if [[ -n $package ]]
then
print "$package found"
# Build package url
package_url="$url$package"
return "$package_url"
fi
done
}
download_package () {
# $1 is package url to download in tmp
filename="${url##*/}"
# Download package in tmp
wget "$1" -P /tmp
# Set out file
output="/tmp/$filename"
print "Downloading $output ..."
return "$output"
}
print "Testing if archiso is running"
grep archiso /proc/cmdline > /dev/null
print "Increasing cowspace to half of RAM"
mount -o remount,size=50% /run/archiso/cowspace
# Get running kernel version
# https://github.com/archzfs/archzfs/issues/337#issuecomment-624312576
kernel_version=$(pacman -Qi linux | sed -n 's/^Version\s*: //p')
kernel_version_fixed="${kernel_version//-/\.}"
print "Adding archzfs repo"
cat >> /etc/pacman.conf <<"EOF"
[archzfs]
Server = http://archzfs.com/archzfs/x86_64
Server = http://mirror.sum7.eu/archlinux/archzfs/archzfs/x86_64
Server = https://mirror.biocrafting.net/archlinux/archzfs/archzfs/x86_64
EOF
print "Fetching archzfs signing keys"
pacman-key --recv-keys F75D9D76
pacman-key --lsign-key F75D9D76
print "Current kernel version is $kernel_version"
# Search kernel package
zfs_utils_package_url=$(search_package "zfs-linux" "$kernel_version_fixed")
# If a package is found
if [[ -n $zfs_utils_package_url ]]
then
# Download package
zfs_linux_package=$(download_package "zfs-linux" "$kernel_version_fixed")
print "Extracting $zfs_linux_package"
tar xvf "$zfs_linux_package" -C /tmp/extract
print "Searching zfs-utils version required"
zfs_utils_version=$(grep 'depend = zfs-utils' /tmp/extract/.PKGINFO | grep -o '[[:digit:]].*')
rm -Rf /tmp/extract
zfs_utils_url=$(search_package "zfs-utils" "$zfs_utils_version")
if [[ -n $zfs_utils_url ]]
then
print "Installing zfs-utils"
pacman -U "$zfs_utils_url" --noconfirm
pacman -U "$zfs_linux_package" --noconfirm
print "Loading zfs kernel module"
# Load kernel module
modprobe zfs && print "ZFS module is working"
else
print "No module found for current kernel version on Archzfs repos"
fi
else
print "No module found for current kernel version on Archzfs repos"
fi