#!/usr/bin/perl # written by John Borwick: borwicjh@wfu.edu use 5.6.0; use strict; use warnings; use Term::ReadKey; use File::Copy qw(cp); our $ID = 'borwicjh@wfu.edu'; our $GPG_PATH = '/cygdrive/c/GnuPG/gpg'; my $infile = shift or die "usage: $0 keyfile\n"; die "infile '$infile' doesn't exist\n" unless -e $infile; cp $infile, "$infile.bak"; open(GPG_IN, "gpg -o - -d $infile |") or die "GPG input pipe failed\n"; our @data = ; close GPG_IN or die "GPG input pipe couldn't be closed.\n"; print "\n\n"; my $quit = 0; do { for( my $i=1; $i<=@data; $i++) { printf "%2d. %s", $i, $data[$i-1]; } print "\nNumber to edit, 'a' to add, or 'q' to quit: "; chomp(my $todo = ); $todo =~ s/^\s+//; $todo =~ s/\s+$//; $todo = lc $todo; print "Unknown option '$todo'\n", next unless $todo =~ /^(\d+|[aq])$/; print "\n"; if ( $1 eq 'a' ) { add_entry(); } elsif ($1 eq 'q' ) { $quit=1; } else { edit_entry( "$1" ); } print "\n"; } until ( $quit ); save(); system("clear"); sub edit_entry { my $offset = shift; print "Can't find that offset '$offset'\n", return unless ($offset >= 1 and $offset <= @data ); $offset--; print "Old entry: $data[$offset]\n"; print "New entry ('EEE' for erase): "; my $entry = ; if ( $entry =~ /^\s*EEE\s*$/ ) { print "Erasing...\n"; splice @data, $offset, 1; } else { $data[$offset]=$entry; } } sub add_entry { print "What to add: "; my $str = ; print "NOTHING ADDED", return unless $str =~ /\S/; push @data, $str; } sub save { open (OUT, "|gpg -o $infile -e -r $ID") or die "Can't open outfile; you might want that .bak file!\n"; foreach (@data) { print OUT; } close OUT or die "Pipe close failed.\n"; }