summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2009-11-13 20:13:36 +0000
committerPaul Buetow <paul@buetow.org>2009-11-13 20:13:36 +0000
commit4ae22ee7e55a4d816c63d88c87799ac0e3ff0b82 (patch)
tree854812de59d6c5414497c6195c84dbecf0542621
-rwxr-xr-xpwgrep.sh236
1 files changed, 236 insertions, 0 deletions
diff --git a/pwgrep.sh b/pwgrep.sh
new file mode 100755
index 0000000..e5e4b6f
--- /dev/null
+++ b/pwgrep.sh
@@ -0,0 +1,236 @@
+#!/bin/bash
+
+# pwgrep v0.4-devel (c) 2009 by Dipl.-Inform. (FH) Paul C. Buetow
+# pwgrep helps you to manage all your passwords using GnuGP
+# for encryption and a versioning system (subversion by default)
+# for keeping track all changes of your password database. In
+# combination to GnuPG you should use the versioning system in
+# combination with SSL or SSH encryption.
+
+# If you are using a *BSD, you may want to edit the shebang line.
+#
+# Usage:
+#
+# Searching for a database value:
+# ./pwgrep.sh searchstring
+#
+# Editing the database (same but without args):
+# ./pwgrep.sh
+#
+# For more reasonable commands the following symlinks are recommended:
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/pwgrep
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/pwedit
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/pwfls
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/pwfcat
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/pwfadd
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/pwfdel
+# ln -s ~/svn/pwgrep/v?.?/pwgrep.sh ~/bin/fwipe
+# Replace ?.? with the version of pwgrep you want to use. Your PATH variable
+# should also include ~/bin then.
+
+# You can overwrite the default values by setting env. variables
+# or by just editing this file.
+
+[ -z $PWGREPDB] && PWGREPDB=database.gpg
+
+# The PWGREPWORDIR should be in its own versioning repository.
+# For password revisions.
+[ -z $PWGREPWORKDIR ] && PWGREPWORKDIR=~/svn/pwdb
+[ -z $PWFILEDIREXT ] && PWFILEDIREXT=files
+
+# Enter here your GnuPG key ID
+[ -z $GPGKEYID ] && GPGKEYID=F4B6FFF0
+
+# Customizing the versioning commands (i.e. if you want to use another
+# versioning system).
+[ -z $VERSIONCOMMIT ] && VERSIONCOMMIT="svn commit"
+[ -z $VERSIONUPDATE ] && VERSIONUPDATE="svn update"
+[ -z $VERSIONADD ] && VERSIONADD="svn add"
+[ -z $VERSIONDEL ] && VERSIONDEL="svn delete"
+
+# Only use mawk or gawk, but if possible not nawk. On *BSD awk=nawk. So try
+# awk/nawk last. You can use nawk but nawk will not match case insensitive.
+[ -z $TRYAWKLIST ] && TRYAWKLIST="mawk gawk awk nawk"
+
+# Find the correct command to wipe temporaly files after usage
+[ -z $TRYWIPELIST ] && TRYWIPELIST="destroy shred"
+
+# From here, do not change stuff!
+
+PWFILEWORKDIR=$PWGREPWORKDIR/$PWFILEDIREXT
+CWD=`pwd`
+umask 177
+
+cd $PWGREPWORKDIR || error "No such file or directory: $PWGREPWORKDIR"
+
+function info {
+ echo "=====> $@"
+}
+
+function error {
+ echo "ERROR: $@"
+ exit 666
+}
+
+function findbin {
+ trylist=$1
+ found=""
+ for bin in $trylist; do
+ if [ -z $found ]; then
+ which=$(which $bin)
+ [ ! -z $which ] && found=$bin
+ fi
+ done
+
+ echo $found
+}
+
+function setawkcmd {
+ AWK=`findbin "$TRYAWKLIST"`
+ [ -z $AWK ] && error No awk found in $PATH
+ info Using $AWK
+}
+
+function setwipecmd {
+ WIPE=`findbin "$TRYWIPELIST"`
+
+ if [ -z $WIPE ]; then
+ # FreeBSDs rm includes -P which is secure enough
+ if [ `uname` = 'FreBSD' ]; then
+ WIPE="rm -v -P"
+ else
+ error "No wipe command found in $PATH, please install shred or destroy"
+ fi
+ fi
+
+ info Using $WIPE
+}
+
+function pwgrep () {
+ search=$1
+ [ -z $NOVERSIONING ] && $VERSIONUPDATE
+ info Searching for $search
+
+ gpg --decrypt $PWGREPDB | $AWK -v search="$search" '
+ BEGIN {
+ flag=0
+ IGNORECASE=1
+ }
+ !/^\t/ {
+ if (!flag && $0 ~ search) {
+ flag=1
+ print $0
+ } else if (flag && $0 ~ search) {
+ print $0
+ } else if (flag) {
+ flag=0
+ }
+ } /^\t/ && flag {
+ print $0
+ }'
+}
+
+function pwedit () {
+ [ -z $NOVERSIONING ] && $VERSIONUPDATE
+ cp -vp $PWGREPDB $PWGREPDB.`date +'%s'`.snap && \
+ gpg --decrypt $PWGREPDB > .database && \
+ vim --cmd 'set noswapfile' --cmd 'set nobackup' \
+ --cmd 'set nowritebackup' .database && \
+ gpg --output .database.gpg -e -r $GPGKEYID .database && \
+ $WIPE .database && \
+ mv .database.gpg $PWGREPDB && \
+ [ -z $NOVERSIONING ] && $VERSIONCOMMIT
+}
+
+function pwfls () {
+ name=`echo $1 | sed 's/.gpg$//'`
+ [ -z $NOVERSIONING ] && $VERSIONUPDATE
+
+ [ ! -e $PWFILEDIREXT ] && error $PWFILEDIREXT does not exist
+
+ if [ -z $name ]; then
+ ls $PWFILEDIREXT | sed -n '/.gpg$/ { s/.gpg$//; p; }' | sort
+ exit 0
+ fi
+
+ gpg --decrypt $PWFILEWORKDIR/${name}.gpg
+}
+
+function pwfadd () {
+ name=`echo $1 | sed 's/.gpg$//'`
+
+ srcfile=$1
+ if [ `echo "$srcfile" | grep -v '^/'` ]; then
+ srcfile=$CWD/$srcfile
+ fi
+
+ if [ ! -z $2 ]; then
+ outfile=`basename $2`
+ else
+ outfile=`basename $name`
+ fi
+
+ [ -z $NOVERSIONING ] && $VERSIONUPDATE
+
+ [ ! -e $PWFILEWORKDIR ] && error $PWFILEWORKDIR does not exist
+ [ -z $name ] && error Missing argument
+
+ gpg --output $PWFILEDIREXT/${outfile}.gpg -e -r $GPGKEYID $srcfile && \
+
+ if [ -z $NOVERSIONING ]; then
+ $VERSIONADD $PWFILEDIREXT/${outfile}.gpg && $VERSIONCOMMIT
+ fi
+}
+
+function pwfdel () {
+ name=`echo $1 | sed 's/.gpg$//'`
+ [ -z $NOVERSIONING ] && $VERSIONUPDATE
+
+ [ ! -e $PWFILEWORKDIR ] && error $PWFILEWORKDIR does not exist
+ [ -z $name ] && error Missing argument
+
+ if [ -z $NOVERSIONING ]; then
+ # Wipe even encrypted file securely
+ $WIPE $PWFILEDIREXT/${name}.gpg && \
+ touch $PWFILEDIREXT/${name}.gpg && $VERSIONCOMMIT && \
+ $VERSIONDEL $PWFILEDIREXT/${name}.gpg && $VERSIONCOMMIT
+ else
+ $WIPE $PWFILEDIREXT/${name}.gpg
+ fi
+}
+
+function fwipe () {
+ [ -z $1 ] && error Missing argument
+ $WIPE $CWD/$1
+}
+
+setawkcmd
+setwipecmd
+
+basename=`basename $0`
+case $basename in
+ pwgrep)
+ pwgrep $@
+ ;;
+ pwedit)
+ pwedit
+ ;;
+ pwfls)
+ pwfls $@
+ ;;
+ pwfcat)
+ pwfls $@
+ ;;
+ pwfadd)
+ pwfadd $@
+ ;;
+ pwfdel)
+ pwfdel $@
+ ;;
+ fwipe)
+ fwipe $@
+ ;;
+ *)
+ error No such operation $basename
+esac
+