coffin

secure lan file storage on a device
git clone git://parazyd.org/coffin.git
Log | Files | Refs | Submodules | README | LICENSE

commit 839e5e2ff0103e68e1aaeeaaa7fc80126fea52f5
parent 77fab0eb4f6f0258c3620ba481780cac5b6f00dd
Author: parazyd <parazyd@dyne.org>
Date:   Wed, 23 Mar 2016 00:09:12 +0100

finished rewriting using zuper

Code has been mostly refactored, and now using the zuper library
which will greatly enhance performance, and help along with development

Diffstat:
Msrc/mourner | 4++--
Msrc/sacrist | 81+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/zlibs/features | 22+++++++++++++++-------
Msrc/zlibs/hooks | 66++++++++++++++++++++++++++++++++++--------------------------------
Msrc/zlibs/keyfiles | 9++++++---
Msrc/zlibs/mounts | 28++++++++++++++++------------
Msrc/zlibs/ttab | 40++++++++++++++++++++--------------------
7 files changed, 143 insertions(+), 107 deletions(-)

diff --git a/src/mourner b/src/mourner @@ -11,11 +11,11 @@ while read -r -u "${COPROC[0]}" event file; do if [[ $file =~ $pattern ]]; then case $event in CREATE) - echo "Created $file..."; sleep 1 + echo "Created $file..." #; sleep 1 `pwd`/sacrist $file $event ;; DELETE) - echo "Removed $file..."; sleep 1 + echo "Removed $file..." #; sleep 1 `pwd`/sacrist $file $event ;; esac diff --git a/src/sacrist b/src/sacrist @@ -4,60 +4,79 @@ # # ~ parazyd +coffin_version=0.2 +coffin_release_date="Mar/2016" + +DEBUG=${DEBUG:-1} +QUIET=${QUIET:-0} +LOG=${LOG:-""} + zkv=1 helpers=1 -R=$(pwd) +R=${COFFIN_PATH:-`pwd`} source $R/zlibs/zuper +# USB key vars+=(device keyuuid) +# Locals +vars+=(GRAVEYARD TOMBS TMPTOMBS TOMBPASSWD) +vars+=(KEYMOUNT COFFINDOT TTAB HOOKS) +vars+=(keypass undertaker tombid) +vars+=(happenz device keyuuid) +source $R/zlibs/zuper.init source $R/zlibs/features source $R/zlibs/hooks source $R/zlibs/keyfiles source $R/zlibs/mounts source $R/zlibs/ttab -source $R/zlibs/zuper.init +LOCK=$R/lock +[[ -f $LOCK ]] && { warn "Lock found. Wait until finished." && exit } +#touch $LOCK -device=$1 -happenz=$2 -keyuuid=$(lsblk -no uuid $device) - -typeset -H keypass -typeset -H keyuuid -typeset -H undertaker -typeset -H graveyard -typeset -H tombs -typeset -H tombpasswd - -# Vars -graveyard="/home/graveyard" # Our graveyard, with all the tombs -tombs="$graveyard/tombs" # Info about opened tombs, holds keyuuid, keyhash and tombid -tmptombs="$graveyard/tmptombs" # Temp tempfile, for updating $tombs -keymount="/media/tombkey" # Directory where keys get mounted -coffindot="$keymount/.coffin" # .coffin directory on the usb key -ttab="$coffindot/ttab" # Our ttab -hooks="$coffindot/hook" -tomb="/usr/local/bin/tomb" -tombpasswd="$graveyard/passwd" +device=$1 && xxx "Device: $device" +happenz=$2 && xxx "Happenz: $happenz" +keyuuid=$(lsblk -no uuid $device) && xxx "Key UUID: $keyuuid" -[[ $happenz == "CREATE" ]] && { - mount-key +GRAVEYARD="${GRAVEYARD:-/home/graveyard}" # Our graveyard, with all the tombs +TOMBS="${TOMBS:-$GRAVEYARD/tombs}" # Info about opened tombs, holds keyuuid, keyhash and tombid +TMPTOMBS="${TMPTOMBS:-$GRAVEYARD/tmptombs}" # Temp tempfile, for updating $tombs +KEYMOUNT="${KEYMOUNT:-/media/tombkey}" # Directory where keys get mounted +COFFINDOT="${COFFINDOT:-$KEYMOUNT/.coffin}" # .coffin directory on the usb key +TTAB="${TTAB:-$COFFINDOT/ttab}" # Our ttab +HOOKS="${HOOKS:-$COFFINDOT/hook}" +TOMB="${TOMB:-/usr/local/bin/tomb}" +TOMBPASSWD="${TOMBPASSWD:-$GRAVEYARD/passwd}" - if [[ -d "$coffindot" ]]; then - notice "Found .coffin" +# Main +req=(happenz device) +ckreq || { + _msg failure "Not called through mourner. Exiting..." + # clean + exit +} - [[ -f "$hooks" ]] && check-hooks - [[ -f "$ttab" ]] && ttab-magic +[[ $happenz == "CREATE" ]] && { + mount-key $device + [[ $? = 0 ]] || { die "Key not mounted successfully." && exit } + if [[ -d "$COFFINDOT" ]]; then + notice "Found .coffin" + [[ -f "$HOOKS" ]] && xxx "Found hooks" && \ + check-hooks + [[ -f "$TTAB" ]] && xxx "Found ttab" && \ + ttab-magic else _msg warning "No .coffin directory" fi - umount-key + umount-key $device + # cleanup & exit } [[ $happenz == "DELETE" ]] && { - # Some kind of endgame + # TODO: Some kind of endgame } + diff --git a/src/zlibs/features b/src/zlibs/features @@ -5,41 +5,49 @@ check-webdav-hook() { davconf="/etc/apache2/sites-available/coffindav.conf" - if [[ $entry =~ webdav && -f $coffindot/webdav.conf ]]; then + if [[ $entry =~ webdav && -f $COFFINDOT/webdav.conf ]]; then notice "Found WebDAV data. Setting up..." - [[ -f $coffindot/davinfo ]] && { - cat $coffindot/davinfo >> /etc/apache2/davpasswd + [[ -f $COFFINDOT/davinfo ]] && { + cat $COFFINDOT/davinfo >> /etc/apache2/davpasswd [[ $? = 0 ]] && { - rm $coffindot/davinfo + rm $COFFINDOT/davinfo gpasswd -a www-data $undertaker notice "Added new WebDAV user" } } sed -i -e :a -e '$d;N;2,3ba' -e 'P;D' $davconf - cat $coffindot/webdav.conf >> $davconf + cat $COFFINDOT/webdav.conf >> $davconf notice "Wrote to $davconf" /etc/init.d/apache2 restart + rm $COFFINDOT/webdav.conf notice "Done setting up WebDAV" else notice "No WebDAV data found" fi } +delete-webdav-hook() { } + + check-sshfs-hook() { fn check-sshfs-hook - if [[ $entry =~ sshfs && -f $coffindot/sshpubkey ]]; then + if [[ $entry =~ sshfs && -f $COFFINDOT/sshpubkey ]]; then notice "Found SSH data. Setting up..." mkdir -p /home/$undertaker/.ssh - cat $coffindot/sshpubkey >> /home/$undertaker/.ssh/authorized_keys + cat $COFFINDOT/sshpubkey >> /home/$undertaker/.ssh/authorized_keys chown -R $undertaker:$undertaker /home/$undertaker/.ssh chmod 700 /home/$undertaker/.ssh && chmod 600 /home/$undertaker/.ssh/authorized_keys [[ $? = 0 ]] && notice "Wrote to authorized_keys" \ && notice "Done setting up SSH" + + # TODO: remove SSH key from usb else notice "No SSH data found" fi } + +delete-sshfs-hook() { } diff --git a/src/zlibs/hooks b/src/zlibs/hooks @@ -4,9 +4,10 @@ check-hooks() { # TODO: fragmented keys, delete, backup, moar fn check-hooks - for entry in $(cat $hooks); do - let hook=$hook+1 - notice "Found hook $hook..." + line=0 + for entry in $(cat $HOOKS); do + let hook=$line+1 + notice "Found hook $line..." # Check what's hook supposed to do if [[ ${entry[(ws@:@)1]} == "create" ]]; then @@ -17,10 +18,12 @@ check-hooks() { backup-tomb else _msg failure "No valid hook syntax on hook $hook" - print $entry >> $hooks.fail - notice "Wrote failed hook to $hooks.fail" + print $entry >> $HOOKS.fail + notice "Wrote failed hook to $HOOKS.fail" fi done + + rm $HOOKS } create-new-tomb() { @@ -31,50 +34,49 @@ create-new-tomb() { notice "Creating new tomb" - undertaker=${entry[(ws@:@)2]} - tombid=${entry[(ws@:@)3]} - tombsize=${entry[(ws@:@)4]} - keypass=$(pwgen 30 -1 1) + undertaker=${entry[(ws@:@)2]} && xxx "Undertaker: $undertaker" + tombid=${entry[(ws@:@)3]} && xxx "Tombid: $tombid" + tombsize=${entry[(ws@:@)4]} && xxx "Tomb size: $tombsize" + keypass=$(pwgen 30 -1 1) && xxx "Key password: $keypass" - if ! [[ ( $(id $undertaker) ) ]]; then - _msg warning "No user called $undertaker found. Creating..." + $(id $undertaker &>/dev/null) + [[ $? = 0 ]] || { + warn "User $undertaker not found. Creating..." useradd -G coffin -m -s /bin/nologin $undertaker notice "Created user $undertaker" - else - notice "Found user $undertaker" - fi - - # Check for features - check-webdav-hook - check-sshfs-hook + } notice "Digging your tomb..." - sudo -u $undertaker $tomb dig -s $tombsize $graveyard/$tombid.tomb || \ - (_msg failure "Digging went downhill. Cleaning and exiting" && \ + sudo -u $undertaker $TOMB dig -s $tombsize $GRAVEYARD/$tombid.tomb || \ + (die "Digging went downhill. Cleaning and exiting" && \ clean-failed-hook) - sudo -u $undertaker $tomb forge $graveyard/$tombid.key \ + sudo -u $undertaker $TOMB forge $GRAVEYARD/$tombid.key \ --unsafe \ --tomb-pwd "$keypass" || \ - (_msg failure "Forging key went downhill. Cleaning and exiting" && \ + (die "Forging key went downhill. Cleaning and exiting" && \ clean-failed-hook) - sudo -u $undertaker $tomb lock $graveyard/$tombid.tomb \ - -k $graveyard/$tombid.key \ + sudo -u $undertaker $TOMB lock $GRAVEYARD/$tombid.tomb \ + -k $GRAVEYARD/$tombid.key \ --unsafe \ --tomb-pwd "$keypass" || \ - (_msg failure "Locking tomb went downhill. Cleaning and exiting" && \ + (die "Locking tomb went downhill. Cleaning and exiting" && \ clean-failed-hook) - notice "Moving your keyfile to your USB key..." - mv $graveyard/$tombid.key $coffindot/ && \ - chown $undertaker:$undertaker $coffindot/$tombid.key && \ - notice "Moved and chowned keyfile" + xxx "Moving your keyfile to your USB key..." + mv $GRAVEYARD/$tombid.key $COFFINDOT/ && \ + chown $undertaker:$undertaker $COFFINDOT/$tombid.key && \ + xxx "Moved and chowned keyfile" - print "${undertaker}:${tombid}:true" >> $ttab + print "${undertaker}:${tombid}:false" >> $TTAB - keyhash=$(hash-key) - print "${keyhash}:${keypass}" >> $tombpasswd + hash-key + print "${keyhash}:${keypass}" >> $TOMBPASSWD notice "Wrote to ttab and tombpasswd" + + # Check for features + check-webdav-hook + check-sshfs-hook } diff --git a/src/zlibs/keyfiles b/src/zlibs/keyfiles @@ -2,16 +2,19 @@ hash-key() { fn hash-key + vars+=(keyhash) + keyhash="" - ${$(sha256sum $coffindot/$tombid.key)[(ws: :)1]} + keyhash=${$(sha256sum $COFFINDOT/$tombid.key)[(ws: :)1]} + xxx "sha256 of keyfile: $keyhash" } compare-key() { fn compare-key - keyhash=$(hash-key) + hash-key - if [[ ( $(grep $keyhash $tombs | grep $keyuuid) ) ]]; then + if [[ ( $(grep $keyhash $TOMBS | grep $keyuuid) ) ]]; then return 0 else return 1 diff --git a/src/zlibs/mounts b/src/zlibs/mounts @@ -1,31 +1,35 @@ #!/usr/bin/env zsh mount-key() { - fn mount-key + fn mount-key $* + req=(device) + ckreq || return 1 - if [[ -d $keymount ]]; then - _msg failure "$keymount already exists." + if [[ -d $KEYMOUNT ]]; then + _msg failure "$KEYMOUNT already exists." return 1 else - notice "Creating $keymount" - mkdir -p $keymount + notice "Creating $KEYMOUNT" + mkdir -p $KEYMOUNT notice "Mounting..." - mount $device $keymount + mount $device $KEYMOUNT return 0 fi } umount-key() { - fn umount-key + fn umount-key $? + req=(device) + ckreq || return 1 - if [[ -d $keymount ]]; then - notice "Unmounting $keymount" - umount $keymount \ - && rmdir $keymount + if [[ -d $KEYMOUNT ]]; then + notice "Unmounting $device" + umount $device \ + && rmdir $KEYMOUNT notice "Success umounting" return 0 else - notice "No $keymount found" + notice "No $KEYMOUNT found" return 0 fi } diff --git a/src/zlibs/ttab b/src/zlibs/ttab @@ -6,48 +6,48 @@ ttab-magic() { notice "Doing ttab magic..." line=0 - - for entry in $(cat $ttab); do + for entry in $(cat $TTAB); do let line=$line+1 notice "Found line $line..." [[ ${entry[(ws@:@)3]} == "true" ]] && { notice "Working on tomb from line $line" - undertaker=${entry[(ws@:@)1]} - notice "Username: $undertaker" - tombid=${entry[(ws@:@)2]} - notice "Tombname: $tombid" + undertaker=${entry[(ws@:@)1]} && xxx "Undertaker: $undertaker" + tombid=${entry[(ws@:@)2]} && xxx "Tombid: $tombid" compare-key - [[ $? = 0 ]] && { notice "compare-key -> true" - sudo -u $undertaker $tomb slam $tombid + sudo -u $undertaker $TOMB slam $tombid - cp $tombs $tmptombs - grep -v $keyhash $tmptombs > $tombs && \ - chmod 600 $tombs && \ - notice "Updated $tombs"$tombs - rm $tmptombs + cp $TOMBS $TMPTOMBS + grep -v "${keyhash}:${keyuuid}" $TMPTOMBS > $TOMBS && \ + chmod 600 $TOMBS && \ + notice "Updated $TOMBS" + rm $TMPTOMBS continue } notice "compare-key -> false" - keypass=${$(grep $keyhash $tombpasswd)[(ws@:@)2]} + hash-key + keypass=$(grep $keyhash $TOMBPASSWD) + keypass=${keypass[(ws@:@)2]} + xxx "Key password: $keypass" - sudo -u $undertaker $tomb open $graveyard/$tombid.tomb \ - -k $coffindot/$tombid.key \ + sudo -u $undertaker $TOMB open $GRAVEYARD/$tombid.tomb \ + -k $COFFINDOT/$tombid.key \ --unsafe \ --tomb-pwd "$keypass" - chmod g+rw /media/$tombid + [[ $? = 0 ]] || { die "Tomb didn't open" && return 1 } [[ -d "/media/$tombid" ]] && { - print "${undertaker}:${keyhash}:${keyuuid}" >> $tombs && \ - chmod 600 $tombs && \ - notice "Added info to $tombs" + chmod g+rw /media/$tombid + print "${undertaker}:${keyhash}:${keyuuid}" >> $TOMBS && \ + chmod 600 $TOMBS && \ + notice "Added info to $TOMBS" } } done