tMerge branch 'next' - libdevuansdk - common library for devuan's simple distro kits
 (HTM) git clone https://git.parazyd.org/libdevuansdk
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit cf0a59cbf55eb066bd679481ce191fbbf0cc5ae6
 (DIR) parent d2089d9a203f79bb5514488dfe6e4dfe26bbb889
 (HTM) Author: parazyd <parazyd@dyne.org>
       Date:   Tue, 15 Nov 2016 17:11:32 +0100
       
       Merge branch 'next'
       
       Diffstat:
         M config                              |      10 ++++++++--
         A doc/Makefile                        |      18 ++++++++++++++++++
         A doc/configuration.7.md              |      52 +++++++++++++++++++++++++++++++
         A doc/creating_wrappers.7.md          |      90 +++++++++++++++++++++++++++++++
         A doc/helper_functions.7.md           |      54 +++++++++++++++++++++++++++++++
         A doc/libdevuansdk.7.md               |      48 +++++++++++++++++++++++++++++++
         A doc/nanodoc                         |      75 +++++++++++++++++++++++++++++++
         A doc/static/foot.html                |      11 +++++++++++
         A doc/static/head.html                |     199 +++++++++++++++++++++++++++++++
         A doc/workflow.7.md                   |      32 +++++++++++++++++++++++++++++++
         M libdevuansdk                        |       1 +
         M zlibs/bootstrap                     |       4 ++++
         M zlibs/helpers                       |     112 +++++++++++++++++++++++++++++++
         A zlibs/iso                           |     129 +++++++++++++++++++++++++++++++
         M zlibs/kernel                        |       4 ++++
       
       15 files changed, 837 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/config b/config
       t@@ -19,8 +19,8 @@
        
        ## libdevuansdk configuration
        
       -vars+=(release version mirror section)
       -arrs+=(core_packages base_packages purge_packages)
       +vars+=(release version mirror section blend_name)
       +arrs+=(core_packages base_packages purge_packages blend_packages)
        
        os="devuan"
        release="jessie"
       t@@ -29,6 +29,7 @@ mirror="http://auto.mirror.devuan.org/merged"
        section="main"
        
        image_name="${os}_${release}_${version}_${arch}"
       +[[ -n $blend_name  ]] && image_name="${image_name}_${blend_name}"
        [[ -n $device_name ]] && image_name="${image_name}_${device_name}"
        
        core_packages=(
       t@@ -59,6 +60,11 @@ base_packages=(
                wpasupplicant
                wireless-tools
                elinks
       +        firmware-linux-free
       +        btrfs-tools
       +        zsh
       +        rsync
       +        git-core
        )
        
        purge_packages=(
 (DIR) diff --git a/doc/Makefile b/doc/Makefile
       t@@ -0,0 +1,18 @@
       +all: clean html man
       +
       +html:
       +        @echo generating html...
       +        @./nanodoc html
       +
       +man:
       +        @echo generating manpages...
       +        @./nanodoc man
       +
       +clean:
       +        @echo cleaning...
       +        @rm -rf html man nav.html
       +        @sed -i -e 's:index.html">.*:html">NAME</a>:' static/head.html
       +        @sed -i -e 's:Subtitle">.*:Subtitle">DESC</span>:' static/head.html
       +        @sed -i -e 's:libdevuansdk-.*:libdevuansdk-VERSION</a>:' static/foot.html
       +
       +.PHONY: all html man clean
 (DIR) diff --git a/doc/configuration.7.md b/doc/configuration.7.md
       t@@ -0,0 +1,52 @@
       +configuration
       +=============
       +
       +much of the `libdevuansdk` configuration is done in `libdevuansdk/config`. here
       +you can edit the defaults if you wish to do something your needs are expressing.
       +
       +## config file
       +
       +`vars` and `arrs` are global arrays holding other global variables and arrays.
       +this is required for `zuper` and helps a lot with debugging. if you declare new
       +variables or arrays, add them to `vars` and `arrs`, respectively.
       +
       +* `os`  
       +  holds the name of the distro being worked on.
       +
       +* `release`  
       +  holds the release name of the distro. used for apt repos mostly.
       +
       +* `version`  
       +  current version of the distro being worked on.
       +
       +* `mirror`  
       +  a mirror holding the packages for `debootstrap`.
       +
       +* `section`  
       +  sections of the repo. for adding in `/etc/apt/sources.list`. separate them
       +  with whitespaces.
       +
       +* `image_name`  
       +  output name of the raw image. if you declare `device_name`, it will be added.
       +  `arm-sdk` does this.
       +
       +* `core_packages`  
       +  this array holds the core packages that will be installed in the bootstrap
       +  process.
       +
       +* `base_packages`  
       +  this array holds the base packages that will be installed later in the
       +  bootstrap process.
       +
       +* `purge_packages`  
       +  this array holds the packages that will get purged at the end of the bootstrap
       +  process.
       +
       +
       +## overriding things
       +
       +to be able to override specific unwanted functions of libdevuansdk, consider
       +sourcing it earlier in the process of initialization.
       +
       +it is possible to override default variables, or even functions without the need
       +of editing libdevuansdk. share a patch with me if you wish :)
 (DIR) diff --git a/doc/creating_wrappers.7.md b/doc/creating_wrappers.7.md
       t@@ -0,0 +1,90 @@
       +creating wrappers around libdevuansdk
       +=====================================
       +
       +libdevuansdk holds all the helper functions you might need, but it does not
       +allow you to simply use it in a completely automated fashion. for that you
       +will have to wrap some zsh around libdevuansdk.
       +
       +there are a few mandatory variables that you are required to declare before
       +sourcing libdevuansdk. otherwise libdevuansdk might write to some places of the
       +system you wouldn't want to.
       +
       +## requirements
       +
       +before sourcing it, libdevuansdk assumes you already loaded and initialized
       +the [zuper](https://github.com/dyne/zuper) zsh library.
       +
       +
       +### mandatory variables
       +
       +* `$R`  
       +  the root directory of your wrapper. in almost every situation you can set
       +  it as `$PWD`
       +
       +* `$workdir`  
       +  the working directory of the current "build". a sane default is
       +  `$R/tmp/workdir`
       +
       +* `$strapdir`  
       +   the bootstrap directory of the current "build". it holds the rootfs when
       +   you debootstrap. sane default: `$workdir/rootfs`
       +
       +* `$arch`  
       +  the CPU architecture of the current "build". values like: `amd64`, `i386`,
       +  `armhf`, etc...
       +
       +
       +### Optional variables
       +
       +* `$extra_packages`  
       +  this should hold an array of packages that exist in the devuan package tree.
       +  they will get installed as a part of the bootstrap process.
       +
       +* `$purge_packages`  
       +  this is an array that holds a list of packages that will get removed at the
       +  final steps of the bootstrap process. note that this array is not empty by
       +  default, so you should only add to it in your wrapper, not override it. 
       +  just to be safe.
       +
       +* `$size`  
       +  This variable will hold the value in MiB for `dd` to know how many zeroes it
       +  should put in the raw image.  
       +  ex: `size=1337`
       +
       +* `$parted_type`  
       +  if you are creating a raw (dd-able) image, this variable will tell
       +  libdevuansdk how to partition that image. either `dos` or `gpt`.
       +
       +* `$parted_boot`  
       +  used if `$parted_type=dos`. it holds the values for `parted` and the
       +  formatting of the `boot` partition.  
       +  ex: `parted_boot="fat32 2048s 264191s"`.  
       +  see the `image_partition_raw_dos()` function in `libdevuansdk/zlibs/imaging`
       +  for a better understanding on how the variable is used.
       +
       +* `$parted_root`  
       +  used if `$parted_type=dos`. it holds the values for `parted` and the
       +  formatting of the `root` partition.  
       +  ex: `parted_root="ext4 264192s 100%"`.  
       +  see the `image_partition_raw_dos()` function in `libdevuansdk/zlibs/imaging`
       +  for a better understanding on how the variable is used.
       +
       +* `$gpt_boot`  
       +  used if `$parted_type=gpt`. it is an array holding the start and end values
       +  for partitioning the `boot` partition.  
       +  ex: `gpt_boot=(8192 32768)`  
       +  see the `image_partition_raw_gpt()` function in `libdevuansdk/zlibs/imaging
       +  for a better understanding on how the variable is used.
       +
       +* `$gpt_root`  
       +  used if `$parted_type=gpt`. it is an array holding the start value for
       +  partitioning the `root` partition.  
       +  ex: `gpt_root=(40960)`  
       +  currently libdevuansdk chooses this as a startpoint, and maxes out remaining
       +  available space. again, see the `image_partition_raw_gpt()` function for a
       +  better understanding.
       +
       +* `$qemu_bin`  
       +  declare this if you are bootstrapping for an architecture different than
       +  yours. it should hold the path to `qemu-user-static` or a similarly named
       +  statically compiled qemu for userspace.
 (DIR) diff --git a/doc/helper_functions.7.md b/doc/helper_functions.7.md
       t@@ -0,0 +1,54 @@
       +helper functions
       +================
       +
       +you can find useful helper functions in `libdevuansdk/zlibs/helpers`. they are
       +intended to help you with writing wrappers, as well as making my job easier
       +within developing libdevuansdk. some of these functions are required for
       +libdevuansdk to properly work as well.
       +
       +
       +## build_image_dist()  
       +this function is kind of a wrapper function, mostly used in `arm-sdk` to build a
       +complete "dd-able" image from start to end. to run, it requires `$arch`,
       +`$size`, `$parted_type`, `$workdir`, and `$strapdir` to be declared. as well as
       +`$parted_root`, `$parted_boot` if `$parted_type=dos`, or `$gpt_root`,
       +`$gpt_boot` if `$parted_type=gpt`. see `creating_wrappers(7)` for insight on
       +these variables.
       +
       +the workflow of this function is bootstrapping a complete rootfs, creating a raw
       +image, installing/compiling a kernel, rsyncing everything to the raw image, and
       +finally, compressing the raw image.
       +
       +
       +## devprocsys()  
       +this function is a simple helper function that takes two arguments: `watdo` and
       +`werdo`. it mounts or umounts `/sys`, `/dev`, `/dev/pts`, and `procfs` where you
       +tell it to. for example:
       +
       +```
       +devprocsys mount $strapdir
       +devprocsys umount $strapdir
       +```
       +
       +
       +## findloopmapp()  
       +this functions takes the raw image and finds a free loopdevice for it to be
       +mounted. it calls `losetup(8)` and `kpartx(8)`.
       +
       +
       +## qemu_install_user()  
       +helper function to install the userspace qemu to `$strapdir`.
       +
       +
       +## dpkgdivert()  
       +this one takes two arguments, `watdo` and `werdo` (much like `devprocsys`). it
       +will create a dpkg diversion in the place you tell it to and remove invoke-rc.d
       +so that apt doesn't autostart daemons when they are installed.
       +
       +
       +## enablessh()  
       +this function will allow root login with password in the bootstrapped rootfs.
       +
       +
       +## silly()  
       +a funny function printing out random messages.
 (DIR) diff --git a/doc/libdevuansdk.7.md b/doc/libdevuansdk.7.md
       t@@ -0,0 +1,48 @@
       +index
       +=====
       +
       +`libdevuansdk` is a shell script library intended to unify the use and creation
       +of various functions spread throughout devuan's various sdks.
       +
       +devuan's sdks are designed to be used interactively from a terminal, as
       +well as from shell scripts. libdevuansdk uses the functionality of the
       +[zuper](https://github.com/dyne/zuper) zsh library, but it does not include
       +it. you are required to include it in your sdk. however, `libdevuansdk`
       +requires the following packages to be installed:
       +
       +```
       +zsh debootstrap sudo kpartx cgpt xz-utils
       +```
       +
       +## notes
       +
       +to support the development, you are welcome to open issues on problems and
       +bugs you encounter. open merge requests of patches or simply get involved
       +in other tasks evident on <https://git.devuan.org>
       +
       +## acknowledgments
       +
       +Devuan's SDK was originally conceived during a period of residency at the
       +Schumacher college in Dartington, UK. Greatly inspired by the laborious and
       +mindful atmosphere of its wonderful premises.
       +
       +The Devuan SDK is Copyright (c) 2015-2016 by the Dyne.org Foundation
       +
       +Devuan SDK components are designed, written and maintained by:
       +
       +- Ivan J. <parazyd@dyne.org>
       +- Denis Roio <jaromil@dyne.org>
       +- Enzo Nicosia <katolaz@freaknet.org>
       +
       +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/>.
 (DIR) diff --git a/doc/nanodoc b/doc/nanodoc
       t@@ -0,0 +1,75 @@
       +#!/bin/sh
       +# Copyright (c) 2016 parazyd <parazyd@dyne.org>
       +# nanodoc is written and maintained by parazyd
       +#
       +# This file is part of arm-sdk
       +#
       +# 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/>.
       +
       +org="parazyd <parazyd@dyne.org> | dyne.org"
       +name=libdevuansdk
       +version=0.2
       +desc="common library for devuan's sdks"
       +
       +pages="
       +    libdevuansdk.7
       +        configuration.7
       +        workflow.7
       +        helper_functions.7
       +        creating_wrappers.7
       +"
       +
       +generate_manpages() {
       +        for page in $pages; do
       +                ronn -r --manual="$name" --organization="$org" ${page}.md
       +        done
       +
       +        mkdir -p man/man7
       +        mv *.7   man/man7
       +}
       +
       +generate_html() {
       +        mkdir -p html
       +        sed -i -e 's/NAME/'"$name"'/' -e 's/DESC/'"$desc"'/g' static/head.html
       +        sed -i -e 's/VERSION/'$version'/'                 static/foot.html
       +
       +        for page in $pages; do
       +                pagetitle=$(sed 1q ${page}.md)
       +                printf '<li><a href="%s.html" class="notPage">%s</a></li>\n' $page "$pagetitle" >> nav.html
       +        done
       +
       +        printf "</ul></div><div id='main'>\n" >> nav.html
       +
       +        for page in $pages; do
       +                printf "\thtml/%s\n" $page
       +                cat static/head.html > html/${page}.html
       +                cat nav.html >> html/${page}.html
       +                python -m markdown ${page}.md >> html/${page}.html
       +                cat static/foot.html >> html/${page}.html
       +
       +                pagetitle=$(sed 1q ${page}.md)
       +                sed -i -e 's/TITLE/'"$pagetitle"'/' html/${page}.html
       +                sed -i -e 's/'$page'.html" class="notPage/'$page'.html" class="thisPage/' html/${page}.html
       +        done
       +
       +        ln -sf libdevuansdk.7.html html/index.html
       +        #cat nav.html
       +        rm -f nav.html
       +}
       +
       +case $1 in
       +        man)  generate_manpages && exit 0 ;;
       +        html) generate_html     && exit 0 ;;
       +        *)    exit 1 ;;
       +esac
 (DIR) diff --git a/doc/static/foot.html b/doc/static/foot.html
       t@@ -0,0 +1,11 @@
       +
       +        </div>
       +        </div>
       +
       +        <div id="footer">
       +        <span class="right">
       +                <a href="https://git.devuan.org/sdk/libdevuansdk">libdevuansdk-VERSION</a>
       +        </span>
       +        </div>
       +</body>
       +</html>
 (DIR) diff --git a/doc/static/head.html b/doc/static/head.html
       t@@ -0,0 +1,199 @@
       +<!DOCTYPE html>
       +<html lang="en">
       +<head>
       +        <meta charset="utf-8">
       +        <title>TITLE</title>
       +
       +        <style type="text/css">
       +        /* {{{ stylesheet */
       +body {
       +        background-color: #eee;
       +        color: #222;
       +        font-family: sans-serif;
       +        -webkit-font-smoothing: antialiased;
       +        padding: 0;
       +        margin: 0;
       +}
       +
       +hr { margin: 30px 60px; }
       +
       +code {
       +        font-family: monospace;
       +        background-color: #ccc;
       +        padding: 0.2ex 0.5ex 0.2ex 0.5ex;
       +        margin: 0.2ex;
       +        border-radius: 5px;
       +}
       +
       +a, a:visited {
       +        color: #058;
       +        text-decoration: none;
       +        -webkit-transition: all 0.2s linear;
       +        -moz-transition: all 0.2s linear;
       +        -ms-transition: all 0.2s linear;
       +        -o-transition: all 0.2s linear;
       +        transition: all 0.2s linear;
       +}
       +
       +a:hover {
       +        background-color: #eee;
       +        text-decoration: none;
       +}
       +
       +#menu {
       +        clear: both;
       +        overflow: hidden;
       +        color: #069;
       +        background-color: #333;
       +        padding: 0.7ex;
       +        font-size: 94%;
       +        border-top: 1px solid #333;
       +        border-bottom: 1px solid #333;
       +}
       +
       +#menu a {
       +        padding: 0.5ex 1ex 0.5ex 1ex;
       +        color: #fff;
       +}
       +
       +#menu a:hover {
       +        background-color: #333;
       +        color: #17a;
       +}
       +
       +#menu a.thisSite {
       +        font-weight: bold;
       +}
       +
       +#header {
       +        clear: both;
       +        color: #666;
       +        font-size: 1.78em;
       +        padding: 0.7ex 0.7ex 0.7ex 0.7em;
       +}
       +
       +#header img {
       +        width: 30px;
       +}
       +
       +#headerLink {
       +        color: #666;
       +        margin-left: 5px;
       +}
       +
       +h1 {
       +        font-family: sans-serif;
       +        margin: 1em 1ex 0.5ex 0;
       +        font-size: 1.4em;
       +}
       +
       +h2 {
       +        font-family: sans-serif;
       +        margin: 1em 1ex 0.5ex 0;
       +        font-size: 1.3em;
       +}
       +
       +h3 {
       +        font-family: sans-serif;
       +        margin: 1em 1ex 0.5ex 0;
       +        font-size: 1.0em;
       +}
       +
       +h4 {
       +        font-family: sans-serif;
       +        margin: 1em 1ex 0.5ex 0;
       +        font-size: 0.9em;
       +}
       +
       +#headerSubtitle {
       +        font-size: 0.75em;
       +        font-style: italic;
       +        margin-left: 1em;
       +}
       +
       +#content {
       +        clear: both;
       +        font-size: 0.9em;
       +        margin: 0;
       +        padding: 0;
       +        background-color: #fff;
       +        overflow: hidden;
       +}
       +
       +#nav {
       +        background-color: #fff;
       +        float: left;
       +        margin: 0 1px 0 0;
       +        padding: 1em 0;
       +        border-right: 1px dotted #ccc;
       +        width: 200px;
       +}
       +
       +#nav ul {
       +        margin: 0;
       +        padding: 0;
       +}
       +
       +#nav li {
       +        list-style: none;
       +        font-size: 0.8em;
       +        padding: 0;
       +        margin: 0;
       +}
       +
       +#nav li ul {
       +        padding-left: 0.6em !important;
       +}
       +
       +#nav li a {
       +        display: block;
       +        margin: 0;
       +        padding: 0.8ex 2em 0.8ex 1em;
       +}
       +
       +#nav li a.thisPage {
       +        color: #222; /*#333;*/
       +        font-weight: bold;
       +        /*font-style: italic;*/
       +}
       +
       +#main {
       +        margin: 0 0 0 200px;
       +        padding: 1.5em;
       +        max-width: 50em;
       +}
       +
       +#footer {
       +        clear: both;
       +        color: #666;
       +        border-top: 1px solid #ccc;
       +        font-size: 84%;
       +        padding: 1em;
       +        margin: 0 0 1.5em 0;
       +}
       +
       +.left {
       +        float: left;
       +        margin: 0;
       +        padding: 0;
       +}
       +
       +.right {
       +        float: right;
       +        margin: 0;
       +        padding: 0;
       +}
       +        /* }}} */
       +        </style>
       +</head>
       +<body>
       +        <div id="header">
       +                <a id="headerLink" href="html">libdevuansdk</a>
       +                <span id="headerSubtitle">DESC</span>
       +        </div>
       +        <div id="menu"></div>
       +
       +        <div id="content">
       +        <div id="nav">
       +
       +        <ul>
 (DIR) diff --git a/doc/workflow.7.md b/doc/workflow.7.md
       t@@ -0,0 +1,32 @@
       +libdevuansdk workflow
       +=====================
       +
       +Working with libdevuansdk splits into categories of what you want to do.
       +`zlibs` are files separated into these "categories":
       +
       +## bootstrap
       +
       +Contains the functions for the bootstrap process. Creating a minimal debootstrap
       +base, and making it into a tarball for later use so you don't have to wait for
       +the debootstrap on every build.
       +
       +## helpers
       +
       +Contains the helper functions for libdevuansdk that make your and my life a bit
       +easier.
       +
       +## imaging
       +
       +Contains the functions necessary for creating raw dd-able images.
       +
       +## kernel
       +
       +Contains the functions for installing a vanilla kernel.
       +
       +## rsync
       +
       +Contains rsync functions
       +
       +## sysconf
       +
       +Contains the default system configuration.
 (DIR) diff --git a/libdevuansdk b/libdevuansdk
       t@@ -24,6 +24,7 @@ source $LIBPATH/config
        source $LIBPATH/zlibs/bootstrap
        source $LIBPATH/zlibs/helpers
        source $LIBPATH/zlibs/imaging
       +source $LIBPATH/zlibs/iso
        source $LIBPATH/zlibs/kernel
        source $LIBPATH/zlibs/rsync
        source $LIBPATH/zlibs/sysconf
 (DIR) diff --git a/zlibs/bootstrap b/zlibs/bootstrap
       t@@ -138,6 +138,7 @@ bootstrap_tar_pack() {
        #apt-get --yes --force-yes purge ${extra_packages}
        apt-get --yes --force-yes autoremove
        apt-get clean
       +rm -f /prepack
        EOF
        
                sudo chmod +x $strapdir/prepack || zerr
       t@@ -181,11 +182,14 @@ apt-get --yes --force-yes upgrade
        apt-get --yes --force-yes install ${extra_packages}
        apt-get --yes --force-yes autoremove
        apt-get clean
       +rm -f /postunpack
        EOF
        
                dpkgdivert on $strapdir
       +        devprocsys mount $strapdir
                sudo chmod +x $strapdir/postunpack   || zerr
                sudo -E chroot $strapdir /postunpack || zerr
       +        devprocsys umount $strapdir
                dpkgdivert off $strapdir
        
                ## below typically used in arm-sdk
 (DIR) diff --git a/zlibs/helpers b/zlibs/helpers
       t@@ -36,13 +36,34 @@ build_image_dist() {
                ## TODO: add blend_prebuild; blend_midbuild; blend_postbuild
        
                bootstrap_complete_base            || zerr
       +        [[ $BLEND = 1 ]] && blend_preinst  || zerr
                image_prepare_raw                  || zerr
                image_partition_raw_${parted_type} || zerr
                build_kernel_${arch}               || zerr
       +        [[ $BLEND = 1 ]] && blend_postinst || zerr
                rsync_to_raw_image                 || zerr
                image_pack_dist                    || zerr
        }
        
       +build_iso_dist() {
       +        fn build_iso_dist
       +        req=(workdir strapdir os arch)
       +        ckreq || return 1
       +
       +        notice "building complete iso image"
       +
       +        bootstrap_complete_base || zerr
       +        [[ $BLEND = 1 ]] && blend_preinst || zerr
       +        iso_prepare_strap       || zerr
       +        build_kernel_${arch}    || zerr
       +        iso_setup_isolinux      || zerr
       +        iso_write_isolinux_cfg  || zerr
       +        [[ $INSTALLER = 1 ]] && iso_setup_installer
       +        [[ $BLEND = 1 ]] && blend_postinst || zerr
       +        iso_squash_strap        || zerr
       +        iso_xorriso_build       || zerr
       +}
       +
        devprocsys() {
                fn devprocsys "$@"
                local watdo="$1"
       t@@ -121,6 +142,38 @@ EOF
                sudo -E chroot $werdo /dpkgdivert || zerr
        }
        
       +enableserv() {
       +        fn enableserv "$@"
       +        local service="$1"
       +        req=(service strapdir)
       +        ckreq || return 1
       +
       +        cat <<EOF | sudo tee -a ${strapdir}/enserv
       +#!/bin/sh
       +update-rc.d ${service} enable
       +EOF
       +
       +        notice "enabling $service service"
       +        sudo chmod +x $strapdir/enserv
       +        sudo -E chroot $strapdir /enserv
       +}
       +
       +disableserv() {
       +        fn disableserv "$@"
       +        local service="$1"
       +        req=(service strapdir)
       +        ckreq || return 1
       +
       +        cat <<EOF | sudo tee -a ${strapdir}/disserv
       +#!/bin/sh
       +update-rc.d ${service} disable
       +EOF
       +
       +        notice "disabling $service service"
       +        sudo chmod +x $strapdir/disserv
       +        sudo -E chroot $strapdir /disserv
       +}
       +
        enablessh() {
                fn enablessh
                req=(strapdir)
       t@@ -130,6 +183,43 @@ enablessh() {
        #!/bin/sh
        sed -i -e 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
        update-rc.d ssh enable
       +chmod +x /etc/init.d/regensshkeys
       +update-rc.d regensshkeys defaults
       +update-rc.d regensshkeys enable
       +EOF
       +
       +        cat <<EOF | sudo tee ${strapdir}/etc/init.d/regensshkeys
       +#!/bin/sh
       +#
       +### BEGIN INIT INFO
       +# Provides:       something
       +# Required-Start: \$syslog
       +# Required-Stop:  \$syslog
       +# Default-Start:  2 3 4 5
       +# Default-Stop:   0 1 6
       +# Short-Description: Regenerate openssh-server keys
       +# Description:    Regenerate openssh-server keys
       +### END INIT INFO
       +#
       +set -e
       +set -u
       +
       +genkeys() {
       +        /usr/sbin/service ssh stop
       +        /usr/sbin/dpkg-reconfigure openssh-server
       +        /usr/sbin/service ssh start
       +        /usr/sbin/update-rc.d regensshkeys disable
       +}
       +
       +case "\$1" in
       +        start)
       +                genkeys;;
       +        stop)
       +                ;;
       +        *)
       +                echo "usage: \$(basename \$0) {start}"
       +                ;;
       +esac
        EOF
        
                dpkgdivert on $strapdir
       t@@ -138,6 +228,28 @@ EOF
                dpkgdivert off $strapdir
        }
        
       +install-custdebs() {
       +        fn install-custdebs
       +        req=(R strapdir)
       +        ckreq || return 1
       +
       +        sudo mkdir -p $strapdir/debs
       +        sudo cp $CPVERBOSE -f $R/extra/custom-packages/*.deb $strapdir/debs/
       +
       +        cat <<EOF | sudo tee ${strapdir}/install-debs
       +#!/bin/sh
       +for deb in /debs/*.deb; do
       +        dpkg -i \$deb
       +        apt-get --yes --force-yes -f install
       +done
       +apt-get autoremove
       +apt-get clean
       +rm -rf /debs install-debs
       +EOF
       +        sudo chmod +x $strapdir/install-debs
       +        sudo -E chroot $strapdir /install-debs
       +}
       +
        silly() {
                fn silly "$@"
                local arg1="$1"
 (DIR) diff --git a/zlibs/iso b/zlibs/iso
       t@@ -0,0 +1,129 @@
       +#!/usr/bin/env zsh
       +# Copyright (c) 2016 Dyne.org Foundation
       +# libdevuansdk is maintained by Ivan J. <parazyd@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/>.
       +
       +## burn baby
       +
       +[[ $INSTALLER = 1 ]] && base_packages+=(grub-pc)
       +
       +iso_prepare_strap() {
       +        fn iso_prepare_strap
       +        req=(strapdir)
       +        ckreq || return 1
       +
       +        notice "preparing strapdir for livecd"
       +
       +        cat <<EOF | sudo tee ${strapdir}/isoprep
       +#!/bin/sh
       +apt-get update
       +apt-get --yes --force-yes install dialog live-boot
       +apt-get --yes --force-yes autoremove
       +apt-get clean
       +rm -f /isoprep
       +EOF
       +        dpkgdivert on $strapdir
       +        sudo chmod +x $strapdir/isoprep
       +        sudo -E chroot $strapdir /isoprep
       +        dpkgdivert off $strapdir
       +}
       +
       +iso_setup_isolinux() {
       +        fn iso_setup_isolinux
       +        req=(workdir strapdir)
       +        ckreq || return 1
       +
       +        notice "setting up isolinux"
       +
       +        pushd $workdir
       +        sudo mkdir -p binary/{live,isolinux}
       +        act "copying kernel and initrd"
       +        sudo cp $CPVERBOSE $strapdir/boot/vmlinuz* binary/live/vmlinuz
       +        sudo cp $CPVERBOSE $strapdir/boot/initrd*  binary/live/initrd
       +
       +        sudo cp $CPVERBOSE /usr/share/live/build/bootloaders/isolinux/isolinux.bin \
       +                binary/isolinux
       +        sudo cp $CPVERBOSE /usr/share/live/build/bootloaders/isolinux/*.c32 \
       +                binary/isolinux
       +        popd
       +}
       +
       +iso_write_isolinux_cfg() {
       +        fn iso_write_isolinux_cfg
       +        req=(workdir arch os)
       +        ckreq || return 1
       +
       +        notice "writing isolinux configuration"
       +        cat <<EOF | sudo tee ${workdir}/binary/isolinux/isolinux.cfg
       +ui vesamenu.c32
       +prompt 0
       +menu title ${os} boot menu
       +timeout 300
       +
       +label live-${arch}
       +menu label ^${os} Live (${arch})
       +menu default
       +linux /live/vmlinuz
       +append initrd=/live/initrd boot=live
       +
       +endtext
       +EOF
       +}
       +
       +iso_squash_strap() {
       +        fn iso_squash_strap
       +        req=(workdir strapdir)
       +        ckreq || return 1
       +
       +        notice "creating squashfs out of strapdir"
       +
       +        pushd $workdir
       +        sudo mksquashfs $strapdir binary/live/filesystem.squashfs -comp xz -e boot
       +        popd
       +}
       +
       +iso_xorriso_build() {
       +        fn iso_xorriso_build
       +        req=(workdir image_name)
       +        ckreq || return 1
       +
       +        notice "building iso..."
       +        isoname="${image_name}-live.iso"
       +
       +        pushd $workdir
       +        sudo xorriso -as mkisofs -r -J -joliet-long -l \
       +                -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
       +                -partition_offset 16 \
       +                -A "${os} Live - ${arch}" \
       +                -b isolinux/isolinux.bin \
       +                -c isolinux/boot.cat \
       +                -no-emul-boot \
       +                -boot-load-size 4 \
       +                -boot-info-table \
       +                -o $R/dist/$isoname \
       +                binary
       +        popd
       +}
       +
       +iso_setup_installer() {
       +        fn iso_setup_installer
       +
       +        notice "setting up devuan-installer"
       +        sudo cp $CPVERBOSE $R/extra/installer/* $strapdir/
       +
       +        ## TODO: init to script
       +}
 (DIR) diff --git a/zlibs/kernel b/zlibs/kernel
       t@@ -30,12 +30,14 @@ build_kernel_amd64() {
        
                notice "installing stock kernel for $arch"
        
       +        dpkgdivert on $strapdir
                devprocsys mount $strapdir
        
                sudo chroot $strapdir \
                        apt-get --yes --force-yes install $kernel
        
                devprocsys umount $strapdir
       +        dpkgdivert off $strapdir
        }
        
        build_kernel_i386() {
       t@@ -49,10 +51,12 @@ build_kernel_i386() {
        
                notice "installing stock kernel for $arch"
        
       +        dpkgdivert on $strapdir
                devprocsys mount $strapdir
        
                sudo chroot $strapdir \
                        apt-get --yes --force-yes install $kernel
        
                devprocsys umount $strapdir
       +        dpkgdivert off $strapdir
        }