diff options
Diffstat (limited to 'Demo/scripts')
-rw-r--r-- | Demo/scripts/README | 1 | ||||
-rwxr-xr-x | Demo/scripts/mboxconvert.py | 113 |
2 files changed, 114 insertions, 0 deletions
diff --git a/Demo/scripts/README b/Demo/scripts/README index 634160b..5b5e88d 100644 --- a/Demo/scripts/README +++ b/Demo/scripts/README @@ -29,6 +29,7 @@ linktree.py Make a copy of a tree with links to original files lll.py Find and list symbolic links in current directory lpwatch.py Watch BSD line printer queues markov.py Markov chain simulation of words or characters +mboxconvvert.py Convert MH or MMDF mailboxes to unix mailbox format methfix.py Fix old method syntax def f(self, (a1, ..., aN)): mkreal.py Turn a symbolic link into a real file or directory mpzpi.py test mpz -- print digits of pi (compare pi.py) diff --git a/Demo/scripts/mboxconvert.py b/Demo/scripts/mboxconvert.py new file mode 100755 index 0000000..5567173 --- /dev/null +++ b/Demo/scripts/mboxconvert.py @@ -0,0 +1,113 @@ +#! /usr/local/bin/python + +# Convert MH directories (1 message per file) or MMDF mailboxes (4x^A +# delimited) to unix mailbox (From ... delimited) on stdout. +# If -f is given, files contain one message per file (e.g. MH messages) + +import rfc822 +import sys +import time +import os +import stat +import getopt +import regex + +def main(): + dofile = mmdf + try: + opts, args = getopt.getopt(sys.argv[1:], 'f') + except getopt.error, msg: + sys.stderr.write('%s\n' % msg) + sys.exit(2) + for o, a in opts: + if o == '-f': + dofile = message + if not args: + args = ['-'] + sts = 0 + for arg in args: + if arg == '-' or arg == '': + sts = dofile(sys.stdin) or sts + elif os.path.isdir(arg): + sts = mh(arg) or sts + elif os.path.isfile(arg): + try: + f = open(arg) + except IOError, msg: + sys.stderr.write('%s: %s\n' % (arg, msg)) + sts = 1 + continue + sts = dofile(f) or sts + f.close() + else: + sys.stderr('%s: not found\n' % arg) + sts = 1 + if sts: + sys.exit(sts) + +numeric = regex.compile('[1-9][0-9]*') + +def mh(dir): + sts = 0 + msgs = os.listdir(dir) + for msg in msgs: + if numeric.match(msg) != len(msg): + continue + fn = os.path.join(dir, msg) + try: + f = open(fn) + except IOError, msg: + sys.stderr.write('%s: %s\n' % (fn, msg)) + sts = 1 + continue + sts = message(f) or sts + return sts + +def mmdf(f): + sts = 0 + while 1: + line = f.readline() + if not line: + break + if line == '\1\1\1\1\n': + sts = message(f, line) or sts + else: + sys.stderr.write( + 'Bad line in MMFD mailbox: %s\n' % `line`) + return sts + +def message(f, delimiter = ''): + sts = 0 + # Parse RFC822 header + m = rfc822.Message(f) + # Write unix header line + fullname, email = m.getaddr('From') + tt = m.getdate('Date') + if tt: + t = time.mktime(tt) + else: + sys.stderr.write( + 'Unparseable date: %s\n' % `m.getheader('Date')`) + t = os.fstat(f.fileno())[stat.ST_MTIME] + print 'From', email, time.ctime(t) + # Copy RFC822 header + for line in m.headers: + print line, + print + # Copy body + while 1: + line = f.readline() + if line == delimiter: + break + if not line: + sys.stderr.write('Unexpected EOF in message\n') + sts = 1 + break + if line[:5] == 'From ': + line = '>' + line + print line, + # Print trailing newline + print + return sts + +main() |