[Twisted-Python] Telnet negotiation with Twisted

Patrick Mylund Nielsen twisted at patrickmylund.com
Sat Dec 3 10:13:31 EST 2011


That's much better, Jean-Paul. Thanks!

On Sat, Dec 3, 2011 at 15:48,  <exarkun at twistedmatrix.com> wrote:
> On 02:22 pm, twisted at patrickmylund.com wrote:
>>Hi Lee,
>>
>>Here is a complete example that works with Twisted 11.0. LINEMODE
>>itself is enabled at connect, but it has different modes that
>>determine what is sent when by the client. (See section 2.2 of
>>http://www.faqs.org/rfcs/rfc1184.html)
>
> You can manage this without a TelnetTransport subclass:
>
> #!/usr/bin/env python
> from twisted.internet.protocol import Factory
> from twisted.conch.telnet import (
>    TelnetProtocol, StatefulTelnetProtocol, TelnetTransport)
> from twisted.conch.telnet import DO, DONT, WILL, WONT
>
> LINEMODE = chr(34)
> LINEMODE_EDIT = chr(1) + chr(1)
> LINEMODE_TRAPSIG = chr(1) + chr(2)
> LINEMODE_MODEACK = chr(1) + chr(4)
> LINEMODE_SOFTTAB = chr(1) + chr(8)
> LINEMODE_LITECHO = chr(1) + chr(16)
>
> class LineModeProtocol(TelnetProtocol):
>
>    def connectionMade(self):
>        print("Connection made!")
>        self.lines = True
>        # Ask client to begin sub-negotation of linemode
>        self.transport.do(LINEMODE)
>
>    def connectionLost(self, reason):
>        print("Connection lost!")
>
>    def enableRemote(self, option):
>        if option == LINEMODE:
>            # The normal (buffered) mode
>            self.transport.requestNegotiation(
>                LINEMODE, LINEMODE_EDIT)
>            return True
>        return False
>
>    def dataReceived(self, data):
>        if self.lines:
>            line = data.rstrip()
>            print("data received (normal): " + line)
>            if line == "gounbuffered":
>                # Only trap signals locally
>                self.transport.requestNegotiation(
>                    LINEMODE, LINEMODE_TRAPSIG)                self.lines
> = False
>        else:
>            # manually buffer data here
>            print("data received (linemode): " + data)
>            if data == "n":
>                # Change to edit mode
>                self.transport.requestNegotiation(
>                    LINEMODE, LINEMODE_EDIT)
>                self.lines = True
>
> class LineModeFactory(Factory):
>
>    def buildProtocol(self, addr):
>        return TelnetTransport(LineModeProtocol)
>
> if __name__ == '__main__':
>    from twisted.internet import reactor
>
>    port = 2222
>    factory = LineModeFactory()
>
>    reactor.listenTCP(port, factory)
>    reactor.run()
>
> Jean-Paul
>
> _______________________________________________
> Twisted-Python mailing list
> Twisted-Python at twistedmatrix.com
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python



More information about the Twisted-Python mailing list