Hi,
This diff updates pyzor to the latest release 0.5.0.
Tested on amd64/sparc64.
Comments ? OK ?
Cheers,
benoit
Index: Makefile
===================================================================
RCS file: /cvs/openbsd/ports/mail/pyzor/Makefile,v
retrieving revision 1.4
diff -u -r1.4 Makefile
--- Makefile 25 Mar 2009 13:39:40 -0000 1.4
+++ Makefile 30 Sep 2009 21:18:05 -0000
@@ -2,12 +2,14 @@
COMMENT= collaborative, networked system to detect and block spam
-DISTNAME= pyzor-0.4.0
-PKGNAME= ${DISTNAME}p1
+MODPY_EGG_VERSION= 0.5.0
+DISTNAME= pyzor-${MODPY_EGG_VERSION}
CATEGORIES= mail net
HOMEPAGE= http://pyzor.sourceforge.net/
+MAINTAINER= Benoit Lecocq <[email protected]>
+
# GPLv2
PERMIT_PACKAGE_CDROM= Yes
PERMIT_PACKAGE_FTP= Yes
@@ -18,6 +20,8 @@
EXTRACT_SUFX= .tar.bz2
MODULES= lang/python
+
+BUILD_DEPENDS += :python-gdbm-*:lang/python/${MODPY_VERSION},-gdbm
NO_REGRESS= Yes
Index: distinfo
===================================================================
RCS file: /cvs/openbsd/ports/mail/pyzor/distinfo,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 distinfo
--- distinfo 2 Sep 2008 12:33:17 -0000 1.1.1.1
+++ distinfo 30 Sep 2009 21:18:05 -0000
@@ -1,5 +1,5 @@
-MD5 (pyzor-0.4.0.tar.bz2) = 7nr+TMnUGbzl8pJQoBxDdA==
-RMD160 (pyzor-0.4.0.tar.bz2) = 7cA8CEaVEohQ94jFdVS5Z9vO/Y4=
-SHA1 (pyzor-0.4.0.tar.bz2) = BXfSkSQKemZJLCtsu/Sf1e2vAv0=
-SHA256 (pyzor-0.4.0.tar.bz2) = J7V/SF7pSpizb12Fz38qYb3/NfxABZRv5TZ87QNb1DA=
-SIZE (pyzor-0.4.0.tar.bz2) = 41764
+MD5 (pyzor-0.5.0.tar.bz2) = IfXtkkcKsSp2WMxGv1mj6Q==
+RMD160 (pyzor-0.5.0.tar.bz2) = bwYT5Zzs/jkMxGAnFqxLe7QsjUU=
+SHA1 (pyzor-0.5.0.tar.bz2) = zrilfdOygcBuu2IRUSOmKdNI0/E=
+SHA256 (pyzor-0.5.0.tar.bz2) = K/PfnpFoYQY6c/e0bLiye6xvZh/OE2KAPennkh/BVbo=
+SIZE (pyzor-0.5.0.tar.bz2) = 40654
Index: patches/patch-lib_pyzor_client_py
===================================================================
RCS file: /cvs/openbsd/ports/mail/pyzor/patches/patch-lib_pyzor_client_py,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 patch-lib_pyzor_client_py
--- patches/patch-lib_pyzor_client_py 2 Sep 2008 12:33:17 -0000 1.1.1.1
+++ patches/patch-lib_pyzor_client_py 30 Sep 2009 21:18:05 -0000
@@ -1,477 +0,0 @@
-$OpenBSD: patch-lib_pyzor_client_py,v 1.1.1.1 2008/09/02 12:33:17 jasper Exp $
-
-- Allow pyzor to scan mailboxes. From Debian.
-- Handle unknown encodings. Even binary parts are handled now.
- Treat empty type as 'text'. From FreeBSD.
-
---- lib/pyzor/client.py.orig Tue Sep 2 12:48:16 2008
-+++ lib/pyzor/client.py Tue Sep 2 12:52:33 2008
-@@ -8,6 +8,7 @@ import cStringIO
- import getopt
- import tempfile
- import mimetools
-+import multifile
- import sha
-
- import pyzor
-@@ -58,11 +59,6 @@ class Client(object):
- self.send(msg, address)
- return self.read_response(msg.get_thread())
-
-- def shutdown(self, address):
-- msg = ShutdownRequest()
-- self.send(msg, address)
-- return self.read_response(msg.get_thread())
--
- def build_socket(self):
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-
-@@ -132,39 +128,50 @@ class ExecCall(object):
-
- def run(self):
- debug = 0
-- (options, args) = getopt.getopt(sys.argv[1:], 'dh:', ['homedir='])
-- if len(args) < 1:
-- self.usage()
--
- specified_homedir = None
-+ options = None
-+ log = None
-+
-+ try:
-+ (options, args) = getopt.getopt(sys.argv[1:], 'd', ['homedir=',
'log'])
-+ except getopt.GetoptError:
-+ self.usage()
-
-+ if len(args) < 1:
-+ self.usage()
-+
- for (o, v) in options:
- if o == '-d':
- debug = 1
-- elif o == '-h':
-- self.usage()
- elif o == '--homedir':
- specified_homedir = v
-+ elif o == '--log':
-+ log = 1
-
- self.output = Output(debug=debug)
--
- homedir = pyzor.get_homedir(specified_homedir)
--
-+
-+ if log:
-+ sys.stderr = open(homedir + "/pyzor.log", 'a')
-+ sys.stderr.write("\npyzor[" + repr (os.getpid()) + "]:\n")
-+
- config = pyzor.Config(homedir)
- config.add_section('client')
-
-- defaults = {'ServersFile': 'servers',
-+ defaults = {'ServersFile': 'servers',
- 'DiscoverServersURL': ServerList.inform_url,
-- 'AccountsFile' : 'accounts',
-+ 'AccountsFile': 'accounts',
-+ 'Timeout': str(Client.timeout),
- }
-
- for k, v in defaults.items():
- config.set('client', k, v)
--
-+
- config.read(os.path.join(homedir, 'config'))
-
- servers_fn = config.get_filename('client', 'ServersFile')
--
-+ Client.timeout = config.getint('client', 'Timeout')
-+
- if not os.path.exists(homedir):
- os.mkdir(homedir)
-
-@@ -197,10 +204,13 @@ class ExecCall(object):
- def usage(self, s=None):
- if s is not None:
- sys.stderr.write("%s\n" % s)
-- sys.stderr.write("""usage: %s [-d] [--homedir dir] command [cmd_opts]
-+ sys.stderr.write("""
-+usage: %s [-d] [--homedir dir] command [cmd_opts]
- command is one of: check, report, discover, ping, digest, predigest,
-- genkey, shutdown
-+ genkey
-+
- Data is read on standard input (stdin).
-+
- """
- % sys.argv[0])
- sys.exit(2)
-@@ -208,9 +218,9 @@ Data is read on standard input (stdin).
-
-
- def ping(self, args):
-- getopt.getopt(args[1:], '')
--
-- if len(args) > 1:
-+ try:
-+ getopt.getopt(args[1:], '')
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
- runner = ClientRunner(self.client.ping)
-@@ -221,30 +231,23 @@ Data is read on standard input (stdin).
- return runner.all_ok
-
-
-- def shutdown(self, args):
-- (opts, args2) = getopt.getopt(args[1:], '')
--
-- if len(args2) > 1:
-+ def info(self, args):
-+ try:
-+ (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
-- runner = ClientRunner(self.client.shutdown)
-+ do_mbox = 'msg'
-
-- for arg in args2:
-- server = Address.from_str(arg)
-- runner.run(server, (server,))
--
-- return runner.all_ok
-+ for (o, v) in options:
-+ if o == '--mbox':
-+ do_mbox = 'mbox'
-
--
-- def info(self, args):
-- getopt.getopt(args[1:], '')
--
-- if len(args) > 1:
-- self.usage("%s does not take any non-option arguments" % args[0])
--
- runner = InfoClientRunner(self.client.info)
-
-- for digest in FileDigester(sys.stdin, self.digest_spec):
-+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox):
-+ if digest is None:
-+ continue
- for server in self.servers:
- response = runner.run(server, (digest, server))
-
-@@ -252,34 +255,45 @@ Data is read on standard input (stdin).
-
-
- def check(self, args):
-- getopt.getopt(args[1:], '')
--
-- if len(args) > 1:
-+ try:
-+ (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
-+ do_mbox = 'msg'
-+
-+ for (o, v) in options:
-+ if o == '--mbox':
-+ do_mbox = 'mbox'
-+
- runner = CheckClientRunner(self.client.check)
-
-- for digest in FileDigester(sys.stdin, self.digest_spec):
-+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox):
-+ if digest is None:
-+ continue
- for server in self.servers:
-- response = runner.run(server, (digest, server))
-+ runner.run(server, (digest, server))
-
- return (runner.found_hit and not runner.whitelisted)
-
-
- def report(self, args):
-- (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
-- do_mbox = False
--
-- if len(args2) > 1:
-+ try:
-+ (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
-+ do_mbox = 'msg'
-+
- for (o, v) in options:
- if o == '--mbox':
-- do_mbox = True
-+ do_mbox = 'mbox'
-
- all_ok = True
-
-- for digest in FileDigester(sys.stdin, self.digest_spec, do_mbox):
-+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox):
-+ if digest is None:
-+ continue
- if not self.send_digest(digest, self.digest_spec,
- self.client.report):
- all_ok = False
-@@ -302,20 +316,22 @@ Data is read on standard input (stdin).
-
-
- def whitelist(self, args):
-- (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
--
-- if len(args2) > 1:
-+ try:
-+ (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
-- do_mbox = False
-+ do_mbox = 'msg'
-
- for (o, v) in options:
- if o == '--mbox':
-- do_mbox = True
-+ do_mbox = 'mbox'
-
- all_ok = True
-
-- for digest in FileDigester(sys.stdin, self.digest_spec, do_mbox):
-+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox):
-+ if digest is None:
-+ continue
- if not self.send_digest(digest, self.digest_spec,
- self.client.whitelist):
- all_ok = False
-@@ -324,28 +340,29 @@ Data is read on standard input (stdin).
-
-
- def digest(self, args):
-- (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
--
-- if len(args2) > 1:
-+ try:
-+ (options, args2) = getopt.getopt(args[1:], '', ['mbox'])
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
-+ do_mbox = 'msg'
-
-- do_mbox = False
--
- for (o, v) in options:
- if o == '--mbox':
-- do_mbox = True
-+ do_mbox = 'mbox'
-
-- for digest in FileDigester(sys.stdin, self.digest_spec, do_mbox):
-+ for digest in get_input_handler(sys.stdin, self.digest_spec, do_mbox):
-+ if digest is None:
-+ continue
- sys.stdout.write("%s\n" % digest)
-
- return True
-
-
- def print_digested(self, args):
-- getopt.getopt(args[1:], '')
--
-- if len(args) > 1:
-+ try:
-+ getopt.getopt(args[1:], '')
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
- def loop():
-@@ -358,9 +375,9 @@ Data is read on standard input (stdin).
- return True
-
- def genkey(self, args):
-- getopt.getopt(args[1:], '')
--
-- if len(args) > 1:
-+ try:
-+ getopt.getopt(args[1:], '')
-+ except getopt.GetoptError:
- self.usage("%s does not take any non-option arguments" % args[0])
-
- import getpass
-@@ -414,7 +431,6 @@ Data is read on standard input (stdin).
- 'report': report,
- 'ping' : ping,
- 'genkey': genkey,
-- 'shutdown': shutdown,
- 'info': info,
- 'whitelist': whitelist,
- 'digest': digest,
-@@ -466,7 +482,7 @@ class DataDigester(object):
-
- (fp, offsets) = self.get_line_offsets(fp)
-
-- # did we get an empty file?
-+ # did we get an empty (parsed output) file?
- if len(offsets) == 0:
- return
-
-@@ -608,32 +624,38 @@ class PrintingDataDigester(DataDigester):
-
-
-
--class FileDigester(BasicIterator):
-- __slots__ = ['digester']
--
-- def __init__(self, fp, spec, mbox=False):
-- self.digester = iter(get_file_digester(fp, spec, mbox))
-- self.output = pyzor.Output()
--
-- def next(self):
-- digest = self.digester.next()
-- self.output.debug("calculated digest: %s" % digest)
-- return digest
--
--
--
--def get_file_digester(fp, spec, mbox, seekable=False):
-+def get_input_handler(fp, spec, style='msg', seekable=False):
- """Return an object that can be iterated over
- to get all the digests from fp according to spec.
- mbox is a boolean"""
-- if mbox:
-+ if style == 'msg':
-+ return filter(lambda x: x is not None,
-+ (DataDigester(rfc822BodyCleaner(fp),
-+ spec, seekable).get_digest(),)
-+ )
-+
-+ elif style =='mbox':
- return MailboxDigester(fp, spec)
-
-- return (DataDigester(rfc822BodyCleaner(fp),
-- spec, seekable).get_digest(),)
-+ elif style == 'digests':
-+ return JustDigestsIterator(fp)
-
-+ raise ValueError, "unknown input style"
-
-
-+class JustDigestsIterator(BasicIterator):
-+ __slots__ = ['fp']
-+
-+ def __init__(self, fp):
-+ self.fp = fp
-+
-+ def next(self):
-+ l = fp.readline()
-+ if not l:
-+ raise StopIteration
-+ return l.rstrip()
-+
-+
- class MailboxDigester(BasicIterator):
- __slots__ = ['mbox', 'digest_spec', 'seekable']
-
-@@ -645,7 +667,12 @@ class MailboxDigester(BasicIterator):
- self.seekable = seekable
-
- def next(self):
-- next_msg = self.mbox.next()
-+ try:
-+ next_msg = self.mbox.next()
-+ except IOError:
-+ print "Error: Please feed mailbox files in on stdin, i.e."
-+ print " pyzor digest --mbox < my_mbox_file"
-+ next_msg = None
- if next_msg is None:
- raise StopIteration
- return DataDigester(next_msg, self.digest_spec,
-@@ -662,39 +689,70 @@ class rfc822BodyCleaner(BasicIterator):
- self.multifile = None
- self.curfile = None
-
-+ # Check if we got a mail or not. Set type to binary if there is no
'From:' header and
-+ # type text/plain with encoding 7bit. 7bit is passed trough anyway so
nobody cares.
-+ if (not msg.has_key("From") and self.type == 'text' and msg.subtype ==
'plain' and msg.getencoding() == '7bit'):
-+ self.type = 'binary';
-+
-+ if self.type is '':
-+ self.type = 'text';
-+
- if self.type == 'text':
- encoding = msg.getencoding()
-- if encoding == '7bit':
-- self.curfile = msg.fp
-- else:
-- self.curfile = tempfile.TemporaryFile()
-- mimetools.decode(msg.fp, self.curfile, encoding)
-- self.curfile.seek(0)
--
-+ self.curfile = msg.fp
-+ if encoding != '7bit':
-+ # fix bad encoding name
-+ if encoding == '8bits':
-+ encoding = '8bit'
-+ try:
-+ newcurfile = tempfile.TemporaryFile()
-+ mimetools.decode(msg.fp, newcurfile, encoding)
-+ newcurfile.seek(0)
-+ self.curfile = newcurfile
-+ except:
-+ # ignore encoding on errors, pass msg as is
-+ pass
-+
- elif self.type == 'multipart':
- import multifile
- self.multifile = multifile.MultiFile(msg.fp, seekable=False)
- self.multifile.push(msg.getparam('boundary'))
-- self.multifile.next()
-- self.curfile = self.__class__(self.multifile)
-+ try:
-+ self.multifile.next()
-+ self.curfile = self.__class__(self.multifile)
-+ except:
-+ #
-+ # Catch multipart decoding errors
-+ #
-+ fp.seek(0)
-+ self.curfile = fp
-+ self.type = 'binary'
-
-
- if self.type == 'text' or self.type == 'multipart':
- assert self.curfile is not None
-+ elif self.type == 'binary':
-+ try:
-+ fp.seek(0)
-+ except:
-+ pass
-+ self.curfile = fp
- else:
- assert self.curfile is None
-
-
- def readline(self):
- l = ''
-- if self.type in ('text', 'multipart'):
-- l = self.curfile.readline()
--
-- if self.type == 'multipart' and not l and self.multifile.next():
-- self.curfile = self.__class__(self.multifile)
-- # recursion. Could get messy if
-- # we get a bunch of empty multifile parts
-- l = self.readline()
-+ try:
-+ if self.type in ('text', 'multipart', 'binary'):
-+ l = self.curfile.readline()
-+ if self.type == 'multipart' and not l and self.multifile.next():
-+ self.curfile = self.__class__(self.multifile)
-+ # recursion. Could get messy if
-+ # we get a bunch of empty multifile parts
-+ l = self.readline()
-+ except (TypeError, multifile.Error):
-+ pass
- return l
-
-
Index: pkg/PLIST
===================================================================
RCS file: /cvs/openbsd/ports/mail/pyzor/pkg/PLIST,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 PLIST
--- pkg/PLIST 2 Sep 2008 12:33:17 -0000 1.1.1.1
+++ pkg/PLIST 30 Sep 2009 21:18:05 -0000
@@ -2,7 +2,7 @@
bin/pyzor
bin/pyzord
lib/python${MODPY_VERSION}/site-packages/pyzor/
-lib/python${MODPY_VERSION}/site-packages/pyzor-0.4.0-py${MODPY_VERSION}.egg-info
+lib/python${MODPY_VERSION}/site-packages/pyzor-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info
lib/python${MODPY_VERSION}/site-packages/pyzor/__init__.py
lib/python${MODPY_VERSION}/site-packages/pyzor/__init__.pyc
lib/python${MODPY_VERSION}/site-packages/pyzor/client.py