#!/bin/bash set -Eeuo pipefail # config WORKDIR="/tmp/menhera" ROOTFS="" # internal global variables OLDROOT="/" NEWROOT="" # https://stackoverflow.com/a/3232082/2646069 confirm() { # call with a prompt string or use a default read -r -p "${1:-Are you sure? [y/N]} " response case "$response" in [yY][eE][sS]|[yY]) true ;; *) false ;; esac } get_rootfs() { if [ -n ${ROOTFS} ]; then echo "Getting rootfs URL..." # forgive me for parsing HTML with these shit # and hope it works ROOTFS_TIME=$(curl -fsSL "https://images.linuxcontainers.org/images/debian/stretch/amd64/default/?C=M;O=D" | grep -oP '(\d{8}_\d{2}:\d{2})' | head -n 1) ROOTFS="https://images.linuxcontainers.org/images/debian/stretch/amd64/default/${ROOTFS_TIME}/rootfs.squashfs" else echo "\$ROOTFS is set to '$ROOTFS'" fi } sync_filesystem() { echo "Syncing..." sync sync } prepare_environment() { echo "Loading kernel modules..." modprobe overlay modprobe squashfs sysctl kernel.panic=10 echo "Creating workspace in '${WORKDIR}'..." # workspace mkdir -p "${WORKDIR}" mount -t tmpfs tmpfs "${WORKDIR}" # new rootfs mkdir -p "${WORKDIR}/newroot" # readonly part of new rootfs mkdir -p "${WORKDIR}/newrootro" # writeable part of new rootfs mkdir -p "${WORKDIR}/newrootrw" # overlayfs workdir mkdir -p "${WORKDIR}/overlayfs_workdir" echo "Downloading temporary rootfs..." curl -L -C - -o "${WORKDIR}/rootfs.squashfs" "${ROOTFS}" } mount_new_rootfs() { echo "Mounting temporary rootfs..." mount -t squashfs "${WORKDIR}/rootfs.squashfs" "${WORKDIR}/newrootro" mount -t overlay overlay -o rw,lowerdir="${WORKDIR}/newrootro",upperdir="${WORKDIR}/newrootrw",workdir="${WORKDIR}/overlayfs_workdir" "${WORKDIR}/newroot" NEWROOT="${WORKDIR}/newroot" } install_software() { echo "Installing OpenSSH Server into new rootfs..." DEBIAN_FRONTEND=noninteractive chroot "${NEWROOT}" apt-get update -y DEBIAN_FRONTEND=noninteractive chroot "${NEWROOT}" apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install -y ssh } copy_config() { echo "Copying important config into new rootfs..." ! cp -ax "${OLDROOT}/etc/resolv.conf" "${NEWROOT}/etc" ! cp -axr "${OLDROOT}/etc/ssh" "${NEWROOT}/etc" ! cp -ax "${OLDROOT}/etc/"{passwd,shadow} "${NEWROOT}/etc" ! cp -axr "${OLDROOT}/root/.ssh" "${NEWROOT}/root" chroot "${NEWROOT}" chsh -s /bin/bash root cat > "${NEWROOT}/etc/motd" <