On 4/25/2013 12:02 AM, EMF wrote:
On 4/24/2013 11:43 PM, Fred Smith wrote:
On Wed, Apr 24, 2013 at 10:15:22PM -0400, EMF wrote:
OS:  CentOS 6.4 x86_64
Postfix package:  postfix-2.6.6-2.2.el6_1.x86_64
Spambayes package:  spambayes-1.1-0.2.a6.el6.noarch

All right, I've hit a brick wall with my integration of spambayes
and postfix.  I based my build combining Jonathan St. Andre's
instructions at http://spambayes.sourceforge.net/server_side.html,
with a few tweaks from the Postfix side in
http://www.postfix.org/FILTER_README.html --- mostly because I'm
going to extend the logic.

I've successfully trained spambayes with about 12,000 each spam and
ham, creating a database in /var/spambayes/filter.db.

Running a captured message through sb_filter.py from the command
line works flawlessly:
-----------------------------------------
$ whoami
filter
$ cat /tmp/msg.7440 | /usr/bin/sb_filter.py -d /var/spambayes/filter.db -f
Return-Path: <e...@amhran.net>
Received: from amhran.net (3wg23q1.amhran.net [192.168.1.160])
         by courier.amhran.net (Postfix) with ESMTP id CFF223E
         for <e...@amhran.net>; Wed, 24 Apr 2013 21:28:34 -0400 (EDT)
From: "EMF" <e...@amhran.net>
To: "EMF" <e...@amhran.net>
Subject: Testing
X-Spambayes-Classification: ham; 0.17

SB Test
$
-----------------------------------------

Here are the lines from postfix's master.cf (which are very
straightforward):
-----------------------------------------
smtp      inet  n       -       n       -       -       smtpd
      -o content_filter=filter:dummy
filter unix  -   n   n   -   -   pipe
      flags=Rq user=filter
      argv=/usr/local/bin/spamfilter.sh -f ${sender} -- ${recipient}
-----------------------------------------

Spamfilter.sh sends the mail just fine if it consists of this:
-----------------------------------------
     cat > /tmp/msg.$$
     /usr/sbin/sendmail -i $@ < /tmp/msg.$$
-----------------------------------------
but not if it contains this:
-----------------------------------------
     cat > /tmp/msg.$$
     cat /tmp/msg.$$ | /usr/bin/sb_filter.py -d
/var/spambayes/filter.db -f > /tmp/new.$$
     /usr/sbin/sendmail -i $@ < /tmp/new.$$
-----------------------------------------

In the latter case --- msg.$$ contains the message, but new.$$ is a
zero-length file, and thus what comes through on the far end is an
empty message.  Interestingly, I get this in syslog.log:
-----------------------------------------
Apr 24 21:28:35 courier abrt: detected unhandled Python exception in
'/usr/bin/sb_filter.py'
Apr 24 21:28:35 courier abrt: can't communicate with ABRT daemon, is
it running? [Errno 13] Permission denied
-----------------------------------------

How can I capture the exception?  What's being called by
sb_filter.py at the command line that isn't available when run
inside the content_filter?
Well, I'm not intimate with the innards of the spambayes components,
but if a program behaves differently on commandline than it does
in its own normal environment, I'd guess there's something different
about the system environment: PATH, LD_LIBRARY_PATH, etc., etc.,
etc.

Okay, I caught the exception in sb_filter.py with a traceback:

------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/bin/sb_filter_debug.py", line 279, in <module>
    main()
  File "/usr/bin/sb_filter_debug.py", line 255, in main
    h.newdb()
  File "/usr/bin/sb_filter_debug.py", line 179, in newdb
    self.open('n')
  File "/usr/bin/sb_filter_debug.py", line 167, in open
    self.h = hammie.open(self.dbname, self.usedb, self.mode)
  File "/usr/lib/python2.6/site-packages/spambayes/hammie.py", line 272, in open
    return Hammie(storage.open_storage(filename, useDB, mode), mode)
  File "/usr/lib/python2.6/site-packages/spambayes/storage.py", line 998, in 
open_storage
    return klass(data_source_name, mode)
  File "/usr/lib/python2.6/site-packages/spambayes/storage.py", line 154, in 
__init__
    self.load()
  File "/usr/lib/python2.6/site-packages/spambayes/storage.py", line 180, in 
load
    self.dbm = dbmstorage.open(self.db_name, self.mode)
  File "/usr/lib/python2.6/site-packages/spambayes/dbmstorage.py", line 70, in 
open
    return f(db_name, mode)
  File "/usr/lib/python2.6/site-packages/spambayes/dbmstorage.py", line 40, in 
open_best
    return f(*args)
  File "/usr/lib/python2.6/site-packages/spambayes/dbmstorage.py", line 20, in 
open_dbhash
    return bsddb.hashopen(*args)
  File "/usr/lib64/python2.6/bsddb/__init__.py", line 361, in hashopen
    d.open(file, db.DB_HASH, flags, mode)
DBAccessError: (13, 'Permission denied')

------------------------------------------------------------

So, it's getting a permission denied on the hash database.  I added some logic to capture 
self.dbname, self.usedb, and self.mode --- and I found a difference.  When run from the command 
line, self.mode is "r", but when run as part of the filter, it's set to "n".  
It's trying to create a new hash database instead of reading the one it's been told to use!

After digging back through the code and disabling parts, it's choking on 
"os.path.exists".  For some reason, when run as part of the postfix filter, it 
believes /var/spambayes/filter.db doesn't exist.  As shown in the master.cf lines, 
there's no chroot involved, so I didn't know why it couldn't find the file.

And then, the lightbulb hits, and I proceed to start thumping my head on the 
table:
        [root@courier-b tmp] # getenforce
        Enforcing

Curse you, SElinux, curse you.  Setting the correct context on the filter.db 
file resolves the problem.

NOTABUG.

_______________________________________________
SpamBayes@python.org
http://mail.python.org/mailman/listinfo/spambayes
Info/Unsubscribe: http://mail.python.org/mailman/listinfo/spambayes
Check the FAQ before asking: http://spambayes.sf.net/faq.html

Reply via email to