tadd bootstrap functions - libdevuansdk - common library for devuan's simple distro kits HTML git clone https://git.parazyd.org/libdevuansdk DIR Log DIR Files DIR Refs DIR Submodules DIR README DIR LICENSE --- DIR commit 406ad450042f2910f3d08c104da59903003c54fe DIR parent a52e018a44d669fd65a9ee5f3d5cc740a5b4ee27 HTML Author: parazyd <parazyd@dyne.org> Date: Thu, 29 Sep 2016 21:22:00 +0200 add bootstrap functions Diffstat: A config | 59 +++++++++++++++++++++++++++++++ A libdevuansdk | 34 +++++++++++++++++++++++++++++++ A zlibs/bootstrap | 181 +++++++++++++++++++++++++++++++ A zlibs/helpers | 83 +++++++++++++++++++++++++++++++ A zlibs/sysconf | 131 +++++++++++++++++++++++++++++++ 5 files changed, 488 insertions(+), 0 deletions(-) --- DIR diff --git a/config b/config t@@ -0,0 +1,59 @@ +#!/usr/bin/env zsh +# +# Copyright (c) 2016 Dyne.org Foundation +# libdevuansdk is written and maintained by Ivan J. <parazyd@dyne.org> +# with code contributions from KatolaZ <katolaz@freaknet.org> +# and Jaromil <jaromil@dyne.org> +# +# This file is part of libdevuansdk +# +# This source code is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this source code. If not, see <http://www.gnu.org/licenses/>. + +## libdevuansdk configuration + +vars+=(release version mirror section) +arrs+=(core_packages base_packages system_packages) + +os="devuan" +release="jessie" +version="1.0.0-beta" +mirror="http://packages.devuan.org/merged" +section="main" + +core_packages=( + devuan_keyring + debian_keyring + initramfs-tools + binutils + ca-certificates + curl + console-common + less + nano + vi +) + +base_packages=( + bzip2 + dialog + apt-utils + fakeroot + e2fsprogs + parted +) + +system_packages=( + sysvinit + ssh +) DIR diff --git a/libdevuansdk b/libdevuansdk t@@ -0,0 +1,34 @@ +#!/usr/bin/env zsh +# +# Copyright (c) 2016 Dyne.org Foundation +# libdevuansdk is written and maintained by Ivan J. <parazyd@dyne.org> +# with code contributions from KatolaZ <katolaz@freaknet.org> +# and Jaromil <jaromil@dyne.org> +# +# This file is part of libdevuansdk +# +# This source code is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this source code. If not, see <http://www.gnu.org/licenses/>. + +libdevuansdk_version="0.2-dev" +LIBPATH=${LIBPATH:-`dirname $0`} + +source $LIBPATH/config +source $LIBPATH/zlibs/bootstrap +source $LIBPATH/zlibs/helpers +source $LIBPATH/zlibs/sysconf + +vars+=(libdevuansdk_version) +vars+=(LIBPATH) + +notice "libdevuansdk-v$libdevuansdk_version loaded" DIR diff --git a/zlibs/bootstrap b/zlibs/bootstrap t@@ -0,0 +1,181 @@ +#!/usr/bin/env zsh +# +# Copyright (c) 2016 Dyne.org Foundation +# libdevuansdk is written and maintained by Ivan J. <parazyd@dyne.org> +# with code contributions from KatolaZ <katolaz@freaknet.org> +# and Jaromil <jaromil@dyne.org> +# +# This file is part of libdevuansdk +# +# This source code is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this source code. If not, see <http://www.gnu.org/licenses/>. + +vars+=(bootstrap_tgz) + +bootstrap() { + fn bootstrap "$@" + req=(arch) + ckreq || return 1 + + notice "bootstrapping $os $arch base" + + bootstrap_tgz="$R/tmp/bootstrap-${os}-${arch}.tgz" + + [[ -f $bootstrap_tgz ]] && { + notice "using the existing bootstrap tarball found in $R/tmp" + bootstrap_tar_unpack $strapdir || { die "failed to extract"; zerr } + return 0 + } + notice "running debootstrap stage 1" + ## deboostrap stage 1 + sudo debootstrap \ + --foreign \ + --arch $arch $release $strapdir $mirror || zerr + + [[ $arch =~ "^arm.." ]] && qemu_install_user + + ## debootstrap stage 2 + notice "running debootstrap stage 2" + sudo chroot $strapdir \ + /debootstrap/debootstrap --second-stage || zerr + + ## write all system configuration + notice "writing system configuration" + conf_print_debconf | sudo tee $strapdir/debconf.set + conf_print_fstab | sudo tee $strapdir/etc/fstab + conf_print_hostname | sudo tee $strapdir/etc/hostname + conf_print_hosts | sudo tee $strapdir/etc/hosts + conf_print_networkifaces | sudo tee $strapdir/etc/network/interfaces + conf_print_resolvconf | sudo tee $strapdir/etc/resolv.conf + conf_print_sourceslist | sudo tee $strapdir/etc/apt/sources.list + + ## write third-stage for chroot + bootstrap_config_thirdstage | sudo tee $strapdir/thirdstage + bootstrap_config_cleanup | sudo tee $strapdir/cleanup + sudo chmod +x $strapdir/thirdstage + sudo chmod +x $strapdir/cleanup + + ## chroot into it and configure further + ## debootstrap stage 3 + notice "running debootstrap stage 3" + export LANG=C + export LC_ALL=C + export DEBIAN_FRONTEND=noninteractive + + devprocsys mount $strapdir || zerr + + sudo chroot $strapdir /thirdstage || zerr + sudo chroot $strapdir /cleanup || zerr + + sleep 1 && devprocsys umount $strapdir || zerr + + bootstrap_tar_pack || zerr +} + +bootstrap_config_cleanup() { + fn config_cleanup + + cat << EOF +#!/bin/sh +rm -f /debconf.set +rm -f /thirdstage +rm -f /etc/ssh/*_key +rm -f /etc/ssh/*.pub +rm -f /root/.bash_history +## our file for which we check the bootstrap is complete +echo "1" > .done +EOF +} + +bootstrap_config_thirdstage() { + fn bootstrap_config_thirdstage + req=(core_packages base_packages system_packages) + ckreq || return 1 + + cat << EOF +#!/bin/sh +dpkg-divert --add --local \ + --divert /usr/sbin/invoke-rc.d.chroot --rename /usr/sbin/invoke-rc.d +cp /bin/true /usr/sbin/invoke-rc.d +echo -e "#!/bin/sh\nexit 101" > /usr/sbin/policy-rc.d +chmod +x /usr/sbin/policy-rc.d + +apt-get update +apt-get --yes --force-yes install locales-all +debconf-set-selections /debconf.set + +apt-get update +apt-get -y install ${core_packages} + +echo "root:${os}" | chpasswd +sed -i -e 's/KERNEL\!=\"eth\*|/KERNEL\!=\"/' \ + /lib/udev/rules.d/75-persistent-net-generator.rules +rm -f /etc/udev/rules.d/70-persistent-net.rules +export DEBIAN_FRONTEND=noninteractive + +apt-get --yes --force-yes install \ + ${base_packages} \ + ${system_packages} \ + ${extra_packages} +apt-get --yes --force-yes dist-upgrade +apt-get --yes --force-yes autoremove + +apt-get clean + +rm -f /usr/sbin/policy-rc.d +rm -f /usr/sbin/invoke-rc.d +dpkg-divert --remove --rename /usr/sbin/invoke-rc.d +EOF +} + +bootstrap_tar_pack() { + fn bootstrap_tar_pack + req=(bootstrap_tgz) + ckreq || return 1 + + local _dest=`dirname $bootstrap_tgz` + + if [[ -f $bootstrap_tgz ]]; then + act "tarball found already in $_dest" + else + notice "Creating boostrap tarball in $bootstrap_tgz" + silly + + pushd ${strapdir} + + mkdir -p ${_dest} + silly + sudo tar czf $bootstrap_tgz \ + --exclude={./boot,./dev,./sys,./proc} \ + ./ + + popd + fi +} + +bootstrap_tar_unpack() { + fn bootstrap_tar_unpack $@ + local unpath="$1" + req=(unpath bootstrap_tgz) + ckreq || return 1 + + [[ -f ${unpath}/.done ]] && { + warning "bootstrap already unpacked in $unpath" + return 1 + } + + mkdir -p ${unpath} + silly + sudo tar xf $bootstrap_tgz -C ${unpath} + sudo mkdir -p ${unpath}/{boot,dev,sys,proc} +} DIR diff --git a/zlibs/helpers b/zlibs/helpers t@@ -0,0 +1,83 @@ +#!/usr/bin/env zsh +# +# Copyright (c) 2016 Dyne.org Foundation +# libdevuansdk is written and maintained by Ivan J. <parazyd@dyne.org> +# with code contributions from KatolaZ <katolaz@freaknet.org> +# and Jaromil <jaromil@dyne.org> +# +# This file is part of libdevuansdk +# +# This source code is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this source code. If not, see <http://www.gnu.org/licenses/>. + +## helper functions that make your life easier + +devprocsys() { + fn devprocsys "$@" + local watdo="$1" + local werdo="$2" + req=(watdo werdo) + ckreq || return 1 + + if [[ $watdo = mount ]]; then + sudo mount -o bind /sys $werdo/sys && act "mounted sys" + sudo mount -t proc proc $werdo/proc && act "mounted proc" + sudo mount -o bind /dev $werdo/dev && act "mounted dev" + sudo mount -o bind /dev/pts $werdo/dev/pts && act "mounted dev/pts" + elif [[ $watdo = umount ]]; then + sudo umount $werdo/dev/pts && act "umounted dev/pts" && sleep 2 + sudo umount $werdo/dev && act "umounted dev" && sleep 2 + sudo umount $werdo/proc && act "umounted proc" && sleep 2 + sudo umount $werdo/sys && act "umounted sys" && sleep 2 + fi +} + +silly() { + fn silly "$@" + local arg1="$1" + local arg2="$2" + ## cheers mailpile! + funneh=("do not think of purple hippos" + "increasing entropy & scrambling bits" + "indexing kittens..." + "patching bugs..." + "spinning violently around the y-axis" + "warming up particle accelerator" + "this server is powered by a lemon and two electrodes" + "becoming self-aware" + "BCC-ing ALL THE SPIES!" + "all of your config settings & passwords are encrypted with AES256" + "the most common password is 123456, hopefully yours is different" + "good things come to those who wait" + "Make Free Software and be happy" + "We like volcanos, do you like volcanos?" + "Crossing out swear words..." + "Informing David Cameron of suspicious ac^H^H^H ... naaah :)" + "Abandon all hope, ye who enter here" + "Compiling bullshit bingo grid..." + "Estimating chance of asteroid hitting Earth" + "Applying coupons..." + "Backing up the entire Internet..." + "Making you wait for no reason" + "Doing nothing" + "Pay no attention to the man behind the curtain" + "You are great just the way you are" + "Supplying monkeys with typewriters" + "Swapping time and space" + "Self potato" + "it's all lies" + "A million hamsters are spinning their wheels right now" + ) + local rnd=$(shuf -i1-30 -n 1) + act "${funneh[$rnd]}" ; [[ $arg1 = sleep ]] && sleep $arg2 +} DIR diff --git a/zlibs/sysconf b/zlibs/sysconf t@@ -0,0 +1,131 @@ +#!/usr/bin/env zsh +# +# Copyright (c) 2016 Dyne.org Foundation +# libdevuansdk is written and maintained by Ivan J. <parazyd@dyne.org> +# with code contributions from KatolaZ <katolaz@freaknet.org> +# and Jaromil <jaromil@dyne.org> +# +# This file is part of libdevuansdk +# +# This source code is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this source code. If not, see <http://www.gnu.org/licenses/>. + +## default system configurations + +conf_print_debconf() { + fn conf_print_debconf + + cat << EOF +console-common console-data/keymap/policy select Select keymap from full list +console-common console-data/keymap/full select en-latin1-nodeadkeys +EOF +} + +conf_print_fstab() { + fn conf_print_fstab + + cat << EOF +#<file system> <mount point> <type> <options> <dump> <pass> +proc /proc proc nodev,noexec,nosuid 0 0 + +# rootfs +/dev/sda2 / ext4 errors=remount-ro 0 1 + +# boot +/dev/sda1 /boot ext2 noauto 0 0 +EOF +} + +conf_print_hostname() { + fn conf_print_hostname + req=(os) + ckreq || return 1 + + print $os +} + +conf_print_hosts() { + fn conf_print_hosts + req=(os) + ckreq || return 1 + + cat << EOF +127.0.0.1 ${os} localhost +::1 localhost ip6-localhost ip6-loopback +fe00::0 ip6-localnet +fe00::0 ip6-mcastprefix +fe02::1 ip6-allnodes +fe02::1 ip6-allrouters +EOF +} + +conf_print_networkifaces() { + fn conf_print_networkifaces + + cat << EOF +# interfaces(5) file used by ifup(8) and ifdown(8) + +# Please note that this file is written to be used with dhcpcd +# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf' + +# Include files from /etc/network/interfaces.d: +source-directory /etc/network/interfaces.d + +auto lo +iface lo inet loopback + +auto eth0 +iface eth0 inet dhcp + +# auto eth0 +# iface eth0 inet static +# address 10.0.1.10 +# netmask 255.255.255.0 + +# allow-hotplug wlan0 +# iface wlan0 inet manual +# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf + +# allow-hotplug wlan1 +# iface wlan1 inet manual +# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf +EOF +} + +conf_print_resolvconf() { + fn conf_print_resolvconf + + cat << EOF +## google's nameservers +nameserver 8.8.8.8 +nameserver 8.8.4.4 +EOF +} + +conf_print_sourceslist() { + fn conf_print_sourceslist + req=(mirror release section) + ckreq || return 1 + + cat << EOF +## package repositories +deb ${mirror} ${release} ${section} +deb ${mirror} ${release}-updates ${section} +deb ${mirror} ${release}-security ${section} + +## source repositories +# deb-src ${mirror} ${release} ${section} +# deb-src ${mirror} ${release}-updates ${section} +# deb-src ${mirror} ${release}-security ${section} +EOF +}