#!/bin/bash
-version () {
- equery list $1 | tail -n 1 | sed 's/.*-//'
-}
+set -e
+
+# Set some more or less unchanging variables
+SSH_PORT="22"
+DYN_BIN="/usr/sbin/pcscd /usr/lib64/readers/usb/ifd-ccid.bundle/Contents/Linux/libccid.so"
+
+RD=$(mktemp -d)
+wd=$(mktemp -d)
packages="/usr/portage/distfiles"
-wd="/usr/src/initramfs/builds"
cur=$(pwd)
busybox="busybox"
-busybox_ver="$(version ${busybox})"
-
cryptsetup="cryptsetup"
-cryptsetup_ver="$(version ${cryptsetup})"
-
lvm="LVM"
-lvm_ver="2.2.02.166"
+dropbear="dropbear"
+gpg="gnupg"
-busybox="busybox"
-busybox_ver="$(version ${dropbear})"
+distfile () {
+ find $packages -iname "${1}*" | head -n 1
+}
+
+# Create basic directory structure
+mkdir -p ${RD}/{bin,dev,etc/dropbear,lib64,mnt/root,proc,root/.ssh,sys,usr/sbin,var/log,var/run}
-if [ -d ${wd} ]; then
- rm -rf ${wd}
-fi
-mkdir ${wd}
cd ${wd}
-tar xf ${packages}/${busybox}-${busybox_ver}.tar.bz2
+tar xf $(distfile ${busybox})
-cp ${cur}/busybox_config ${busybox}-${busybox_ver}/.config
-cd ${busybox}-${busybox_ver}
+cd ${busybox}*
+cp ${cur}/busybox_config ./.config
make -j8
make install
mkdir ${wd}/busybox/bin -p
-cp _install/bin/busybox ${wd}/busybox/bin
+cp _install/bin/busybox ${RD}/bin/busybox
+cp examples/udhcp/simple.script ${RD}/bin/simple.script
cd ${wd}
-tar xf ${packages}/${cryptsetup}-${cryptsetup_ver}.tar.xz
+tar xf $(distfile ${cryptsetup})
-cd ${cryptsetup}-${cryptsetup_ver}
+cd ${cryptsetup}*
-./configure --enable-static=yes \
+./configure --prefix=/ \
+ --enable-static=yes \
--enable-shared=no \
--disable-nls \
--enable-static-cryptsetup \
--with-crypto_backend=kernel
make -j8
-make install DESTDIR=${wd}/cryptsetup
+make install DESTDIR=${RD}
+mv -f ${RD}/sbin/cryptsetup.static ${RD}/sbin/cryptsetup
cd ${wd}
-tar xf ${packages}/${lvm}${lvm_ver}.tgz
+tar xf $(distfile ${lvm})
-cd ${lvm}${lvm_ver}
+cd ${lvm}*
CFLAGS="-fPIC" \
--disable-udev-systemd-background-jobs
make -j8
-make install DESTDIR=${wd}/lvm
+make install DESTDIR=${RD}
+mv -f ${RD}/sbin/lvm.static ${RD}/sbin/lvm
cd ${wd}
-tar xf ${packages}/${dropbear}-${dropbear_ver}.tar.bz2
+tar xf $(distfile ${dropbear})
-cd ${dropbear}-${dropbear}
+cd ${dropbear}*
-./configure --enable-static \
+./configure --prefix=/ \
+ --enable-static \
--disable-syslog \
--disable-utmp \
--disable-utmpx \
--disable-shadow
make -j8
-make install DESTDIR=${wd}/dropbear
+make install DESTDIR=${RD}
+
+cd ${wd}
+
+tar xf $(distfile ${gpg})
+
+cd ${gpg}*
+
+LDFLAGS="-static" \
+ ./configure \
+ --prefix=/ \
+ --enable-static_rnd=linux \
+ --disable-gnupg-iconv \
+ --enable-minimal \
+ --disable-agent-support \
+ --disable-photo-viewers \
+ --disable-keyserver-helpers \
+ --disable-dns-srv \
+ --disable-dns-cert \
+ --without-readline \
+ --with-included-zlib \
+ --enable-card-support \
+ --enable-noexecstack
+
+make -j8
+make install DESTDIR=${RD}
+
+
+# Copy all necessary dynamic libraries
+for bin in ${DYN_BIN}; do
+ for lib in $(lddtree -l ${bin}); do
+ DIR=$(dirname ${lib})
+ mkdir -p ${RD}${DIR}
+ cp -L ${lib} ${RD}${lib}
+ done
+done
+
+cat << EOF > ${RD}/init
+#!/bin/busybox sh
+rescue_shell() {
+ /bin/busybox echo "Something went wrong. Dropping you to a shell"
+ /bin/busybox --install -s
+ exec /bin/sh
+}
+
+# Mount filesystems
+/bin/busybox mount -t devtmpfs none /dev || rescue_shell
+/bin/busybox mount -t proc none /proc || rescue_shell
+/bin/busybox mount -t sysfs none /sys || rescue_shell
+#/bin/busybox echo 0 > /proc/sys/kernel/printk || rescue_shell
+
+# Unlock luks device
+/sbin/cryptsetup -T 5 luksOpen /dev/sdb3 lukssdb3 || rescue_shell
+
+# Create LVM nodes /dev/main/root etc
+/sbin/lvm vgscan --mknodes || rescue_shell
+/sbin/lvm lvchange -a ly main/root || rescue_shell
+/sbin/lvm lvchange -a ly main/home || rescue_shell
+/sbin/lvm lvchange -a ly main/swap || rescue_shell
+/sbin/lvm vgscan --mknodes || rescue_shell
+
+# Mount root fs
+/bin/busybox mount -o ro /dev/main/root /mnt/root || rescue_shell
+
+# Unmount filesystems
+/bin/busybox umount /dev || rescue_shell
+
+# Rescue shell for dicking around:
+/bin/busybox install -s
+/bin/sh
+
+# Boot system
+exec /bin/busybox switch_root /mnt/root /sbin/init || rescue_shell
+EOF
+
+chmod +x ${RD}/init
+
+find ${RD} -type f -printf "/%P %p %m 0 0\n" > ${wd}/filelist
+find ${RD} -type d -printf "/%P %m 0 0 \n" >> ${wd}/filelist
+
+pushd /usr/src/linux
+/usr/src/linux/scripts/gen_initramfs_list.sh \
+ -o ${wd}/initramfs.gz -u "squash" -g "squash" ${wd}/filelist
+popd
+echo "Initramfs has been generated at ${RD}"
+echo "Initramfs.gz has been generated at ${wd}/initramfs.gz"