undertaker (6767B)
1 #!/bin/zsh 2 # 3 # Undertaker, auxiliary command for Tomb 4 # 5 # Tomb is a tool to operate file encryption of private and secret data 6 # 7 # Undertaker is a tool to retrieve tomb keys from various sources 8 # 9 # {{{ Copyleft (C) 2012 Dyne.org foundation 10 # 2011-2012 Denis Roio <jaromil@dyne.org> 11 # 12 # This source code is free software; you can redistribute it and/or 13 # modify it under the terms of the GNU Public License as published by 14 # the Free Software Foundation; either version 3 of the License, or 15 # (at your option) any later version. 16 # 17 # This source code is distributed in the hope that it will be useful, 18 # but WITHOUT ANY WARRANTY; without even the implied warranty of 19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 20 # Please refer to the GNU Public License for more details. 21 # 22 # You should have received a copy of the GNU Public License along with 23 # this source code; if not, write to: 24 # Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 25 26 # }}} 27 28 # signal traps (special funcs in Zsh) 29 TRAPKILL() die "KILL signal caught, undertaker aborting." 30 TRAPSTOP() die "STOP signal caught, undertaker aborting." 31 32 # first of all source the tomb core functions 33 TOMBBIN=$(dirname $(readlink -f $0))/tomb 34 if ! [[ -x $TOMBBIN ]]; then 35 print "$fg[red][!]$fg[white] Tomb command not found, operation aborted." >&2; exit 1 36 fi 37 source $TOMBBIN ${tomb_opts[@]} source 38 TOMBEXEC=undertaker 39 40 key_found() { 41 # $1 is "url" 42 if option_is_set --batch; then 43 print -n '[m]' >&2 44 fi 45 print "$fg[white][found] $1" >&2 46 } 47 48 49 50 function undertaker_scheme() { 51 zparseopts -D -path=print_path 52 53 local scheme 54 scheme=$1 55 local keypath 56 keypath=$2 57 case $scheme in 58 59 60 bluetooth) 61 #TODO: support --print-path 62 act "access to bluetooth protocol requested" 63 which obexftp &> /dev/null 64 if [[ $? != 0 ]]; then 65 _warning "obexftp not found, needed for bluetooth: operation aborted." 66 return 64 67 fi 68 keytmp=`safe_dir undertaker` 69 cd $keytmp 70 # fetch key from bluetooth, url format: bluetooth://55:33:44:55:66/file/path 71 obexdevpath=${keypath#*//} 72 obexdev=${obexdevpath%%/*} 73 obexpath=${obexdevpath#*/} 74 act "obex device: $obexdev" 75 act "obex path: $obexpath" 76 obexftp -b $obexdev -g $obexpath 77 if [[ $? != 0 ]]; then 78 rmdir ${keytmp} 79 die "a problem occurred retreiving the key via bluetooth." 80 fi 81 # print out the key on stdout 82 if option_is_set --path; then 83 echo $obexpath 84 # up to the caller to delete the key 85 # TODO: --path should have the directory where to put the key 86 # as argument, instead of creating keytmp 87 else 88 cat `pwd`/$obexpath >&1 89 # wipe out the key 90 ${WIPE[@]} $obexpath 91 cd - 92 rmdir ${keytmp} 93 fi 94 95 # tombkey="basename $obexpath" 96 ;; 97 98 file) 99 if ! [[ -f $keypath ]]; then 100 _warning "Invalid path $keypath" 101 return 1 102 fi 103 if option_is_set --path; then 104 key_found $scheme://$keypath; 105 else 106 < $keypath 107 r=$? 108 if [[ $r != 0 ]]; then return 1; fi 109 return 0 110 fi 111 ;; 112 113 mounted) 114 for mountpoint in `cut -f2 /etc/mtab -d ' ' | sort -u`; do 115 undertaker_scheme ${print_path[@]} file ${mountpoint}/${keypath} 116 ret=$? 117 if [[ $ret == 0 ]]; then 118 return 0 119 fi 120 done 121 ;; 122 123 udisks) 124 #It implements automounting using udisks; udisks is a (recently) 125 #new technology, so we can't rely on it being present 126 if ! which udisks &> /dev/null; then 127 _warning 'udisks not found' 128 exit 64 129 fi 130 while true; do 131 device=`udisks --monitor|egrep '/sd[a-z][0-9]' -o -m1` 132 device=/dev$device 133 udisks --mount $device 134 ###get mountpoint for device 135 mountpoint=`egrep "^${device} " /etc/mtab|cut -d ' ' -f2` 136 undertaker_scheme ${print_path[@]} file ${mountpoint}/${keypath} 137 ret=$? 138 udisks --unmount $device 139 if [[ $ret == 0 ]]; then 140 return 0 141 fi 142 done 143 ;; 144 145 near) 146 ###Given the path to the tomb, search the key near to that 147 undertaker_scheme file ${keypath}.key 148 ;; 149 150 151 152 *) 153 if ! which undertaker-$scheme &> /dev/null; then 154 _warning "url protocol not recognized: $scheme" 155 return 64 156 fi 157 undertaker-$scheme ${print_path[@]} ${scheme}://$keypath 158 return $? 159 ;; 160 esac 161 } 162 163 function main() { 164 typeset -A opts 165 zparseopts -M -E -D -Aopts -poll -path -batch 166 if ! [ $1 ] ; then 167 print "[W] an argument is missing, the undertaker is confused" >&2 168 print "usage: undertaker [options] url://host:path/to/tomb.key" >&2 169 exit 1; 170 fi 171 local -a tomb_opts 172 if [[ -n ${(k)opts[--batch]} ]]; then 173 tomb_opts+='--no-color' 174 tomb_opts+='--quiet' 175 fi 176 local -a under_opts 177 if [[ -n ${(k)opts[--path]} ]]; then 178 under_opts+='--path' 179 fi 180 local -A backupopts 181 for a in ${(k)opts}; do 182 backupopts[$a]=${opts[$a]} 183 done 184 source tomb ${tomb_opts[@]} source 185 TOMBEXEC=undertaker 186 for a in ${(k)backupopts}; do 187 opts[$a]=${backupopts[$a]} 188 done 189 check_bin 190 191 _success "Undertaker will look for $1" 192 193 ARG1=${1} 194 scheme=${ARG1%://*} 195 keypath=${ARG1#*//} 196 197 if [[ -n ${(k)opts[--poll]} ]]; then 198 while true; do 199 progress poll 0 search 200 undertaker_scheme ${under_opts[@]} $scheme $keypath 201 r=$? 202 if [[ $r == 64 ]]; then 203 exit 64 204 fi 205 progress poll 100 done 206 sleep 3 207 done 208 else 209 undertaker_scheme ${under_opts[@]} $scheme $keypath 210 fi 211 } 212 main $* 213 214 ### Conventions and other comments: 215 # 216 # EXIT CODES FOR SCHEME HANDLERS 217 # 0 is for everything went fine 218 # 64 is for "not supported/the problem won't be solved by polling". This is for things like: unmet dependencies, not supported at all, etc 219 # everything else means just "error". Use 1, please. So other codes can be used if needed 220 #