CONTENTS
2
2.6.2 Setting Message By Local Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.6.3 Use Services to Make Dependencies Sane . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.6.4 Read Status File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.6.5 Announce on Web, Too . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.6.6 Announce on IRC, Too . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.6.7 Add XML-RPC Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.7 The Evolution of Finger: cleaning up the finger code . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.7.2 Write Readable Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.8 The Evolution of Finger: moving to a component based architecture . . . . . . . . . . . . . . . . . . 61
2.8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2.8.2 Write Maintainable Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
2.8.3 Advantages of Latest Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
2.8.4 Aspect-Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
2.9 The Evolution of Finger: pluggable backends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
2.9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
2.9.2 Another Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
2.9.3 Yet Another Back-end: Doing the Standard Thing . . . . . . . . . . . . . . . . . . . . . . . . 77
2.10 The Evolution of Finger: a web frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
2.10.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
2.11 The Evolution of Finger: Twisted client support using Perspective Broker . . . . . . . . . . . . . . . 89
2.11.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
2.11.2 Use Perspective Broker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
2.12 The Evolution of Finger: using a single factory for multiple protocols . . . . . . . . . . . . . . . . . 95
2.12.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
2.12.2 Support HTTPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
2.13 The Evolution of Finger: a Twisted finger client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
2.13.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
2.13.2 Finger Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
2.14 The Evolution of Finger: making a finger library . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
2.14.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
2.14.2 Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
2.14.3 Easy Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
2.15 The Evolution of Finger: configuration and packaging of the finger service . . . . . . . . . . . . . . . 106
2.15.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
2.15.2 Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
2.15.3 OS Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
2.16 Setting up the TwistedQuotes application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
2.16.1 Goal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
2.16.2 Setting up the TwistedQuotes project directory . . . . . . . . . . . . . . . . . . . . . . . . . 114
2.17 Designing Twisted Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
2.17.1 Goals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
2.17.2 Example of a modular design: TwistedQuotes . . . . . . . . . . . . . . . . . . . . . . . . . . 116
3 Networking and Other Event Sources 119
3.1 Overview of Twisted Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.2 Reactor Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.2.1 Reactor Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
3.2.2 Using the reactor object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.3 Using SSL in Twisted . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.3.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3.3.2 SSL echo server and client without client authentication . . . . . . . . . . . . . . . . . . . . 121
3.3.3 Using startTLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
3.3.4 Client authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
3.3.5 Other facilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.3.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
3.4 UDP Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125