tbegin refactoring - coffin - secure lan file storage on a device
 (HTM) git clone git://parazyd.org/coffin.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 0c26ca5a864dd457ec0b76639df21f333ffcd6d9
 (DIR) parent c8469c1d7100a08baa625ae50d3ea7b83e46c928
 (HTM) Author: parazyd <parazyd@dyne.org>
       Date:   Thu,  6 Oct 2016 10:43:17 +0200
       
       begin refactoring
       
       Diffstat:
         A .gitmodules                         |       3 +++
         M Makefile                            |      64 ++++++++++++++++++++++++++++---
         A coffin                              |      39 +++++++++++++++++++++++++++++++
         A config.mk                           |      17 +++++++++++++++++
         A daemon                              |      28 ++++++++++++++++++++++++++++
         R src/extra/Makefile -> extra/Makefi… |       0 
         R src/extra/apachedav -> extra/apach… |       0 
         R src/extra/coffin.init -> extra/cof… |       0 
         A extra/coffin.key                    |      52 +++++++++++++++++++++++++++++++
         A extra/coffin.pem                    |      31 +++++++++++++++++++++++++++++++
         R src/extra/conf.sh -> extra/conf.sh  |       0 
         R src/extra/davpasswd -> extra/davpa… |       0 
         R src/extra/gen.sh -> extra/gen.sh    |       0 
         M helpers/makehook                    |      15 +++++++++++----
         A sacrist                             |     100 +++++++++++++++++++++++++++++++
         D src/Makefile                        |      65 -------------------------------
         D src/coffin                          |      39 -------------------------------
         D src/sacrist                         |     106 ------------------------------
         D src/zlibs/features                  |     126 -------------------------------
         D src/zlibs/hooks                     |     160 -------------------------------
         D src/zlibs/keyfiles                  |      75 -------------------------------
         D src/zlibs/mounts                    |      55 -------------------------------
         D src/zlibs/ttab                      |      98 -------------------------------
         D src/zlibs/zuper                     |     729 -------------------------------
         D src/zlibs/zuper.init                |      35 -------------------------------
         R src/tomb -> tomb                    |       0 
         R src/hexencode.c -> tomb-kdb-hexenc… |       0 
         R src/gen_salt.c -> tomb-kdb-pbkdf2-… |       0 
         R src/benchmark.c -> tomb-kdb-pbkdf2… |       0 
         R src/pbkdf2.c -> tomb-kdb-pbkdf2.c   |       0 
         A wallet/bindhook                     |       1 +
         A zlibs/features                      |     126 +++++++++++++++++++++++++++++++
         A zlibs/hooks                         |     160 +++++++++++++++++++++++++++++++
         A zlibs/keyfiles                      |      75 +++++++++++++++++++++++++++++++
         A zlibs/mounts                        |      55 +++++++++++++++++++++++++++++++
         A zlibs/ttab                          |      98 +++++++++++++++++++++++++++++++
         A zuper                               |       1 +
       
       37 files changed, 855 insertions(+), 1498 deletions(-)
       ---
 (DIR) diff --git a/.gitmodules b/.gitmodules
       t@@ -0,0 +1,3 @@
       +[submodule "zuper"]
       +        path = zuper
       +        url = https://github.com/dyne/zuper.git
 (DIR) diff --git a/Makefile b/Makefile
       t@@ -1,11 +1,63 @@
       -all:
       -        make -C src
       +# coffin
       +# see LICENSE file for copyright and license details
        
       -install:
       -        make -C src install
       +include config.mk
       +
       +
       +BIN = \
       +        tomb-kdb-pbkdf2 \
       +        tomb-kdb-pbkdf2-getiter \
       +        tomb-kdb-pbkdf2-gensalt \
       +        tomb-kdb-hexencode
       +
       +OBJ = ${BIN:=.o}
       +SRC = ${BIN:=.c}
       +
       +all: options tomb
       +
       +options:
       +        @echo coffin build options:
       +        @echo "CFLAGS  = ${CFLAGS}"
       +        @echo "LDFLAGS = ${LDFLAGS}"
       +        @echo "CC      = ${CC}"
       +
       +.o:
       +        @${CC} ${LDFLAGS} -o $@ $< ${LDLIBS}
       +
       +.c.o:
       +        @echo CC $<
       +        @${CC} ${CFLAGS} -o $@ -c $<
       +
       +${OBJ}: config.mk
       +
       +tomb: ${BIN} ${OBJ}
        
        clean:
       -        make -C src clean
       +        @echo cleaning
       +        @rm -f ${BIN} ${OBJ}
       +
       +dist: clean
       +        @echo creating dist tarball
       +        @mkdir -p coffin-${VERSION}
       +        @cp -f coffin config.mk LICENSE Makefile README.md NOTES.md \
       +                sacrist tomb ${SRC} coffin-${VERSION}
       +        @cp -r zlibs helpers zuper extra coffin-${VERSION}
       +        @rm -f coffin-${VERSION}/zuper/.git
       +        @tar -cf coffin-${VERSION}.tar coffin-${VERSION}
       +        @gzip coffin-${VERSION}.tar
       +        @rm -rf coffin-${VERSION}
       +
       +install: all
       +        @echo installing coffin to ${DESTDIR}${PREFIX}
       +        @mkdir -p ${DESTDIR}${PREFIX}/coffin
       +        @mkdir ${DESTDIR}${PREFIX}/coffin/bin
       +        @mkdir ${DESTDIR}${PREFIX}/coffin/share
       +        @cp -f coffin sacrist tomb ${BIN} ${DESTDIR}${PREFIX}/coffin/bin/
       +        @cp -rf zlibs zuper ${DESTDIR}${PREFIX}/coffin/share/
       +
        
        uninstall:
       -        make -C src uninstall
       +        @echo removing coffin from ${DESTDIR}${PREFIX}
       +        @rm -rf ${DESTDIR}${PREFIX}/coffin
       +
       +.PHONY: all options tomb clean dist install uninstall
 (DIR) diff --git a/coffin b/coffin
       t@@ -0,0 +1,39 @@
       +#!/usr/bin/env bash
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +pattern='sd[a-z][1-9]$'
       +coproc inotifywait --monitor --event create,delete --format '%e %w%f' /dev
       +
       +echo $COPROC_PID > /var/run/coffin.pid # pidfile
       +
       +while read -r -u "${COPROC[0]}" event file; do
       +    if [[ $file =~ $pattern ]]; then
       +        case $event in
       +            CREATE)
       +                echo "Created $file..." #; sleep 1
       +                $(dirname $0)/sacrist $file $event
       +                ;;
       +            DELETE)
       +                echo "Removed $file..." #; sleep 1
       +                $(dirname $0)/sacrist $file $event
       +                ;;
       +        esac
       +    fi
       +done
 (DIR) diff --git a/config.mk b/config.mk
       t@@ -0,0 +1,17 @@
       +# coffin
       +# see LICENSE file for copyright and license details
       +
       +VERSION=0.4
       +
       +# customize below to fit your system
       +
       +PREFIX = /usr/local
       +MANPREFIX = ${PREFIX}/share/man
       +
       +# flags
       +CFLAGS += -g -std=c99 -Os -fPIC -fPIE
       +LDLIBS = -lgcrypt
       +LDFLAGS += -g -pie
       +
       +# compiler and linker
       +CC = cc
 (DIR) diff --git a/daemon b/daemon
       t@@ -0,0 +1,28 @@
       +#!/bin/sh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +## this script tries to emulate the behaviour of bsd daemon(3) call
       +## runs a job with its std streams closed and detaches from terminal
       +
       +if test -z $1; then
       +        echo usage: $(basename $0) job && exit 1
       +fi
       +
       +(exec "$@" &) > /dev/null 2>&1
 (DIR) diff --git a/src/extra/Makefile b/extra/Makefile
 (DIR) diff --git a/src/extra/apachedav b/extra/apachedav
 (DIR) diff --git a/src/extra/coffin.init b/extra/coffin.init
 (DIR) diff --git a/extra/coffin.key b/extra/coffin.key
       t@@ -0,0 +1,52 @@
       +-----BEGIN PRIVATE KEY-----
       +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
       +/n3lc+LNbXwBbp3pK0SccBuBN5u2gw==
       +-----END PRIVATE KEY-----
 (DIR) diff --git a/extra/coffin.pem b/extra/coffin.pem
       t@@ -0,0 +1,31 @@
       +-----BEGIN CERTIFICATE-----
       +MIIFXTCCA0WgAwIBAgIJAMpciwT0q3QLMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV
       +BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX
       +aWRnaXRzIFB0eSBMdGQwHhcNMTYwNTE3MDk1NzIxWhcNMjYwNTE1MDk1NzIxWjBF
       +MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50
       +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
       +CgKCAgEAoGzg73A8ip3bG+XxH+d9dy5iu5Lq2fiRIxW6awCoM9b+ExwSqlWMcjXh
       +9LUz+UrBYufIlxHWGAaNPKXeDxD+uSnyZ4/X0hrWzF/IdA+5Xa6h/ZOmwcjkoVbP
       +EMfJX7RxAPQ73OvWnRqyJPGYwxJl27W8GievxX/N55RVL3lal7clQjvE4slccmfC
       +2NLSHALQTJX4TAcGOb1JdD3usC078YlDM9LDnajfFau3SP73Kq26rVqUODXnzWOg
       +y/ATqb9E3kBuHufrXAhH7Vuq1lukSosDO+BINFElPXIl1lquMbpcTxvvaqFuKaun
       +BcNBc9Tc4H5KHwwFXbWPbZbYMyjUQOn9cBv8bJrdjeZb8QBzbEjY2en0n9PVtoYh
       +pXZ72evu0GXDAFT29Ur6OXrxkjgtjea0RzWV2pL/7T6Qeuu+aMYf+EeNwb9EO6eX
       +bV+Cg+QiVXbLvmnLfSC+u9RBUVUNBv5dzbyj3nhSwKURUckCrwOzM4nwTCb+xXzI
       +xVbf5k1SAs3K7cHOaXdGigO5lu5G/2nzx8C+LzYq5XwnDfVd2mgbfeRRijjzSpmd
       +l4up/SgRRy+SRcZNaU0EY9u1RnHQGfrwu2chE1BOW1QDTQ2UpmQWC9j+5TrB3q0q
       +lHCBLZGS0JNv5fNZHEQh/FbIyXH1Vtb5tY4KeTGqFDA6fheVi5ECAwEAAaNQME4w
       +HQYDVR0OBBYEFEveK4OH3+IDe77AXaqiqBX1w+GBMB8GA1UdIwQYMBaAFEveK4OH
       +3+IDe77AXaqiqBX1w+GBMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIB
       +ACqgmYWgbqaPt4m6VyFVRrmV4GG6eYWWvoVgMeii2N48eCfF9xI6uHbZfqTzH6Jz
       +G46R+LGjyDK8FOOuCa4cy1pj/Kg+Ddr2mEDvps3aKOyg2+40QotM5mB21699pY6c
       +/MvTM2Wot0R5aL9Ucvxu/w1DEn+O8ucQE6obx0xd/YtdjTDzF/6gvUpC8Bo9cij0
       +Ef5eNsQP2ypDJxqrEAStYRsjVNRBLODOllxW7ot5Opbc1HHEDQFYeMG4Tm3Oj0NG
       +lIZ8mNc3jPcdUR+ipRDgcwYZ0+emhgMS0X2JBbT+EmFSe3I5/Lg6e4BnYx+Pzqex
       +gV8eVHnMdZ5AzQQs/JfEzfZhgdS/4NHBy15mbSHrtVbgedL4HBdinuoR4A0vtoyh
       +FqE3mw57IZ1X56h342BRU95LK48RhJr1BEZSdfqpaavtBywS2ltEyzW17/00LesB
       +Q+TKAkrMrwgi5XbEKoOXVGIoxgLMI72uB56NIv8nsApo2htAzFzG/uiLnaVAHAg9
       +w65d0kMtDSEegnr+UXfJBlvYXPt3schqGiot0+fczIMl08ab71jQBcEkXt9RV6WI
       +Ka3mzPSBw1VgkiDJiwuQj/pCxr2bu2jrIAhgN9Xh/bhucLHGiVA+CmomDXgaklet
       +3EWQGV+gpRCeF8pJK6ZyMZmJ8j+OK6qpQCwuO+7myMQb
       +-----END CERTIFICATE-----
 (DIR) diff --git a/src/extra/conf.sh b/extra/conf.sh
 (DIR) diff --git a/src/extra/davpasswd b/extra/davpasswd
 (DIR) diff --git a/src/extra/gen.sh b/extra/gen.sh
 (DIR) diff --git a/helpers/makehook b/helpers/makehook
       t@@ -184,9 +184,13 @@ happenz() {
                                        successmsg
                                }
                                ;;
       +                0)
       +
       +                        printf "Quitting...\"
       +                        exit
       +                        ;;
                        *)
       -                        echo -e "\n"
       -                        echo "No valid option. Exiting..."
       +                        printf "\nNo valid option. Exiting...\n"
                                exit
                                ;;
                esac
       t@@ -196,7 +200,9 @@ main() {
                cat <<EOF
        
        #########################################################
       -                   ..:: COFFIN ::..
       +                   ┏━╸┏━┓┏━╸┏━╸╻┏┓╻
       +                   ┃  ┃ ┃┣╸ ┣╸ ┃┃┗┫
       +                   ┗━╸┗━┛╹  ╹  ╹╹ ╹
           = cryptographic office filer for important nuggets =
                              version 0.4
                        https://coffin.dyne.org
       t@@ -206,12 +212,13 @@ main() {
        3) Backup a tomb from the coffin
        4) Toggle your tomb's open/close state
        5) Configure and create a Bitcoin wallet
       +0) Quit
        
        #########################################################
        
        EOF
        
       -read -n 1 -p "Type in the number of the function you wish to perform: " action
       +read -p "Type in the number of the function you wish to perform: " action
        happenz $action
        }
        
 (DIR) diff --git a/sacrist b/sacrist
       t@@ -0,0 +1,100 @@
       +#!/usr/bin/env zsh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +coffin_version=0.4
       +
       +DEBUG=${DEBUG:-0}
       +QUIET=${QUIET:-0}
       +LOG=${LOG:-""}
       +
       +swapoff -a ## I feel so safe
       +
       +R="$(dirname $0)"
       +source $R/../share/zlibs/zuper
       +
       +# USB key
       +vars+=(device keyuuid)
       +
       +vars+=(GRAVEYARD TOMBS TMPTOMBS TOMBPASSWD)
       +vars+=(KEYMOUNT COFFINDOT TTAB HOOKS)
       +vars+=(keypass undertaker tombid)
       +vars+=(happenz device keyuuid)
       +
       +source $R/../share/zlibs/features
       +source $R/../share/zlibs/hooks
       +source $R/../share/zlibs/keyfiles
       +source $R/../share/zlibs/mounts
       +source $R/../share/zlibs/ttab
       +
       +source $R/../share/zlibs/zuper.init
       +
       +LOCK=$R/.lock
       +[[ -f $LOCK ]] && { warn "Lock found. Wait until finished." && exit }
       +touch $LOCK
       +
       +# Check for a configuration file
       +# [[ -f ".coffinrc" ]] && parse-config
       +
       +device=$1 && xxx "Device: $device"
       +happenz=$2 && xxx "Happenz: $happenz"
       +keyuuid=$(lsblk -no uuid $device) && xxx "Key UUID: $keyuuid"
       +
       +GRAVEYARD="/home/graveyard" # Our graveyard, with all the tombs
       +TOMBS="$GRAVEYARD/tombs" # Info about opened tombs, holds keyuuid, keyhash and tombid
       +TMPTOMBS="$GRAVEYARD/tmptombs" # Temp tempfile, for updating $tombs
       +TOMBPASSWD="$GRAVEYARD/passwd"
       +KEYMOUNT="/media/tombkey" # Directory where keys get mounted
       +COFFINDOT="$KEYMOUNT/coffin" # .coffin directory on the usb key
       +TTAB="$COFFINDOT/ttab" # Our ttab
       +HOOKS="$COFFINDOT/hook"
       +TOMB="$R/tomb"
       +
       +# Main
       +req=(happenz device)
       +ckreq || {
       +        die "Not called through mourner. Exiting..."
       +        clean
       +        exit
       +}
       +
       +act "Coffin v${coffin_version}, Cryptographic office filer for important nuggets "
       +
       +[[ $happenz == "CREATE" ]] && {
       +        mount-key $device || { die "Key not mounted successfully." && exit 1 }
       +
       +        if [[ -d "$COFFINDOT" ]]; then
       +                act "Found .coffin"
       +                [[ -f "$HOOKS" ]] && xxx "Found hooks" && \
       +                        check-hooks
       +                [[ -f "$TTAB" ]] && xxx "Found ttab" && \
       +                        ttab-magic
       +        else
       +                warn "No .coffin directory"
       +        fi
       +
       +        umount-key $device
       +        rm -f $LOCK && exit 0 || exit 1
       +        # cleanup & exit
       +}
       +
       +[[ $happenz == "DELETE" ]] && {
       +        # TODO: Some kind of endgame
       +        rm -f $LOCK && exit 0 || exit 1
       +}
 (DIR) diff --git a/src/Makefile b/src/Makefile
       t@@ -1,65 +0,0 @@
       -PREFIX = /usr/local/coffin/bin
       -CFLAGS = -O2
       -
       -all:
       -        $(CC) $(CFLAGS) -o tomb-kdb-pbkdf2 pbkdf2.c -lgcrypt
       -        $(CC) $(CFLAGS) -o tomb-kdb-pbkdf2-getiter benchmark.c -lgcrypt
       -        $(CC) $(CFLAGS) -o tomb-kdb-pbkdf2-gensalt gen_salt.c -lgcrypt
       -        $(CC) $(CFLAGS) -o tomb-kdb-hexencode hexencode.c
       -        make -C extra
       -
       -clean:
       -        rm -f tomb-kdb-pbkdf2
       -        rm -f tomb-kdb-pbkdf2-getiter
       -        rm -f tomb-kdb-pbkdf2-gensalt
       -        rm -f tomb-kdb-hexencode
       -        make -C extra clean
       -
       -install:
       -        install -Dm755 coffin ${PREFIX}/coffin
       -        install -Dm755 sacrist ${PREFIX}/sacrist
       -        install -Dm755 zlibs/features ${PREFIX}/zlibs/features
       -        install -Dm755 zlibs/hooks ${PREFIX}/zlibs/hooks
       -        install -Dm755 zlibs/keyfiles ${PREFIX}/zlibs/keyfiles
       -        install -Dm755 zlibs/mounts ${PREFIX}/zlibs/mounts
       -        install -Dm755 zlibs/ttab ${PREFIX}/zlibs/ttab
       -        install -Dm755 zlibs/zuper ${PREFIX}/zlibs/zuper
       -        install -Dm644 zlibs/zuper.init ${PREFIX}/zlibs/zuper.init
       -        install -Dm755 tomb ${PREFIX}/tomb
       -        install -Dm755 tomb-kdb-pbkdf2 ${PREFIX}/tomb-kdb-pbkdf2
       -        install -Dm755 tomb-kdb-pbkdf2-getiter ${PREFIX}/tomb-kdb-pbkdf2-getiter
       -        install -Dm755 tomb-kdb-pbkdf2-gensalt ${PREFIX}/tomb-kdb-pbkdf2-gensalt
       -        install -Dm755 tomb-kdb-hexencode ${PREFIX}/tomb-kdb-hexencode
       -        install -Dm770 -g coffin -d /home/graveyard
       -        install -Dm755 extra/coffin.init /etc/init.d/coffin
       -        install -Dm775 -g www-data -d /etc/apache2/DAV
       -        install -Dm600 extra/davpasswd /etc/apache2/DAV/davpasswd
       -        install -Dm640 extra/apachedav /etc/apache2/sites-available/coffindav.conf
       -        install -Dm700 -d /etc/ssl/coffin
       -        install -Dm400 extra/coffin.pem /etc/ssl/coffin/coffin.pem
       -        install -Dm400 extra/coffin.key /etc/ssl/coffin/coffin.key
       -        make -C extra install
       -        @echo "To enable WebDAV, run: 'a2ensite coffindav.conf' as root."
       -
       -uninstall:
       -        make -C extra uninstall
       -        rm -f ${PREFIX}/coffin
       -        rm -f ${PREFIX}/sacrist
       -        rm -f ${PREFIX}/zlibs/features
       -        rm -f ${PREFIX}/zlibs/hooks
       -        rm -f ${PREFIX}/zlibs/keyfiles
       -        rm -f ${PREFIX}/zlibs/mounts
       -        rm -f ${PREFIX}/zlibs/ttab
       -        rm -f ${PREFIX}/zlibs/zuper
       -        rm -f ${PREFIX}/zlibs/zuper.init
       -        rm -f ${PREFIX}/tomb
       -        rm -f ${PREFIX}/tomb-kdb-pbkdf2
       -        rm -f ${PREFIX}/tomb-kdb-pbkdf2-getiter
       -        rm -f ${PREFIX}/tomb-kdb-pbkdf2-gensalt
       -        rm -f ${PREFIX}/tomb-kdb-hexencode
       -        rm -f /etc/init.d/coffin
       -        rm -rf /etc/apache2/DAV
       -        rm -f /etc/apache2/sites-available/coffindav.conf
       -        rm -f /etc/apache2/sites-enabled/coffindav.conf
       -        rm -rf /etc/ssl/coffin
       -        @echo "To disable WebDAV, run: 'a2dissite coffindav.conf' as root."
 (DIR) diff --git a/src/coffin b/src/coffin
       t@@ -1,39 +0,0 @@
       -#!/usr/bin/env bash
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -pattern='sd[a-z][1-9]$'
       -coproc inotifywait --monitor --event create,delete --format '%e %w%f' /dev
       -
       -echo $COPROC_PID > /var/run/coffin.pid # pidfile
       -
       -while read -r -u "${COPROC[0]}" event file; do
       -    if [[ $file =~ $pattern ]]; then
       -        case $event in
       -            CREATE)
       -                echo "Created $file..." #; sleep 1
       -                /usr/local/share/coffin/bin/sacrist $file $event
       -                ;;
       -            DELETE)
       -                echo "Removed $file..." #; sleep 1
       -                /usr/local/share/coffin/bin/sacrist $file $event
       -                ;;
       -        esac
       -    fi
       -done
 (DIR) diff --git a/src/sacrist b/src/sacrist
       t@@ -1,106 +0,0 @@
       -#!/usr/bin/env zsh
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -coffin_version=0.4
       -coffin_release_date="May/2016"
       -
       -DEBUG=${DEBUG:-0}
       -QUIET=${QUIET:-0}
       -LOG=${LOG:-""}
       -
       -swapoff -a # I feel so safe
       -
       -zkv=1
       -helpers=1
       -
       -R=/usr/local/share/coffin/bin
       -source $R/zlibs/zuper
       -
       -# USB key
       -vars+=(device keyuuid)
       -# Locals
       -vars+=(GRAVEYARD TOMBS TMPTOMBS TOMBPASSWD)
       -vars+=(KEYMOUNT COFFINDOT TTAB HOOKS)
       -vars+=(keypass undertaker tombid)
       -vars+=(happenz device keyuuid)
       -
       -source $R/zlibs/zuper.init
       -source $R/zlibs/features
       -source $R/zlibs/hooks
       -source $R/zlibs/keyfiles
       -source $R/zlibs/mounts
       -source $R/zlibs/ttab
       -#source $R/zlibs/config
       -
       -LOCK=$R/.lock
       -[[ -f $LOCK ]] && { warn "Lock found. Wait until finished." && exit }
       -touch $LOCK
       -
       -# Check for a configuration file
       -# [[ -f ".coffinrc" ]] && parse-config
       -
       -device=$1 && xxx "Device: $device"
       -happenz=$2 && xxx "Happenz: $happenz"
       -keyuuid=$(lsblk -no uuid $device) && xxx "Key UUID: $keyuuid"
       -
       -GRAVEYARD="/home/graveyard" # Our graveyard, with all the tombs
       -TOMBS="$GRAVEYARD/tombs" # Info about opened tombs, holds keyuuid, keyhash and tombid
       -TMPTOMBS="$GRAVEYARD/tmptombs" # Temp tempfile, for updating $tombs
       -TOMBPASSWD="$GRAVEYARD/passwd"
       -KEYMOUNT="/media/tombkey" # Directory where keys get mounted
       -COFFINDOT="$KEYMOUNT/coffin" # .coffin directory on the usb key
       -TTAB="$COFFINDOT/ttab" # Our ttab
       -HOOKS="$COFFINDOT/hook"
       -TOMB="$R/tomb"
       -
       -# Main
       -req=(happenz device)
       -ckreq || {
       -        die "Not called through mourner. Exiting..."
       -        clean
       -        exit
       -}
       -
       -act "Coffin, Cryptographic office filer for important nuggets "
       -act "Version: $coffin_version, $coffin_release_date"
       -
       -[[ $happenz == "CREATE" ]] && {
       -        mount-key $device
       -        [[ $? = 0 ]] || { die "Key not mounted successfully." && exit }
       -
       -        if [[ -d "$COFFINDOT" ]]; then
       -                act "Found .coffin"
       -                [[ -f "$HOOKS" ]] && xxx "Found hooks" && \
       -                        check-hooks
       -                [[ -f "$TTAB" ]] && xxx "Found ttab" && \
       -                        ttab-magic
       -        else
       -                warn "No .coffin directory"
       -        fi
       -
       -        umount-key $device
       -        rm $LOCK
       -        # cleanup & exit
       -}
       -
       -[[ $happenz == "DELETE" ]] && {
       -        # TODO: Some kind of endgame
       -        rm $LOCK
       -}
 (DIR) diff --git a/src/zlibs/features b/src/zlibs/features
       t@@ -1,126 +0,0 @@
       -#!/usr/bin/env zsh
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -create-webdav-hook() {
       -        fn create-webdav-hook
       -
       -        davconf="/etc/apache2/sites-available/coffindav.conf"
       -        davpass="/etc/apache2/DAV/davpasswd"
       -
       -        if [[ $entry =~ webdav && -f $COFFINDOT/davpasswd ]]; then
       -                act "Found WebDAV data. Setting up..."
       -
       -                cat $COFFINDOT/davpasswd >> $davpass
       -                [[ $? = 0 ]] || {
       -                        die "Failed setting up WebDAV."
       -                        return 1
       -                }
       -                rm $COFFINDOT/davpasswd
       -                gpasswd -a www-data $undertaker # NOTE: consider standalone group
       -                act "Added new WebDAV user"
       -
       -                sed -i -e :a -e '$d;N;2,3ba' -e 'P;D' $davconf
       -#                cat $COFFINDOT/webdav.conf >> $davconf
       -                cat << EOF >> $davconf
       -
       -                alias /${tombid} /media/${tombid}
       -                <Directory "/media/${tombid}">
       -                        Dav On
       -                        AllowOverride none
       -                        Options Indexes
       -                        AuthType Digest
       -                        AuthName WebDAV
       -                        AuthUserFile /etc/apache2/DAV/davpasswd
       -                        Require user ${undertaker}
       -                </Directory>
       -
       -        </VirtualHost>
       -</IfModule>
       -EOF
       -                act "Wrote to $davconf"
       -                /etc/init.d/apache2 reload
       -                [[ $? = 0 ]] || warn "Apache is funky"
       -#                rm $COFFINDOT/webdav.conf
       -                act "Done setting up WebDAV"
       -        else
       -                act "No WebDAV data found"
       -                return 0
       -        fi
       -}
       -
       -delete-webdav-hook() {
       -        fn delete-webdav-hook $*
       -        req=(tombid)
       -        tombid="$1"
       -        ckreq || return 1
       -
       -        davconf="/etc/apache2/sites-available/coffindav.conf"
       -
       -        sed -i '/alias\ \/${tombid}/,+10 d' $davconf
       -        /etc/init.d/apache2 reload
       -        [[ $? = 0 ]] || warn "Apache is funky"
       -        act "Deleted WebDAV data"
       -}
       -
       -create-sshfs-hook() {
       -        fn create-sshfs-hook
       -
       -        if [[ $entry =~ sshfs && -f $COFFINDOT/$tombid.pub ]]; then
       -                act "Found SSH data. Setting up..."
       -
       -                [[ -d /home/$undertaker/.ssh ]] || mkdir -p /home/$undertaker/.ssh
       -                cat $COFFINDOT/$tombid.pub >> /home/$undertaker/.ssh/authorized_keys
       -                chown -R $undertaker:$undertaker /home/$undertaker/.ssh
       -                chmod 700 /home/$undertaker/.ssh && chmod 600 /home/$undertaker/.ssh/authorized_keys
       -
       -                [[ $? = 0 ]] && act "Wrote to authorized_keys" \
       -                        && act "Done setting up SSH"
       -
       -                # NOTE: maybe remove SSH key from usb, consider deletion
       -        else
       -                act "No SSH data found"
       -        fi
       -}
       -
       -delete-sshfs-hook() {
       -        fn delete-sshfs-hook $*
       -        req=(undertaker tombid)
       -        undertaker="$1"
       -        tombid="$2"
       -        ckreq || return 1
       -
       -        authkeys="/home/$undertaker/.ssh/authorized_keys"
       -
       -        grep -v $tombid $authkeys > $authkeys.tmp
       -        mv $authkeys.tmp $authkeys
       -
       -        act "Deleted SSH data"
       -}
       -
       -create-wallet-hook() {
       -        fn create-wallet-hook
       -
       -        if [[ $entry =~ ":wallet" ]]; then
       -                act "Found Bitcoin wallet data. Setting up..."
       -
       -                [[ -d /home/$undertaker/.bitcoin/wallet ]] || mkdir -p /home/$undertaker/.bitcoin/wallet
       -                # TODO: see NOTES.md about the tmp idea
       -        fi
       -}
 (DIR) diff --git a/src/zlibs/hooks b/src/zlibs/hooks
       t@@ -1,160 +0,0 @@
       -#!/usr/bin/env zsh
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -check-hooks() {
       -        # TODO: fragmented keys, delete, backup, moar
       -        fn check-hooks
       -
       -        line=0
       -        for entry in $(cat $HOOKS); do
       -                let hook=$line+1
       -                act "Found hook $line..."
       -
       -                # Check what's hook supposed to do
       -                if [[ ${entry[(ws@:@)1]} == "create" ]]; then
       -                        create-new-tomb
       -                elif [[ ${entry[(ws@:@)1]} == "delete" ]]; then
       -                        delete-tomb
       -                elif [[ ${entry[(ws@:@)1]} == "backup" ]]; then
       -                        backup-tomb
       -                else
       -                        die "No valid hook syntax on hook $hook"
       -                        print $entry >> $HOOKS.fail
       -                        act "Wrote failed hook to $HOOKS.fail"
       -                        return 1
       -                fi
       -        done
       -        rm $HOOKS
       -}
       -
       -create-new-tomb() {
       -        fn create-new-tomb
       -
       -        # TODO: recognize custom post/bind hooks and implement them in the
       -        # new tomb
       -
       -        act "Creating new tomb"
       -
       -        undertaker=${entry[(ws@:@)2]} && xxx "Undertaker: $undertaker"
       -        tombid=${entry[(ws@:@)3]} && xxx "Tombid: $tombid"
       -        tombsize=${entry[(ws@:@)4]} && xxx "Tomb size: $tombsize"
       -        keypass=$(pwgen 30 -1 1) && xxx "Key password: $keypass"
       -
       -        $(id $undertaker &>/dev/null)
       -        [[ $? = 0 ]] || {
       -                warn "User $undertaker not found. Creating..."
       -                useradd -G coffin -m -s /bin/sh $undertaker
       -                act "Created user $undertaker"
       -        }
       -
       -        act "Digging your tomb..."
       -
       -        sudo -u $undertaker $TOMB dig -s $tombsize $GRAVEYARD/$tombid.tomb || \
       -                (die "Digging went downhill. Cleaning and exiting" && \
       -                        clean-failed-hook)
       -
       -        sudo -u $undertaker $TOMB forge -k $GRAVEYARD/$tombid.key \
       -                --kdf 10 \
       -                --unsafe \
       -                --tomb-pwd "$keypass" || \
       -                        (die "Forging key went downhill. Cleaning and exiting" && \
       -                                clean-failed-hook)
       -
       -        sudo -u $undertaker $TOMB lock $GRAVEYARD/$tombid.tomb \
       -                -k $GRAVEYARD/$tombid.key \
       -                --unsafe \
       -                --tomb-pwd "$keypass" || \
       -                        (die "Locking tomb went downhill. Cleaning and exiting" && \
       -                                clean-failed-hook)
       -
       -        xxx "Moving your keyfile to your USB key..."
       -        mv $GRAVEYARD/$tombid.key $COFFINDOT/ && \
       -                chown $undertaker:$undertaker $COFFINDOT/$tombid.key && \
       -                        xxx "Moved and chowned keyfile"
       -
       -        print "${undertaker}:${tombid}:true" >> $TTAB
       -
       -        hash-key
       -        print "${keyhash}:${keypass}" >> $TOMBPASSWD
       -        chmod 600 $TOMBPASSWD
       -        act "Wrote to ttab and tombpasswd"
       -
       -        # Check for features
       -        create-webdav-hook
       -        create-sshfs-hook
       -        create-wallet-hook
       -}
       -
       -delete-tomb() {
       -        fn delete-tomb
       -
       -        act "Deleting tomb"
       -
       -        undertaker=${entry[(ws@:@)2]} && xxx "Undertaker: $undertaker"
       -        tombid=${entry[(ws@:@)3]} && xxx "Tombid: $tombid"
       -
       -        [[ $(id $undertaker) ]] || {
       -                die "User $undertaker not found. Exiting..." \
       -                        && return 1
       -        }
       -
       -        [[ -f $GRAVEYARD/$tombid.tomb ]] || {
       -                die "Tomb $tombid.tomb not found. Exiting..." \
       -                        && return 1
       -        }
       -
       -        [[ -f $COFFINDOT/$tombid.key ]] || {
       -                die "Key of $tombid not found. Exiting..." \
       -                        && return 1
       -        }
       -
       -        compare-key
       -        [[ $? = 0 ]] && {
       -                sudo -u $undertaker $TOMB slam $tombid
       -                update-tombs del
       -
       -                grep -v ${undertaker}:${tombid} $TTAB > $TTAB.tmp
       -                mv $TTAB.tmp $TTAB && \
       -                        act "Removed from ttab"
       -
       -                grep -v ${keyhash} $TOMBPASSWD > $TOMBPASSWD.tmp
       -                mv $TOMBPASSWD.tmp $TOMBPASSWD && \
       -                        chmod 600 $TOMBPASSWD && \
       -                        act "Removed from tombpasswd"
       -
       -                # Check for features
       -                delete-webdav-hook $tombid
       -                delete-sshfs-hook $undertaker $tombid
       -        }
       -}
       -
       -check-temptomb() {
       -        fn check-temptomb
       -
       -        act "Checking for tomb temps"
       -        if [[ -d ${GRAVEYARD}/temp/${tombid} ]]; then
       -                mv ${GRAVEYARD}/temp/${tombid}/* /media/${tombid}/
       -                mv ${GRAVEYARD}/temp/${tombid}/.* /media/${tombid}/
       -
       -                act "Moved all tomb temps"
       -
       -                rmdir ${GRAVEYARD}/temp/${tombid}
       -        fi
       -}
 (DIR) diff --git a/src/zlibs/keyfiles b/src/zlibs/keyfiles
       t@@ -1,75 +0,0 @@
       -#!/usr/bin/env zsh
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -hash-key() {
       -        fn hash-key
       -        vars+=(keyhash)
       -        keyhash=""
       -
       -        keyhash=${$(sha256sum $COFFINDOT/$tombid.key)[(ws: :)1]}
       -        xxx "sha256 of keyfile: $keyhash"
       -}
       -
       -compare-key() {
       -        fn compare-key
       -
       -        hash-key
       -
       -        if [[ ( $(grep $keyhash $TOMBS | grep $keyuuid) ) ]]; then
       -                return 0
       -        else
       -                return 1
       -        fi
       -}
       -
       -#                                 ,_-=(!7(7/zs_.
       -#                              .='  ' .`/,/!(=)Zm.
       -#                .._,,._..  ,-`- `,\ ` -` -`\\7//WW.
       -#           ,v=~/.-,-\- -!|V-s.)iT-|s|\-.'   `///mK%.
       -#         v!`i!-.e]-g`bT/i(/[=.Z/m)K(YNYi..   /-]i44M.
       -#       v`/,`|v]-DvLcfZ/eV/iDLN\D/ZK@%8W[Z..   `/d!Z8m
       -#      //,c\(2(X/NYNY8]ZZ/bZd\()/\7WY%WKKW)   -'|(][%4.
       -#    ,\\i\c(e)WX@WKKZKDKWMZ8(b5/ZK8]Z7%ffVM,   -.Y!bNMi
       -#    /-iit5N)KWG%%8%%%%W8%ZWM(8YZvD)XN(@.  [   \]!/GXW[
       -#   / ))G8\NMN%W%%%%%%%%%%8KK@WZKYK*ZG5KMi,-   vi[NZGM[
       -#  i\!(44Y8K%8%%%**~YZYZ@%%%%%4KWZ/PKN)ZDZ7   c=//WZK%!    This is a euphemism for how my code is structured.
       -# ,\v\YtMZW8W%%f`,`.t/bNZZK%%W%%ZXb*K(K5DZ   -c\\/KM48
       -# -|c5PbM4DDW%f  v./c\[tMY8W%PMW%D@KW)Gbf   -/(=ZZKM8[     If you're reading this, you have probably been put
       -# 2(N8YXWK85@K   -'c|K4/KKK%@  V%@@WD8e~  .//ct)8ZK%8`     in charge of maintaining this program.
       -# =)b%]Nd)@KM[  !'\cG!iWYK%%|   !M@KZf    -c\))ZDKW%`
       -# YYKWZGNM4/Pb  '-VscP4]b@W%     'Mf`   -L\///KM(%W!       I am so, so sorry for you.
       -# !KKW4ZK/W7)Z. '/cttbY)DKW%     -`  .',\v)K(5KW%%f
       -# 'W)KWKZZg)Z2/,!/L(-DYYb54%  ,,`, -\-/v(((KK5WW%f         God speed.
       -#  \M4NDDKZZ(e!/\7vNTtZd)8\Mi!\-,-/i-v((tKNGN%W%%
       -#  'M8M88(Zd))///((|D\tDY\\KK-`/-i(=)KtNNN@W%%%@%[
       -#   !8%@KW5KKN4///s(\Pd!ROBY8/=2(/4ZdzKD%K%%%M8@%%
       -#    '%%%W%dGNtPK(c\/2\[Z(ttNYZ2NZW8W8K%%%%YKM%M%%.
       -#      *%%W%GW5@/%!e]_tZdY()v)ZXMZW%W%%%*5Y]K%ZK%8[
       -#       '*%%%%8%8WK\)[/ZmZ/Zi]!/M%%%%@f\ \Y/NNMK%%!
       -#         'VM%%%%W%WN5Z/Gt5/b)((cV@f`  - |cZbMKW%%|
       -#            'V*M%%%WZ/ZG\t5((+)L'-,,/  -)X(NWW%%%
       -#                 `~`MZ/DZGNZG5(((\,    ,t\\Z)KW%@
       -#                    'M8K%8GN8\5(5///]i!v\K)85W%%f
       -#                      YWWKKKKWZ8G54X/GGMeK@WM8%@
       -#                       !M8%8%48WG@KWYbW%WWW%%%@
       -#                         VM%WKWK%8K%%8WWWW%%%@`
       -#                           ~*%%%%%%W%%%%%%%@~
       -#                              ~*MM%%%%%%@f`
       -#                                  '''''
 (DIR) diff --git a/src/zlibs/mounts b/src/zlibs/mounts
       t@@ -1,55 +0,0 @@
       -#!/usr/bin/env zsh
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -mount-key() {
       -        fn mount-key $*
       -        req=(device)
       -        device="$1"
       -        ckreq || return 1
       -
       -        if [[ -d $KEYMOUNT ]]; then
       -                die "$KEYMOUNT already exists."
       -                return 1
       -        else
       -                act "Creating $KEYMOUNT"
       -                mkdir -p $KEYMOUNT
       -                act "Mounting..."
       -                mount $device $KEYMOUNT
       -                return 0
       -        fi
       -}
       -
       -umount-key() {
       -        fn umount-key $?
       -        req=(device)
       -        device="$1"
       -        ckreq || return 1
       -
       -        if [[ -d $KEYMOUNT ]]; then
       -                act "Unmounting $device"
       -                umount $device \
       -                && rmdir $KEYMOUNT
       -                act "Success umounting"
       -                return 0
       -        else
       -                act "No $KEYMOUNT found"
       -                return 0
       -        fi
       -}
 (DIR) diff --git a/src/zlibs/ttab b/src/zlibs/ttab
       t@@ -1,98 +0,0 @@
       -#!/usr/bin/env zsh
       -#
       -# Copyright (c) 2016 Dyne.org Foundation
       -# coffin is written and maintained by parazyd <parazyd@dyne.org>
       -#
       -# This file is part of coffin
       -#
       -# 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/>.
       -
       -update-tombs() {
       -        fn update-tombs $*
       -        req=(happ)
       -        happ="$1"
       -        ckreq || return 1
       -
       -        if [[ $happ == "add" ]]; then
       -                print "${undertaker}:${keyhash}:${keyuuid}" >> $TOMBS && \
       -                        chmod 600 $TOMBS && \
       -                        act "Added info to $TOMBS"
       -        elif [[ $happ == "del" ]]; then
       -                cp $TOMBS $TMPTOMBS
       -                grep -v "${keyhash}:${keyuuid}" $TMPTOMBS > $TOMBS && \
       -                        chmod 600 $TOMBS && \
       -                        act "Removed from $TOMBS"
       -                rm $TMPTOMBS
       -        fi
       -}
       -
       -ttab-magic() {
       -        fn ttab-magic
       -
       -        act "Doing ttab magic..."
       -
       -        line=0
       -        for entry in $(cat $TTAB); do
       -                let line=$line+1
       -                act "Found line $line..."
       -
       -                [[ ${entry[(ws@:@)3]} == "true" ]] && {
       -                        act "Working on tomb from line $line"
       -
       -                        undertaker=${entry[(ws@:@)1]} && xxx "Undertaker: $undertaker"
       -                        tombid=${entry[(ws@:@)2]} && xxx "Tombid: $tombid"
       -
       -                        compare-key
       -                        [[ $? = 0 ]] && {
       -                                act "compare-key -> true"
       -                                close-tomb
       -
       -                                update-tombs del
       -                                continue
       -                        }
       -
       -                        act "compare-key -> false"
       -
       -                        hash-key
       -                        keypass=$(grep $keyhash $TOMBPASSWD)
       -                        keypass=${keypass[(ws@:@)2]}
       -                        xxx "Key password: $keypass"
       -
       -                        open-tomb
       -
       -                        [[ -d "/media/$tombid" ]] && {
       -                                chmod g+rw /media/$tombid
       -                                update-tombs add
       -                        }
       -
       -                        check-temptomb
       -                }
       -        done
       -}
       -
       -open-tomb() {
       -        sudo -u ${undertaker} ${TOMB} open \
       -                ${GRAVEYARD}/${tombid}.tomb \
       -                -k ${COFFINDOT}/${tombid}.key \
       -                --unsafe \
       -                --tomb-pwd "${keypass}"
       -
       -        [[ $? = 0 ]] || { die "Tomb didn't open" && return 1 }
       -}
       -
       -close-tomb() {
       -        sudo -u ${undertaker} ${TOMB} slam ${tombid}
       -
       -        [[ $? = 0 ]] || { die "Tomb didn't slam" && return 1 }
       -}
 (DIR) diff --git a/src/zlibs/zuper b/src/zlibs/zuper
       t@@ -1,729 +0,0 @@
       -#!/usr/bin/env zsh
       -## -*- origami-fold-style: triple-braces -*-
       -#
       -# Zuper - Zsh Ultimate Programmer's Extensions Refurbished
       -#
       -# Copyright (C) 2015 Dyne.org Foundation
       -#
       -# Zuper is designed, written and maintained by Denis Roio <jaromil@dyne.org>
       -#
       -# This source  code is free  software; you can redistribute  it and/or
       -# modify it under the terms of  the GNU Public License as published by
       -# the Free  Software Foundation; either  version 3 of the  License, or
       -# (at your option) any later version.
       -#
       -# This source code 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.
       -# Please refer to the GNU Public License for more details.
       -#
       -# You should have received a copy of the GNU Public License along with
       -# this source code; if not, write to:
       -# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
       -
       -
       -##########################
       -typeset -aU vars
       -typeset -aU arrs
       -typeset -aU maps
       -
       -vars=(DEBUG QUIET LOG)
       -arrs=(req freq)
       -
       -vars+=(zuper_version)
       -zuper_version=0.2
       -
       -# {{{ Messaging
       -
       -# Messaging function with pretty coloring
       -autoload colors
       -colors
       -
       -vars+=(last_act last_func last_notice)
       -
       -function _msg() {
       -    local msg="$2"
       -    command -v gettext 1>/dev/null 2>/dev/null && msg="$(gettext -s "$2")"
       -    for i in $(seq 3 ${#});
       -    do
       -        msg=${(S)msg//::$(($i - 2))*::/$*[$i]}
       -    done
       -
       -    local command="print -P"
       -    local progname="$fg[magenta]${PROGRAM##*/}$reset_color"
       -    local message="$fg_bold[normal]$fg_no_bold[normal]$msg$reset_color"
       -    local -i returncode
       -
       -    case "$1" in
       -        inline)
       -            command+=" -n"; pchars=" > "; pcolor="yellow"
       -            ;;
       -        message)
       -            last_act="$msg"
       -            pchars=" . "; pcolor="white"; message="$fg_no_bold[$pcolor]$msg$reset_color"
       -            ;;
       -        verbose)
       -            last_func="$msg"
       -            pchars="[D]"; pcolor="blue"
       -            ;;
       -        success)
       -            last_notice="$msg"
       -            pchars="(*)"; pcolor="green"; message="$fg_no_bold[$pcolor]$msg$reset_color"
       -            ;;
       -        warning)
       -            pchars="[W]"; pcolor="yellow"; message="$fg_no_bold[$pcolor]$msg$reset_color"
       -            ;;
       -        failure)
       -            pchars="[E]"; pcolor="red"; message="$fg_no_bold[$pcolor]$msg$reset_color"
       -            returncode=1
       -            ;;
       -        print)
       -            progname=""
       -            ;;
       -        *)
       -            pchars="[F]"; pcolor="red"
       -            message="Developer oops!  Usage: _msg MESSAGE_TYPE \"MESSAGE_CONTENT\""
       -            returncode=127
       -            zerr
       -            ;;
       -    esac
       -    ${=command} "${progname} $fg_bold[$pcolor]$pchars$reset_color ${message}$color[reset_color]" >&2
       -
       -    # write the log if its configured
       -    [[ "$LOG" = "" ]] || {
       -        touch $LOG || return $?
       -        ${=command} "${progname} $fg_bold[$pcolor]$pchars$reset_color ${message}$color[reset_color]" >> $LOG
       -    }
       -
       -    return $returncode
       -}
       -
       -function _message say act() {
       -    local notice="message"
       -    [[ "$1" = "-n" ]] && shift && notice="inline"
       -    [[ $QUIET = 1 ]] || _msg "$notice" $@
       -    return 0
       -}
       -
       -function _verbose xxx func() {
       -    [[ $DEBUG = 1 ]] && _msg verbose $@
       -    return 0
       -}
       -
       -function _success yes notice() {
       -    [[ $QUIET = 1 ]] || _msg success $@
       -    return 0
       -}
       -
       -function _warning no warn warning() {
       -    [[ $QUIET = 1 ]] || _msg warning $@
       -    return 0
       -}
       -
       -function _failure fatal die error() {
       -    #    typeset -i exitcode=${exitv:-1}
       -    [[ $QUIET = 1 ]] || _msg failure $@
       -    return 1
       -}
       -
       -function _print() {
       -    [[ $QUIET = 1 ]] || _msg print $@
       -    return 0
       -}
       -
       -# }}} Messaging
       -
       -# {{{ Debugging
       -
       -fn() {
       -    fun="$@"
       -    req=()
       -    freq=()
       -    func "$fun"
       -}
       -
       -zerr() {
       -    error "error in: ${fun:-$last_notice}"
       -    [[ "$last_func"   = "" ]] || warn "called in: $last_func"
       -    [[ "$last_act"    = "" ]] || warn "called in: $last_act"
       -    [[ "$last_notice" = "" ]] || warn "called in: $last_notice"
       -    # [[ "$fun"         = "" ]] || warn "called in: $fun"
       -    TRAPEXIT() {
       -        error "error reported, operation aborted."
       -    }
       -    return 1
       -}
       -
       -
       -ckreq reqck() {
       -    err=0
       -    for v in $req; do
       -        [[ "${(P)v}" = "" ]] && {
       -            warn "${fun[(ws: :)1]}(): required setting is blank: $v"
       -            err=1
       -        }
       -    done
       -
       -    [[ $err = 1 ]] && return $err
       -
       -    for f in $freq; do
       -        # exists and has size greater than zero
       -        [[ -s $f ]] || {
       -            warn "required file empty: $f"
       -            err=1
       -        }
       -    done
       -    [[ $err == 1 ]] && zerr
       -    return $err
       -}
       -
       -zdump() {
       -    fn zdump
       -    [[ ${#vars} -gt 0 ]] && {
       -        print "Global variables:"
       -        for _v in $vars; do
       -            print " $_v = \t ${(P)_v}"
       -        done
       -    }
       -    [[ ${#arrs} -gt 0 ]] && {
       -        print "Global arrays:"
       -        for _a in $arrs; do
       -        print " $_a \t ( ${(P)_a} )"
       -        done
       -    }
       -    [[ ${#maps} -gt 0 ]] && {
       -        print "Global maps:"
       -        for _m in $maps; do
       -            print " $_m [key] \t ( ${(Pk)_m} )"
       -            print " $_m [val] \t ( ${(Pv)_m} )"
       -        done
       -    }
       -}
       -
       -# handy wrappers for throw/catch execution of blocks where we need the
       -# program to exit on any error (non-zero) returned by any function
       -throw() { function TRAPZERR() { zerr; return 1 } }
       -catch() { function TRAPZERR() { } }
       -
       -##########################
       -# Endgame handling
       -
       -arrs+=(destruens)
       -destruens=()
       -
       -# Trap functions for the endgame event
       -TRAPINT()  { endgame INT;   return $? }
       -# TRAPEXIT() { endgame EXIT;  return $? }
       -TRAPHUP()  { endgame HUP;   return $? }
       -TRAPQUIT() { endgame QUIT;  return $? }
       -TRAPABRT() { endgame ABORT; return $? }
       -TRAPKILL() { endgame KILL;  return $? }
       -# TRAPPIPE() { endgame PIPE;  return $? }
       -TRAPTERM() { endgame TERM;  return $? }
       -TRAPSTOP() { endgame STOP;  return $? }
       -# TRAPZERR() { func "function returns non-zero." }
       -
       -
       -endgame() {
       -    fn "endgame $*"
       -
       -    # execute all no matter what
       -    TRAPZERR() { }
       -
       -    # process registered destructors
       -    for d in $destruens; do
       -        fn "destructor: $d"
       -        $d
       -    done
       -    return 0
       -}
       -
       -# Register endgame() to be called at exit.
       -# unlike TRAPEXIT, the zshexit() hook is not called when functions exit.
       -zshexit() { endgame EXIT; return $? }
       -
       -# }}} Debugging
       -
       -# {{{ Tempfiles
       -
       -##########################
       -# Temp file handling
       -
       -vars+=(ztmpfile)
       -# ztmp() fills in $ztmpfile global. Caller must copy that variable as
       -# it will be overwritten at every call.
       -ztmp() {
       -    fn ztmp
       -
       -    ztmpfile=`mktemp`
       -    tmpfiles+=($ztmpfile)
       -}
       -
       -# All tempfiles are freed in endgame()
       -_ztmp_destructor() {
       -    fn _ztmp_destructor
       -
       -    for f in $tmpfiles; do
       -        rm -f "$f"
       -    done
       -    tmpfiles=()
       -}
       -
       -arrs+=(tmpfiles)
       -destruens+=(_ztmp_destructor)
       -
       -# }}} Tempfiles
       -
       -# {{{ Strings
       -
       -# tokenizer, works only with one char length delimiters
       -# saves everything in global array tok=()
       -arrs+=(tok)
       -strtok() {
       -    fn "strtok $*"
       -    _string="$1"
       -    _delim="$2"
       -    req=(_string _delim)
       -    ckreq || return $?
       -
       -    tok=()
       -    f=0
       -    c=0
       -    for c in {1..${#_string}}; do
       -        if [[ "${_string[(e)$c]}" == "$_delim" ]]; then
       -            # check if not empty
       -            t=${_string[(e)$(($f + 1)),$(($c - 1))]}
       -            [[ "$t" == "" ]] || tok+=($t)
       -            # save last found
       -            f=$c
       -        fi
       -    done
       -    # add last token
       -    t=${_string[(e)$(($f + 1)),$c]}
       -    [[ "$t" == "" ]] || tok+=($t)
       -}
       -
       -# TODO: move in here some helpers
       -
       -# }}} Strings
       -
       -# {{{ Key/Value filesave
       -
       -# optional: define zkv=1 on source
       -
       -[[ "$zkv" = "" ]] || {
       -
       -    ##########################
       -    # Key/Value file storage using ZSh associative maps
       -
       -    zmodload zsh/system
       -
       -    # load a map from a file
       -    # map must be already instantiated with typeset -A by called
       -    # name of map is defined inside the file
       -    function zkv.load() {
       -        fn "zkv-load $*"
       -
       -        file=$1
       -        [[ "$file" = "" ]] && {
       -            error "zkv-open() missing argument: file-path"
       -            zerr
       -            return 1    }
       -        [[ -r "$file" ]] || {
       -            error "zkv-open() file not found $file"
       -            zerr
       -            return 1    }
       -        [[ -s "$file" ]] || {
       -            error "zkv-open() file is empty"
       -            zerr
       -            return 1    }
       -
       -        source $file
       -    }
       -
       -    # save a map in a file
       -    # $1 = name of the map associative array
       -    # $2 = full path to the file
       -    function zkv.save() {
       -        fn "zkv.save $*"
       -
       -        _map=$1
       -        _path=$2
       -        [[ "$_path" = "" ]] && {
       -            error "zkv.save() missing argument: map-name path-to-file"
       -            zerr
       -            return 1
       -        }
       -        [[ -r $_path ]] && {
       -            func "zkv.close() overwriting $_path"
       -            func "backup turd left behind: ${_path}~"
       -            mv $_path $_path~
       -        }
       -        touch $_path
       -
       -        # wondering about http://www.zsh.org/mla/users/2015/msg00286.html
       -        # meanwhile solved using a double array, wasting a full map memcpy
       -        _karr=(${(Pk)_map})
       -        _varr=(${(Pv)_map})
       -        _num="${#_karr}"
       -        for c in {1..$_num}; do
       -            # can also be cat here, however for speed we use builtins
       -            # switch to cat if compatibility is an issue
       -            sysread -o 1 <<EOF >> $_path
       -$_map+=("${_karr[$c]}" "${(v)_varr[$c]}")
       -EOF
       -        done
       -        func "$_num key/values stored in $_path"
       -    }
       -
       -}
       -
       -# }}} Key/Value filesave
       -
       -# {{{ Get/Set REST API
       -
       -# optional: define restful=1 on source
       -
       -[[ "$restful" = "" ]] || {
       -
       -    ########
       -    # Restful API client
       -    # there is a clear zsh optimization here in get/set kv
       -    # using zsh/tcp instead of spawning curl
       -    # and perhaps querying with one call using ?recursive
       -
       -    zmodload zsh/net/tcp
       -
       -
       -    function restful.put() {
       -        fn "restful.put $*"
       -
       -        # $1 = hostname
       -        # $2 = port
       -        # $3 = path
       -        # value from stdin |
       -
       -        # to check if the http service is running is up to the caller
       -
       -        _host=${1} # ip address
       -        _port=${2}
       -        _path=${3}
       -        sysread _v
       -
       -        req=(_host)
       -        ckreq || return $?
       -
       -        if ztcp $_host $_port; then
       -
       -            # TODO: work out various parsers, this one works with consul.io
       -
       -            _fd=$REPLY
       -            #    func "tcp open on fd $fd"
       -            cat <<EOF >& $_fd
       -PUT ${_path} HTTP/1.1
       -User-Agent: Zuper/$zuper_version
       -Host: ${_host}:${_port}
       -Accept: */*
       -Content-Length: ${#_v}
       -Content-Type: application/x-www-form-urlencoded
       -
       -EOF
       -
       -            print -n "$_v" >& $_fd
       -
       -            sysread -i $_fd _res
       -
       -            # close connection
       -            ztcp -c $_fd
       -
       -            [[ "$_res" =~ "true" ]] || {
       -                warn "failed PUT on restful key/value"
       -                warn "host: ${_host}"
       -                warn "port: ${_port}"
       -                warn "path: ${_path}"
       -                warn "value: $_v"
       -                print - "$_res"
       -                zerr
       -                return 1
       -            }
       -
       -        else
       -            error "cannot connect to restful service: $_host:$_port"
       -            zerr
       -            return 1
       -        fi
       -
       -        return 0
       -
       -    }
       -
       -    function restful.get() {
       -        fn "restful.get $*"
       -
       -        _host=${1}
       -        _port=${2}
       -        _path=${3}
       -
       -        req=(_host _port)
       -        ckreq || return $?
       -
       -        ztcp $_host $_port || {
       -            zerr
       -            return 1
       -        }
       -
       -        _fd=$REPLY
       -
       -        # TODO: work out various parsers, this one works with consul.io
       -
       -        cat <<EOF >& $_fd
       -GET ${_path} HTTP/1.1
       -User-Agent: Zuper/$zuper_version
       -Host: $_host:$_port
       -Accept: */*
       -
       -EOF
       -        sysread -i $_fd -o 1 | awk -F: '
       -/"Value":/ { gsub(/"|}]/,"",$7) ; print $7 }' | base64 -d
       -
       -        # close connection
       -        ztcp -c $_fd
       -
       -        return 0
       -
       -    }
       -
       -}
       -
       -# }}} Get/Set REST API
       -
       -# {{{ Helpers
       -[[ "$helpers" = "" ]] || {
       -
       -    function helper.isfound isfound() {
       -        command -v $1   1>/dev/null 2>/dev/null
       -        return $?
       -    }
       -
       -    # remote leading and trailing spaces in a string taken from stdin
       -    function helper.trim trim() {
       -        sed -e 's/^[[:space:]]*//g ; s/[[:space:]]*\$//g'
       -    }
       -
       -    zmodload zsh/mapfile
       -    # faster substitute for cat
       -    function helper.printfile printfile() {
       -        print ${mapfile[$1]}
       -    }
       -
       -    # extract all emails found in a text from stdin
       -    # outputs them one per line
       -    function helper.extract-emails extract_emails() {
       -        awk '{ for (i=1;i<=NF;i++)
       -     if ( $i ~ /[[:alnum:]]@[[:alnum:]]/ ) {
       -       gsub(/<|>|,/ , "" , $i); print $i } }'
       -    }
       -
       -
       -    zmodload zsh/regex
       -    # takes a string as argument, returns success if is an email
       -    function helper.isemail isemail() {
       -        [[ "$1" -regex-match "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" ]] && return 0
       -
       -        return 1
       -    }
       -
       -    # takes a numeric argument and prints out a human readable size
       -    function helper.human-size human_size() {
       -        [[ $1 -gt 0 ]] || {
       -            error "human_size() called with invalid argument"
       -            return 1
       -        }
       -
       -        # we use the binary operation for speed
       -        # shift right 10 is divide by 1024
       -
       -        # gigabytes
       -        [[ $1 -gt 1073741824 ]] && {
       -            print -n "$(( $1 >> 30 )) GB"
       -            return 0
       -        }
       -
       -        # megabytes
       -        [[ $1 -gt 1048576 ]] && {
       -            print -n "$(( $1 >> 20 )) MB"
       -            return 0
       -        }
       -        # kilobytes
       -        [[ $1 -gt 1024 ]] && {
       -            print -n "$(( $1 >> 10 )) KB"
       -            return 0
       -        }
       -        # bytes
       -        print -n "$1 Bytes"
       -        return 0
       -    }
       -
       -
       -    # strips out all html/xml tags (everything between < >)
       -    function helper.html-strip xml_strip html_strip() { sed 's/<[^>]\+>//g' }
       -
       -    # changes stdin string special chars to be shown in html
       -    function helper.escape-html escape_html() {
       -        sed -e '
       -s/\&/\&amp;/g
       -s/>/\&gt;/g
       -s/</\&lt;/g
       -s/"/\&quot;/g
       -'
       -    }
       -
       -    # escapes special chars in urls
       -    function helper.decode-url decode_url urldecode() {
       -        sed -e '
       -s/%25/%/gi
       -s/%20/ /gi
       -s/%09/ /gi
       -s/%21/!/gi
       -s/%22/"/gi
       -s/%23/#/gi
       -s/%24/\$/gi
       -s/%26/\&/gi
       -s/%27/'\''/gi
       -s/%28/(/gi
       -s/%29/)/gi
       -s/%2a/\*/gi
       -s/%2b/+/gi
       -s/%2c/,/gi
       -s/%2d/-/gi
       -s/%2e/\./gi
       -s/%2f/\//gi
       -s/%3a/:/gi
       -s/%3b/;/gi
       -s/%3d/=/gi
       -s/%3e//gi
       -s/%3f/?/gi
       -s/%40/@/gi
       -s/%5b/\[/gi
       -s/%5c/\\/gi
       -s/%5d/\]/gi
       -s/%5e/\^/gi
       -s/%5f/_/gi
       -s/%60/`/gi
       -s/%7b/{/gi
       -s/%7c/|/gi
       -s/%7d/}/gi
       -s/%7e/~/gi
       -s/%09/      /gi
       -'
       -    }
       -
       -    function helper.encode-url encode_url urlencode() {
       -        sed -e '
       -s/%/%25/g
       -s/ /%20/g
       -s/ /%09/g
       -s/!/%21/g
       -s/"/%22/g
       -s/#/%23/g
       -s/\$/%24/g
       -s/\&/%26/g
       -s/'\''/%27/g
       -s/(/%28/g
       -s/)/%29/g
       -s/\*/%2a/g
       -s/+/%2b/g
       -s/,/%2c/g
       -s/-/%2d/g
       -s/\./%2e/g
       -s/\//%2f/g
       -s/:/%3a/g
       -s/;/%3b/g
       -s//%3e/g
       -s/?/%3f/g
       -s/@/%40/g
       -s/\[/%5b/g
       -s/\\/%5c/g
       -s/\]/%5d/g
       -s/\^/%5e/g
       -s/_/%5f/g
       -s/`/%60/g
       -s/{/%7b/g
       -s/|/%7c/g
       -s/}/%7d/g
       -s/~/%7e/g
       -s/      /%09/g
       -'
       -    }
       -
       -}
       -# }}} Helpers
       -
       -# {{{ Config
       -
       -# This is not a full config parser, but its a mechanism to read single
       -# sections of configuration files that are separated using various
       -# syntax methods. The only method supported is now org-mode whose
       -# sections start with #+ . It fills in the global array
       -# $config_section which can be read out to a file or interpreted in
       -# memory, whatever syntax it may contain.
       -
       -vars+=(config_section_type)
       -arrs+=(config_section)
       -config_section_type=org-mode
       -
       -config.section.type() {
       -    fn config.section.type
       -    _type=$1
       -    req=(_type)
       -    ckreq || return $?
       -
       -    case $_type in
       -        org-mode)
       -            config_section_type=org-mode
       -            ;;
       -        *)
       -            error "Unknown config type:$_type"
       -            return 1
       -            ;;
       -    esac
       -
       -    act "$_type config section parser initialized"
       -    return 0
       -
       -}
       -
       -# fills in contents of section in array config_section
       -config.section.read() {
       -    fn config.section.read
       -    _file=$1
       -    _section=$2
       -    req=(_file _section)
       -    freq=($_file)
       -    ckreq || return $?
       -
       -    case $config_section_type in
       -        org-mode)
       -            _contents=`awk '
       -BEGIN { found=0 }
       -/^#\+ '"$_section"'/ { found=1; next }
       -/^#\+/ { if(found==1) exit 0 }
       -/^$/ { next }
       -{ if(found==1) print $0 }
       -' $_file`
       -
       -            ;;
       -        *)
       -            error "Unknown config type:$_type"
       -            ;;
       -    esac
       -
       -    config_section=()
       -    for c in ${(f)_contents}; do
       -        config_section+=("$c")
       -    done
       -    return 0
       -
       -}
       -
       -# }}} Config
 (DIR) diff --git a/src/zlibs/zuper.init b/src/zlibs/zuper.init
       t@@ -1,35 +0,0 @@
       -##########################
       -# Zuper Init
       -
       -# initialize globals only after sourcing everything
       -# since zlibs may contain more variable declarations
       -for _v in $vars; do
       -    typeset -h $_v
       -done
       -for _a in $arrs; do
       -    typeset -aU $_a
       -done
       -for _m in $maps; do
       -    typeset -A $_m
       -done
       -
       -# reset defaults
       -DEBUG=${DEBUG:-0}
       -QUIET=${QUIET:-0}
       -LOG=${LOG:-""}
       -req=()
       -freq=()
       -last_act=()
       -last_func=()
       -last_notice=()
       -tmpfiles=()
       -config_section=()
       -config_section_type=${config_section_type:-org-mode}
       -
       -
       -func "Zuper $zuper_version initialized"
       -func "${#vars} global variables registered"
       -func "${#arrs} global arrays registered"
       -func "${#maps} global maps registered"
       -
       -
 (DIR) diff --git a/src/tomb b/tomb
 (DIR) diff --git a/src/hexencode.c b/tomb-kdb-hexencode.c
 (DIR) diff --git a/src/gen_salt.c b/tomb-kdb-pbkdf2-gensalt.c
 (DIR) diff --git a/src/benchmark.c b/tomb-kdb-pbkdf2-getiter.c
 (DIR) diff --git a/src/pbkdf2.c b/tomb-kdb-pbkdf2.c
 (DIR) diff --git a/wallet/bindhook b/wallet/bindhook
       t@@ -0,0 +1 @@
       +wallets        .bitcoin/wallets
 (DIR) diff --git a/zlibs/features b/zlibs/features
       t@@ -0,0 +1,126 @@
       +#!/usr/bin/env zsh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +create-webdav-hook() {
       +        fn create-webdav-hook
       +
       +        davconf="/etc/apache2/sites-available/coffindav.conf"
       +        davpass="/etc/apache2/DAV/davpasswd"
       +
       +        if [[ $entry =~ webdav && -f $COFFINDOT/davpasswd ]]; then
       +                act "Found WebDAV data. Setting up..."
       +
       +                cat $COFFINDOT/davpasswd >> $davpass
       +                [[ $? = 0 ]] || {
       +                        die "Failed setting up WebDAV."
       +                        return 1
       +                }
       +                rm $COFFINDOT/davpasswd
       +                gpasswd -a www-data $undertaker # NOTE: consider standalone group
       +                act "Added new WebDAV user"
       +
       +                sed -i -e :a -e '$d;N;2,3ba' -e 'P;D' $davconf
       +#                cat $COFFINDOT/webdav.conf >> $davconf
       +                cat << EOF >> $davconf
       +
       +                alias /${tombid} /media/${tombid}
       +                <Directory "/media/${tombid}">
       +                        Dav On
       +                        AllowOverride none
       +                        Options Indexes
       +                        AuthType Digest
       +                        AuthName WebDAV
       +                        AuthUserFile /etc/apache2/DAV/davpasswd
       +                        Require user ${undertaker}
       +                </Directory>
       +
       +        </VirtualHost>
       +</IfModule>
       +EOF
       +                act "Wrote to $davconf"
       +                /etc/init.d/apache2 reload
       +                [[ $? = 0 ]] || warn "Apache is funky"
       +#                rm $COFFINDOT/webdav.conf
       +                act "Done setting up WebDAV"
       +        else
       +                act "No WebDAV data found"
       +                return 0
       +        fi
       +}
       +
       +delete-webdav-hook() {
       +        fn delete-webdav-hook $*
       +        req=(tombid)
       +        tombid="$1"
       +        ckreq || return 1
       +
       +        davconf="/etc/apache2/sites-available/coffindav.conf"
       +
       +        sed -i '/alias\ \/${tombid}/,+10 d' $davconf
       +        /etc/init.d/apache2 reload
       +        [[ $? = 0 ]] || warn "Apache is funky"
       +        act "Deleted WebDAV data"
       +}
       +
       +create-sshfs-hook() {
       +        fn create-sshfs-hook
       +
       +        if [[ $entry =~ sshfs && -f $COFFINDOT/$tombid.pub ]]; then
       +                act "Found SSH data. Setting up..."
       +
       +                [[ -d /home/$undertaker/.ssh ]] || mkdir -p /home/$undertaker/.ssh
       +                cat $COFFINDOT/$tombid.pub >> /home/$undertaker/.ssh/authorized_keys
       +                chown -R $undertaker:$undertaker /home/$undertaker/.ssh
       +                chmod 700 /home/$undertaker/.ssh && chmod 600 /home/$undertaker/.ssh/authorized_keys
       +
       +                [[ $? = 0 ]] && act "Wrote to authorized_keys" \
       +                        && act "Done setting up SSH"
       +
       +                # NOTE: maybe remove SSH key from usb, consider deletion
       +        else
       +                act "No SSH data found"
       +        fi
       +}
       +
       +delete-sshfs-hook() {
       +        fn delete-sshfs-hook $*
       +        req=(undertaker tombid)
       +        undertaker="$1"
       +        tombid="$2"
       +        ckreq || return 1
       +
       +        authkeys="/home/$undertaker/.ssh/authorized_keys"
       +
       +        grep -v $tombid $authkeys > $authkeys.tmp
       +        mv $authkeys.tmp $authkeys
       +
       +        act "Deleted SSH data"
       +}
       +
       +create-wallet-hook() {
       +        fn create-wallet-hook
       +
       +        if [[ $entry =~ ":wallet" ]]; then
       +                act "Found Bitcoin wallet data. Setting up..."
       +
       +                [[ -d /home/$undertaker/.bitcoin/wallet ]] || mkdir -p /home/$undertaker/.bitcoin/wallet
       +                # TODO: see NOTES.md about the tmp idea
       +        fi
       +}
 (DIR) diff --git a/zlibs/hooks b/zlibs/hooks
       t@@ -0,0 +1,160 @@
       +#!/usr/bin/env zsh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +check-hooks() {
       +        # TODO: fragmented keys, delete, backup, moar
       +        fn check-hooks
       +
       +        line=0
       +        for entry in $(cat $HOOKS); do
       +                let hook=$line+1
       +                act "Found hook $line..."
       +
       +                # Check what's hook supposed to do
       +                if [[ ${entry[(ws@:@)1]} == "create" ]]; then
       +                        create-new-tomb
       +                elif [[ ${entry[(ws@:@)1]} == "delete" ]]; then
       +                        delete-tomb
       +                elif [[ ${entry[(ws@:@)1]} == "backup" ]]; then
       +                        backup-tomb
       +                else
       +                        die "No valid hook syntax on hook $hook"
       +                        print $entry >> $HOOKS.fail
       +                        act "Wrote failed hook to $HOOKS.fail"
       +                        return 1
       +                fi
       +        done
       +        rm $HOOKS
       +}
       +
       +create-new-tomb() {
       +        fn create-new-tomb
       +
       +        # TODO: recognize custom post/bind hooks and implement them in the
       +        # new tomb
       +
       +        act "Creating new tomb"
       +
       +        undertaker=${entry[(ws@:@)2]} && xxx "Undertaker: $undertaker"
       +        tombid=${entry[(ws@:@)3]} && xxx "Tombid: $tombid"
       +        tombsize=${entry[(ws@:@)4]} && xxx "Tomb size: $tombsize"
       +        keypass=$(pwgen 30 -1 1) && xxx "Key password: $keypass"
       +
       +        $(id $undertaker &>/dev/null)
       +        [[ $? = 0 ]] || {
       +                warn "User $undertaker not found. Creating..."
       +                useradd -G coffin -m -s /bin/sh $undertaker
       +                act "Created user $undertaker"
       +        }
       +
       +        act "Digging your tomb..."
       +
       +        sudo -u $undertaker $TOMB dig -s $tombsize $GRAVEYARD/$tombid.tomb || \
       +                (die "Digging went downhill. Cleaning and exiting" && \
       +                        clean-failed-hook)
       +
       +        sudo -u $undertaker $TOMB forge -k $GRAVEYARD/$tombid.key \
       +                --kdf 10 \
       +                --unsafe \
       +                --tomb-pwd "$keypass" || \
       +                        (die "Forging key went downhill. Cleaning and exiting" && \
       +                                clean-failed-hook)
       +
       +        sudo -u $undertaker $TOMB lock $GRAVEYARD/$tombid.tomb \
       +                -k $GRAVEYARD/$tombid.key \
       +                --unsafe \
       +                --tomb-pwd "$keypass" || \
       +                        (die "Locking tomb went downhill. Cleaning and exiting" && \
       +                                clean-failed-hook)
       +
       +        xxx "Moving your keyfile to your USB key..."
       +        mv $GRAVEYARD/$tombid.key $COFFINDOT/ && \
       +                chown $undertaker:$undertaker $COFFINDOT/$tombid.key && \
       +                        xxx "Moved and chowned keyfile"
       +
       +        print "${undertaker}:${tombid}:true" >> $TTAB
       +
       +        hash-key
       +        print "${keyhash}:${keypass}" >> $TOMBPASSWD
       +        chmod 600 $TOMBPASSWD
       +        act "Wrote to ttab and tombpasswd"
       +
       +        # Check for features
       +        create-webdav-hook
       +        create-sshfs-hook
       +        create-wallet-hook
       +}
       +
       +delete-tomb() {
       +        fn delete-tomb
       +
       +        act "Deleting tomb"
       +
       +        undertaker=${entry[(ws@:@)2]} && xxx "Undertaker: $undertaker"
       +        tombid=${entry[(ws@:@)3]} && xxx "Tombid: $tombid"
       +
       +        [[ $(id $undertaker) ]] || {
       +                die "User $undertaker not found. Exiting..." \
       +                        && return 1
       +        }
       +
       +        [[ -f $GRAVEYARD/$tombid.tomb ]] || {
       +                die "Tomb $tombid.tomb not found. Exiting..." \
       +                        && return 1
       +        }
       +
       +        [[ -f $COFFINDOT/$tombid.key ]] || {
       +                die "Key of $tombid not found. Exiting..." \
       +                        && return 1
       +        }
       +
       +        compare-key
       +        [[ $? = 0 ]] && {
       +                sudo -u $undertaker $TOMB slam $tombid
       +                update-tombs del
       +
       +                grep -v ${undertaker}:${tombid} $TTAB > $TTAB.tmp
       +                mv $TTAB.tmp $TTAB && \
       +                        act "Removed from ttab"
       +
       +                grep -v ${keyhash} $TOMBPASSWD > $TOMBPASSWD.tmp
       +                mv $TOMBPASSWD.tmp $TOMBPASSWD && \
       +                        chmod 600 $TOMBPASSWD && \
       +                        act "Removed from tombpasswd"
       +
       +                # Check for features
       +                delete-webdav-hook $tombid
       +                delete-sshfs-hook $undertaker $tombid
       +        }
       +}
       +
       +check-temptomb() {
       +        fn check-temptomb
       +
       +        act "Checking for tomb temps"
       +        if [[ -d ${GRAVEYARD}/temp/${tombid} ]]; then
       +                mv ${GRAVEYARD}/temp/${tombid}/* /media/${tombid}/
       +                mv ${GRAVEYARD}/temp/${tombid}/.* /media/${tombid}/
       +
       +                act "Moved all tomb temps"
       +
       +                rmdir ${GRAVEYARD}/temp/${tombid}
       +        fi
       +}
 (DIR) diff --git a/zlibs/keyfiles b/zlibs/keyfiles
       t@@ -0,0 +1,75 @@
       +#!/usr/bin/env zsh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +hash-key() {
       +        fn hash-key
       +        vars+=(keyhash)
       +        keyhash=""
       +
       +        keyhash=${$(sha256sum $COFFINDOT/$tombid.key)[(ws: :)1]}
       +        xxx "sha256 of keyfile: $keyhash"
       +}
       +
       +compare-key() {
       +        fn compare-key
       +
       +        hash-key
       +
       +        if [[ ( $(grep $keyhash $TOMBS | grep $keyuuid) ) ]]; then
       +                return 0
       +        else
       +                return 1
       +        fi
       +}
       +
       +#                                 ,_-=(!7(7/zs_.
       +#                              .='  ' .`/,/!(=)Zm.
       +#                .._,,._..  ,-`- `,\ ` -` -`\\7//WW.
       +#           ,v=~/.-,-\- -!|V-s.)iT-|s|\-.'   `///mK%.
       +#         v!`i!-.e]-g`bT/i(/[=.Z/m)K(YNYi..   /-]i44M.
       +#       v`/,`|v]-DvLcfZ/eV/iDLN\D/ZK@%8W[Z..   `/d!Z8m
       +#      //,c\(2(X/NYNY8]ZZ/bZd\()/\7WY%WKKW)   -'|(][%4.
       +#    ,\\i\c(e)WX@WKKZKDKWMZ8(b5/ZK8]Z7%ffVM,   -.Y!bNMi
       +#    /-iit5N)KWG%%8%%%%W8%ZWM(8YZvD)XN(@.  [   \]!/GXW[
       +#   / ))G8\NMN%W%%%%%%%%%%8KK@WZKYK*ZG5KMi,-   vi[NZGM[
       +#  i\!(44Y8K%8%%%**~YZYZ@%%%%%4KWZ/PKN)ZDZ7   c=//WZK%!    This is a euphemism for how my code is structured.
       +# ,\v\YtMZW8W%%f`,`.t/bNZZK%%W%%ZXb*K(K5DZ   -c\\/KM48
       +# -|c5PbM4DDW%f  v./c\[tMY8W%PMW%D@KW)Gbf   -/(=ZZKM8[     If you're reading this, you have probably been put
       +# 2(N8YXWK85@K   -'c|K4/KKK%@  V%@@WD8e~  .//ct)8ZK%8`     in charge of maintaining this program.
       +# =)b%]Nd)@KM[  !'\cG!iWYK%%|   !M@KZf    -c\))ZDKW%`
       +# YYKWZGNM4/Pb  '-VscP4]b@W%     'Mf`   -L\///KM(%W!       I am so, so sorry for you.
       +# !KKW4ZK/W7)Z. '/cttbY)DKW%     -`  .',\v)K(5KW%%f
       +# 'W)KWKZZg)Z2/,!/L(-DYYb54%  ,,`, -\-/v(((KK5WW%f         God speed.
       +#  \M4NDDKZZ(e!/\7vNTtZd)8\Mi!\-,-/i-v((tKNGN%W%%
       +#  'M8M88(Zd))///((|D\tDY\\KK-`/-i(=)KtNNN@W%%%@%[
       +#   !8%@KW5KKN4///s(\Pd!ROBY8/=2(/4ZdzKD%K%%%M8@%%
       +#    '%%%W%dGNtPK(c\/2\[Z(ttNYZ2NZW8W8K%%%%YKM%M%%.
       +#      *%%W%GW5@/%!e]_tZdY()v)ZXMZW%W%%%*5Y]K%ZK%8[
       +#       '*%%%%8%8WK\)[/ZmZ/Zi]!/M%%%%@f\ \Y/NNMK%%!
       +#         'VM%%%%W%WN5Z/Gt5/b)((cV@f`  - |cZbMKW%%|
       +#            'V*M%%%WZ/ZG\t5((+)L'-,,/  -)X(NWW%%%
       +#                 `~`MZ/DZGNZG5(((\,    ,t\\Z)KW%@
       +#                    'M8K%8GN8\5(5///]i!v\K)85W%%f
       +#                      YWWKKKKWZ8G54X/GGMeK@WM8%@
       +#                       !M8%8%48WG@KWYbW%WWW%%%@
       +#                         VM%WKWK%8K%%8WWWW%%%@`
       +#                           ~*%%%%%%W%%%%%%%@~
       +#                              ~*MM%%%%%%@f`
       +#                                  '''''
 (DIR) diff --git a/zlibs/mounts b/zlibs/mounts
       t@@ -0,0 +1,55 @@
       +#!/usr/bin/env zsh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +mount-key() {
       +        fn mount-key $*
       +        req=(device)
       +        device="$1"
       +        ckreq || return 1
       +
       +        if [[ -d $KEYMOUNT ]]; then
       +                die "$KEYMOUNT already exists."
       +                return 1
       +        else
       +                act "Creating $KEYMOUNT"
       +                mkdir -p $KEYMOUNT
       +                act "Mounting..."
       +                mount $device $KEYMOUNT
       +                return 0
       +        fi
       +}
       +
       +umount-key() {
       +        fn umount-key $?
       +        req=(device)
       +        device="$1"
       +        ckreq || return 1
       +
       +        if [[ -d $KEYMOUNT ]]; then
       +                act "Unmounting $device"
       +                umount $device \
       +                && rmdir $KEYMOUNT
       +                act "Success umounting"
       +                return 0
       +        else
       +                act "No $KEYMOUNT found"
       +                return 0
       +        fi
       +}
 (DIR) diff --git a/zlibs/ttab b/zlibs/ttab
       t@@ -0,0 +1,98 @@
       +#!/usr/bin/env zsh
       +#
       +# Copyright (c) 2016 Dyne.org Foundation
       +# coffin is written and maintained by Ivan J. <parazyd@dyne.org>
       +#
       +# This file is part of coffin
       +#
       +# 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/>.
       +
       +update-tombs() {
       +        fn update-tombs $*
       +        req=(happ)
       +        happ="$1"
       +        ckreq || return 1
       +
       +        if [[ $happ == "add" ]]; then
       +                print "${undertaker}:${keyhash}:${keyuuid}" >> $TOMBS && \
       +                        chmod 600 $TOMBS && \
       +                        act "Added info to $TOMBS"
       +        elif [[ $happ == "del" ]]; then
       +                cp $TOMBS $TMPTOMBS
       +                grep -v "${keyhash}:${keyuuid}" $TMPTOMBS > $TOMBS && \
       +                        chmod 600 $TOMBS && \
       +                        act "Removed from $TOMBS"
       +                rm $TMPTOMBS
       +        fi
       +}
       +
       +ttab-magic() {
       +        fn ttab-magic
       +
       +        act "Doing ttab magic..."
       +
       +        line=0
       +        for entry in $(cat $TTAB); do
       +                let line=$line+1
       +                act "Found line $line..."
       +
       +                [[ ${entry[(ws@:@)3]} == "true" ]] && {
       +                        act "Working on tomb from line $line"
       +
       +                        undertaker=${entry[(ws@:@)1]} && xxx "Undertaker: $undertaker"
       +                        tombid=${entry[(ws@:@)2]} && xxx "Tombid: $tombid"
       +
       +                        compare-key
       +                        [[ $? = 0 ]] && {
       +                                act "compare-key -> true"
       +                                close-tomb
       +
       +                                update-tombs del
       +                                continue
       +                        }
       +
       +                        act "compare-key -> false"
       +
       +                        hash-key
       +                        keypass=$(grep $keyhash $TOMBPASSWD)
       +                        keypass=${keypass[(ws@:@)2]}
       +                        xxx "Key password: $keypass"
       +
       +                        open-tomb
       +
       +                        [[ -d "/media/$tombid" ]] && {
       +                                chmod g+rw /media/$tombid
       +                                update-tombs add
       +                        }
       +
       +                        check-temptomb
       +                }
       +        done
       +}
       +
       +open-tomb() {
       +        sudo -u ${undertaker} ${TOMB} open \
       +                ${GRAVEYARD}/${tombid}.tomb \
       +                -k ${COFFINDOT}/${tombid}.key \
       +                --unsafe \
       +                --tomb-pwd "${keypass}"
       +
       +        [[ $? = 0 ]] || { die "Tomb didn't open" && return 1 }
       +}
       +
       +close-tomb() {
       +        sudo -u ${undertaker} ${TOMB} slam ${tombid}
       +
       +        [[ $? = 0 ]] || { die "Tomb didn't slam" && return 1 }
       +}
 (DIR) diff --git a/zuper b/zuper
       t@@ -0,0 +1 @@
       +Subproject commit 4fed4af700b791d7df770edf802aaf67c2a07e67