On Wed, Nov 18, 2015 at 9:28 AM, Tom Boland <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