From 5b54b5f82238b3cc20eb11b794a19482ac93af12 Mon Sep 17 00:00:00 2001 From: TLINDEN Date: Fri, 10 Feb 2012 20:14:24 +0100 Subject: [PATCH] ADDED: "-" works also for --dump, but in the other direction. It causes note to dump to standard output instead into a file. ADDED: you can specify - as filename for use with --import and if you want to create a new note. "-" stands for standardinput and it allows you tp pipe another commands output to note! ADDED: you can now use an environment variable for the passphrase (when using encryption). If it is presen, note will not ask for a passphrase. This is very usefull in comination with the addition above, for use in scripts. CHANGED: the interactive help screen is now coloured. ADDED: -o commandline switch, which causes note to overwrite an existing database when importing data from a previous dump. Very handy if you want to re-initialize your db, i.e. if you changed the format. ADDED: the long-tree-view (-T) displays now also the note-number of each note. --- Changelog | 19 ++++ Makefile.PL | 1 + NOTEDB/binary.pm | 8 ++ NOTEDB/mysql.pm | 9 ++ README | 62 ++++++++++- UPGRADE | 2 +- bin/note | 283 +++++++++++++++++++++++++++++++---------------- 7 files changed, 281 insertions(+), 103 deletions(-) diff --git a/Changelog b/Changelog index 8bbbc24..6bba06b 100644 --- a/Changelog +++ b/Changelog @@ -1,5 +1,24 @@ ================================================================================== +1.0.3: +ADDED: "-" works also for --dump, but in the other direction. It causes + note to dump to standard output instead into a file. +ADDED: you can specify - as filename for use with --import and if you want + to create a new note. "-" stands for standardinput and it allows you + tp pipe another commands output to note! +ADDED: you can now use an environment variable for the passphrase (when using + encryption). If it is presen, note will not ask for a passphrase. This + is very usefull in comination with the addition above, for use in + scripts. +CHANGED: the interactive help screen is now coloured. +ADDED: -o commandline switch, which causes note to overwrite an existing + database when importing data from a previous dump. Very handy if + you want to re-initialize your db, i.e. if you changed the format. +ADDED: the long-tree-view (-T) displays now also the note-number of each + note. + +================================================================================== + 1.0.2: ADDED: Topic-Tree overview command (-t or -T). ADDED: Enhanced list command in interactive mode, you can now specify diff --git a/Makefile.PL b/Makefile.PL index 7b0cfd3..1af2635 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -11,6 +11,7 @@ sub chk_mod print "<====\tchecking $mod \t====>\n"; eval { $mod .= ".pm"; + $mod =~ s/::/\//g; require $mod; }; if($@) { diff --git a/NOTEDB/binary.pm b/NOTEDB/binary.pm index 5627eb5..8c43b0c 100644 --- a/NOTEDB/binary.pm +++ b/NOTEDB/binary.pm @@ -86,6 +86,14 @@ sub use_crypt { } } +sub set_del_all +{ + unlink $NOTEDB; + open(TT,">$NOTEDB") or die "Could not create $NOTEDB: $!\n"; + close (TT); +} + + sub get_single { my($this, $num) = @_; diff --git a/NOTEDB/mysql.pm b/NOTEDB/mysql.pm index adc0b42..4eb7ee3 100644 --- a/NOTEDB/mysql.pm +++ b/NOTEDB/mysql.pm @@ -43,6 +43,7 @@ my $sql_edit = "UPDATE $table SET $fnote = ?, $fdate = ? WHERE $fnum = ?"; my $sql_insertnew = "INSERT INTO $table VALUES (?, ?, ?)"; my $sql_del = "DELETE FROM $table WHERE $fnum = ?"; +my $sql_del_all = "DELETE FROM $table"; ###################################################################################################### sub new @@ -213,6 +214,14 @@ sub set_del } +sub set_del_all +{ + my($this) = @_; + my $statement = $DB->prepare($sql_del_all) || die $DB->errstr(); + $statement->execute() || die $DB->errstr(); + return; +} + sub set_recountnums { my $this = shift; diff --git a/README b/README index 39b103d..27a21a5 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -note 1.0.2 by Thomas Linden, 01/05/2000 +note 1.0.3 by Thomas Linden, 02/05/2000 Introduction @@ -87,7 +87,8 @@ Usage To create a new note, simply run "note". You can enter the note (the length is by default limited to 4096 bytes, - which you can change from your config file). + which you can change from your config file if you are using + the binary backend, therwise there is no limitation). End by typing a . on a line itself. note will tell you the number of the note. @@ -108,7 +109,7 @@ Usage strcture. You can use the command "-t" in this case, which will display a tree-view of your tpic-structure. You can use the command "-T" if you want to see the notes under each - topic too. + topic too. "-T" will also show the number of each note. To edit a certain note, type "note -e 1". It will invoke your editor (vi or pico). You can edit it, after saving, note @@ -142,6 +143,22 @@ Usage your note-dump form your office to home and import it there for further use). The dumps from the two versions of note are in the same format. + Using dumps it is also possible to reinitialize your database. You + can use the "-o" switch whcih causes note to overwrite your existing + database. This is very handy if you changed heavily your config. And + it is required, if you changed: encryption, db-driver, (binary-format) + and the password. You can use the following command for reinitializing: + $ note -D - | note -o -I - + What the hell, does it?! Step by step: + o "note -D -" creates a note-database dump and prints it out + to stantdard output. + o "|" this is the shell's pipe command. It does take the output + of the left program and gives it to the right progrem as standard + input. + o "note -o -I -" imports a note-database dump from standard input + and overwrites an existing database. + Before you use the "-o" switch, I consider yuo to make a backup! + @@ -216,6 +233,32 @@ Topics +Scripting +========= + + Since version 1.0.3 there are some additions which allows you to use note in + scripts, without user-interaction. You might run a special script as cronjob, + which adds a note under a certain topic every week. Or the like. + + Here are the possibilies you have: + + You can add a new note through a pipe, another commands output becomes + note's input: + $ cat /var/spool/news/daily | note - + This command adds the content of a file "daily" as a new note. Note the dash. + it stands for "Standard Input". Note will be completely silent and it will not + ask for something. + + Suppose you are using encryption. You might wonder, how note will get your + passphrase? The solution: You need to set up an environment variable which + contains the password: + $ export NOTE_PASSWD=secret + If the variable is present, note will not ask you for a passphrase! + + + + + Format of the notedb (binary backend) ===================================== @@ -311,6 +354,8 @@ Security the file UPGRADE and follow it's directions! Someday I will add a "change passwd" function, which will do all these things for you. Someday, I said... + For now you can use the "re-initialze database" functionality, mentioned + earlier in the "Usage" section (at the end of the section). Note: To make sure, the encrypted data can be stored properly, it will be uuencoded after encryption. @@ -321,6 +366,15 @@ Security the phrase, then the data can't be decrypted. Even if it is possible - I am not responsible for that! + Note: How does note know, if the passphrase was incorrect? It uses the + specified phrase and encodes at least one note (the first one) + and checks if the decrypted timestamp field matches the following + expression: "^\d+\.\d+". Translated from perl to human: + the timestamp must begin with minimum one digit (possibly more), + followed by one dot, followed by minimum one digit (possibly more). + Chances are bad, that a wrong passphrase will cause a timestamp + matching the rule above. If you have other experiences, please + drop me a mail! Comments @@ -353,4 +407,4 @@ Author and Copyright Last changed ============ - 18/04/2000 + 02/05/2000 diff --git a/UPGRADE b/UPGRADE index a173281..3139389 100644 --- a/UPGRADE +++ b/UPGRADE @@ -1,4 +1,4 @@ -READ THIS FILE, IF YOU ARE UPGRADING FROM 0.9 TO 1.0.0 +READ THIS FILE, IF YOU ARE UPGRADING FROM 0.9 TO 1.0.x ====================================================== diff --git a/bin/note b/bin/note index 3eb3521..2cb3d85 100755 --- a/bin/note +++ b/bin/note @@ -1,7 +1,16 @@ #!/usr/bin/perl -# $Author: thomas $ $Id: note,v 1.19 2000/04/30 16:07:23 thomas Exp thomas $ $Revision: 1.19 $ +# $Author: thomas $ $Id: note,v 1.22 2000/05/01 18:51:40 thomas Exp thomas $ $Revision: 1.22 $ # # $Log: note,v $ +# Revision 1.22 2000/05/01 18:51:40 thomas +# added "-" to sub dump +# +# Revision 1.21 2000/05/01 00:17:27 thomas +# *** empty log message *** +# +# Revision 1.20 2000/04/30 23:31:38 thomas +# added -o and coloured sub help. +# # Revision 1.19 2000/04/30 16:07:23 thomas # *** empty log message *** # @@ -97,9 +106,10 @@ sub help; sub import; sub display_tree; sub tree; +sub print_tree; my ( - $maxlen, $timelen, $TOPIC, $TYPE, $mode, $NOTEDB, $NoteKey, + $maxlen, $timelen, $TOPIC, $TYPE, $mode, $NOTEDB, $NoteKey, $ImportType, $NewType, $version, $number, $CurTopic, $CurDepth, $PATH, $CONF, $WantTopic, $sizeof, $MAX_TIME, $PreferredEditor, %TP, $TopicSep, $TreeType, $ListType, $searchstring, $dump_file, $ALWAYS_INT, $KEEP_TIMESTAMP, @@ -136,7 +146,7 @@ $TIME_COLOR = "black"; $TOPIC_COLOR = "BLACK"; $TOPIC = 1; $TopicSep = '/'; -$version = "1.0.2"; +$version = "1.0.3"; if($TOPIC) { $CurDepth = 1; # the current depth inside the topic "directory" structure... @@ -165,6 +175,12 @@ else } $ARGV[0] = ""; } + elsif($ARGV[0] eq "-") + { + $NewType = 1; + $mode = "new"; + $ARGV[0] = ""; + } elsif($ARGV[0] eq "-i" || $ARGV[0] eq "--interactive") { $mode = "interactive"; @@ -241,10 +257,35 @@ else print "no dumpfile specified, using $dump_file.\n"; } } + elsif($ARGV[0] eq "-o" || $ARGV[0] eq "--overwrite") + { + $mode = "import"; + $ImportType = $ARGV[0]; + if($ARGV[1] eq "-I" || $ARGV[1] eq "--Import") { + $dump_file = $ARGV[2]; + } + else { + print "--overwrite is only suitable for use with --import!\n"; + exit(1); + } + $ARGV[0] = ""; + if($dump_file eq "") + { + print "No dumpfile specified.\n"; + exit(1); + } + } elsif($ARGV[0] eq "-I" || $ARGV[0] eq "--Import" || $ARGV[0] eq "--import") { $mode = "import"; - $dump_file = $ARGV[1]; + if($ARGV[1] eq "-o" || $ARGV[1] eq "-overwrite") { + $dump_file = $ARGV[2]; + $ImportType = $ARGV[1]; + } + else { + $dump_file = $ARGV[1]; + $ImportType = $ARGV[2]; + } $ARGV[0] = ""; if($dump_file eq "") { @@ -340,19 +381,24 @@ if($USE_CRYPT eq "YES" && $NOTEDB::crypt_supported == 1) { if($CRYPT_METHOD eq "") { $CRYPT_METHOD = "Crypt::IDEA"; } - print "password: "; - eval { - local($|) = 1; - local(*TTY); - open(TTY,"/dev/tty"); - system ("stty -echo ); - print STDERR "\r\n"; - system ("stty echo ; + if(!exists $ENV{'NOTE_PASSWD'}) { + print "password: "; + eval { + local($|) = 1; + local(*TTY); + open(TTY,"/dev/tty"); + system ("stty -echo ); + print STDERR "\r\n"; + system ("stty echo ; + } + } + else { + $key = $ENV{'NOTE_PASSWD'}; } chomp $key; $db->use_crypt($key,$CRYPT_METHOD); @@ -625,15 +671,23 @@ sub new $note = ""; $line = ""; # create a new note - print "enter the text of the note, end with .\n"; - do - { - $line = ; - $note = $note . $line; - } until $line eq ".\n"; - # remove the . ! - chop $note; - chop $note; + if($NewType) + { + # be silent! read from STDIN until EOF. + while () { $note .= $_; } + } + else + { + print "enter the text of the note, end with .\n"; + do + { + $line = ; + $note = $note . $line; + } until $line eq ".\n"; + # remove the . ! + chop $note; + chop $note; + } } # since we have not number, look for the next available: @@ -738,14 +792,20 @@ sub edit sub dump { - my(%res, $num); + my(%res, $num, $DUMP); # $dump_file - open (DUMP, ">$dump_file") or die "could not open $dump_file\n"; - select DUMP; + if($dump_file eq "-") { + $DUMP = *STDOUT; + } + else { + open (DUMPFILE, ">$dump_file") or die "could not open $dump_file\n"; + $DUMP = *DUMPFILE; + } + select $DUMP; %res = $db->get_all(); foreach $num (sort { $a <=> $b } keys %res) { - print STDOUT "dumping note number $num to $dump_file\n"; + print STDOUT "dumping note number $num to $dump_file\n" if($dump_file ne "-"); print "Number: $num\n" ."Timestamp: $res{$num}->{'date'}\n" ."$res{$num}->{'note'}\n"; @@ -757,12 +817,20 @@ sub dump sub import { - my($num, $start, $complete, $dummi, $note, $date, $time, $number); + my($num, $start, $complete, $dummi, $note, $date, $time, $number, $stdin, $DUMP); # open $dump_file and import it into the notedb - open (DUMP, "<$dump_file") or die "could not open $dump_file\n"; + $stdin = 1 if($dump_file eq "-"); + if($stdin) { + $DUMP = *STDIN; + } + else { + open (DUMPFILE, "<$dump_file") or die "could not open $dump_file\n"; + $DUMP = *DUMPFILE; + } + $db->set_del_all() if($ImportType ne ""); $complete=0; $start = 0; - while() + while(<$DUMP>) { chomp $_; if($_ =~ /^Number:\s\d+/) @@ -778,7 +846,7 @@ sub import # we got a complete record, save it! $number = $db->get_nextnum(); $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n"; + print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); $complete = 0; $note = ""; $date = ""; @@ -801,7 +869,7 @@ sub import # the last record, if existent $number = $db->get_nextnum(); $db->set_new($number,$note, $date); - print "note number $number from $dump_file inserted into notedb.\n"; + print "note number $number from $dump_file inserted into notedb.\n" if(!$stdin); } } @@ -809,27 +877,21 @@ sub import sub interactive { - #$|=1; - #my $term = new Term::ReadLine(''); - #my $OUT = $term->OUT || *STDOUT; - #my $term->MinLine(undef); - #my $attribs = $term->Attribs; - #$term->bind_key(ord "\cc", 'abort'); my($maxlen_save, $B, $BB, $menu, $char, @LastTopic); $maxlen_save = $maxlen; # create menu: $B = ""; $BB = ""; - $menu = "[" . $B . "L" . $BB . " List "; + $menu = "[" . $B . "L" . $BB . "-List "; if($TOPIC) { - $menu .= $B . "T" . $BB . " Topics "; + $menu .= $B . "T" . $BB . "-Topics "; } - $menu .= $B . "N" . $BB . " New " - . $B . "D" . $BB . " Delete " - . $B . "S" . $BB . " Search " - . $B . "E" . $BB . " Edit " - . $B . "?" . $BB . " Help " - . $B . "Q" . $BB . " Quit] "; # $CurTopic will be empty if $TOPIC is off! + $menu .= $B . "N" . $BB . "-New " + . $B . "D" . $BB . "-Delete " + . $B . "S" . $BB . "-Search " + . $B . "E" . $BB . "-Edit " + . $B . "?" . $BB . "-Help " + . $B . "Q" . $BB . "-Quit] "; # $CurTopic will be empty if $TOPIC is off! # per default let's list all the stuff: # Initially do a list command! $maxlen += $timelen; @@ -1015,23 +1077,30 @@ sub usage print qq~This is the program note $version by Thomas Linden (c) 1999-2000. It comes with absolutely NO WARRANTY. It is distributed under the terms of the GNU General Public License. Use it at your own risk :-) -Usage: note [-i | --interactive] | [ options ] [ number [,number...]] +Usage: note [ options ] [ number [,number...]] Options: - -h --help displays this help screen - -v --version displays the version number - -l --list [] lists all existing notes If no topic were specified, - it will display a list of all existing topics. - -L --longlist [] the same as -l but prints also the timestamp - -t --topic prints a list of all topics as a tree. - -T --longtopc prints the topic-tree with the notes under each topic - -s --search searches for trough the notes database - -e --edit edit note with - -d --delete delete note with - -D --Dump [] dumps the notes to the textfile - -I --Import imports a previously dumped textfile into the - note-database. Dumps from the mysql and the binary - version are in the same format. - -i --interactive interactive mode +-h --help displays this help screen +-v --version displays the version number +-l --list [] lists all existing notes If no topic were specified, + it will display a list of all existing topics. +-L --longlist [] the same as -l but prints also the timestamp +-t --topic prints a list of all topics as a tree. +-T --longtopc prints the topic-tree with the notes under each topic +-s --search searches for trough the notes database +-e --edit edit note with +-d --delete delete note with +-D --Dump [ | -] dumps the notes to the textfile . if is simply + a "-" it will printed out to standard output. +-I --Import | - imports a previously dumped textfile into the + note-database. Data will be appended by default. + You can also specify a dash "note -I -" instead of a , + which causes note, silently to read in a dump from STDIN. +-o --overwrite only suitable for use with --Import. Overwrites an + existing notedb. +-i --interactive interactive mode +- if you run note only with one dash: "note -", then it will + read in a new note from STDIN until EOF, this makes it + possible to pipe text into a new note. o if you specify only a number (i.e. "note 4"), then the note with that number will be displayed. @@ -1043,6 +1112,9 @@ Options: informations about the configuration. o In interactive mode you can get help at any time by typing "?" or "h" at the prompt. + o If encryption support is turned on, note will ask you for a passphrase every + time it runs. You can avoid this behavior by setting the environment-variable + \$NOTE_PASSWD. You will need this for example, if you call note from a script. ~; exit 1; } @@ -1296,44 +1368,54 @@ sub getdate sub help { -print qq~ --------------------------------------------------------------- -HELP for interactive note $version +my $B = ""; +my $BB = ""; +my($S, $L, $T, $Q, $H, $N, $D, $E); +$L = $B . "L" . $BB . $NOTEC; +$T = $B . "T" . $BB . $NOTEC; +$Q = $B . "Q" . $BB . $NOTEC; +$H = $B . "?" . $BB . $NOTEC; +$N = $B . "N" . $BB . $NOTEC; +$D = $B . "D" . $BB . $NOTEC; +$E = $B . "E" . $BB . $NOTEC; +$S = $B . "S" . $BB . $NOTEC; +print C qq~$BORDERC +----------------------------------------------------------------------$_BORDERC $TOPICC +HELP for interactive note $version +$_TOPICC $NOTEC The following commands are available: -L/l List notes. L=long, with timestamp and l=short without timestamp. +$L List notes. L=long, with timestamp and l=short without timestamp. You can also just hit for short list. - If you specify a subtopic, then list will display it's contents, i.e. - "l mytopic" will dislpay notes under mytopic. -N Create a new note. -D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". + If you specify a subtopic, then list will display it's contents, + i.e.: "l mytopic" will dislpay notes under mytopic. +$N Create a new note. +$D Delete a note. You can either hit "d 1" or "d 1-4" or just hit "d". If you don't specify a number, you will be asked for. -S Search trough the notes database. Usage is similar to Delete, use +$S Search trough the notes database. Usage is similar to Delete, use a string instead of a number to search for. -E Edit a note. Usage is similar to Delete but you can only edit note - a time.~; +$E Edit a note. Usage is similar to Delete but you can only edit note + a time. +$H This help screen. +$Q Exit the program.~; if($TOPIC) { -print qq~ -T/t print a list of all existing topics as a tree. T prints the tree with - all notes under each topic. - =====> - You can change the actual topic by simply typing it's name or by - using the command "cd", i.e. "cd mytopic". - You can create a new topic by creating a new note, the first line - must be the topic borderd by slashes, i.e. "/newtopic/". The slash - is the default topic-sepearator, but you can override thie in the - config! - If you type just ".." instead of a topic, you will go one step back - in your topic-structure. - =====>~; -} -print qq~ -?/H This help screen. -Q Exit the program. +print C qq~ +$T print a list of all existing topics as a tree. T prints the tree + with all notes under each topic. -All commands except the List command are case insensitive. ---------------------------------------------------------------- + You can change the actual topic by simply typing it's name or by using + the command "cd", i.e. "cd mytopic". You can create a new topic by creating + a new note, the first line must be the topic borderd by slashes, i.e.: + "/newtopic/". The slash is the default topic-sepearator, but you can over- + ride this in the config! If you type just ".." instead of a topic, you will + go one step back in your topic-structure. +~; +} +print C qq~ +$NOTEC +All commands except the List command are case insensitive. $_NOTEC $BORDERC +----------------------------------------------------------------------$_BORDERC ~; } @@ -1358,7 +1440,7 @@ sub display_tree { @nodes = ();("$TopicSep"); $text = $firstline; } - &tree($text, \%TREE, @nodes); + &tree($num, $text, \%TREE, @nodes); } # now that we have build our tree (in %TREE) go on t display it: @@ -1369,14 +1451,18 @@ sub display_tree { sub tree { - my($text, $LocalTree, $node, @nodes) = @_; + my($num, $text, $LocalTree, $node, @nodes) = @_; if(@nodes) { if(! exists $LocalTree->{$node}->{$NoteKey}) { $LocalTree->{$node}->{$NoteKey} = []; } - &tree($text, $LocalTree->{$node}, @nodes); + &tree($num, $text, $LocalTree->{$node}, @nodes); } else { + if(length($text) > ($maxlen - 5)) { + $text = substr($text, 0, ($maxlen -5)); + } + $text = $text . " (" . $NUMC . "#" . $num . $_NUMC . $NOTEC . ")" . $_NOTEC if($text ne ""); push @{$LocalTree->{$node}->{$NoteKey}}, $text; } } @@ -1402,3 +1488,4 @@ sub print_tree { &print_tree($hashref->{$subnotes[$index]},($index == $#subnotes?"$prefix ":"$prefix| ")); } } +