Thanks again for this. It's really useful. It turns out that the delimiter is a plain old \n. Who knows how consistent this will be between different policy daemons, I don't know!
I've modified it to manage a DeferredQueue which hopefully means I can just keep throwing requests at it without every being bounced away. A stripped down example (with even less error checking!) of what I've managed to work your example in to is here: class PostfixPolicyClient(LineReceiver): delimiter = '\n' def __init__(self): self.resultQueue = DeferredQueue() def lineReceived(self, line): if '=' in line: self.resultQueue.put(True if line.split('=')[1] == 'OK' else False) def sendPostfixPolicyClientRequest(self, request_dict): for k, v in request_dict.items(): self.sendLine('{}={}'.format(k, v)) self.sendLine('') return self.resultQueue.get() Now, this isn't a working example, it's just the minimum that will demonstrate my idea. I just wonder if what I've done with the DeferredQueue is sane. If I return the .get() entry from the DeferredQueue when doing the request, and then do a put() in lineReceived, am I guaranteeing that I will get my results in the correct order? Thanks again for all your help! Many thanks. Tom. On 19/11/15 07:53, exvito here wrote: > > On Wed, Nov 18, 2015 at 9:28 AM, Tom Boland <t...@t0mb.net > <mailto:t...@t0mb.net>> wrote: > > I think what you've provided me with is useful for me, but I think > it's backwards for my purposes, as I need to be connecting to the > policy daemon rather than being the policy daemon! > > I wanted to do this with deferred calls in case one of the policy > daemons becomes unreachable and blocks my application. Do you > think I should do something differently in that regard? My SQL > lookups are done synchronously. If the database server goes away, > I've got bigger problems anyway! > > > So maybe something like this is more likely to be useful: > > #!/usr/bin/env python > > from __future__ import print_function > > from twisted.internet import reactor, protocol, endpoints, defer > from twisted.protocols import basic > > > class PostfixProtocol(basic.LineReceiver): > > # Assuming Postfix uses '\r\n' line breaks (does it?) > delimiter = '\r\n' > > def __init__(self): > self.action = None > self.action_deferred = None > > def lineReceived(self, line): > if '=' in line: > self.action = line.split('=')[1] > elif line == '': > self.action_deferred.callback(self.action) > self.action_deferred = None > else: > # oops, bad input > pass > > def sendPostfixRequest(self, request_dict): > if not self.action_deferred is None: > raise Exception('transaction pending') > for k, v in request_dict.items(): > self.sendLine('{}={}'.format(k,v)) > # Empty line signals we're done > self.sendLine('') > self.action_deferred = defer.Deferred() > return self.action_deferred > > @defer.inlineCallbacks > def checkPostfixPolicy(request_dict): > ep = endpoints.clientFromString(reactor, > 'tcp:host=127.0.0.1:port=10000') > p = yield endpoints.connectProtocol(ep, PostfixProtocol()) > action = yield p.sendPostfixRequest(request_dict) > print('got: {}'.format(action)) > reactor.stop() > > > if __name__ == '__main__': > > request_dict = { > 'recipient': 'em...@ddr.ess', > 'sender': 'em...@ddr.ess', > } > reactor.callWhenRunning(checkPostfixPolicy, request_dict) > reactor.run() > > Highlights: > - This is not the same protocol as before, in particular it uses a > different delimiter. > - It assumes the response is also terminated with an empty line (does > it?). > - It more than one outstanding response: a different exception should > be used. > - The input processing is very rudimentary and failure-prone. > - checkPostfixPolicy could, of course, return instead of printing. :) > > Cheers, > -- > exvito > > > _______________________________________________ > Twisted-Python mailing list > Twisted-Python@twistedmatrix.com > http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python