Lloyd Zusman <[EMAIL PROTECTED]> writes:
> [ ... ]
>
> I couldn't figure out how to distinguish between a "release" and a
> "confirm", so I haven't yet written the "confirm" hook that was
> suggested by Ole Wolf. Does anyone know how to make that distinction
> within the tmda-1.1.11 code base?
Well, I now think that I've figured it out. The confirmation logic is
handled in tmda-rfilter, and I have now also patched that file.
Therefore, I now have a patch for tmda-1.1.11 which adds all five variables:
PENDING_RELEASE_ACTION_HOOK
PENDING_CONFIRM_ACTION_HOOK
PENDING_DELETE_ACTION_HOOK
PENDING_WHITELIST_ACTION_HOOK
PENDING_BLACKLIST_ACTION_HOOK
All the documentation can be found in the patched version of
Defaults.py. Once again, any help in testing this would be very much
appreciated.
The patch:
--- bin/tmda-rfilter.orig 2007-04-01 17:59:00.000000000 -0400
+++ bin/tmda-rfilter 2007-04-01 18:00:45.000000000 -0400
@@ -474,4 +474,7 @@
def release_pending(timestamp, pid, msg):
"""Release a confirmed message from the pending queue."""
+ # If there is a pending confirm hook, attempt to pipe
+ # the message through it.
+ msg.tryActionHook(Defaults.PENDING_CONFIRM_ACTION_HOOK)
# Remove Return-Path: to avoid duplicates.
return_path = return_path = parseaddr(msg.get('return-path'))[1]
--- TMDA/Defaults.py.orig 2007-04-01 12:51:53.000000000 -0400
+++ TMDA/Defaults.py 2007-04-01 18:03:12.000000000 -0400
@@ -1213,4 +1213,99 @@
PENDING_WHITELIST_RELEASE = 1
+# PENDING_RELEASE_ACTION_HOOK
+# Path of an optional executable that will be run when a message
+# is being released from the pending queue, right before this
+# release takes place.
+#
+# It will be run as follows:
+#
+# /path/to/executable /path/to/pending-message-file
+#
+# The message text will be available in this executable's stdin.
+#
+# When this executable is invoked, all TMDA configuration
+# variables will be available in the environment in the
+# form of strings.
+#
+# Default is None
+if not vars().has_key('PENDING_RELEASE_ACTION_HOOK'):
+ PENDING_RELEASE_ACTION_HOOK = None
+
+# PENDING_CONFIRM_ACTION_HOOK
+# Path of an optional executable that will be run when a message
+# is being confirmed from the pending queue, right before this
+# confirmation takes place.
+#
+# It will be run as follows:
+#
+# /path/to/executable /path/to/pending-message-file
+#
+# The message text will be available in this executable's stdin.
+#
+# When this executable is invoked, all TMDA configuration
+# variables will be available in the environment in the
+# form of strings.
+#
+# Default is None
+if not vars().has_key('PENDING_CONFIRM_ACTION_HOOK'):
+ PENDING_CONFIRM_ACTION_HOOK = None
+
+# PENDING_DELETE_ACTION_HOOK
+# Path of an optional executable that will be run when a message
+# is being deleted from the pending queue, right before this
+# deletion takes place.
+#
+# It will be run as follows:
+#
+# /path/to/executable /path/to/pending-message-file
+#
+# The message text will be available in this executable's stdin.
+#
+# When this executable is invoked, all TMDA configuration
+# variables will be available in the environment in the
+# form of strings.
+#
+# Default is None
+if not vars().has_key('PENDING_DELETE_ACTION_HOOK'):
+ PENDING_DELETE_ACTION_HOOK = None
+
+# PENDING_WHITELIST_ACTION_HOOK
+# Path of an optional executable that will be run when a message
+# is being whitelisted from the pending queue, right before this
+# whitelisting takes place.
+#
+# It will be run as follows:
+#
+# /path/to/executable /path/to/pending-message-file
+#
+# The message text will be available in this executable's stdin.
+#
+# When this executable is invoked, all TMDA configuration
+# variables will be available in the environment in the
+# form of strings.
+#
+# Default is None
+if not vars().has_key('PENDING_WHITELIST_ACTION_HOOK'):
+ PENDING_WHITELIST_ACTION_HOOK = None
+
+# PENDING_BLACKLIST_ACTION_HOOK
+# Path of an optional executable that will be run when a message
+# is being blacklisted from the pending queue, right before this
+# blacklisting takes place.
+#
+# It will be run as follows:
+#
+# /path/to/executable /path/to/pending-message-file
+#
+# The message text will be available in this executable's stdin.
+#
+# When this executable is invoked, all TMDA configuration
+# variables will be available in the environment in the
+# form of strings.
+#
+# Default is None
+if not vars().has_key('PENDING_BLACKLIST_ACTION_HOOK'):
+ PENDING_BLACKLIST_ACTION_HOOK = None
+
# ADDED_HEADERS_CLIENT
# A Python dictionary containing one or more header:value string pairs
@@ -1599,4 +1694,9 @@
'PENDING_RELEASE_APPEND': None,
'PENDING_WHITELIST_APPEND': None,
+ 'PENDING_RELEASE_ACTION_HOOK' : None,
+ 'PENDING_CONFIRM_ACTION_HOOK' : None,
+ 'PENDING_DELETE_ACTION_HOOK' : None,
+ 'PENDING_WHITELIST_ACTION_HOOK' : None,
+ 'PENDING_BLACKLIST_ACTION_HOOK' : None,
'RESPONSE_DIR': None,
'SENDMAIL_PROGRAM': None,
--- TMDA/Pending.py.orig 2007-04-01 13:06:15.000000000 -0400
+++ TMDA/Pending.py 2007-04-01 18:00:06.000000000 -0400
@@ -28,6 +28,8 @@
import email
import os
+import re
import sys
import time
+from types import *
import Defaults
@@ -40,4 +42,5 @@
Q = Q.init()
+DefaultVarPat = re.compile('^[A-Z][A-Z0-9_]*$')
class Queue:
@@ -366,7 +369,29 @@
self.x_primary_address, self.return_path)
+
+ def tryActionHook(self, hook):
+ """Attempt to run an action hook"""
+ if hook is None:
+ return
+ # Put all appropriate Defaults variables into the environment.
+ for (k, v) in vars(Defaults).items():
+ if DefaultVarPat.search(k):
+ try:
+ if v is None:
+ del os.environ[k]
+ else:
+ os.environ[k] = str(v)
+ except:
+ pass
+ pendpath = os.path.join(Defaults.PENDING_DIR, self.msgid + '.msg')
+ # This will throw an exception upon failure.
+ Util.pipecmd('%s %s' % (hook, pendpath), self.show())
+
def release(self):
"""Release a message from the pending queue."""
import Cookie
+ # If there is a pending release hook, attempt to pipe
+ # the message through it.
+ self.tryActionHook(Defaults.PENDING_RELEASE_ACTION_HOOK)
if Defaults.PENDING_RELEASE_APPEND:
Util.append_to_file(self.append_address,
@@ -401,4 +426,7 @@
def delete(self):
"""Delete a message from the pending queue."""
+ # If there is a pending delete hook, attempt to pipe
+ # the message through it.
+ self.tryActionHook(Defaults.PENDING_DELETE_ACTION_HOOK)
if Defaults.PENDING_DELETE_APPEND:
Util.append_to_file(self.append_address,
@@ -408,4 +436,7 @@
def whitelist(self):
"""Whitelist the message sender."""
+ # If there is a pending whitelist hook, attempt to pipe
+ # the message through it.
+ self.tryActionHook(Defaults.PENDING_WHITELIST_ACTION_HOOK)
if Defaults.PENDING_WHITELIST_APPEND:
Util.append_to_file(self.append_address,
@@ -419,4 +450,7 @@
def blacklist(self):
"""Blacklist the message sender."""
+ # If there is a pending blacklist hook, attempt to pipe
+ # the message through it.
+ self.tryActionHook(Defaults.PENDING_BLACKLIST_ACTION_HOOK)
if Defaults.PENDING_BLACKLIST_APPEND:
Util.append_to_file(self.append_address,
--
Lloyd Zusman
[EMAIL PROTECTED]
God bless you.
_________________________________________________
tmda-workers mailing list ([email protected])
http://tmda.net/lists/listinfo/tmda-workers