itunfinished refactoring, now using zuper - coffin - secure lan file storage on a device Err parazyd.org 70 hgit clone git://parazyd.org/coffin.git URL:git://parazyd.org/coffin.git parazyd.org 70 1Log /git/coffin/log.gph parazyd.org 70 1Files /git/coffin/files.gph parazyd.org 70 1Refs /git/coffin/refs.gph parazyd.org 70 1Submodules /git/coffin/file/.gitmodules.gph parazyd.org 70 1README /git/coffin/file/README.md.gph parazyd.org 70 1LICENSE /git/coffin/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit b7fbb10958f1c7aab9f940476f93963a9210d579 /git/coffin/commit/b7fbb10958f1c7aab9f940476f93963a9210d579.gph parazyd.org 70 1parent 4bb95404c004caea78e233a8fb4b8ac0b5ba64bb /git/coffin/commit/4bb95404c004caea78e233a8fb4b8ac0b5ba64bb.gph parazyd.org 70 hAuthor: parazyd URL:mailto:parazyd@dyne.org parazyd.org 70 iDate: Mon, 21 Mar 2016 23:45:10 +0100 Err parazyd.org 70 i Err parazyd.org 70 iunfinished refactoring, now using zuper Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i A .gitignore | 1 + Err parazyd.org 70 i M README.md | 4 ++-- Err parazyd.org 70 i D bin/mourner | 23 ----------------------- Err parazyd.org 70 i D bin/sacrist | 219 ------------------------------- Err parazyd.org 70 i D gmakehook | 539 ------------------------------- Err parazyd.org 70 i A helpers/gmakehook | 539 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/mourner | 23 +++++++++++++++++++++++ Err parazyd.org 70 i A src/sacrist | 63 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/features | 45 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/hooks | 80 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/keyfiles | 19 +++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/mounts | 31 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/ttab | 54 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/zuper | 729 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i A src/zlibs/zuper.init | 35 +++++++++++++++++++++++++++++++ Err parazyd.org 70 i Err parazyd.org 70 i15 files changed, 1621 insertions(+), 783 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/.gitignore b/.gitignore /git/coffin/file/.gitignore.gph parazyd.org 70 it@@ -0,0 +1 @@ Err parazyd.org 70 i+NOTES.md Err parazyd.org 70 1diff --git a/README.md b/README.md /git/coffin/file/README.md.gph parazyd.org 70 it@@ -14,9 +14,9 @@ files are once again unreadable. Err parazyd.org 70 i * `gmakehook` can be used to create tombox hooks in a more user-friendly Err parazyd.org 70 i manner. It is a GUI (zenity) helper script. Err parazyd.org 70 i Err parazyd.org 70 i-## Installation Err parazyd.org 70 i- Err parazyd.org 70 i ## Usage Err parazyd.org 70 i Err parazyd.org 70 i+## Installation Err parazyd.org 70 i+ Err parazyd.org 70 i ## Troubleshooting Err parazyd.org 70 i Err parazyd.org 70 1diff --git a/bin/mourner b/bin/mourner /git/coffin/file/bin/mourner.gph parazyd.org 70 it@@ -1,23 +0,0 @@ Err parazyd.org 70 i-#!/bin/bash Err parazyd.org 70 i-# Err parazyd.org 70 i-# mourner - inotify script to watch /dev for new keys Err parazyd.org 70 i-# Err parazyd.org 70 i-# ~ parazyd Err parazyd.org 70 i- Err parazyd.org 70 i-pattern='sd[a-z][1-9]$' Err parazyd.org 70 i-coproc inotifywait --monitor --event create,delete --format '%e %w%f' /dev Err parazyd.org 70 i- Err parazyd.org 70 i-while read -r -u "${COPROC[0]}" event file; do Err parazyd.org 70 i- if [[ $file =~ $pattern ]]; then Err parazyd.org 70 i- case $event in Err parazyd.org 70 i- CREATE) Err parazyd.org 70 i- echo "Created $file..."; sleep 1 Err parazyd.org 70 i- `pwd`/sacrist $file $event Err parazyd.org 70 i- ;; Err parazyd.org 70 i- DELETE) Err parazyd.org 70 i- echo "Removed $file..."; sleep 1 Err parazyd.org 70 i- `pwd`/sacrist $file $event Err parazyd.org 70 i- ;; Err parazyd.org 70 i- esac Err parazyd.org 70 i- fi Err parazyd.org 70 i-done Err parazyd.org 70 1diff --git a/bin/sacrist b/bin/sacrist /git/coffin/file/bin/sacrist.gph parazyd.org 70 it@@ -1,219 +0,0 @@ Err parazyd.org 70 i-#!/bin/zsh Err parazyd.org 70 i-# Err parazyd.org 70 i-# sacrist - script called by mourner, for our graveyard administration Err parazyd.org 70 i-# Err parazyd.org 70 i-# ~ parazyd Err parazyd.org 70 i- Err parazyd.org 70 i-device=$1 Err parazyd.org 70 i-happenz=$2 Err parazyd.org 70 i-keyuuid=$(blkid $device | awk -F\" '{print $2}') Err parazyd.org 70 i- Err parazyd.org 70 i-typeset -H keypass Err parazyd.org 70 i-typeset -H keyuuid Err parazyd.org 70 i-typeset -H undertaker Err parazyd.org 70 i-typeset -H graveyard Err parazyd.org 70 i-typeset -H tombs Err parazyd.org 70 i-typeset -H tombpasswd Err parazyd.org 70 i- Err parazyd.org 70 i-# Vars Err parazyd.org 70 i-graveyard="/home/graveyard" # Our graveyard, with all the tombs Err parazyd.org 70 i-tombs="$graveyard/tombs" # Info about opened tombs, holds keyuuid, keyhash and tombid Err parazyd.org 70 i-tmptombs="$graveyard/tmptombs" # Temp tempfile, for updating $tombs Err parazyd.org 70 i-keymount="/media/tombkey" # Directory where keys get mounted Err parazyd.org 70 i-coffindot="$keymount/.coffin" # .coffin directory on the usb key Err parazyd.org 70 i-ttab="$coffindot/ttab" # Our ttab Err parazyd.org 70 i-hooks="$coffindot/hook" Err parazyd.org 70 i-tomb="/usr/local/bin/tomb" Err parazyd.org 70 i-tombpasswd="$graveyard/passwd" Err parazyd.org 70 i- Err parazyd.org 70 i-# Debugs Err parazyd.org 70 i-print "Arg1: $1" Err parazyd.org 70 i-print "Arg2: $2" Err parazyd.org 70 i-print "Device path is: $device" Err parazyd.org 70 i-print "Device UUID is: $keyuuid" Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ msg Err parazyd.org 70 i-_msg() { Err parazyd.org 70 i- if [[ $1 == "error" ]]; then Err parazyd.org 70 i- print "\e[1;31m[E] \e[0;31m$2 \e[0m" Err parazyd.org 70 i- elif [[ $1 == "warn" ]]; then Err parazyd.org 70 i- print "\e[1;33m[W] \e[0;33m$2 \e[0m" Err parazyd.org 70 i- elif [[ $1 == "info" ]]; then Err parazyd.org 70 i- print "\e[1;34m[i] \e[0;34m$2 \e[0m" Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-_umountkey() { umount $keymount; rmdir $keymount } Err parazyd.org 70 i-_mountkey() { mkdir -p $keymount; mount $device $keymount } Err parazyd.org 70 i- Err parazyd.org 70 i-_hashkey() { cat $coffindot/$tombid.key | sha512sum | awk -F" " '{print $1}' } Err parazyd.org 70 i- Err parazyd.org 70 i-_comparekey() { Err parazyd.org 70 i- keyhash=$(_hashkey) Err parazyd.org 70 i- if [[ ( $(cat $tombs | grep $keyhash | grep $keyuuid) ) ]]; then Err parazyd.org 70 i- happenz=close Err parazyd.org 70 i- else Err parazyd.org 70 i- happenz=open Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i- Err parazyd.org 70 i-_hooks() { Err parazyd.org 70 i- for entry in $(cat $hooks); do Err parazyd.org 70 i- let hook=$hook+1 Err parazyd.org 70 i- _msg info "Found hook $hook..." Err parazyd.org 70 i- Err parazyd.org 70 i- # Check what's hook supposed to do Err parazyd.org 70 i- if [[ ${entry[(ws@:@)1]} == "create" ]]; then Err parazyd.org 70 i- _create_new_tomb Err parazyd.org 70 i- elif [[ ${entry[(ws@:@)1]} == "delete" ]]; then Err parazyd.org 70 i- #DELETE TOMB Err parazyd.org 70 i- elif [[ ${entry[(ws@:@)1]} == "backup" ]]; then Err parazyd.org 70 i- # do backup Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg error "No valid hook syntax on hook $hook" Err parazyd.org 70 i- fi Err parazyd.org 70 i- rm $hooks && _msg info "Removed $hooks" Err parazyd.org 70 i- done Err parazyd.org 70 i-} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ ttabmagic Err parazyd.org 70 i-_ttabmagic() { Err parazyd.org 70 i- # Loop entire ttab and do stuff for tombs that want to be opened Err parazyd.org 70 i- _msg info "Doing ttab magic..." Err parazyd.org 70 i- line=0 Err parazyd.org 70 i- Err parazyd.org 70 i- for entry in $(cat $ttab); do Err parazyd.org 70 i- let line=$line+1 Err parazyd.org 70 i- _msg info "Found line $line..." Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ ${entry[(ws@:@)3]} == "true" ]]; then Err parazyd.org 70 i- _msg info "Working on tomb from line $line..." Err parazyd.org 70 i- undertaker=${entry[(ws@:@)1]} Err parazyd.org 70 i- print "Username: $undertaker" Err parazyd.org 70 i- tombid=${entry[(ws@:@)2]} Err parazyd.org 70 i- print "Tomb name: $tombid.tomb" Err parazyd.org 70 i- _comparekey Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ $happenz == "close" ]]; then Err parazyd.org 70 i- _msg warn "Comparekey true" Err parazyd.org 70 i- sudo -u $undertaker $tomb slam $tombid Err parazyd.org 70 i- cp $tombs $tmptombs Err parazyd.org 70 i- grep -v $keyhash $tmptombs > $tombs && chmod 600 $tombs && _msg info "Updated $tombs" Err parazyd.org 70 i- rm $tmptombs Err parazyd.org 70 i- continue Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- _msg warn "Comparekey false" Err parazyd.org 70 i- keypass=$(cat $tombpasswd | grep $keyhash | awk -F: '{print $2}') Err parazyd.org 70 i- print "Tomb passphrase: $keypass" Err parazyd.org 70 i- sudo -u $undertaker $tomb open $graveyard/$tombid.tomb -k $coffindot/$tombid.key \ Err parazyd.org 70 i- --unsafe --tomb-pwd "$keypass" Err parazyd.org 70 i- Err parazyd.org 70 i- chmod g+rw /media/$tombid Err parazyd.org 70 i- if [[ -d "/media/$tombid" ]]; then Err parazyd.org 70 i- print "$undertaker:$keyhash:$keyuuid" >> $tombs && chmod 600 $tombs && _msg info "Added info to $tombs" Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg warn "Nothing added to $tombs" Err parazyd.org 70 i- fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- done Err parazyd.org 70 i- umount $keymount && rmdir $keymount && _msg info "Unmounted and deleted $keymount" Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ _create_new_tomb Err parazyd.org 70 i-_create_new_tomb() { Err parazyd.org 70 i- # TODO: options for webdav, sshfs, ipfs Err parazyd.org 70 i- # TODO: recognize custom post/bind hooks and implement them inside the new tomb Err parazyd.org 70 i- # TODO: delete/backup/foo hooks Err parazyd.org 70 i- Err parazyd.org 70 i- _msg info "Creating new tomb!" Err parazyd.org 70 i- undertaker=${entry[(ws@:@)2]} Err parazyd.org 70 i- tombid=${entry[(ws@:@)3]} Err parazyd.org 70 i- tombsize=${entry[(ws@:@)4]} Err parazyd.org 70 i- keypass=$(pwgen 30 -1 1) Err parazyd.org 70 i- Err parazyd.org 70 i- if ! [[ ( $(id $undertaker) ) ]]; then Err parazyd.org 70 i- _msg warn "No user called $undertaker found. Creating..." Err parazyd.org 70 i- useradd -G tombox -m -s /bin/bash $undertaker Err parazyd.org 70 i- _msg info "Created user $undertaker" Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg warn "User $undertaker exists. Continuing..." Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ $entry =~ webdav && -f $coffindot/webdav.conf ]]; then Err parazyd.org 70 i- _msg info "Found WebDAV data. Setting up..." Err parazyd.org 70 i- if [[ -f $coffindot/davinfo ]]; then Err parazyd.org 70 i- cat $coffindot/davinfo >> /etc/apache2/davpasswd Err parazyd.org 70 i- rm $coffindot/davinfo Err parazyd.org 70 i- gpasswd -a www-data $undertaker Err parazyd.org 70 i- _msg info "Wrote to davpasswd" Err parazyd.org 70 i- fi Err parazyd.org 70 i- sed -i -e :a -e '$d;N;2,3ba' -e 'P;D' /etc/apache2/sites-available/tomboxdav.conf Err parazyd.org 70 i- cat $coffindot/webdav.conf >> /etc/apache2/sites-available/tomboxdav.conf Err parazyd.org 70 i- _msg info "Wrote to tomboxdav.conf" Err parazyd.org 70 i- rm $coffindot/webdav.conf Err parazyd.org 70 i- /etc/init.d/apache2 restart Err parazyd.org 70 i- _msg info "Done setting up WebDAV!" Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg info "No WebDAV data found. Continuing..." Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ $entry =~ sshfs && -f $coffindot/sshpubkey ]]; then Err parazyd.org 70 i- _msg info "Found SSH info. Setting up..." Err parazyd.org 70 i- mkdir -p /home/$undertaker/.ssh Err parazyd.org 70 i- cat $coffindot/sshpubkey >> /home/$undertaker/.ssh/authorized_keys Err parazyd.org 70 i- chown -R $undertaker:$undertaker /home/$undertaker/.ssh Err parazyd.org 70 i- _msg info "Wrote to authorized_keys" Err parazyd.org 70 i- rm $coffindot/sshpubkey Err parazyd.org 70 i- _msg info "Done setting up SSH." Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg info "No SSH data found. Continuing..." Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- sudo -u $undertaker $tomb dig -s $tombsize $graveyard/$tombid.tomb Err parazyd.org 70 i- sudo -u $undertaker $tomb forge $graveyard/$tombid.key --unsafe --tomb-pwd "$keypass" Err parazyd.org 70 i- sudo -u $undertaker $tomb lock $graveyard/$tombid.tomb -k $graveyard/$tombid.key \ Err parazyd.org 70 i- --unsafe --tomb-pwd "$keypass" Err parazyd.org 70 i- Err parazyd.org 70 i- mv $graveyard/$tombid.key $coffindot/ && chown $undertaker:$undertaker $coffindot/$tombid.key && \ Err parazyd.org 70 i- _msg info "Moved and chowned keyfile" Err parazyd.org 70 i- print "${undertaker}:${tombid}:true" >> $ttab Err parazyd.org 70 i- keyhash=$(_hashkey) Err parazyd.org 70 i- print "${keyhash}:${keypass}" >> $tombpasswd Err parazyd.org 70 i- _msg info "Wrote to $ttab and $tombpasswd" Err parazyd.org 70 i- # rm $createme && _msg info "Removed $createme" Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-_endgame() { Err parazyd.org 70 i- # Mr. Proper Err parazyd.org 70 i-} Err parazyd.org 70 i- Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ MAIN Err parazyd.org 70 i-if [[ $happenz == "CREATE" ]]; then Err parazyd.org 70 i- _mountkey Err parazyd.org 70 i- if [[ -d "$coffindot" ]]; then Err parazyd.org 70 i- _msg info "$coffindot found..." Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ -f "$hooks" ]]; then Err parazyd.org 70 i- _hooks Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg warn "No hooks detected" Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- if ! [[ -f "$ttab" ]]; then Err parazyd.org 70 i- _msg error "No ttab!" Err parazyd.org 70 i- umount $keymount && rmdir $keymount && _msg info "Unmounted and removed $keymount" Err parazyd.org 70 i- else Err parazyd.org 70 i- _ttabmagic Err parazyd.org 70 i- fi Err parazyd.org 70 i- else Err parazyd.org 70 i- _msg error "No valid .coffin directory! Exiting..." Err parazyd.org 70 i- _umountkey && _msg info "Unmounted and removed $keymount" Err parazyd.org 70 i- fi Err parazyd.org 70 i-fi Err parazyd.org 70 i-# }}} Err parazyd.org 70 1diff --git a/gmakehook b/gmakehook /git/coffin/file/gmakehook.gph parazyd.org 70 it@@ -1,539 +0,0 @@ Err parazyd.org 70 i-#!/usr/bin/env zsh Err parazyd.org 70 i-# Err parazyd.org 70 i-# Zenity helper script to make tombox hooks more user-friendly Err parazyd.org 70 i-# Err parazyd.org 70 i-# ~ parazyd Err parazyd.org 70 i- Err parazyd.org 70 i-typeset -H UNDERTAKER Err parazyd.org 70 i-typeset -H TOMBSIZE Err parazyd.org 70 i-typeset -H TOMBNAME Err parazyd.org 70 i-typeset -H sudoassword Err parazyd.org 70 i- Err parazyd.org 70 i-keymount="/media/tombkey" Err parazyd.org 70 i-coffindot="$keymount/.coffin" Err parazyd.org 70 i-hooks="$coffindot/hook" Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ icon Err parazyd.org 70 i-MONMORT="/tmp/monmort.png" Err parazyd.org 70 i-ICONB64="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgEAQAAACJ4248AAAAAmJLR0T//xSrMc0AAAAJcEhZcwAA Err parazyd.org 70 i-AEgAAABIAEbJaz4AAAAJdnBBZwAAACAAAAAgAIf6nJ0AAADrSURBVFjD5ZZBEsMgCEU/TO/l2XMx Err parazyd.org 70 i-04VjQ1K1CDYswkwWJnH+E/EL4RP7jluDCACoim/bvfIpFQiKEJcQHCN9xEtLCgDMQM7f33sZrPNG Err parazyd.org 70 i-/05loCXujfAtCAVgNgLwIuycjQAra8G9Fm823ADabPRA1QDelfZAVUZktWrNvL8ew5YTnsStx3Am Err parazyd.org 70 i-AyOInJVbYF1prZuU+tsR1g9UMDqGuo5oFWhtSEQNEGmeVrqv73Tj0pIZirANMYqRhyw5Bb9MauSW Err parazyd.org 70 i-SwA8l9OzG5LnAsiiDQGQRRvaEwInK54J390hndAIYIeQ4k6AAjE/h06ab0SjP08MA1xDAAAAJXRF Err parazyd.org 70 i-WHRkYXRlOmNyZWF0ZQAyMDExLTAxLTEyVDA5OjM0OjI0KzAxOjAwo//d7wAAACV0RVh0ZGF0ZTpt Err parazyd.org 70 i-b2RpZnkAMjAxMS0wMS0xMlQwOTozNDoyNCswMTowMNKiZVMAAAAASUVORK5CYII=" Err parazyd.org 70 i-print "$ICONB64" | base64 --decode > $MONMORT Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ sudo functions Err parazyd.org 70 i-function _sudo { Err parazyd.org 70 i- sudoassword=$(ask_password "Insert sudo password for user $USER") Err parazyd.org 70 i- print "$sudoassword\n" | sudo -S -v Err parazyd.org 70 i- _sudowrong Err parazyd.org 70 i-} Err parazyd.org 70 i-function _sudowrong { Err parazyd.org 70 i- if [[ $? == 1 ]]; then Err parazyd.org 70 i- sudoassword=$(ask_password "Wrong password. Insert sudo password for user $USER") Err parazyd.org 70 i- print "$sudoassword\n" | sudo -S -v Err parazyd.org 70 i- _sudowrong Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ Some pinentry code shamelessly stolen from tomb Err parazyd.org 70 i-# Ask user for a password Err parazyd.org 70 i-# Wraps around the pinentry command, from the GnuPG project, as it Err parazyd.org 70 i-# provides better security and conveniently use the right toolkit. Err parazyd.org 70 i-ask_password() { Err parazyd.org 70 i- local description="$1" Err parazyd.org 70 i- local title="${2:-Enter tomb password.}" Err parazyd.org 70 i- local output Err parazyd.org 70 i- local password Err parazyd.org 70 i- local gtkrc Err parazyd.org 70 i- local theme Err parazyd.org 70 i- Err parazyd.org 70 i- # Distributions have broken wrappers for pinentry: they do Err parazyd.org 70 i- # implement fallback, but they disrupt the output somehow. We are Err parazyd.org 70 i- # better off relying on less intermediaries, so we implement our Err parazyd.org 70 i- # own fallback mechanisms. Pinentry supported: curses, gtk-2, qt4 Err parazyd.org 70 i- # and x11. Err parazyd.org 70 i- Err parazyd.org 70 i- # make sure LANG is set, default to C Err parazyd.org 70 i- LANG=${LANG:-C} Err parazyd.org 70 i- Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ "$DISPLAY" = "" ]]; then Err parazyd.org 70 i- Err parazyd.org 70 i- if _is_found "pinentry-curses"; then Err parazyd.org 70 i- output=`cat </dev/null 2>/dev/null Err parazyd.org 70 i- return $? Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ _clean - Clean function, removes sensitive stuff from memory Err parazyd.org 70 i-function _clean { Err parazyd.org 70 i- TOMBSIZE="$rr"; unset TOMBSIZE Err parazyd.org 70 i- TOMBNAME="$rr"; unset TOMBNAME Err parazyd.org 70 i- UNDERTAKER="$rr"; unset UNDERTAKER Err parazyd.org 70 i- sudoassword="$rr"; unset sudoassword Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ zenity dialogs Err parazyd.org 70 i-function _fsel { Err parazyd.org 70 i- zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --file-selection \ Err parazyd.org 70 i- --title="$1" Err parazyd.org 70 i-} Err parazyd.org 70 i-function _zenques { Err parazyd.org 70 i- zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --question \ Err parazyd.org 70 i- --text="$1" Err parazyd.org 70 i-} Err parazyd.org 70 i-function _zenwarn { Err parazyd.org 70 i- zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --warning \ Err parazyd.org 70 i- --title="$1" \ Err parazyd.org 70 i- --text="$2" Err parazyd.org 70 i-} Err parazyd.org 70 i-function _zeninfo { Err parazyd.org 70 i- zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --info \ Err parazyd.org 70 i- --title="$1" \ Err parazyd.org 70 i- --text="$2" Err parazyd.org 70 i-} Err parazyd.org 70 i-function _zenerr { Err parazyd.org 70 i- zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --error \ Err parazyd.org 70 i- --title="$1" \ Err parazyd.org 70 i- --text="$2" Err parazyd.org 70 i-} Err parazyd.org 70 i-function _zenentry { Err parazyd.org 70 i- zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --entry \ Err parazyd.org 70 i- --title="$1" \ Err parazyd.org 70 i- --text="$2" \ Err parazyd.org 70 i- --entry-text="$3" Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-function _umountkey { sudo umount $keymount && sudo rmdir $keymount } Err parazyd.org 70 i-function _mountkey { Err parazyd.org 70 i- sudo umount $USBKEY Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- _zenerr "Error" "Your key is mounted somewhere and I've run into issues. Please unmount it and re-run." Err parazyd.org 70 i- _clean && exit Err parazyd.org 70 i- fi Err parazyd.org 70 i- if [[ -d $keymount ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Something is already mounted on $keymount. Please check and re-run." Err parazyd.org 70 i- _clean && exit Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- sudo mkdir -p $keymount Err parazyd.org 70 i- sudo mount $USBKEY $keymount Err parazyd.org 70 i- Err parazyd.org 70 i- if ! [[ -d $coffindot ]]; then Err parazyd.org 70 i- sudo mkdir $coffindot Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ _writedavinfo Err parazyd.org 70 i-function _writedavinfo { Err parazyd.org 70 i- if [[ -n $davpass ]]; then Err parazyd.org 70 i- davinfo=$(echo -n "$UNDERTAKER:WebDAV:" \ Err parazyd.org 70 i- && echo -n "$UNDERTAKER:WebDAV:$davpass" \ Err parazyd.org 70 i- | md5sum \ Err parazyd.org 70 i- | awk '{print $1}') Err parazyd.org 70 i- print $davinfo | sudo tee $coffindot/davinfo Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- cat < Err parazyd.org 70 i- Dav On Err parazyd.org 70 i- AllowOverride none Err parazyd.org 70 i- Options Indexes FollowSymlinks Err parazyd.org 70 i- AuthType Digest Err parazyd.org 70 i- AuthName WebDAV Err parazyd.org 70 i- AuthUserFile /etc/apache2/davpasswd Err parazyd.org 70 i- Require user ${UNDERTAKER} Err parazyd.org 70 i- Err parazyd.org 70 i- Err parazyd.org 70 i- Err parazyd.org 70 i- Err parazyd.org 70 i-EOF Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-function _main { Err parazyd.org 70 i- _clean Err parazyd.org 70 i- cmnd=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="tombox hook helper" \ Err parazyd.org 70 i- --list \ Err parazyd.org 70 i- --hide-header \ Err parazyd.org 70 i- --text="tombox hook helper\nChoose what hook you want to create:" \ Err parazyd.org 70 i- --separator=" # " \ Err parazyd.org 70 i- --column=Function \ Err parazyd.org 70 i- --column=Description \ Err parazyd.org 70 i- "create" "a new tomb on the tombox" \ Err parazyd.org 70 i- "delete" "a tomb from the tombox" \ Err parazyd.org 70 i- "backup" "a tomb from the tombox" \ Err parazyd.org 70 i- "foobar" "on the tombox") Err parazyd.org 70 i- eval "_$cmnd" Err parazyd.org 70 i-} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ _create Err parazyd.org 70 i-function _create { Err parazyd.org 70 i- vars=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Create a new tomb" \ Err parazyd.org 70 i- --forms \ Err parazyd.org 70 i- --text="Enter the info for your new tomb" \ Err parazyd.org 70 i- --separator=":" \ Err parazyd.org 70 i- --add-entry="Tombox username" \ Err parazyd.org 70 i- --add-entry="Tomb name" \ Err parazyd.org 70 i- --add-entry="Tomb's size in MiB") Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- else Err parazyd.org 70 i- UNDERTAKER=${vars[(ws@:@)1]} Err parazyd.org 70 i- re='^[A-Za-z0-9]+$' Err parazyd.org 70 i- if ! [[ $UNDERTAKER =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in username!" Err parazyd.org 70 i- exec _create Err parazyd.org 70 i- fi Err parazyd.org 70 i- TOMBNAME=${vars[(ws@:@)2]} Err parazyd.org 70 i- if ! [[ $TOMBNAME =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in tomb name!" Err parazyd.org 70 i- exec _create Err parazyd.org 70 i- fi Err parazyd.org 70 i- TOMBSIZE=${vars[(ws@:@)3]} Err parazyd.org 70 i- re='^[0-9]+$' Err parazyd.org 70 i- if ! [[ $TOMBSIZE =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in tomb size!" Err parazyd.org 70 i- exec _create Err parazyd.org 70 i- fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- feats=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Choose features" \ Err parazyd.org 70 i- --text="Choose features you wish to include with your tomb" \ Err parazyd.org 70 i- --list \ Err parazyd.org 70 i- --checklist \ Err parazyd.org 70 i- --separator=":" \ Err parazyd.org 70 i- --column=Yes/No \ Err parazyd.org 70 i- --column=Feature \ Err parazyd.org 70 i- "FALSE" "webdav" \ Err parazyd.org 70 i- "FALSE" "sshfs" \ Err parazyd.org 70 i- "FALSE" "ipfs") Err parazyd.org 70 i- if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ $feats =~ "webdav" ]]; then Err parazyd.org 70 i- _zenques "Do you already have a WebDAV login?" Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- davpass=$(_zenentry "WebDAV Password" \ Err parazyd.org 70 i- "Insert the password you want to use for WebDAV login:" \ Err parazyd.org 70 i- "my very strong password") Err parazyd.org 70 i- if [[ $? = 1 ]]; then; davpass=""; fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- if [[ $feats =~ "sshfs" ]]; then Err parazyd.org 70 i- _zenques "Do you already have an SSH key setup for your user?" Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- sshpubkey=$(_fsel "Select your SSH pubkey you want to use.") Err parazyd.org 70 i- else Err parazyd.org 70 i- sshpubkey="" Err parazyd.org 70 i- fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- TOMBHOOKS=$(_zenques "Choose 'Yes' if you want to edit your tomb's bind-hooks and post-hooks") Err parazyd.org 70 i- if [[ $? = 0 ]]; then Err parazyd.org 70 i- bindhook=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="bind-hooks" \ Err parazyd.org 70 i- --checkbox="Accept these bind-hooks" \ Err parazyd.org 70 i- --text-info \ Err parazyd.org 70 i- --editable) Err parazyd.org 70 i- if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i- Err parazyd.org 70 i- posthook=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="post-hooks" \ Err parazyd.org 70 i- --checkbox="Accept these post-hooks" \ Err parazyd.org 70 i- --text-info \ Err parazyd.org 70 i- --editable) Err parazyd.org 70 i- if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- _zeninfo "gmakehook" "Plug in your USB key and click OK." Err parazyd.org 70 i- lsblk -npl | awk -F" " '{print $1 " " $4}' | grep '^/dev/sd.. ' > ./.devs Err parazyd.org 70 i- Err parazyd.org 70 i- USBKEY=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Choose USB key" \ Err parazyd.org 70 i- --list \ Err parazyd.org 70 i- --text="Choose your USB key to use" \ Err parazyd.org 70 i- --separator=" " \ Err parazyd.org 70 i- --column="Device path" \ Err parazyd.org 70 i- --column="Device size" \ Err parazyd.org 70 i- $(cat ./.devs)) Err parazyd.org 70 i- if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i- Err parazyd.org 70 i- _sudo Err parazyd.org 70 i- _mountkey Err parazyd.org 70 i- if [[ -f $hooks ]]; then Err parazyd.org 70 i- _zenques "Warning! There is already an existing hook. Do you want to overwrite?" Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- _zeninfo "gmakehook" "Postponing..." && _umountkey && exec _main Err parazyd.org 70 i- else Err parazyd.org 70 i- print "create:${UNDERTAKER}:${TOMBNAME}:${TOMBSIZE}:${feats}" | sudo tee $hooks Err parazyd.org 70 i- if [[ $feats =~ "webdav" ]]; then; _writedavinfo; fi Err parazyd.org 70 i- if [[ -n $sshpubkey ]]; then; sudo cp $sshpubkey ./sshpubkey ; fi Err parazyd.org 70 i- if [[ -n $bindhook ]]; then Err parazyd.org 70 i- print "$bindhook" | sudo tee $coffindot/bindhooks Err parazyd.org 70 i- fi Err parazyd.org 70 i- if [[ -n $posthook ]]; then Err parazyd.org 70 i- print "$posthook" | sudo tee $coffindot/posthooks Err parazyd.org 70 i- fi Err parazyd.org 70 i- _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in a tombox to activate it." Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- fi Err parazyd.org 70 i- else Err parazyd.org 70 i- print "create:${UNDERTAKER}:${TOMBNAME}:${TOMBSIZE}:${feats}" | sudo tee $hooks Err parazyd.org 70 i- if [[ $feats =~ "webdav" ]]; then; _writedavinfo; fi Err parazyd.org 70 i- if [[ -n $sshpubkey ]]; then; sudo cp $sshpubkey $coffindot/sshpubkey ; fi Err parazyd.org 70 i- if [[ -n $bindhook ]]; then Err parazyd.org 70 i- print "$bindhook" | sudo tee $coffindot/bindhooks Err parazyd.org 70 i- fi Err parazyd.org 70 i- if [[ -n $posthook ]]; then Err parazyd.org 70 i- print "$posthook" | sudo tee $coffindot/posthooks Err parazyd.org 70 i- fi Err parazyd.org 70 i- _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in the tombox to activate it." Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ _delete Err parazyd.org 70 i-function _delete { Err parazyd.org 70 i- vars=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Delete an existing tomb" \ Err parazyd.org 70 i- --forms \ Err parazyd.org 70 i- --text="Enter the info of your tomb" \ Err parazyd.org 70 i- --separator=":" \ Err parazyd.org 70 i- --add-entry="Tombox username" \ Err parazyd.org 70 i- --add-entry="Tomb name") Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- else Err parazyd.org 70 i- UNDERTAKER=${vars[(ws@:@)1]} Err parazyd.org 70 i- re='^[A-Za-z0-9]+$' Err parazyd.org 70 i- if ! [[ $UNDERTAKER =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in username!" Err parazyd.org 70 i- exec _delete Err parazyd.org 70 i- fi Err parazyd.org 70 i- TOMBNAME=${vars[(ws@:@)2]} Err parazyd.org 70 i- if ! [[ $TOMBNAME =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in tomb name!" Err parazyd.org 70 i- exec _delete Err parazyd.org 70 i- fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- _zeninfo "gmakehook" "Plug in your USB key and click OK." Err parazyd.org 70 i- lsblk -npl | awk -F" " '{print $1 " " $4}' | grep '^/dev/sd.. ' > ./.devs Err parazyd.org 70 i- Err parazyd.org 70 i- USBKEY=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Choose USB key" \ Err parazyd.org 70 i- --list \ Err parazyd.org 70 i- --text="Choose your USB key to use" \ Err parazyd.org 70 i- --separator=" " \ Err parazyd.org 70 i- --column="Device path" \ Err parazyd.org 70 i- --column="Device size" \ Err parazyd.org 70 i- $(cat ./.devs)) Err parazyd.org 70 i- if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i- Err parazyd.org 70 i- _sudo Err parazyd.org 70 i- _mountkey Err parazyd.org 70 i- if [[ -f $hooks ]]; then Err parazyd.org 70 i- _zenques "Warning! There is already an existing hook. Do you want to overwrite?" Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- _zeninfo "gmakehook" "Postponing..." && _umountkey && exec _main Err parazyd.org 70 i- else Err parazyd.org 70 i- print "delete:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i- _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in a tombox to activate it." Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- fi Err parazyd.org 70 i- else Err parazyd.org 70 i- print "delete:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i- _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in the tombox to activate it." Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-# {{{ _backup Err parazyd.org 70 i-function _backup { Err parazyd.org 70 i- vars=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Backup an existing tomb" \ Err parazyd.org 70 i- --forms \ Err parazyd.org 70 i- --text="Enter the info of your tomb" \ Err parazyd.org 70 i- --separator=":" \ Err parazyd.org 70 i- --add-entry="Tombox username" \ Err parazyd.org 70 i- --add-entry="Tomb name") Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- else Err parazyd.org 70 i- UNDERTAKER=${vars[(ws@:@)1]} Err parazyd.org 70 i- re='^[A-Za-z0-9]+$' Err parazyd.org 70 i- if ! [[ $UNDERTAKER =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in username!" Err parazyd.org 70 i- exec _delete Err parazyd.org 70 i- fi Err parazyd.org 70 i- TOMBNAME=${vars[(ws@:@)2]} Err parazyd.org 70 i- if ! [[ $TOMBNAME =~ $re ]]; then Err parazyd.org 70 i- _zenwarn "Warning" "Invalid characters in tomb name!" Err parazyd.org 70 i- exec _delete Err parazyd.org 70 i- fi Err parazyd.org 70 i- fi Err parazyd.org 70 i- Err parazyd.org 70 i- _zeninfo "gmakehook" "Plug in your USB key and click OK." Err parazyd.org 70 i- lsblk -npl | awk -F" " '{print $1 " " $4}' | grep '^/dev/sd.. ' > ./.devs Err parazyd.org 70 i- Err parazyd.org 70 i- USBKEY=$(zenity \ Err parazyd.org 70 i- --window-icon="$MONMORT" \ Err parazyd.org 70 i- --title="Choose USB key" \ Err parazyd.org 70 i- --list \ Err parazyd.org 70 i- --text="Choose your USB key to use" \ Err parazyd.org 70 i- --separator=" " \ Err parazyd.org 70 i- --column="Device path" \ Err parazyd.org 70 i- --column="Device size" \ Err parazyd.org 70 i- $(cat ./.devs)) Err parazyd.org 70 i- if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i- Err parazyd.org 70 i- _sudo Err parazyd.org 70 i- _mountkey Err parazyd.org 70 i- if [[ -f $hooks ]]; then Err parazyd.org 70 i- _zenques "Warning! There is already an existing hook. Do you want to overwrite?" Err parazyd.org 70 i- if [[ $? = 1 ]]; then Err parazyd.org 70 i- _zeninfo "gmakehook" "Postponing..." && _umountkey && exec _main Err parazyd.org 70 i- else Err parazyd.org 70 i- print "backup:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i- _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in a tombox to activate it." Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- fi Err parazyd.org 70 i- else Err parazyd.org 70 i- print "backup:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i- _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in the tombox to activate it." Err parazyd.org 70 i- exec _main Err parazyd.org 70 i- fi Err parazyd.org 70 i-} Err parazyd.org 70 i-# }}} Err parazyd.org 70 i- Err parazyd.org 70 i-function _ { rm ./.devs } Err parazyd.org 70 i-exec _main Err parazyd.org 70 1diff --git a/helpers/gmakehook b/helpers/gmakehook /git/coffin/file/helpers/gmakehook.gph parazyd.org 70 it@@ -0,0 +1,539 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+# Err parazyd.org 70 i+# Zenity helper script to make tombox hooks more user-friendly Err parazyd.org 70 i+# Err parazyd.org 70 i+# ~ parazyd Err parazyd.org 70 i+ Err parazyd.org 70 i+typeset -H UNDERTAKER Err parazyd.org 70 i+typeset -H TOMBSIZE Err parazyd.org 70 i+typeset -H TOMBNAME Err parazyd.org 70 i+typeset -H sudoassword Err parazyd.org 70 i+ Err parazyd.org 70 i+keymount="/media/tombkey" Err parazyd.org 70 i+coffindot="$keymount/.coffin" Err parazyd.org 70 i+hooks="$coffindot/hook" Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ icon Err parazyd.org 70 i+MONMORT="/tmp/monmort.png" Err parazyd.org 70 i+ICONB64="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgEAQAAACJ4248AAAAAmJLR0T//xSrMc0AAAAJcEhZcwAA Err parazyd.org 70 i+AEgAAABIAEbJaz4AAAAJdnBBZwAAACAAAAAgAIf6nJ0AAADrSURBVFjD5ZZBEsMgCEU/TO/l2XMx Err parazyd.org 70 i+04VjQ1K1CDYswkwWJnH+E/EL4RP7jluDCACoim/bvfIpFQiKEJcQHCN9xEtLCgDMQM7f33sZrPNG Err parazyd.org 70 i+/05loCXujfAtCAVgNgLwIuycjQAra8G9Fm823ADabPRA1QDelfZAVUZktWrNvL8ew5YTnsStx3Am Err parazyd.org 70 i+AyOInJVbYF1prZuU+tsR1g9UMDqGuo5oFWhtSEQNEGmeVrqv73Tj0pIZirANMYqRhyw5Bb9MauSW Err parazyd.org 70 i+SwA8l9OzG5LnAsiiDQGQRRvaEwInK54J390hndAIYIeQ4k6AAjE/h06ab0SjP08MA1xDAAAAJXRF Err parazyd.org 70 i+WHRkYXRlOmNyZWF0ZQAyMDExLTAxLTEyVDA5OjM0OjI0KzAxOjAwo//d7wAAACV0RVh0ZGF0ZTpt Err parazyd.org 70 i+b2RpZnkAMjAxMS0wMS0xMlQwOTozNDoyNCswMTowMNKiZVMAAAAASUVORK5CYII=" Err parazyd.org 70 i+print "$ICONB64" | base64 --decode > $MONMORT Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ sudo functions Err parazyd.org 70 i+function _sudo { Err parazyd.org 70 i+ sudoassword=$(ask_password "Insert sudo password for user $USER") Err parazyd.org 70 i+ print "$sudoassword\n" | sudo -S -v Err parazyd.org 70 i+ _sudowrong Err parazyd.org 70 i+} Err parazyd.org 70 i+function _sudowrong { Err parazyd.org 70 i+ if [[ $? == 1 ]]; then Err parazyd.org 70 i+ sudoassword=$(ask_password "Wrong password. Insert sudo password for user $USER") Err parazyd.org 70 i+ print "$sudoassword\n" | sudo -S -v Err parazyd.org 70 i+ _sudowrong Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Some pinentry code shamelessly stolen from tomb Err parazyd.org 70 i+# Ask user for a password Err parazyd.org 70 i+# Wraps around the pinentry command, from the GnuPG project, as it Err parazyd.org 70 i+# provides better security and conveniently use the right toolkit. Err parazyd.org 70 i+ask_password() { Err parazyd.org 70 i+ local description="$1" Err parazyd.org 70 i+ local title="${2:-Enter tomb password.}" Err parazyd.org 70 i+ local output Err parazyd.org 70 i+ local password Err parazyd.org 70 i+ local gtkrc Err parazyd.org 70 i+ local theme Err parazyd.org 70 i+ Err parazyd.org 70 i+ # Distributions have broken wrappers for pinentry: they do Err parazyd.org 70 i+ # implement fallback, but they disrupt the output somehow. We are Err parazyd.org 70 i+ # better off relying on less intermediaries, so we implement our Err parazyd.org 70 i+ # own fallback mechanisms. Pinentry supported: curses, gtk-2, qt4 Err parazyd.org 70 i+ # and x11. Err parazyd.org 70 i+ Err parazyd.org 70 i+ # make sure LANG is set, default to C Err parazyd.org 70 i+ LANG=${LANG:-C} Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ "$DISPLAY" = "" ]]; then Err parazyd.org 70 i+ Err parazyd.org 70 i+ if _is_found "pinentry-curses"; then Err parazyd.org 70 i+ output=`cat </dev/null 2>/dev/null Err parazyd.org 70 i+ return $? Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ _clean - Clean function, removes sensitive stuff from memory Err parazyd.org 70 i+function _clean { Err parazyd.org 70 i+ TOMBSIZE="$rr"; unset TOMBSIZE Err parazyd.org 70 i+ TOMBNAME="$rr"; unset TOMBNAME Err parazyd.org 70 i+ UNDERTAKER="$rr"; unset UNDERTAKER Err parazyd.org 70 i+ sudoassword="$rr"; unset sudoassword Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ zenity dialogs Err parazyd.org 70 i+function _fsel { Err parazyd.org 70 i+ zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --file-selection \ Err parazyd.org 70 i+ --title="$1" Err parazyd.org 70 i+} Err parazyd.org 70 i+function _zenques { Err parazyd.org 70 i+ zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --question \ Err parazyd.org 70 i+ --text="$1" Err parazyd.org 70 i+} Err parazyd.org 70 i+function _zenwarn { Err parazyd.org 70 i+ zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --warning \ Err parazyd.org 70 i+ --title="$1" \ Err parazyd.org 70 i+ --text="$2" Err parazyd.org 70 i+} Err parazyd.org 70 i+function _zeninfo { Err parazyd.org 70 i+ zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --info \ Err parazyd.org 70 i+ --title="$1" \ Err parazyd.org 70 i+ --text="$2" Err parazyd.org 70 i+} Err parazyd.org 70 i+function _zenerr { Err parazyd.org 70 i+ zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --error \ Err parazyd.org 70 i+ --title="$1" \ Err parazyd.org 70 i+ --text="$2" Err parazyd.org 70 i+} Err parazyd.org 70 i+function _zenentry { Err parazyd.org 70 i+ zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --entry \ Err parazyd.org 70 i+ --title="$1" \ Err parazyd.org 70 i+ --text="$2" \ Err parazyd.org 70 i+ --entry-text="$3" Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _umountkey { sudo umount $keymount && sudo rmdir $keymount } Err parazyd.org 70 i+function _mountkey { Err parazyd.org 70 i+ sudo umount $USBKEY Err parazyd.org 70 i+ [[ $? = 0 ]] || { Err parazyd.org 70 i+ _zenerr "Error" "Your key is mounted somewhere and I've run into issues. Please unmount it and re-run." Err parazyd.org 70 i+ _clean && exit } Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ -d $keymount ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Something is already mounted on $keymount. Please check and re-run." Err parazyd.org 70 i+ _clean && exit Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ sudo mkdir -p $keymount Err parazyd.org 70 i+ sudo mount $USBKEY $keymount Err parazyd.org 70 i+ Err parazyd.org 70 i+ if ! [[ -d $coffindot ]]; then Err parazyd.org 70 i+ sudo mkdir $coffindot Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ _writedavinfo Err parazyd.org 70 i+function _writedavinfo { Err parazyd.org 70 i+ if [[ -n $davpass ]]; then Err parazyd.org 70 i+ davinfo=$(echo -n "$UNDERTAKER:WebDAV:" \ Err parazyd.org 70 i+ && echo -n "$UNDERTAKER:WebDAV:$davpass" \ Err parazyd.org 70 i+ | md5sum \ Err parazyd.org 70 i+ | awk '{print $1}') Err parazyd.org 70 i+ print $davinfo | sudo tee $coffindot/davinfo Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ cat < Err parazyd.org 70 i+ Dav On Err parazyd.org 70 i+ AllowOverride none Err parazyd.org 70 i+ Options Indexes FollowSymlinks Err parazyd.org 70 i+ AuthType Digest Err parazyd.org 70 i+ AuthName WebDAV Err parazyd.org 70 i+ AuthUserFile /etc/apache2/davpasswd Err parazyd.org 70 i+ Require user ${UNDERTAKER} Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+EOF Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _main { Err parazyd.org 70 i+ _clean Err parazyd.org 70 i+ cmnd=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="tombox hook helper" \ Err parazyd.org 70 i+ --list \ Err parazyd.org 70 i+ --hide-header \ Err parazyd.org 70 i+ --text="tombox hook helper\nChoose what hook you want to create:" \ Err parazyd.org 70 i+ --separator=" # " \ Err parazyd.org 70 i+ --column=Function \ Err parazyd.org 70 i+ --column=Description \ Err parazyd.org 70 i+ "create" "a new tomb on the tombox" \ Err parazyd.org 70 i+ "delete" "a tomb from the tombox" \ Err parazyd.org 70 i+ "backup" "a tomb from the tombox" \ Err parazyd.org 70 i+ "foobar" "on the tombox") Err parazyd.org 70 i+ eval "_$cmnd" Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ _create Err parazyd.org 70 i+function _create { Err parazyd.org 70 i+ vars=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Create a new tomb" \ Err parazyd.org 70 i+ --forms \ Err parazyd.org 70 i+ --text="Enter the info for your new tomb" \ Err parazyd.org 70 i+ --separator=":" \ Err parazyd.org 70 i+ --add-entry="Tombox username" \ Err parazyd.org 70 i+ --add-entry="Tomb name" \ Err parazyd.org 70 i+ --add-entry="Tomb's size in MiB") Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ else Err parazyd.org 70 i+ UNDERTAKER=${vars[(ws@:@)1]} Err parazyd.org 70 i+ re='^[A-Za-z0-9]+$' Err parazyd.org 70 i+ if ! [[ $UNDERTAKER =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in username!" Err parazyd.org 70 i+ exec _create Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ TOMBNAME=${vars[(ws@:@)2]} Err parazyd.org 70 i+ if ! [[ $TOMBNAME =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in tomb name!" Err parazyd.org 70 i+ exec _create Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ TOMBSIZE=${vars[(ws@:@)3]} Err parazyd.org 70 i+ re='^[0-9]+$' Err parazyd.org 70 i+ if ! [[ $TOMBSIZE =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in tomb size!" Err parazyd.org 70 i+ exec _create Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ feats=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Choose features" \ Err parazyd.org 70 i+ --text="Choose features you wish to include with your tomb" \ Err parazyd.org 70 i+ --list \ Err parazyd.org 70 i+ --checklist \ Err parazyd.org 70 i+ --separator=":" \ Err parazyd.org 70 i+ --column=Yes/No \ Err parazyd.org 70 i+ --column=Feature \ Err parazyd.org 70 i+ "FALSE" "webdav" \ Err parazyd.org 70 i+ "FALSE" "sshfs" \ Err parazyd.org 70 i+ "FALSE" "ipfs") Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ $feats =~ "webdav" ]]; then Err parazyd.org 70 i+ _zenques "Do you already have a WebDAV login?" Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ davpass=$(_zenentry "WebDAV Password" \ Err parazyd.org 70 i+ "Insert the password you want to use for WebDAV login:" \ Err parazyd.org 70 i+ "my very strong password") Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; davpass=""; fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ $feats =~ "sshfs" ]]; then Err parazyd.org 70 i+ _zenques "Do you already have an SSH key setup for your user?" Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ sshpubkey=$(_fsel "Select your SSH pubkey you want to use.") Err parazyd.org 70 i+ else Err parazyd.org 70 i+ sshpubkey="" Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ TOMBHOOKS=$(_zenques "Choose 'Yes' if you want to edit your tomb's bind-hooks and post-hooks") Err parazyd.org 70 i+ if [[ $? = 0 ]]; then Err parazyd.org 70 i+ bindhook=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="bind-hooks" \ Err parazyd.org 70 i+ --checkbox="Accept these bind-hooks" \ Err parazyd.org 70 i+ --text-info \ Err parazyd.org 70 i+ --editable) Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ posthook=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="post-hooks" \ Err parazyd.org 70 i+ --checkbox="Accept these post-hooks" \ Err parazyd.org 70 i+ --text-info \ Err parazyd.org 70 i+ --editable) Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ _zeninfo "gmakehook" "Plug in your USB key and click OK." Err parazyd.org 70 i+ lsblk -npl | awk -F" " '{print $1 " " $4}' | grep '^/dev/sd.. ' > ./.devs Err parazyd.org 70 i+ Err parazyd.org 70 i+ USBKEY=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Choose USB key" \ Err parazyd.org 70 i+ --list \ Err parazyd.org 70 i+ --text="Choose your USB key to use" \ Err parazyd.org 70 i+ --separator=" " \ Err parazyd.org 70 i+ --column="Device path" \ Err parazyd.org 70 i+ --column="Device size" \ Err parazyd.org 70 i+ $(cat ./.devs)) Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ _sudo Err parazyd.org 70 i+ _mountkey Err parazyd.org 70 i+ if [[ -f $hooks ]]; then Err parazyd.org 70 i+ _zenques "Warning! There is already an existing hook. Do you want to overwrite?" Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ _zeninfo "gmakehook" "Postponing..." && _umountkey && exec _main Err parazyd.org 70 i+ else Err parazyd.org 70 i+ print "create:${UNDERTAKER}:${TOMBNAME}:${TOMBSIZE}:${feats}" | sudo tee $hooks Err parazyd.org 70 i+ if [[ $feats =~ "webdav" ]]; then; _writedavinfo; fi Err parazyd.org 70 i+ if [[ -n $sshpubkey ]]; then; sudo cp $sshpubkey ./sshpubkey ; fi Err parazyd.org 70 i+ if [[ -n $bindhook ]]; then Err parazyd.org 70 i+ print "$bindhook" | sudo tee $coffindot/bindhooks Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ if [[ -n $posthook ]]; then Err parazyd.org 70 i+ print "$posthook" | sudo tee $coffindot/posthooks Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in a tombox to activate it." Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ else Err parazyd.org 70 i+ print "create:${UNDERTAKER}:${TOMBNAME}:${TOMBSIZE}:${feats}" | sudo tee $hooks Err parazyd.org 70 i+ if [[ $feats =~ "webdav" ]]; then; _writedavinfo; fi Err parazyd.org 70 i+ if [[ -n $sshpubkey ]]; then; sudo cp $sshpubkey $coffindot/sshpubkey ; fi Err parazyd.org 70 i+ if [[ -n $bindhook ]]; then Err parazyd.org 70 i+ print "$bindhook" | sudo tee $coffindot/bindhooks Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ if [[ -n $posthook ]]; then Err parazyd.org 70 i+ print "$posthook" | sudo tee $coffindot/posthooks Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in the tombox to activate it." Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ _delete Err parazyd.org 70 i+function _delete { Err parazyd.org 70 i+ vars=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Delete an existing tomb" \ Err parazyd.org 70 i+ --forms \ Err parazyd.org 70 i+ --text="Enter the info of your tomb" \ Err parazyd.org 70 i+ --separator=":" \ Err parazyd.org 70 i+ --add-entry="Tombox username" \ Err parazyd.org 70 i+ --add-entry="Tomb name") Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ else Err parazyd.org 70 i+ UNDERTAKER=${vars[(ws@:@)1]} Err parazyd.org 70 i+ re='^[A-Za-z0-9]+$' Err parazyd.org 70 i+ if ! [[ $UNDERTAKER =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in username!" Err parazyd.org 70 i+ exec _delete Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ TOMBNAME=${vars[(ws@:@)2]} Err parazyd.org 70 i+ if ! [[ $TOMBNAME =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in tomb name!" Err parazyd.org 70 i+ exec _delete Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ _zeninfo "gmakehook" "Plug in your USB key and click OK." Err parazyd.org 70 i+ lsblk -npl | awk -F" " '{print $1 " " $4}' | grep '^/dev/sd.. ' > ./.devs Err parazyd.org 70 i+ Err parazyd.org 70 i+ USBKEY=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Choose USB key" \ Err parazyd.org 70 i+ --list \ Err parazyd.org 70 i+ --text="Choose your USB key to use" \ Err parazyd.org 70 i+ --separator=" " \ Err parazyd.org 70 i+ --column="Device path" \ Err parazyd.org 70 i+ --column="Device size" \ Err parazyd.org 70 i+ $(cat ./.devs)) Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ _sudo Err parazyd.org 70 i+ _mountkey Err parazyd.org 70 i+ if [[ -f $hooks ]]; then Err parazyd.org 70 i+ _zenques "Warning! There is already an existing hook. Do you want to overwrite?" Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ _zeninfo "gmakehook" "Postponing..." && _umountkey && exec _main Err parazyd.org 70 i+ else Err parazyd.org 70 i+ print "delete:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i+ _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in a tombox to activate it." Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ else Err parazyd.org 70 i+ print "delete:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i+ _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in the tombox to activate it." Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ _backup Err parazyd.org 70 i+function _backup { Err parazyd.org 70 i+ vars=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Backup an existing tomb" \ Err parazyd.org 70 i+ --forms \ Err parazyd.org 70 i+ --text="Enter the info of your tomb" \ Err parazyd.org 70 i+ --separator=":" \ Err parazyd.org 70 i+ --add-entry="Tombox username" \ Err parazyd.org 70 i+ --add-entry="Tomb name") Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ else Err parazyd.org 70 i+ UNDERTAKER=${vars[(ws@:@)1]} Err parazyd.org 70 i+ re='^[A-Za-z0-9]+$' Err parazyd.org 70 i+ if ! [[ $UNDERTAKER =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in username!" Err parazyd.org 70 i+ exec _delete Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ TOMBNAME=${vars[(ws@:@)2]} Err parazyd.org 70 i+ if ! [[ $TOMBNAME =~ $re ]]; then Err parazyd.org 70 i+ _zenwarn "Warning" "Invalid characters in tomb name!" Err parazyd.org 70 i+ exec _delete Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ _zeninfo "gmakehook" "Plug in your USB key and click OK." Err parazyd.org 70 i+ lsblk -npl | awk -F" " '{print $1 " " $4}' | grep '^/dev/sd.. ' > ./.devs Err parazyd.org 70 i+ Err parazyd.org 70 i+ USBKEY=$(zenity \ Err parazyd.org 70 i+ --window-icon="$MONMORT" \ Err parazyd.org 70 i+ --title="Choose USB key" \ Err parazyd.org 70 i+ --list \ Err parazyd.org 70 i+ --text="Choose your USB key to use" \ Err parazyd.org 70 i+ --separator=" " \ Err parazyd.org 70 i+ --column="Device path" \ Err parazyd.org 70 i+ --column="Device size" \ Err parazyd.org 70 i+ $(cat ./.devs)) Err parazyd.org 70 i+ if [[ $? = 1 ]]; then; exec _main; fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ _sudo Err parazyd.org 70 i+ _mountkey Err parazyd.org 70 i+ if [[ -f $hooks ]]; then Err parazyd.org 70 i+ _zenques "Warning! There is already an existing hook. Do you want to overwrite?" Err parazyd.org 70 i+ if [[ $? = 1 ]]; then Err parazyd.org 70 i+ _zeninfo "gmakehook" "Postponing..." && _umountkey && exec _main Err parazyd.org 70 i+ else Err parazyd.org 70 i+ print "backup:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i+ _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in a tombox to activate it." Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ else Err parazyd.org 70 i+ print "backup:${UNDERTAKER}:${TOMBNAME}" | sudo tee $hooks Err parazyd.org 70 i+ _umountkey && _zeninfo "Success" "$hooks written successfully!\nPlug the USB key in the tombox to activate it." Err parazyd.org 70 i+ exec _main Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+# }}} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _ { rm ./.devs } Err parazyd.org 70 i+exec _main Err parazyd.org 70 1diff --git a/src/mourner b/src/mourner /git/coffin/file/src/mourner.gph parazyd.org 70 it@@ -0,0 +1,23 @@ Err parazyd.org 70 i+#!/usr/bin/env bash Err parazyd.org 70 i+# Err parazyd.org 70 i+# mourner - inotify script to watch /dev for new keys Err parazyd.org 70 i+# Err parazyd.org 70 i+# ~ parazyd Err parazyd.org 70 i+ Err parazyd.org 70 i+pattern='sd[a-z][1-9]$' Err parazyd.org 70 i+coproc inotifywait --monitor --event create,delete --format '%e %w%f' /dev Err parazyd.org 70 i+ Err parazyd.org 70 i+while read -r -u "${COPROC[0]}" event file; do Err parazyd.org 70 i+ if [[ $file =~ $pattern ]]; then Err parazyd.org 70 i+ case $event in Err parazyd.org 70 i+ CREATE) Err parazyd.org 70 i+ echo "Created $file..."; sleep 1 Err parazyd.org 70 i+ `pwd`/sacrist $file $event Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ DELETE) Err parazyd.org 70 i+ echo "Removed $file..."; sleep 1 Err parazyd.org 70 i+ `pwd`/sacrist $file $event Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ esac Err parazyd.org 70 i+ fi Err parazyd.org 70 i+done Err parazyd.org 70 1diff --git a/src/sacrist b/src/sacrist /git/coffin/file/src/sacrist.gph parazyd.org 70 it@@ -0,0 +1,63 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+# Err parazyd.org 70 i+# sacrist - script called by mourner, for our graveyard administration Err parazyd.org 70 i+# Err parazyd.org 70 i+# ~ parazyd Err parazyd.org 70 i+ Err parazyd.org 70 i+zkv=1 Err parazyd.org 70 i+helpers=1 Err parazyd.org 70 i+ Err parazyd.org 70 i+R=$(pwd) Err parazyd.org 70 i+source $R/zlibs/zuper Err parazyd.org 70 i+ Err parazyd.org 70 i+vars+=(device keyuuid) Err parazyd.org 70 i+ Err parazyd.org 70 i+source $R/zlibs/features Err parazyd.org 70 i+source $R/zlibs/hooks Err parazyd.org 70 i+source $R/zlibs/keyfiles Err parazyd.org 70 i+source $R/zlibs/mounts Err parazyd.org 70 i+source $R/zlibs/ttab Err parazyd.org 70 i+ Err parazyd.org 70 i+source $R/zlibs/zuper.init Err parazyd.org 70 i+ Err parazyd.org 70 i+device=$1 Err parazyd.org 70 i+happenz=$2 Err parazyd.org 70 i+keyuuid=$(lsblk -no uuid $device) Err parazyd.org 70 i+ Err parazyd.org 70 i+typeset -H keypass Err parazyd.org 70 i+typeset -H keyuuid Err parazyd.org 70 i+typeset -H undertaker Err parazyd.org 70 i+typeset -H graveyard Err parazyd.org 70 i+typeset -H tombs Err parazyd.org 70 i+typeset -H tombpasswd Err parazyd.org 70 i+ Err parazyd.org 70 i+# Vars Err parazyd.org 70 i+graveyard="/home/graveyard" # Our graveyard, with all the tombs Err parazyd.org 70 i+tombs="$graveyard/tombs" # Info about opened tombs, holds keyuuid, keyhash and tombid Err parazyd.org 70 i+tmptombs="$graveyard/tmptombs" # Temp tempfile, for updating $tombs Err parazyd.org 70 i+keymount="/media/tombkey" # Directory where keys get mounted Err parazyd.org 70 i+coffindot="$keymount/.coffin" # .coffin directory on the usb key Err parazyd.org 70 i+ttab="$coffindot/ttab" # Our ttab Err parazyd.org 70 i+hooks="$coffindot/hook" Err parazyd.org 70 i+tomb="/usr/local/bin/tomb" Err parazyd.org 70 i+tombpasswd="$graveyard/passwd" Err parazyd.org 70 i+ Err parazyd.org 70 i+[[ $happenz == "CREATE" ]] && { Err parazyd.org 70 i+ mount-key Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ -d "$coffindot" ]]; then Err parazyd.org 70 i+ notice "Found .coffin" Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ -f "$hooks" ]] && check-hooks Err parazyd.org 70 i+ [[ -f "$ttab" ]] && ttab-magic Err parazyd.org 70 i+ Err parazyd.org 70 i+ else Err parazyd.org 70 i+ _msg warning "No .coffin directory" Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ umount-key Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+[[ $happenz == "DELETE" ]] && { Err parazyd.org 70 i+ # Some kind of endgame Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/src/zlibs/features b/src/zlibs/features /git/coffin/file/src/zlibs/features.gph parazyd.org 70 it@@ -0,0 +1,45 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+ Err parazyd.org 70 i+check-webdav-hook() { Err parazyd.org 70 i+ fn check-webdav-hook Err parazyd.org 70 i+ Err parazyd.org 70 i+ davconf="/etc/apache2/sites-available/tomboxdav.conf" Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ $entry =~ webdav && -f $coffindot/webdav.conf ]]; then Err parazyd.org 70 i+ notice "Found WebDAV data. Setting up..." Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ -f $coffindot/davinfo ]] && { Err parazyd.org 70 i+ cat $coffindot/davinfo >> /etc/apache2/davpasswd Err parazyd.org 70 i+ [[ $? = 0 ]] && { Err parazyd.org 70 i+ rm $coffindot/davinfo Err parazyd.org 70 i+ gpasswd -a www-data $undertaker Err parazyd.org 70 i+ notice "Added new WebDAV user" Err parazyd.org 70 i+ } Err parazyd.org 70 i+ } Err parazyd.org 70 i+ sed -i -e :a -e '$d;N;2,3ba' -e 'P;D' $davconf Err parazyd.org 70 i+ cat $coffindot/webdav.conf >> $davconf Err parazyd.org 70 i+ notice "Wrote to $davconf" Err parazyd.org 70 i+ /etc/init.d/apache2 restart Err parazyd.org 70 i+ notice "Done setting up WebDAV" Err parazyd.org 70 i+ else Err parazyd.org 70 i+ notice "No WebDAV data found" Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+check-sshfs-hook() { Err parazyd.org 70 i+ fn check-sshfs-hook Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ $entry =~ sshfs && -f $coffindot/sshpubkey ]]; then Err parazyd.org 70 i+ notice "Found SSH data. Setting up..." Err parazyd.org 70 i+ Err parazyd.org 70 i+ mkdir -p /home/$undertaker/.ssh Err parazyd.org 70 i+ cat $coffindot/sshpubkey >> /home/$undertaker/.ssh/authorized_keys Err parazyd.org 70 i+ chown -R $undertaker:$undertaker /home/$undertaker/.ssh Err parazyd.org 70 i+ chmod 700 /home/$undertaker/.ssh && chmod 600 /home/$undertaker/.ssh/authorized_keys Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ $? = 0 ]] && notice "Wrote to authorized_keys" \ Err parazyd.org 70 i+ && notice "Done setting up SSH" Err parazyd.org 70 i+ else Err parazyd.org 70 i+ notice "No SSH data found" Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/src/zlibs/hooks b/src/zlibs/hooks /git/coffin/file/src/zlibs/hooks.gph parazyd.org 70 it@@ -0,0 +1,80 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+ Err parazyd.org 70 i+check-hooks() { Err parazyd.org 70 i+ # TODO: fragmented keys, delete, backup, moar Err parazyd.org 70 i+ fn check-hooks Err parazyd.org 70 i+ Err parazyd.org 70 i+ for entry in $(cat $hooks); do Err parazyd.org 70 i+ let hook=$hook+1 Err parazyd.org 70 i+ notice "Found hook $hook..." Err parazyd.org 70 i+ Err parazyd.org 70 i+ # Check what's hook supposed to do Err parazyd.org 70 i+ if [[ ${entry[(ws@:@)1]} == "create" ]]; then Err parazyd.org 70 i+ create-new-tomb Err parazyd.org 70 i+ elif [[ ${entry[(ws@:@)1]} == "delete" ]]; then Err parazyd.org 70 i+ delete-tomb Err parazyd.org 70 i+ elif [[ ${entry[(ws@:@)1]} == "backup" ]]; then Err parazyd.org 70 i+ backup-tomb Err parazyd.org 70 i+ else Err parazyd.org 70 i+ _msg failure "No valid hook syntax on hook $hook" Err parazyd.org 70 i+ print $entry >> $hooks.fail Err parazyd.org 70 i+ notice "Wrote failed hook to $hooks.fail" Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ done Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+create-new-tomb() { Err parazyd.org 70 i+ fn create-new-tomb Err parazyd.org 70 i+ Err parazyd.org 70 i+ # TODO: recognize custom post/bind hooks and implement them in the Err parazyd.org 70 i+ # new tomb Err parazyd.org 70 i+ Err parazyd.org 70 i+ notice "Creating new tomb" Err parazyd.org 70 i+ Err parazyd.org 70 i+ undertaker=${entry[(ws@:@)2]} Err parazyd.org 70 i+ tombid=${entry[(ws@:@)3]} Err parazyd.org 70 i+ tombsize=${entry[(ws@:@)4]} Err parazyd.org 70 i+ keypass=$(pwgen 30 -1 1) Err parazyd.org 70 i+ Err parazyd.org 70 i+ if ! [[ ( $(id $undertaker) ) ]]; then Err parazyd.org 70 i+ _msg warning "No user called $undertaker found. Creating..." Err parazyd.org 70 i+ useradd -G tombox -m -s /bin/nologin $undertaker Err parazyd.org 70 i+ notice "Created user $undertaker" Err parazyd.org 70 i+ else Err parazyd.org 70 i+ notice "Found user $undertaker" Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ # Check for features Err parazyd.org 70 i+ check-webdav-hook Err parazyd.org 70 i+ check-sshfs-hook Err parazyd.org 70 i+ Err parazyd.org 70 i+ notice "Digging your tomb..." Err parazyd.org 70 i+ Err parazyd.org 70 i+ sudo -u $undertaker $tomb dig -s $tombsize $graveyard/$tombid.tomb || \ Err parazyd.org 70 i+ (_msg failure "Digging went downhill. Cleaning and exiting" && \ Err parazyd.org 70 i+ clean-failed-hook) Err parazyd.org 70 i+ Err parazyd.org 70 i+ sudo -u $undertaker $tomb forge $graveyard/$tombid.key \ Err parazyd.org 70 i+ --unsafe \ Err parazyd.org 70 i+ --tomb-pwd "$keypass" || \ Err parazyd.org 70 i+ (_msg failure "Forging key went downhill. Cleaning and exiting" && \ Err parazyd.org 70 i+ clean-failed-hook) Err parazyd.org 70 i+ Err parazyd.org 70 i+ sudo -u $undertaker $tomb lock $graveyard/$tombid.tomb \ Err parazyd.org 70 i+ -k $graveyard/$tombid.key \ Err parazyd.org 70 i+ --unsafe \ Err parazyd.org 70 i+ --tomb-pwd "$keypass" || \ Err parazyd.org 70 i+ (_msg failure "Locking tomb went downhill. Cleaning and exiting" && \ Err parazyd.org 70 i+ clean-failed-hook) Err parazyd.org 70 i+ Err parazyd.org 70 i+ notice "Moving your keyfile to your USB key..." Err parazyd.org 70 i+ mv $graveyard/$tombid.key $coffindot/ && \ Err parazyd.org 70 i+ chown $undertaker:$undertaker $coffindot/$tombid.key && \ Err parazyd.org 70 i+ notice "Moved and chowned keyfile" Err parazyd.org 70 i+ Err parazyd.org 70 i+ print "${undertaker}:${tombid}:true" >> $ttab Err parazyd.org 70 i+ Err parazyd.org 70 i+ keyhash=$(hash-key) Err parazyd.org 70 i+ print "${keyhash}:${keypass}" >> $tombpasswd Err parazyd.org 70 i+ notice "Wrote to ttab and tombpasswd" Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/src/zlibs/keyfiles b/src/zlibs/keyfiles /git/coffin/file/src/zlibs/keyfiles.gph parazyd.org 70 it@@ -0,0 +1,19 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+ Err parazyd.org 70 i+hash-key() { Err parazyd.org 70 i+ fn hash-key Err parazyd.org 70 i+ Err parazyd.org 70 i+ ${$(sha256sum $coffindot/$tombid.key)[(ws: :)1]} Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+compare-key() { Err parazyd.org 70 i+ fn compare-key Err parazyd.org 70 i+ Err parazyd.org 70 i+ keyhash=$(hash-key) Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ ( $(grep $keyhash $tombs | grep $keyuuid) ) ]]; then Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ else Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/src/zlibs/mounts b/src/zlibs/mounts /git/coffin/file/src/zlibs/mounts.gph parazyd.org 70 it@@ -0,0 +1,31 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+ Err parazyd.org 70 i+mount-key() { Err parazyd.org 70 i+ fn mount-key Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ -d $keymount ]]; then Err parazyd.org 70 i+ _msg failure "$keymount already exists." Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ else Err parazyd.org 70 i+ notice "Creating $keymount" Err parazyd.org 70 i+ mkdir -p $keymount Err parazyd.org 70 i+ notice "Mounting..." Err parazyd.org 70 i+ mount $device $keymount Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+umount-key() { Err parazyd.org 70 i+ fn umount-key Err parazyd.org 70 i+ Err parazyd.org 70 i+ if [[ -d $keymount ]]; then Err parazyd.org 70 i+ notice "Unmounting $keymount" Err parazyd.org 70 i+ umount $keymount \ Err parazyd.org 70 i+ && rmdir $keymount Err parazyd.org 70 i+ notice "Success umounting" Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ else Err parazyd.org 70 i+ notice "No $keymount found" Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ fi Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/src/zlibs/ttab b/src/zlibs/ttab /git/coffin/file/src/zlibs/ttab.gph parazyd.org 70 it@@ -0,0 +1,54 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+ Err parazyd.org 70 i+ttab-magic() { Err parazyd.org 70 i+ fn ttab-magic Err parazyd.org 70 i+ Err parazyd.org 70 i+ notice "Doing ttab magic..." Err parazyd.org 70 i+ Err parazyd.org 70 i+ line=0 Err parazyd.org 70 i+ Err parazyd.org 70 i+ for entry in $(cat $ttab); do Err parazyd.org 70 i+ let line=$line+1 Err parazyd.org 70 i+ notice "Found line $line..." Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ ${entry[(ws@:@)3]} == "true" ]] && { Err parazyd.org 70 i+ notice "Working on tomb from line $line" Err parazyd.org 70 i+ Err parazyd.org 70 i+ undertaker=${entry[(ws@:@)1]} Err parazyd.org 70 i+ notice "Username: $undertaker" Err parazyd.org 70 i+ tombid=${entry[(ws@:@)2]} Err parazyd.org 70 i+ notice "Tombname: $tombid" Err parazyd.org 70 i+ Err parazyd.org 70 i+ compare-key Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ $? = 0 ]] && { Err parazyd.org 70 i+ notice "compare-key -> true" Err parazyd.org 70 i+ sudo -u $undertaker $tomb slam $tombid Err parazyd.org 70 i+ Err parazyd.org 70 i+ cp $tombs $tmptombs Err parazyd.org 70 i+ grep -v $keyhash $tmptombs > $tombs && \ Err parazyd.org 70 i+ chmod 600 $tombs && \ Err parazyd.org 70 i+ notice "Updated $tombs"$tombs Err parazyd.org 70 i+ rm $tmptombs Err parazyd.org 70 i+ continue Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ notice "compare-key -> false" Err parazyd.org 70 i+ Err parazyd.org 70 i+ keypass=${$(grep $keyhash $tombpasswd)[(ws@:@)2]} Err parazyd.org 70 i+ Err parazyd.org 70 i+ sudo -u $undertaker $tomb open $graveyard/$tombid.tomb \ Err parazyd.org 70 i+ -k $coffindot/$tombid.key \ Err parazyd.org 70 i+ --unsafe \ Err parazyd.org 70 i+ --tomb-pwd "$keypass" Err parazyd.org 70 i+ Err parazyd.org 70 i+ chmod g+rw /media/$tombid Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ -d "/media/$tombid" ]] && { Err parazyd.org 70 i+ print "${undertaker}:${keyhash}:${keyuuid}" >> $tombs && \ Err parazyd.org 70 i+ chmod 600 $tombs && \ Err parazyd.org 70 i+ notice "Added info to $tombs" Err parazyd.org 70 i+ } Err parazyd.org 70 i+ } Err parazyd.org 70 i+ done Err parazyd.org 70 i+} Err parazyd.org 70 1diff --git a/src/zlibs/zuper b/src/zlibs/zuper /git/coffin/file/src/zlibs/zuper.gph parazyd.org 70 it@@ -0,0 +1,729 @@ Err parazyd.org 70 i+#!/usr/bin/env zsh Err parazyd.org 70 i+## -*- origami-fold-style: triple-braces -*- Err parazyd.org 70 i+# Err parazyd.org 70 i+# Zuper - Zsh Ultimate Programmer's Extensions Refurbished Err parazyd.org 70 i+# Err parazyd.org 70 i+# Copyright (C) 2015 Dyne.org Foundation Err parazyd.org 70 i+# Err parazyd.org 70 i+# Zuper is designed, written and maintained by Denis Roio Err parazyd.org 70 i+# Err parazyd.org 70 i+# This source code is free software; you can redistribute it and/or Err parazyd.org 70 i+# modify it under the terms of the GNU Public License as published by Err parazyd.org 70 i+# the Free Software Foundation; either version 3 of the License, or Err parazyd.org 70 i+# (at your option) any later version. Err parazyd.org 70 i+# Err parazyd.org 70 i+# This source code is distributed in the hope that it will be useful, Err parazyd.org 70 i+# but WITHOUT ANY WARRANTY; without even the implied warranty of Err parazyd.org 70 i+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Err parazyd.org 70 i+# Please refer to the GNU Public License for more details. Err parazyd.org 70 i+# Err parazyd.org 70 i+# You should have received a copy of the GNU Public License along with Err parazyd.org 70 i+# this source code; if not, write to: Err parazyd.org 70 i+# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+########################## Err parazyd.org 70 i+typeset -aU vars Err parazyd.org 70 i+typeset -aU arrs Err parazyd.org 70 i+typeset -aU maps Err parazyd.org 70 i+ Err parazyd.org 70 i+vars=(DEBUG QUIET LOG) Err parazyd.org 70 i+arrs=(req freq) Err parazyd.org 70 i+ Err parazyd.org 70 i+vars+=(zuper_version) Err parazyd.org 70 i+zuper_version=0.2 Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Messaging Err parazyd.org 70 i+ Err parazyd.org 70 i+# Messaging function with pretty coloring Err parazyd.org 70 i+autoload colors Err parazyd.org 70 i+colors Err parazyd.org 70 i+ Err parazyd.org 70 i+vars+=(last_act last_func last_notice) Err parazyd.org 70 i+ Err parazyd.org 70 i+function _msg() { Err parazyd.org 70 i+ local msg="$2" Err parazyd.org 70 i+ command -v gettext 1>/dev/null 2>/dev/null && msg="$(gettext -s "$2")" Err parazyd.org 70 i+ for i in $(seq 3 ${#}); Err parazyd.org 70 i+ do Err parazyd.org 70 i+ msg=${(S)msg//::$(($i - 2))*::/$*[$i]} Err parazyd.org 70 i+ done Err parazyd.org 70 i+ Err parazyd.org 70 i+ local command="print -P" Err parazyd.org 70 i+ local progname="$fg[magenta]${PROGRAM##*/}$reset_color" Err parazyd.org 70 i+ local message="$fg_bold[normal]$fg_no_bold[normal]$msg$reset_color" Err parazyd.org 70 i+ local -i returncode Err parazyd.org 70 i+ Err parazyd.org 70 i+ case "$1" in Err parazyd.org 70 i+ inline) Err parazyd.org 70 i+ command+=" -n"; pchars=" > "; pcolor="yellow" Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ message) Err parazyd.org 70 i+ last_act="$msg" Err parazyd.org 70 i+ pchars=" . "; pcolor="white"; message="$fg_no_bold[$pcolor]$msg$reset_color" Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ verbose) Err parazyd.org 70 i+ last_func="$msg" Err parazyd.org 70 i+ pchars="[D]"; pcolor="blue" Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ success) Err parazyd.org 70 i+ last_notice="$msg" Err parazyd.org 70 i+ pchars="(*)"; pcolor="green"; message="$fg_no_bold[$pcolor]$msg$reset_color" Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ warning) Err parazyd.org 70 i+ pchars="[W]"; pcolor="yellow"; message="$fg_no_bold[$pcolor]$msg$reset_color" Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ failure) Err parazyd.org 70 i+ pchars="[E]"; pcolor="red"; message="$fg_no_bold[$pcolor]$msg$reset_color" Err parazyd.org 70 i+ returncode=1 Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ print) Err parazyd.org 70 i+ progname="" Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ *) Err parazyd.org 70 i+ pchars="[F]"; pcolor="red" Err parazyd.org 70 i+ message="Developer oops! Usage: _msg MESSAGE_TYPE \"MESSAGE_CONTENT\"" Err parazyd.org 70 i+ returncode=127 Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ ;; Err parazyd.org 70 i+ esac Err parazyd.org 70 i+ ${=command} "${progname} $fg_bold[$pcolor]$pchars$reset_color ${message}$color[reset_color]" >&2 Err parazyd.org 70 i+ Err parazyd.org 70 i+ # write the log if its configured Err parazyd.org 70 i+ [[ "$LOG" = "" ]] || { Err parazyd.org 70 i+ touch $LOG || return $? Err parazyd.org 70 i+ ${=command} "${progname} $fg_bold[$pcolor]$pchars$reset_color ${message}$color[reset_color]" >> $LOG Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ return $returncode Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _message say act() { Err parazyd.org 70 i+ local notice="message" Err parazyd.org 70 i+ [[ "$1" = "-n" ]] && shift && notice="inline" Err parazyd.org 70 i+ [[ $QUIET = 1 ]] || _msg "$notice" $@ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _verbose xxx func() { Err parazyd.org 70 i+ [[ $DEBUG = 1 ]] && _msg verbose $@ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _success yes notice() { Err parazyd.org 70 i+ [[ $QUIET = 1 ]] || _msg success $@ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _warning no warn warning() { Err parazyd.org 70 i+ [[ $QUIET = 1 ]] || _msg warning $@ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _failure fatal die error() { Err parazyd.org 70 i+ # typeset -i exitcode=${exitv:-1} Err parazyd.org 70 i+ [[ $QUIET = 1 ]] || _msg failure $@ Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+function _print() { Err parazyd.org 70 i+ [[ $QUIET = 1 ]] || _msg print $@ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# }}} Messaging Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Debugging Err parazyd.org 70 i+ Err parazyd.org 70 i+fn() { Err parazyd.org 70 i+ fun="$@" Err parazyd.org 70 i+ req=() Err parazyd.org 70 i+ freq=() Err parazyd.org 70 i+ func "$fun" Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+zerr() { Err parazyd.org 70 i+ error "error in: ${fun:-$last_notice}" Err parazyd.org 70 i+ [[ "$last_func" = "" ]] || warn "called in: $last_func" Err parazyd.org 70 i+ [[ "$last_act" = "" ]] || warn "called in: $last_act" Err parazyd.org 70 i+ [[ "$last_notice" = "" ]] || warn "called in: $last_notice" Err parazyd.org 70 i+ # [[ "$fun" = "" ]] || warn "called in: $fun" Err parazyd.org 70 i+ TRAPEXIT() { Err parazyd.org 70 i+ error "error reported, operation aborted." Err parazyd.org 70 i+ } Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ckreq reqck() { Err parazyd.org 70 i+ err=0 Err parazyd.org 70 i+ for v in $req; do Err parazyd.org 70 i+ [[ "${(P)v}" = "" ]] && { Err parazyd.org 70 i+ warn "${fun[(ws: :)1]}(): required setting is blank: $v" Err parazyd.org 70 i+ err=1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ done Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ $err = 1 ]] && return $err Err parazyd.org 70 i+ Err parazyd.org 70 i+ for f in $freq; do Err parazyd.org 70 i+ # exists and has size greater than zero Err parazyd.org 70 i+ [[ -s $f ]] || { Err parazyd.org 70 i+ warn "required file empty: $f" Err parazyd.org 70 i+ err=1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ done Err parazyd.org 70 i+ [[ $err == 1 ]] && zerr Err parazyd.org 70 i+ return $err Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+zdump() { Err parazyd.org 70 i+ fn zdump Err parazyd.org 70 i+ [[ ${#vars} -gt 0 ]] && { Err parazyd.org 70 i+ print "Global variables:" Err parazyd.org 70 i+ for _v in $vars; do Err parazyd.org 70 i+ print " $_v = \t ${(P)_v}" Err parazyd.org 70 i+ done Err parazyd.org 70 i+ } Err parazyd.org 70 i+ [[ ${#arrs} -gt 0 ]] && { Err parazyd.org 70 i+ print "Global arrays:" Err parazyd.org 70 i+ for _a in $arrs; do Err parazyd.org 70 i+ print " $_a \t ( ${(P)_a} )" Err parazyd.org 70 i+ done Err parazyd.org 70 i+ } Err parazyd.org 70 i+ [[ ${#maps} -gt 0 ]] && { Err parazyd.org 70 i+ print "Global maps:" Err parazyd.org 70 i+ for _m in $maps; do Err parazyd.org 70 i+ print " $_m [key] \t ( ${(Pk)_m} )" Err parazyd.org 70 i+ print " $_m [val] \t ( ${(Pv)_m} )" Err parazyd.org 70 i+ done Err parazyd.org 70 i+ } Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# handy wrappers for throw/catch execution of blocks where we need the Err parazyd.org 70 i+# program to exit on any error (non-zero) returned by any function Err parazyd.org 70 i+throw() { function TRAPZERR() { zerr; return 1 } } Err parazyd.org 70 i+catch() { function TRAPZERR() { } } Err parazyd.org 70 i+ Err parazyd.org 70 i+########################## Err parazyd.org 70 i+# Endgame handling Err parazyd.org 70 i+ Err parazyd.org 70 i+arrs+=(destruens) Err parazyd.org 70 i+destruens=() Err parazyd.org 70 i+ Err parazyd.org 70 i+# Trap functions for the endgame event Err parazyd.org 70 i+TRAPINT() { endgame INT; return $? } Err parazyd.org 70 i+# TRAPEXIT() { endgame EXIT; return $? } Err parazyd.org 70 i+TRAPHUP() { endgame HUP; return $? } Err parazyd.org 70 i+TRAPQUIT() { endgame QUIT; return $? } Err parazyd.org 70 i+TRAPABRT() { endgame ABORT; return $? } Err parazyd.org 70 i+TRAPKILL() { endgame KILL; return $? } Err parazyd.org 70 i+# TRAPPIPE() { endgame PIPE; return $? } Err parazyd.org 70 i+TRAPTERM() { endgame TERM; return $? } Err parazyd.org 70 i+TRAPSTOP() { endgame STOP; return $? } Err parazyd.org 70 i+# TRAPZERR() { func "function returns non-zero." } Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+endgame() { Err parazyd.org 70 i+ fn "endgame $*" Err parazyd.org 70 i+ Err parazyd.org 70 i+ # execute all no matter what Err parazyd.org 70 i+ TRAPZERR() { } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # process registered destructors Err parazyd.org 70 i+ for d in $destruens; do Err parazyd.org 70 i+ fn "destructor: $d" Err parazyd.org 70 i+ $d Err parazyd.org 70 i+ done Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# Register endgame() to be called at exit. Err parazyd.org 70 i+# unlike TRAPEXIT, the zshexit() hook is not called when functions exit. Err parazyd.org 70 i+zshexit() { endgame EXIT; return $? } Err parazyd.org 70 i+ Err parazyd.org 70 i+# }}} Debugging Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Tempfiles Err parazyd.org 70 i+ Err parazyd.org 70 i+########################## Err parazyd.org 70 i+# Temp file handling Err parazyd.org 70 i+ Err parazyd.org 70 i+vars+=(ztmpfile) Err parazyd.org 70 i+# ztmp() fills in $ztmpfile global. Caller must copy that variable as Err parazyd.org 70 i+# it will be overwritten at every call. Err parazyd.org 70 i+ztmp() { Err parazyd.org 70 i+ fn ztmp Err parazyd.org 70 i+ Err parazyd.org 70 i+ ztmpfile=`mktemp` Err parazyd.org 70 i+ tmpfiles+=($ztmpfile) Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# All tempfiles are freed in endgame() Err parazyd.org 70 i+_ztmp_destructor() { Err parazyd.org 70 i+ fn _ztmp_destructor Err parazyd.org 70 i+ Err parazyd.org 70 i+ for f in $tmpfiles; do Err parazyd.org 70 i+ rm -f "$f" Err parazyd.org 70 i+ done Err parazyd.org 70 i+ tmpfiles=() Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+arrs+=(tmpfiles) Err parazyd.org 70 i+destruens+=(_ztmp_destructor) Err parazyd.org 70 i+ Err parazyd.org 70 i+# }}} Tempfiles Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Strings Err parazyd.org 70 i+ Err parazyd.org 70 i+# tokenizer, works only with one char length delimiters Err parazyd.org 70 i+# saves everything in global array tok=() Err parazyd.org 70 i+arrs+=(tok) Err parazyd.org 70 i+strtok() { Err parazyd.org 70 i+ fn "strtok $*" Err parazyd.org 70 i+ _string="$1" Err parazyd.org 70 i+ _delim="$2" Err parazyd.org 70 i+ req=(_string _delim) Err parazyd.org 70 i+ ckreq || return $? Err parazyd.org 70 i+ Err parazyd.org 70 i+ tok=() Err parazyd.org 70 i+ f=0 Err parazyd.org 70 i+ c=0 Err parazyd.org 70 i+ for c in {1..${#_string}}; do Err parazyd.org 70 i+ if [[ "${_string[(e)$c]}" == "$_delim" ]]; then Err parazyd.org 70 i+ # check if not empty Err parazyd.org 70 i+ t=${_string[(e)$(($f + 1)),$(($c - 1))]} Err parazyd.org 70 i+ [[ "$t" == "" ]] || tok+=($t) Err parazyd.org 70 i+ # save last found Err parazyd.org 70 i+ f=$c Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ done Err parazyd.org 70 i+ # add last token Err parazyd.org 70 i+ t=${_string[(e)$(($f + 1)),$c]} Err parazyd.org 70 i+ [[ "$t" == "" ]] || tok+=($t) Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# TODO: move in here some helpers Err parazyd.org 70 i+ Err parazyd.org 70 i+# }}} Strings Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Key/Value filesave Err parazyd.org 70 i+ Err parazyd.org 70 i+# optional: define zkv=1 on source Err parazyd.org 70 i+ Err parazyd.org 70 i+[[ "$zkv" = "" ]] || { Err parazyd.org 70 i+ Err parazyd.org 70 i+ ########################## Err parazyd.org 70 i+ # Key/Value file storage using ZSh associative maps Err parazyd.org 70 i+ Err parazyd.org 70 i+ zmodload zsh/system Err parazyd.org 70 i+ Err parazyd.org 70 i+ # load a map from a file Err parazyd.org 70 i+ # map must be already instantiated with typeset -A by called Err parazyd.org 70 i+ # name of map is defined inside the file Err parazyd.org 70 i+ function zkv.load() { Err parazyd.org 70 i+ fn "zkv-load $*" Err parazyd.org 70 i+ Err parazyd.org 70 i+ file=$1 Err parazyd.org 70 i+ [[ "$file" = "" ]] && { Err parazyd.org 70 i+ error "zkv-open() missing argument: file-path" Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 } Err parazyd.org 70 i+ [[ -r "$file" ]] || { Err parazyd.org 70 i+ error "zkv-open() file not found $file" Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 } Err parazyd.org 70 i+ [[ -s "$file" ]] || { Err parazyd.org 70 i+ error "zkv-open() file is empty" Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 } Err parazyd.org 70 i+ Err parazyd.org 70 i+ source $file Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # save a map in a file Err parazyd.org 70 i+ # $1 = name of the map associative array Err parazyd.org 70 i+ # $2 = full path to the file Err parazyd.org 70 i+ function zkv.save() { Err parazyd.org 70 i+ fn "zkv.save $*" Err parazyd.org 70 i+ Err parazyd.org 70 i+ _map=$1 Err parazyd.org 70 i+ _path=$2 Err parazyd.org 70 i+ [[ "$_path" = "" ]] && { Err parazyd.org 70 i+ error "zkv.save() missing argument: map-name path-to-file" Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ [[ -r $_path ]] && { Err parazyd.org 70 i+ func "zkv.close() overwriting $_path" Err parazyd.org 70 i+ func "backup turd left behind: ${_path}~" Err parazyd.org 70 i+ mv $_path $_path~ Err parazyd.org 70 i+ } Err parazyd.org 70 i+ touch $_path Err parazyd.org 70 i+ Err parazyd.org 70 i+ # wondering about http://www.zsh.org/mla/users/2015/msg00286.html Err parazyd.org 70 i+ # meanwhile solved using a double array, wasting a full map memcpy Err parazyd.org 70 i+ _karr=(${(Pk)_map}) Err parazyd.org 70 i+ _varr=(${(Pv)_map}) Err parazyd.org 70 i+ _num="${#_karr}" Err parazyd.org 70 i+ for c in {1..$_num}; do Err parazyd.org 70 i+ # can also be cat here, however for speed we use builtins Err parazyd.org 70 i+ # switch to cat if compatibility is an issue Err parazyd.org 70 i+ sysread -o 1 <> $_path Err parazyd.org 70 i+$_map+=("${_karr[$c]}" "${(v)_varr[$c]}") Err parazyd.org 70 i+EOF Err parazyd.org 70 i+ done Err parazyd.org 70 i+ func "$_num key/values stored in $_path" Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# }}} Key/Value filesave Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Get/Set REST API Err parazyd.org 70 i+ Err parazyd.org 70 i+# optional: define restful=1 on source Err parazyd.org 70 i+ Err parazyd.org 70 i+[[ "$restful" = "" ]] || { Err parazyd.org 70 i+ Err parazyd.org 70 i+ ######## Err parazyd.org 70 i+ # Restful API client Err parazyd.org 70 i+ # there is a clear zsh optimization here in get/set kv Err parazyd.org 70 i+ # using zsh/tcp instead of spawning curl Err parazyd.org 70 i+ # and perhaps querying with one call using ?recursive Err parazyd.org 70 i+ Err parazyd.org 70 i+ zmodload zsh/net/tcp Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ function restful.put() { Err parazyd.org 70 i+ fn "restful.put $*" Err parazyd.org 70 i+ Err parazyd.org 70 i+ # $1 = hostname Err parazyd.org 70 i+ # $2 = port Err parazyd.org 70 i+ # $3 = path Err parazyd.org 70 i+ # value from stdin | Err parazyd.org 70 i+ Err parazyd.org 70 i+ # to check if the http service is running is up to the caller Err parazyd.org 70 i+ Err parazyd.org 70 i+ _host=${1} # ip address Err parazyd.org 70 i+ _port=${2} Err parazyd.org 70 i+ _path=${3} Err parazyd.org 70 i+ sysread _v Err parazyd.org 70 i+ Err parazyd.org 70 i+ req=(_host) Err parazyd.org 70 i+ ckreq || return $? Err parazyd.org 70 i+ Err parazyd.org 70 i+ if ztcp $_host $_port; then Err parazyd.org 70 i+ Err parazyd.org 70 i+ # TODO: work out various parsers, this one works with consul.io Err parazyd.org 70 i+ Err parazyd.org 70 i+ _fd=$REPLY Err parazyd.org 70 i+ # func "tcp open on fd $fd" Err parazyd.org 70 i+ cat <& $_fd Err parazyd.org 70 i+PUT ${_path} HTTP/1.1 Err parazyd.org 70 i+User-Agent: Zuper/$zuper_version Err parazyd.org 70 i+Host: ${_host}:${_port} Err parazyd.org 70 i+Accept: */* Err parazyd.org 70 i+Content-Length: ${#_v} Err parazyd.org 70 i+Content-Type: application/x-www-form-urlencoded Err parazyd.org 70 i+ Err parazyd.org 70 i+EOF Err parazyd.org 70 i+ Err parazyd.org 70 i+ print -n "$_v" >& $_fd Err parazyd.org 70 i+ Err parazyd.org 70 i+ sysread -i $_fd _res Err parazyd.org 70 i+ Err parazyd.org 70 i+ # close connection Err parazyd.org 70 i+ ztcp -c $_fd Err parazyd.org 70 i+ Err parazyd.org 70 i+ [[ "$_res" =~ "true" ]] || { Err parazyd.org 70 i+ warn "failed PUT on restful key/value" Err parazyd.org 70 i+ warn "host: ${_host}" Err parazyd.org 70 i+ warn "port: ${_port}" Err parazyd.org 70 i+ warn "path: ${_path}" Err parazyd.org 70 i+ warn "value: $_v" Err parazyd.org 70 i+ print - "$_res" Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ else Err parazyd.org 70 i+ error "cannot connect to restful service: $_host:$_port" Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ fi Err parazyd.org 70 i+ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ function restful.get() { Err parazyd.org 70 i+ fn "restful.get $*" Err parazyd.org 70 i+ Err parazyd.org 70 i+ _host=${1} Err parazyd.org 70 i+ _port=${2} Err parazyd.org 70 i+ _path=${3} Err parazyd.org 70 i+ Err parazyd.org 70 i+ req=(_host _port) Err parazyd.org 70 i+ ckreq || return $? Err parazyd.org 70 i+ Err parazyd.org 70 i+ ztcp $_host $_port || { Err parazyd.org 70 i+ zerr Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ _fd=$REPLY Err parazyd.org 70 i+ Err parazyd.org 70 i+ # TODO: work out various parsers, this one works with consul.io Err parazyd.org 70 i+ Err parazyd.org 70 i+ cat <& $_fd Err parazyd.org 70 i+GET ${_path} HTTP/1.1 Err parazyd.org 70 i+User-Agent: Zuper/$zuper_version Err parazyd.org 70 i+Host: $_host:$_port Err parazyd.org 70 i+Accept: */* Err parazyd.org 70 i+ Err parazyd.org 70 i+EOF Err parazyd.org 70 i+ sysread -i $_fd -o 1 | awk -F: ' Err parazyd.org 70 i+/"Value":/ { gsub(/"|}]/,"",$7) ; print $7 }' | base64 -d Err parazyd.org 70 i+ Err parazyd.org 70 i+ # close connection Err parazyd.org 70 i+ ztcp -c $_fd Err parazyd.org 70 i+ Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+} Err parazyd.org 70 i+ Err parazyd.org 70 i+# }}} Get/Set REST API Err parazyd.org 70 i+ Err parazyd.org 70 i+# {{{ Helpers Err parazyd.org 70 i+[[ "$helpers" = "" ]] || { Err parazyd.org 70 i+ Err parazyd.org 70 i+ function helper.isfound isfound() { Err parazyd.org 70 i+ command -v $1 1>/dev/null 2>/dev/null Err parazyd.org 70 i+ return $? Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # remote leading and trailing spaces in a string taken from stdin Err parazyd.org 70 i+ function helper.trim trim() { Err parazyd.org 70 i+ sed -e 's/^[[:space:]]*//g ; s/[[:space:]]*\$//g' Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ zmodload zsh/mapfile Err parazyd.org 70 i+ # faster substitute for cat Err parazyd.org 70 i+ function helper.printfile printfile() { Err parazyd.org 70 i+ print ${mapfile[$1]} Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # extract all emails found in a text from stdin Err parazyd.org 70 i+ # outputs them one per line Err parazyd.org 70 i+ function helper.extract-emails extract_emails() { Err parazyd.org 70 i+ awk '{ for (i=1;i<=NF;i++) Err parazyd.org 70 i+ if ( $i ~ /[[:alnum:]]@[[:alnum:]]/ ) { Err parazyd.org 70 i+ gsub(/<|>|,/ , "" , $i); print $i } }' Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ zmodload zsh/regex Err parazyd.org 70 i+ # takes a string as argument, returns success if is an email Err parazyd.org 70 i+ function helper.isemail isemail() { Err parazyd.org 70 i+ [[ "$1" -regex-match "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" ]] && return 0 Err parazyd.org 70 i+ Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # takes a numeric argument and prints out a human readable size Err parazyd.org 70 i+ function helper.human-size human_size() { Err parazyd.org 70 i+ [[ $1 -gt 0 ]] || { Err parazyd.org 70 i+ error "human_size() called with invalid argument" Err parazyd.org 70 i+ return 1 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # we use the binary operation for speed Err parazyd.org 70 i+ # shift right 10 is divide by 1024 Err parazyd.org 70 i+ Err parazyd.org 70 i+ # gigabytes Err parazyd.org 70 i+ [[ $1 -gt 1073741824 ]] && { Err parazyd.org 70 i+ print -n "$(( $1 >> 30 )) GB" Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # megabytes Err parazyd.org 70 i+ [[ $1 -gt 1048576 ]] && { Err parazyd.org 70 i+ print -n "$(( $1 >> 20 )) MB" Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ # kilobytes Err parazyd.org 70 i+ [[ $1 -gt 1024 ]] && { Err parazyd.org 70 i+ print -n "$(( $1 >> 10 )) KB" Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ # bytes Err parazyd.org 70 i+ print -n "$1 Bytes" Err parazyd.org 70 i+ return 0 Err parazyd.org 70 i+ } Err parazyd.org 70 i+ Err parazyd.org 70 i+ Err parazyd.org 70 i+ # strips out all html/xml tags (everything between < >) Err parazyd.org 70 i+ function helper.html-strip xml_strip html_strip() { sed 's/<[^>]\+>//g' } Err parazyd.org 70 i+ Err parazyd.org 70 i+ # changes stdin string special chars to be shown in html Err parazyd.org 70 i+ function helper.escape-html escape_html() { Err parazyd.org 70 i+ sed -e ' Err parazyd.org 70 i+s/\&/\&/g Err parazyd.org 70 i+s/>/\>/g Err parazyd.org 70 i+s/