annotate Demo/threads/telnet.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents 71a294bd7950
children 6b18a095c2e7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Minimal interface to the Internet telnet protocol.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # *** modified to use threads ***
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # It refuses all telnet options and does not recognize any of the other
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # telnet commands, but can still be used to connect in line-by-line mode.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # It's also useful to play with a number of other services,
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # like time, finger, smtp and even ftp.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # Usage: telnet host [port]
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 #
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # The port may be a service name or a decimal port number;
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # it defaults to 'telnet'.
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 import sys, os, time
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 from socket import *
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 import thread
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 BUFSIZE = 8*1024
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # Telnet protocol characters
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
24 IAC = chr(255) # Interpret as command
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 DONT = chr(254)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 DO = chr(253)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 WONT = chr(252)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 WILL = chr(251)
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 def main():
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
31 if len(sys.argv) < 2:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
32 sys.stderr.write('usage: telnet hostname [port]\n')
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
33 sys.exit(2)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
34 host = sys.argv[1]
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
35 try:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
36 hostaddr = gethostbyname(host)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
37 except error:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
38 sys.stderr.write(sys.argv[1] + ': bad host name\n')
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
39 sys.exit(2)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
40 #
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
41 if len(sys.argv) > 2:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
42 servname = sys.argv[2]
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
43 else:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
44 servname = 'telnet'
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
45 #
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
46 if '0' <= servname[:1] <= '9':
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
47 port = eval(servname)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
48 else:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
49 try:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
50 port = getservbyname(servname, 'tcp')
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
51 except error:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
52 sys.stderr.write(servname + ': bad tcp service name\n')
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
53 sys.exit(2)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
54 #
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
55 s = socket(AF_INET, SOCK_STREAM)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
56 #
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
57 try:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
58 s.connect((host, port))
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
59 except error, msg:
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 16075
diff changeset
60 sys.stderr.write('connect failed: %r\n' % (msg,))
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
61 sys.exit(1)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
62 #
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
63 thread.start_new(child, (s,))
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
64 parent(s)
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 def parent(s):
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
67 # read socket, write stdout
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
68 iac = 0 # Interpret next char as command
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
69 opt = '' # Interpret next char as option
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
70 while 1:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
71 data, dummy = s.recvfrom(BUFSIZE)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
72 if not data:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
73 # EOF -- exit
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
74 sys.stderr.write( '(Closed by remote host)\n')
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
75 sys.exit(1)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
76 cleandata = ''
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
77 for c in data:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
78 if opt:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
79 print ord(c)
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 16075
diff changeset
80 ## print '(replying: %r)' % (opt+c,)
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
81 s.send(opt + c)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
82 opt = ''
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
83 elif iac:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
84 iac = 0
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
85 if c == IAC:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
86 cleandata = cleandata + c
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
87 elif c in (DO, DONT):
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
88 if c == DO: print '(DO)',
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
89 else: print '(DONT)',
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
90 opt = IAC + WONT
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
91 elif c in (WILL, WONT):
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
92 if c == WILL: print '(WILL)',
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
93 else: print '(WONT)',
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
94 opt = IAC + DONT
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
95 else:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
96 print '(command)', ord(c)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
97 elif c == IAC:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
98 iac = 1
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
99 print '(IAC)',
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
100 else:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
101 cleandata = cleandata + c
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
102 sys.stdout.write(cleandata)
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
103 sys.stdout.flush()
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 16075
diff changeset
104 ## print 'Out:', repr(cleandata)
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 def child(s):
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
107 # read stdin, write socket
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
108 while 1:
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
109 line = sys.stdin.readline()
31515
71a294bd7950 Replace backticks with repr() or "%r"
Walter Dörwald <walter@livinglogic.de>
parents: 16075
diff changeset
110 ## print 'Got:', repr(line)
16075
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
111 if not line: break
50bbe811b344 Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 15568
diff changeset
112 s.send(line)
937
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113
58a4cb18f025 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 main()