Mercurial > cpython-lru_cache-weakref
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 |
| rev | line source |
|---|---|
| 937 | 1 # Minimal interface to the Internet telnet protocol. |
| 2 # | |
| 3 # *** modified to use threads *** | |
| 4 # | |
| 5 # It refuses all telnet options and does not recognize any of the other | |
| 6 # telnet commands, but can still be used to connect in line-by-line mode. | |
| 7 # It's also useful to play with a number of other services, | |
| 8 # like time, finger, smtp and even ftp. | |
| 9 # | |
| 10 # Usage: telnet host [port] | |
| 11 # | |
| 12 # The port may be a service name or a decimal port number; | |
| 13 # it defaults to 'telnet'. | |
| 14 | |
| 15 | |
| 16 import sys, os, time | |
| 17 from socket import * | |
| 18 import thread | |
| 19 | |
| 20 BUFSIZE = 8*1024 | |
| 21 | |
| 22 # Telnet protocol characters | |
| 23 | |
|
16075
50bbe811b344
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
15568
diff
changeset
|
24 IAC = chr(255) # Interpret as command |
| 937 | 25 DONT = chr(254) |
| 26 DO = chr(253) | |
| 27 WONT = chr(252) | |
| 28 WILL = chr(251) | |
| 29 | |
| 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 | 65 |
| 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 | 105 |
| 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 | 113 |
| 114 main() |
