www.jetmore.org/john/code

Nothing's guaranteed. If it breaks it's not my fault. All programs have
usage information available through --help option.
 
bak - low cognitive-load file archiving
exipick - display messages from Exim queue based on a variety of criteria
exixpand - An overlay for Exim string expansion testing (exim -be) providing history, command editing, and macro expansion
gen-auth - generate and decode SMTP authentication strings (PLAIN, LOGIN, CRAM-MD5, SPA)
parse-ipod-db - display info on music in iPod DB (unsupported)
myclear - clear to bottom of terminal instead of top
rand - generate random numbers for scripts
swaks - Swiss Army Knife SMTP

bak - low cognitive-load file archiving (latest version)

TODO
- 20030422 work w/ directories, too...
- 20030422 work across file systems?

Version History 20030322.0
* 19990415 initial implementation
* 20021028 changed #! line from /local to /usr
* 20021028 rewritten 3.5 years later
             - ensures files exist
             - mkdirs bak dir rel to file, rather than CWD
             - preserves file attrs (owner, grp, mode)
             - better error checking
             - suffix from .# to .YYYYMMDD.#
             - changed to 'use strict';
* 20021104 added -p option to select path for save dir.  By default it
           uses the same path as the argument
* 20021104 added -d option to specify name of save dir.  By default it
           uses 'bak'
* 20021104 added -n option to add one line note to comment file
* 20021104 added -c option to add multiline comment to comment file
* 20021104 added better error checking
* 20021202 added ext_usage function for --help
* 20021202 started filling in info for detailed --help option
* 20021223 added -n and -c options to usage strings
* 20021223 changed behaviour of comment strings.  Now the comments
           go into <file>.note (not <file>.<dstr>.<s>.note
* 20021223 changed default save location to BAK (from bak)
* 20021223 finished --help screen
* 20021226 added -a option
* 20021226 .note file now gets created w/ x bits masked off.
* 20021226 added "0" entry for exit status in --help
* 20021226 moved from usage() model to mexit() model
* 20030322 added --version, moved --help to POD

exipick - display messages from Exim queue based on a variety of criteria (latest version)
This script was incorporated into the main Exim distribution some years ago. I will keep updating this page because some vendors (cPanel, notably) do not include expick. In general though you should use the version of exipick that came with your Exim.

Version History 20120509.0
* 20120509 added $tls_tni variable
* 20120509 fixing a few typos and changing $tls_sni to match
           the version in exim's repo (fixed by pdp)
20100323.0
* 20100323 fixed doc typo for -bpra (debian 574778)
20100222.0
* 20100222 added --input-dir and --finput options to allow non-std
           queue locations (esp. the "Finput" "frozen queue")
20100104.1
* 20070628 updated copyright to 2007
* 20070628 added support for $max_received_linelength (4.68-PH/11)
* 20071217 added header_path and data_path variables,haven't documented
* 20080422 fixed documentation bug regarding behavior of -r and -f
* 20100104 fixed doc type, exim bug 942, reported by andreas
* 20100104 updated copyright date to 2010
* 20100104 documented data_path and header_path variables
20061117.2
* 20061016 implemented $h_ shortcuts for $header_ variables
* 20061017 re-implemented header parsing.  Processing of h_*,
           message_headers, reply_address, and received_count is now
           defered until var is actually requested
* 20061017 implemented rh_* and bh_*, and reimplemented h_* vars
           to match spec. I'm 100% sure rh_ is right, I'm pretty
           sure bh_ is right, and I feel pretty good about h_.  Perl
           Encode module is required to translate between character sets
* 20061017 created --charset option to override default local charset
* 20061017 made $message_headers match spec definition and implemented
           new var $message_headers_raw as per 4.64-PH/13
> 20061017 released 20061017.1-dev to exim-users@exim.org
* 20061019 explicitly pre-set a couple of boolean vars to "0" to match
           exim's behaviour
* 20061019 added --just-vars option to aid debugging
* 20061116 processing was allowed to go on too long when a criterion
           was found to be invalid resulting in non-sensical errors.
* 20061116 20061107 numeric operators did not handle negative values
           correctly
* 20061117 added and documented $message_body_missing variable
* 20061117 added and documented $received_ip_address and
           $received_port (4.64-PH/43)
* 20061117 punted on h_ vars.  rh_ and bh_ match exim behavior, h_
           always matches bh_ (like exim w/ no iconv support) until
           I can figure out how to make perl and exim match
* 20061117 rejiggered bh_ and h_ line endings to match new
           behavior in 4.64-PH/27
20060919.0
* 20060919 changed spool reading code to handle arbitrary acl_ 
           variables (4.64-PH/09)
* 20060919 an args starting with '^' supplied to --show-vars is now
           a regular expression applied against all variable names.
           Variable names matching will be displayed.
* 20060919 fixed getopt declaration to make args to some options
           required, not optional (--spool, -f, -r, -s, -y, -o,
           --sort, --freeze, --thaw, --show-vars)
20060721.2
* 20060606 added --reverse option (and -R for exiqgrep compatibility)
* 20060606 added --random option
* 20060609 added --size option
* 20060622 Updated FSF address in GPL notice
* 20060623 implemented and documented --sort option
* 20060623 changed guts of Exim::SpoolFile::print_message to
           Exim::SpoolFile::format_message and made print_message
           a wrapper call to format_message
* 20060623 reimplemented --sort, storing output from format_message
           instead of using IO::Scalar/tie/untie method, which
           was slower than I'd like.
* 20060721 format_message/print_message change 0n 6/23 introduced
           bug where -i no longer worked.  fixed.
* 20060721 removed requirement for IO::Scalar left over from
           previous --sort implementation
* 20060721 added --not to negate all tests
* 20060721 redid --help text to hopefully be more clear.  added
           ToolExipick and ToolExipickManPage pages to wiki.  Added
           link to ToolExipickManPage in exim spec
20060307.1
* 20060216 20050728 added --unsorted to enable unsorted output in
           all output formats (previously only available via exim
           options -bpr, -bpru, and -bpra)
* 20060222 added --freeze and --thaw methods
* 20060223 documented --freeze and --thaw
* 20060223 added and documented ! operator to negate entire criteria.
* 20060223 fixed bug where -bpc and -c didn't work w/ --freeze
* 20060223 performance enhancements (11.5% reduction in execution
           time from previous version)
* 20060302 (done 20060224) checkin more perf enhancement (~24%
           from initial review)
20060216.1
* 20060216 removed parentheses from 'next' and 'last' calls that
           specified labels.  This cause compilation failure on
           older perls (5.005_03 specifically)
* 20060216 refactored code to remove -w error on deprecated split
           usage in new-ish perls
* 20060216 updated copyright year
* 20060216 20050701 -bpc always showed count of all messages on
           queue.  Changed to only show those matching criteria
20051215.3
* 20051215 fixed --show-vars/-b bug ("Vars:" was shown regardless
           of whether --show-vars was used);
* 20051215 made var retrieval using get_var() caseless
* 20051215 added support for new -aclc and -aclm spool format
           introduced in 4.61-PH/06
20050802.0
* 20050802 added message_exim_id var (4.53-PH/04)
20050604.1
* 20050604 20050516 fixed so eq/ne crit can use quotes on the value
           if you want (kept doing it out of habit)
* 20050604 20050603 documented --flatq, --show-vars, --show-tests
* 20050604 20050603 documented --show-vars, confirmed working status
* 20050604 implemented new var shown_message_size and documented
* 20050604 finally implemented exiqgrep's -s option and documented
* 20050604 fixed --show-vars to display in the order specified
* 20050604 20050603 made --show-vars work w/ -i, --flatq, -b
* 20050604 noted in docs $received_time is now a std var as of 4.51
* 20050604 fixed login/uid/gid parsing per exim change 4.51-PH/34
* 20050604 add variable message_linecount (4.51-PH/41)
20050225.0
* 20050117 set $| to unbuffer STDOUT
* 20050223 updated copyright date to 2005
* 20050223 Fixed spool file reading of login/uid/gid line per
           exim ChangeLog 4.50/80
* 20050223 added $host_lookup_deferred, $smtp_active_hostname,
           $spam_score, $spam_score_int, $bmi_verdicts (exim-4.50)
* 20050224 actually added $spam_score this time
* 20050225 added --show-tests option to show criteria exactly as they
           are processed against each message
* 20050225 added $each_recipients, $each_recipients_del and
           $each_recipients_undel pseudo vars
* 20050225 in documentation, mark every variable with a $ to make it
           easier to read.  Other doc cleanups.
* 20050225 reformatted some of the code for easier reading
20041110.0
* 20041102 added optimization when searching for specific message_id
* 20041103 changed '=' op to be caseless by dafault, added --caseful
           option to change this back to old behavior.
* 20041110 fixed recipients_del POD to note that it includes
           generated addrs
* 20041110 added variables recipients_{del,undel}_count
20040725.0
* 20040301 doc fixes (just stupid typos)
* 20040422 added --show-rules opt to display compiled rules
* 20040422 fixed bug in compilation regexps.  caused 'recipients =
           domain.net' to parse as var = 'recipients = domain.' and
           cmp = '("$var" ne "t") ? 1 : 0'
* 20040724 added $body_zerocount, $allow_unqualified_recipient,
           $allow_unqualified_sender (exim-4.41)
20040221.0
* 20040220 added f, r, y, o, z, x, c, l, i, b options to mimic
           interface to exiqgrep
* 20040220 added --flatq option (I hate exiqgrep's -b output)
* 20040221 documented new options
* 20040221 added and documented -show-vars option
20040104.2
* 20031229 started building Exim::HeaderFile module internally, got
           loose structure and started figuring out how to parse hdr
* 20031229 finished header parsing, started modeling how to access data
* 20031231 finished rough model of module and program
* 20031231 reworked module to handle multiple messages per instance
* 20031231 add on-demand body loading
* 20031231 implemented message_body_size and message_size
* 20040101 fix to read headers > 999 bytes
* 20040101 better handling of messages which disappear (get delivered)
* 20040101 fixed calc for message_size to match exim's method
* 20040101 reworked criteria processing to support multiple types
* 20040102 changed output to match exim's if -D file missing
* 20040102 allow M/K, d/h/m suffixes on numeric comparisons
* 20040102 changed Exim::HeaderFile to Exim::SpoolFile
* 20040102 fixed misc bugs in criteria processing
* 20040102 fixed recipient parsing to handle multiple styles of listing
* 20040102 added meaningful error framework to Exim::SpoolFile
* 20040102 added release framework
* 20040102 added -spool, -bp, -bpa, -bpc, -bpr, -bpra, -bpru, -bpu opts
* 20040102 fixed bug w/ multiple criteria using same variable
* 20040102 added -and and -or to specify type of processing
* 20040102 fixed bug in calculation of received_count
* 20040104 wrote --help POD
* 20040104 fixed stupid bug in -bpc calculation
* 20040104 changed deliver_firsttime to first_delivery and
           deliver_manual_thaw to manually_thawed
* 20040104 allow variably cased criteria vars (to allow header_To, etc)
* 20040104 add originator_login to output when applicable

exixpand - An overlay for Exim string expansion testing (exim -be) providing history, command editing, and macro expansion (latest version)

TODO
- 20040421 need to handle wrapped lines better
- 20040422 do .commands need to be added to history
- 20040422 how do history and multiline editing work together?
- 20040521 should somehow keep track of MACROs, also.  possibly
           a little harder because we don't get the $ leader?
- 20040715 catch ^C as a line-clearer (EOT to exit)
- 20041124 use IPC::Open3 to talk to exim.  wrap in a timer to
           handle deadlock issues

Version History 20050922.1
* 20040421 built basic wrapper w/ history support
* 20040421 added .track, .untrack, and .showvar commands for doing
           internal variable interpolation
* 20040421 started adding support for header variables
* 20040421 added warning for unrecognized commands
* 20041125 added docs
* 20041125 moved quit|exit to .quit|.exit
* 20050922 updated copyright
* 20050922 updated/moved/commented exim binary path

gen-auth - generate and decode SMTP authentication strings (PLAIN, LOGIN, CRAM-MD5, SPA) (latest version)
If you would like to receive email notifications when new versions are released, please send an email to updates-gen-auth@jetmore.net

TODO

Version History 20060620.0
* 20040315 added rce and rcd methods
* 20040316 added and documented encrypt and saltencrypt methods
* 20040316 added -s option to suppress echo on all inputs
* 20040316 added wcsencode and wcsdecode methods
* 20041110 added md5-hex and md5-base64 methods
* 20060201 updated copyright date from 2003 to 2006
* 20060201 rewrote (simplified) get-digest().
* 20060201 added and documented CRAM-SHA1 support
* 20060430 added rot13 support
* 20060430 adde atbash support (needed it for google/davinci game)
* 20060620 added and documented APOP support (contributed by
           anthonyu#killa.net)
* 20060620 general doc revisions for format, typos, etc.  Documented
           previously undocumented methods rot13, atbash
* 20060620 change license to straight GPL
* 20060620 implemented and documented HTTP-BASIC
20031101.2
* 20031101 fixed bug in NTLM (worked w/ exim but not communigate)
20031027.2
* 20031027 reworked command line/stdin processing to be more unified
* 20031027 allow '<>' as args on command line meaning empty string
* 20031027 made Digest::MD5 required only for CRAM-MD5, exit cleanly
           if not found
* 20031027 added NTLM/SPA/MSN authentication (using Authen::NTLM)
* 20031027 updated --help text
20030322.1
* 20030322 unique exit status for unrecognized type
* 20030322 added --help, --version, made release compliant
* 20030322 turned off extraneous printing in CRAM-MD5
* 20030322 changed to allow case-insensitive type specifications
20030312.0
* 20030312 fixed problem with base 64 encoding on lines longer than
           76 chars encoded (~58 plain)
20030310
* 20030310 initial version

parse-ipod-db - display info on music in iPod DB (latest version)

TODO
- 20031027 implement complete DB format as detailed in ACM article.

Version History 20040316.0
* 20040316 placed under the GPL and added comment declaring the 
           script abondonware
20030601.0
* 20030531 initial version

myclear - clear to bottom of terminal instead of top (latest version)

TODO

Version History 20030322.0
* 20030322 added --help, --verion, made release compliant
20030319.0
* 20020514 initial implementation
* 20030122 added ability to use Term::ReadKey (if present) to get
           dimensions of screen.  This means that variable screen
           sizes finally work.  Left old code if ReadKey not installed.
* 20030122 cleaned up the code a bit

rand - generate random numbers for scripts (latest version)

TODO

Version History 20030319.2
* 20030319 added --version, changed --help to use POD
20030319.1
* 20011017 initial implementation
* 20021226 'use strict' compliant
* 20021226 fix $max (defined but not used)
* 20021226 changed default from 0-99 to 1-100.
* 20021226 added usage() function
* 20021226 added and populated ext_usage function
* 20021226 allowed max to be an arbitrary range (x-y means >=x and
           <=y
* 20021226 -s option for specifying srand seed
* 20021226 -n option to specify a number of random nums to produce
* 20021226 option specifying int or float (-f)
* 20021226 added -p option to set precision for float.
* 20021226 option to change default from 0->x-1 to 1->x (-i)
* 20021226 moved from usage() model to mexit() model
* 20030319 changed contact addess to proj-rand

swaks - Swiss Army Knife SMTP; Command line SMTP testing, including TLS and AUTH (Project Page)
If you would like to receive email notifications when new versions are released, please send an email to updates-swaks@jetmore.net