~exarkun/+junk/twisted-benchmarks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from zope.interface import implements

from twisted.internet.defer import succeed
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.cred.portal import IRealm, Portal
from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
from twisted.conch.avatar import ConchUser
from twisted.conch.ssh.userauth import SSHUserAuthClient
from twisted.conch.ssh.session import ISession, SSHSession

from ssh_connect import BenchmarkSSHFactory
from tcp_throughput import Client

from sshendpoint import SSHCommandClientEndpoint

from benchlib import driver


class Client(Client):
    def cleanup(self):
        # The base implementation should work, but does not.
        self._client.transport.conn.transport.transport.loseConnection()



class SSHPasswordUserAuth(SSHUserAuthClient):
    def __init__(self, user, password, instance):
        SSHUserAuthClient.__init__(self, user, instance)
        self.password = password


    def getPassword(self, prompt=None):
        return succeed(self.password)



class EchoTransport(object):
    def __init__(self, protocol):
        self.protocol = protocol


    def write(self, bytes):
        self.protocol.childDataReceived(1, bytes)


    def loseConnection(self):
        pass



class BenchmarkAvatar(ConchUser):
    implements(ISession)

    def __init__(self):
        ConchUser.__init__(self)
        self.channelLookup['session'] = SSHSession


    def execCommand(self, proto, cmd):
        if cmd == 'chargen':
            self.proto = proto
            transport = EchoTransport(proto)
            proto.makeConnection(transport)
        else:
            raise RuntimeError("Unexpected execCommand")


    def closed(self):
        pass



class BenchmarkRealm(object):
    implements(IRealm)

    def requestAvatar(self, avatarId, mind, *interfaces):
        return (
            interfaces[0],
            BenchmarkAvatar(),
            lambda: None)


def main(reactor, duration):
    chunkSize = 16384

    server = BenchmarkSSHFactory()
    server.portal = Portal(BenchmarkRealm())
    server.portal.registerChecker(
        InMemoryUsernamePasswordDatabaseDontUse(username='password'))

    port = reactor.listenTCP(0, server)
    tcpServer = TCP4ClientEndpoint(reactor, '127.0.0.1', port.getHost().port)
    sshServer = SSHCommandClientEndpoint(
        'chargen', tcpServer,
        lambda command:
            SSHPasswordUserAuth('username', 'password', command))

    client = Client(reactor, sshServer)
    d = client.run(duration, chunkSize)
    def cleanup(passthrough):
        d = port.stopListening()
        d.addCallback(lambda ignored: passthrough)
        return d
    d.addCallback(cleanup)
    return d



if __name__ == '__main__':
    import sys
    import ssh_throughput
    # from twisted.python.log import startLogging
    # startLogging(sys.stderr, False)
    driver(ssh_throughput.main, sys.argv)