On 10/02/2013 07:14 AM, David Stainton wrote:
Hi,
I am wondering how I should combine various twisted interfaces
in a way that makes sense. It probably shows here... that I'm new to
twisted.
The Linux iptables can log packets to the netfilter_log which can give
access to user space.
I wrote a simple twisted Reader (IReadDescriptor implementation) that is
working functional code...
https://gist.github.com/david415/6789612
But since these are packets it returns... should I implement a "read
only Protocol"?
Well, if your transport is not writable, just don't implement that -
Exceptions will be raised if you mistakenly try to write, so nothing bad
will happen.
The protocol's dataReceive() method could be called from the
NFLogReader's doRead() method.
Since they're packets it should really be a DatagramProtocol and call
datagramReceived.
Does this mean that NFLogReader would be responsible for calling
buildProtocol to construct the NFLogProtocol?
Typically a factory is responsible for calling buildProtocol, but in
most datagram uses, there is only one protocol instance per port, so you
just instantiate it. See e.g.
http://twistedmatrix.com/documents/current/core/howto/udp.html
In the normal Twisted examples the buildProtocol seems to be called from
the react loop..
Should I pass the protocol factory and the reader to the service?
Sorry I don't know what this means.
If I want to drop privileges right after retrieving the filedescriptor
for netfilter_log, shall I use a Twisted Service/Application to drop the
root privs to a non-superuser?
That would be the "Twisted" way of doing it, yes.
Should the privileges be dropped by the privilegedStartService() method?
The manual says that method is for preparing to drop services...
What I want out of all of this is the most high performance and general
solution to utilizing netfilter_log in twisted...
Couple of general points:
The nflog_cffi code is... hard to read. But it's not obvious to me that
it sets the FD to nonblocking anywhere, or that it's (frankly weird)
generator construct will actually yield the "nonblock" marker object at
the right times. You might want to test this.
On a different note, a colleague wrote some code to process the IPQUEUE
target of iptables a while back. This code did something similar to your
example above, but it didn't bother integrating with the
protocol/factory machinery, and you could consider whether it makes
sense to do so - unlike a TCP or UDP port, you're unlikely to ever have
>1 nflog "connection" per-process, so it's not obvious that using the
full generality of the factory/protocol machinery is appropriate.
However if you do that, I would just copy what Twisted does for UDP;
don't model it on TCP.
_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python