blob: a13e85cc9863542fd520e12a9131c3157375a703 [file] [log] [blame]
Hye-Shik Change029da02005-09-07 07:40:05 +00001r"""TELNET client class.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +00002
3Based on RFC 854: TELNET Protocol Specification, by J. Postel and
4J. Reynolds
5
6Example:
7
8>>> from telnetlib import Telnet
9>>> tn = Telnet('www.python.org', 79) # connect to finger port
10>>> tn.write('guido\r\n')
11>>> print tn.read_all()
12Login Name TTY Idle When Where
13guido Guido van Rossum pts/2 <Dec 2 11:10> snag.cnri.reston..
Tim Petersb90f89a2001-01-15 03:26:36 +000014
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000015>>>
16
17Note that read_all() won't read until eof -- it just reads some data
18-- but it guarantees to read at least one byte unless EOF is hit.
19
20It is possible to pass a Telnet object to select.select() in order to
21wait until more data is available. Note that in this case,
22read_eager() may return '' even if there was data on the socket,
23because the protocol negotiation may have eaten the data. This is why
24EOFError is needed in some cases to distinguish between "no data" and
25"connection closed" (since the socket also appears ready for reading
26when it is closed).
27
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000028To do:
29- option negotiation
Guido van Rossumccb5ec61997-12-24 22:24:19 +000030- timeout should be intrinsic to the connection object instead of an
31 option on one of the read calls only
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000032
33"""
34
35
36# Imported modules
Guido van Rossumccb5ec61997-12-24 22:24:19 +000037import sys
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000038import socket
39import select
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000040
Skip Montanaro40fc1602001-03-01 04:27:19 +000041__all__ = ["Telnet"]
42
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000043# Tunable parameters
44DEBUGLEVEL = 0
45
46# Telnet protocol defaults
47TELNET_PORT = 23
48
49# Telnet protocol characters (don't change)
50IAC = chr(255) # "Interpret As Command"
51DONT = chr(254)
52DO = chr(253)
53WONT = chr(252)
54WILL = chr(251)
55theNULL = chr(0)
Martin v. Löwis574deae2002-11-04 17:34:07 +000056
57SE = chr(240) # Subnegotiation End
58NOP = chr(241) # No Operation
59DM = chr(242) # Data Mark
60BRK = chr(243) # Break
61IP = chr(244) # Interrupt process
62AO = chr(245) # Abort output
63AYT = chr(246) # Are You There
64EC = chr(247) # Erase Character
65EL = chr(248) # Erase Line
66GA = chr(249) # Go Ahead
67SB = chr(250) # Subnegotiation Begin
68
Guido van Rossumb9b50eb1997-12-24 21:07:04 +000069
Martin v. Löwisb0162f92001-09-06 08:51:38 +000070# Telnet protocol options code (don't change)
71# These ones all come from arpa/telnet.h
72BINARY = chr(0) # 8-bit data path
73ECHO = chr(1) # echo
74RCP = chr(2) # prepare to reconnect
75SGA = chr(3) # suppress go ahead
76NAMS = chr(4) # approximate message size
77STATUS = chr(5) # give status
78TM = chr(6) # timing mark
79RCTE = chr(7) # remote controlled transmission and echo
80NAOL = chr(8) # negotiate about output line width
81NAOP = chr(9) # negotiate about output page size
82NAOCRD = chr(10) # negotiate about CR disposition
83NAOHTS = chr(11) # negotiate about horizontal tabstops
84NAOHTD = chr(12) # negotiate about horizontal tab disposition
85NAOFFD = chr(13) # negotiate about formfeed disposition
86NAOVTS = chr(14) # negotiate about vertical tab stops
87NAOVTD = chr(15) # negotiate about vertical tab disposition
88NAOLFD = chr(16) # negotiate about output LF disposition
89XASCII = chr(17) # extended ascii character set
90LOGOUT = chr(18) # force logout
91BM = chr(19) # byte macro
92DET = chr(20) # data entry terminal
93SUPDUP = chr(21) # supdup protocol
94SUPDUPOUTPUT = chr(22) # supdup output
95SNDLOC = chr(23) # send location
96TTYPE = chr(24) # terminal type
97EOR = chr(25) # end or record
98TUID = chr(26) # TACACS user identification
99OUTMRK = chr(27) # output marking
100TTYLOC = chr(28) # terminal location number
101VT3270REGIME = chr(29) # 3270 regime
102X3PAD = chr(30) # X.3 PAD
103NAWS = chr(31) # window size
104TSPEED = chr(32) # terminal speed
105LFLOW = chr(33) # remote flow control
106LINEMODE = chr(34) # Linemode option
107XDISPLOC = chr(35) # X Display Location
108OLD_ENVIRON = chr(36) # Old - Environment variables
109AUTHENTICATION = chr(37) # Authenticate
110ENCRYPT = chr(38) # Encryption option
111NEW_ENVIRON = chr(39) # New - Environment variables
112# the following ones come from
113# http://www.iana.org/assignments/telnet-options
114# Unfortunately, that document does not assign identifiers
115# to all of them, so we are making them up
116TN3270E = chr(40) # TN3270E
117XAUTH = chr(41) # XAUTH
118CHARSET = chr(42) # CHARSET
119RSP = chr(43) # Telnet Remote Serial Port
120COM_PORT_OPTION = chr(44) # Com Port Control Option
121SUPPRESS_LOCAL_ECHO = chr(45) # Telnet Suppress Local Echo
122TLS = chr(46) # Telnet Start TLS
123KERMIT = chr(47) # KERMIT
124SEND_URL = chr(48) # SEND-URL
125FORWARD_X = chr(49) # FORWARD_X
126PRAGMA_LOGON = chr(138) # TELOPT PRAGMA LOGON
127SSPI_LOGON = chr(139) # TELOPT SSPI LOGON
128PRAGMA_HEARTBEAT = chr(140) # TELOPT PRAGMA HEARTBEAT
129EXOPL = chr(255) # Extended-Options-List
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000130NOOPT = chr(0)
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000131
132class Telnet:
133
134 """Telnet interface class.
135
136 An instance of this class represents a connection to a telnet
137 server. The instance is initially not connected; the open()
138 method must be used to establish a connection. Alternatively, the
139 host name and optional port number can be passed to the
140 constructor, too.
141
142 Don't try to reopen an already connected instance.
143
144 This class has many read_*() methods. Note that some of them
145 raise EOFError when the end of the connection is read, because
146 they can return an empty string for other reasons. See the
147 individual doc strings.
148
149 read_until(expected, [timeout])
150 Read until the expected string has been seen, or a timeout is
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000151 hit (default is no timeout); may block.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000152
153 read_all()
154 Read all data until EOF; may block.
155
156 read_some()
157 Read at least one byte or EOF; may block.
158
159 read_very_eager()
160 Read all data available already queued or on the socket,
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000161 without blocking.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000162
163 read_eager()
164 Read either data already queued or some data available on the
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000165 socket, without blocking.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000166
167 read_lazy()
168 Read all data in the raw queue (processing it first), without
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000169 doing any socket I/O.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000170
171 read_very_lazy()
172 Reads all data in the cooked queue, without doing any socket
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000173 I/O.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000174
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000175 read_sb_data()
176 Reads available data between SB ... SE sequence. Don't block.
177
Martin v. Löwisb0162f92001-09-06 08:51:38 +0000178 set_option_negotiation_callback(callback)
179 Each time a telnet option is read on the input flow, this callback
180 (if set) is called with the following parameters :
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000181 callback(telnet socket, command, option)
182 option will be chr(0) when there is no option.
Martin v. Löwisb0162f92001-09-06 08:51:38 +0000183 No other action is done afterwards by telnetlib.
184
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000185 """
186
187 def __init__(self, host=None, port=0):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000188 """Constructor.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000189
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000190 When called without arguments, create an unconnected instance.
191 With a hostname argument, it connects the instance; a port
192 number is optional.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000193
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000194 """
195 self.debuglevel = DEBUGLEVEL
196 self.host = host
197 self.port = port
198 self.sock = None
199 self.rawq = ''
200 self.irawq = 0
201 self.cookedq = ''
202 self.eof = 0
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000203 self.iacseq = '' # Buffer for IAC sequence.
204 self.sb = 0 # flag for SB and SE sequence.
205 self.sbdataq = ''
Martin v. Löwisb0162f92001-09-06 08:51:38 +0000206 self.option_callback = None
Raymond Hettinger10ff7062002-06-02 03:04:52 +0000207 if host is not None:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000208 self.open(host, port)
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000209
210 def open(self, host, port=0):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000211 """Connect to a host.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000212
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000213 The optional second argument is the port number, which
214 defaults to the standard telnet port (23).
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000215
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000216 Don't try to reopen an already connected instance.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000217
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000218 """
219 self.eof = 0
220 if not port:
221 port = TELNET_PORT
222 self.host = host
223 self.port = port
Martin v. Löwis2ad25692001-07-31 08:40:21 +0000224 msg = "getaddrinfo returns an empty list"
Martin v. Löwis4eb59402001-07-26 13:37:33 +0000225 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
226 af, socktype, proto, canonname, sa = res
227 try:
228 self.sock = socket.socket(af, socktype, proto)
229 self.sock.connect(sa)
230 except socket.error, msg:
Martin v. Löwis322c0d12001-10-07 08:53:32 +0000231 if self.sock:
232 self.sock.close()
Martin v. Löwis4eb59402001-07-26 13:37:33 +0000233 self.sock = None
234 continue
235 break
Martin v. Löwisa43c2f82001-07-24 20:34:08 +0000236 if not self.sock:
Martin v. Löwis4eb59402001-07-26 13:37:33 +0000237 raise socket.error, msg
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000238
239 def __del__(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000240 """Destructor -- close the connection."""
241 self.close()
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000242
243 def msg(self, msg, *args):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000244 """Print a debug message, when the debug level is > 0.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000245
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000246 If extra arguments are present, they are substituted in the
247 message using the standard string formatting operator.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000248
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000249 """
250 if self.debuglevel > 0:
251 print 'Telnet(%s,%d):' % (self.host, self.port),
252 if args:
253 print msg % args
254 else:
255 print msg
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000256
257 def set_debuglevel(self, debuglevel):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000258 """Set the debug level.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000259
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000260 The higher it is, the more debug output you get (on sys.stdout).
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000261
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000262 """
263 self.debuglevel = debuglevel
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000264
265 def close(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000266 """Close the connection."""
267 if self.sock:
268 self.sock.close()
269 self.sock = 0
270 self.eof = 1
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000271 self.iacseq = ''
272 self.sb = 0
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000273
274 def get_socket(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000275 """Return the socket object used internally."""
276 return self.sock
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000277
278 def fileno(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000279 """Return the fileno() of the socket object used internally."""
280 return self.sock.fileno()
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000281
282 def write(self, buffer):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000283 """Write a string to the socket, doubling any IAC characters.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000284
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000285 Can block if the connection is blocked. May raise
286 socket.error if the connection is closed.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000287
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000288 """
289 if IAC in buffer:
Eric S. Raymond6b8c5282001-02-09 07:10:12 +0000290 buffer = buffer.replace(IAC, IAC+IAC)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000291 self.msg("send %r", buffer)
Martin v. Löwise12454f2002-02-16 23:06:19 +0000292 self.sock.sendall(buffer)
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000293
294 def read_until(self, match, timeout=None):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000295 """Read until a given string is encountered or until timeout.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000296
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000297 When no match is found, return whatever is available instead,
298 possibly the empty string. Raise EOFError if the connection
299 is closed and no cooked data is available.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000300
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000301 """
302 n = len(match)
303 self.process_rawq()
Eric S. Raymond6b8c5282001-02-09 07:10:12 +0000304 i = self.cookedq.find(match)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000305 if i >= 0:
306 i = i+n
307 buf = self.cookedq[:i]
308 self.cookedq = self.cookedq[i:]
309 return buf
310 s_reply = ([self], [], [])
311 s_args = s_reply
312 if timeout is not None:
313 s_args = s_args + (timeout,)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000314 from time import time
315 time_start = time()
Guido van Rossum68468eb2003-02-27 20:14:51 +0000316 while not self.eof and select.select(*s_args) == s_reply:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000317 i = max(0, len(self.cookedq)-n)
318 self.fill_rawq()
319 self.process_rawq()
Eric S. Raymond6b8c5282001-02-09 07:10:12 +0000320 i = self.cookedq.find(match, i)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000321 if i >= 0:
322 i = i+n
323 buf = self.cookedq[:i]
324 self.cookedq = self.cookedq[i:]
325 return buf
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000326 if timeout is not None:
327 elapsed = time() - time_start
328 if elapsed >= timeout:
329 break
330 s_args = s_reply + (timeout-elapsed,)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000331 return self.read_very_lazy()
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000332
333 def read_all(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000334 """Read all data until EOF; block until connection closed."""
335 self.process_rawq()
336 while not self.eof:
337 self.fill_rawq()
338 self.process_rawq()
339 buf = self.cookedq
340 self.cookedq = ''
341 return buf
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000342
343 def read_some(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000344 """Read at least one byte of cooked data unless EOF is hit.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000345
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000346 Return '' if EOF is hit. Block if no data is immediately
347 available.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000348
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000349 """
350 self.process_rawq()
351 while not self.cookedq and not self.eof:
352 self.fill_rawq()
353 self.process_rawq()
354 buf = self.cookedq
355 self.cookedq = ''
356 return buf
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000357
358 def read_very_eager(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000359 """Read everything that's possible without blocking in I/O (eager).
Tim Petersb90f89a2001-01-15 03:26:36 +0000360
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000361 Raise EOFError if connection closed and no cooked data
362 available. Return '' if no cooked data available otherwise.
363 Don't block unless in the midst of an IAC sequence.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000364
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000365 """
366 self.process_rawq()
367 while not self.eof and self.sock_avail():
368 self.fill_rawq()
369 self.process_rawq()
370 return self.read_very_lazy()
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000371
372 def read_eager(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000373 """Read readily available data.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000374
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000375 Raise EOFError if connection closed and no cooked data
376 available. Return '' if no cooked data available otherwise.
377 Don't block unless in the midst of an IAC sequence.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000378
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000379 """
380 self.process_rawq()
381 while not self.cookedq and not self.eof and self.sock_avail():
382 self.fill_rawq()
383 self.process_rawq()
384 return self.read_very_lazy()
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000385
386 def read_lazy(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000387 """Process and return data that's already in the queues (lazy).
Tim Petersb90f89a2001-01-15 03:26:36 +0000388
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000389 Raise EOFError if connection closed and no data available.
390 Return '' if no cooked data available otherwise. Don't block
391 unless in the midst of an IAC sequence.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000392
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000393 """
394 self.process_rawq()
395 return self.read_very_lazy()
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000396
397 def read_very_lazy(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000398 """Return any data available in the cooked queue (very lazy).
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000399
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000400 Raise EOFError if connection closed and no data available.
401 Return '' if no cooked data available otherwise. Don't block.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000402
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000403 """
404 buf = self.cookedq
405 self.cookedq = ''
406 if not buf and self.eof and not self.rawq:
407 raise EOFError, 'telnet connection closed'
408 return buf
Tim Peters230a60c2002-11-09 05:08:07 +0000409
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000410 def read_sb_data(self):
411 """Return any data available in the SB ... SE queue.
412
Tim Peters230a60c2002-11-09 05:08:07 +0000413 Return '' if no SB ... SE available. Should only be called
414 after seeing a SB or SE command. When a new SB command is
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000415 found, old unread SB data will be discarded. Don't block.
416
417 """
418 buf = self.sbdataq
419 self.sbdataq = ''
420 return buf
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000421
Martin v. Löwisb0162f92001-09-06 08:51:38 +0000422 def set_option_negotiation_callback(self, callback):
423 """Provide a callback function called after each receipt of a telnet option."""
424 self.option_callback = callback
425
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000426 def process_rawq(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000427 """Transfer from raw queue to cooked queue.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000428
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000429 Set self.eof when connection is closed. Don't block unless in
430 the midst of an IAC sequence.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000431
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000432 """
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000433 buf = ['', '']
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000434 try:
435 while self.rawq:
436 c = self.rawq_getchar()
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000437 if not self.iacseq:
438 if c == theNULL:
439 continue
440 if c == "\021":
441 continue
442 if c != IAC:
443 buf[self.sb] = buf[self.sb] + c
444 continue
Martin v. Löwisb0162f92001-09-06 08:51:38 +0000445 else:
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000446 self.iacseq += c
447 elif len(self.iacseq) == 1:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000448 # 'IAC: IAC CMD [OPTION only for WILL/WONT/DO/DONT]'
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000449 if c in (DO, DONT, WILL, WONT):
450 self.iacseq += c
451 continue
Tim Peters230a60c2002-11-09 05:08:07 +0000452
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000453 self.iacseq = ''
454 if c == IAC:
455 buf[self.sb] = buf[self.sb] + c
Martin v. Löwisb0162f92001-09-06 08:51:38 +0000456 else:
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000457 if c == SB: # SB ... SE start.
458 self.sb = 1
459 self.sbdataq = ''
460 elif c == SE:
461 self.sb = 0
462 self.sbdataq = self.sbdataq + buf[1]
463 buf[1] = ''
464 if self.option_callback:
465 # Callback is supposed to look into
466 # the sbdataq
467 self.option_callback(self.sock, c, NOOPT)
468 else:
469 # We can't offer automatic processing of
470 # suboptions. Alas, we should not get any
471 # unless we did a WILL/DO before.
472 self.msg('IAC %d not recognized' % ord(c))
473 elif len(self.iacseq) == 2:
474 cmd = self.iacseq[1]
475 self.iacseq = ''
476 opt = c
477 if cmd in (DO, DONT):
Tim Peters230a60c2002-11-09 05:08:07 +0000478 self.msg('IAC %s %d',
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000479 cmd == DO and 'DO' or 'DONT', ord(opt))
480 if self.option_callback:
481 self.option_callback(self.sock, cmd, opt)
482 else:
483 self.sock.sendall(IAC + WONT + opt)
484 elif cmd in (WILL, WONT):
485 self.msg('IAC %s %d',
486 cmd == WILL and 'WILL' or 'WONT', ord(opt))
487 if self.option_callback:
488 self.option_callback(self.sock, cmd, opt)
489 else:
490 self.sock.sendall(IAC + DONT + opt)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000491 except EOFError: # raised by self.rawq_getchar()
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000492 self.iacseq = '' # Reset on EOF
493 self.sb = 0
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000494 pass
Martin v. Löwis1da9c572002-11-04 09:56:00 +0000495 self.cookedq = self.cookedq + buf[0]
496 self.sbdataq = self.sbdataq + buf[1]
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000497
498 def rawq_getchar(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000499 """Get next char from raw queue.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000500
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000501 Block if no data is immediately available. Raise EOFError
502 when connection is closed.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000503
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000504 """
505 if not self.rawq:
506 self.fill_rawq()
507 if self.eof:
508 raise EOFError
509 c = self.rawq[self.irawq]
510 self.irawq = self.irawq + 1
511 if self.irawq >= len(self.rawq):
512 self.rawq = ''
513 self.irawq = 0
514 return c
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000515
516 def fill_rawq(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000517 """Fill raw queue from exactly one recv() system call.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000518
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000519 Block if no data is immediately available. Set self.eof when
520 connection is closed.
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000521
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000522 """
523 if self.irawq >= len(self.rawq):
524 self.rawq = ''
525 self.irawq = 0
526 # The buffer size should be fairly small so as to avoid quadratic
527 # behavior in process_rawq() above
528 buf = self.sock.recv(50)
Walter Dörwald70a6b492004-02-12 17:35:32 +0000529 self.msg("recv %r", buf)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000530 self.eof = (not buf)
531 self.rawq = self.rawq + buf
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000532
533 def sock_avail(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000534 """Test whether data is available on the socket."""
535 return select.select([self], [], [], 0) == ([self], [], [])
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000536
537 def interact(self):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000538 """Interaction function, emulates a very dumb telnet client."""
Guido van Rossum82eae9e1998-12-23 23:04:17 +0000539 if sys.platform == "win32":
540 self.mt_interact()
541 return
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000542 while 1:
543 rfd, wfd, xfd = select.select([self, sys.stdin], [], [])
544 if self in rfd:
545 try:
546 text = self.read_eager()
547 except EOFError:
548 print '*** Connection closed by remote host ***'
549 break
550 if text:
551 sys.stdout.write(text)
552 sys.stdout.flush()
553 if sys.stdin in rfd:
554 line = sys.stdin.readline()
555 if not line:
556 break
557 self.write(line)
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000558
Guido van Rossum82eae9e1998-12-23 23:04:17 +0000559 def mt_interact(self):
560 """Multithreaded version of interact()."""
561 import thread
562 thread.start_new_thread(self.listener, ())
563 while 1:
564 line = sys.stdin.readline()
565 if not line:
566 break
567 self.write(line)
568
569 def listener(self):
570 """Helper for mt_interact() -- this executes in the other thread."""
571 while 1:
572 try:
573 data = self.read_eager()
574 except EOFError:
575 print '*** Connection closed by remote host ***'
576 return
577 if data:
578 sys.stdout.write(data)
579 else:
580 sys.stdout.flush()
581
Guido van Rossumccb5ec61997-12-24 22:24:19 +0000582 def expect(self, list, timeout=None):
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000583 """Read until one from a list of a regular expressions matches.
Guido van Rossumccb5ec61997-12-24 22:24:19 +0000584
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000585 The first argument is a list of regular expressions, either
586 compiled (re.RegexObject instances) or uncompiled (strings).
587 The optional second argument is a timeout, in seconds; default
588 is no timeout.
Guido van Rossumccb5ec61997-12-24 22:24:19 +0000589
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000590 Return a tuple of three items: the index in the list of the
591 first regular expression that matches; the match object
592 returned; and the text read up till and including the match.
Guido van Rossumccb5ec61997-12-24 22:24:19 +0000593
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000594 If EOF is read and no text was read, raise EOFError.
595 Otherwise, when nothing matches, return (-1, None, text) where
596 text is the text received so far (may be the empty string if a
597 timeout happened).
Guido van Rossumccb5ec61997-12-24 22:24:19 +0000598
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000599 If a regular expression ends with a greedy match (e.g. '.*')
600 or if more than one expression can match the same input, the
601 results are undeterministic, and may depend on the I/O timing.
Guido van Rossumccb5ec61997-12-24 22:24:19 +0000602
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000603 """
604 re = None
605 list = list[:]
606 indices = range(len(list))
607 for i in indices:
608 if not hasattr(list[i], "search"):
609 if not re: import re
610 list[i] = re.compile(list[i])
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000611 if timeout is not None:
612 from time import time
613 time_start = time()
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000614 while 1:
615 self.process_rawq()
616 for i in indices:
617 m = list[i].search(self.cookedq)
618 if m:
619 e = m.end()
620 text = self.cookedq[:e]
621 self.cookedq = self.cookedq[e:]
622 return (i, m, text)
623 if self.eof:
624 break
625 if timeout is not None:
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000626 elapsed = time() - time_start
627 if elapsed >= timeout:
628 break
629 s_args = ([self.fileno()], [], [], timeout-elapsed)
630 r, w, x = select.select(*s_args)
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000631 if not r:
632 break
633 self.fill_rawq()
634 text = self.read_very_lazy()
635 if not text and self.eof:
636 raise EOFError
637 return (-1, None, text)
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000638
639
640def test():
641 """Test program for telnetlib.
642
643 Usage: python telnetlib.py [-d] ... [host [port]]
644
645 Default host is localhost; default port is 23.
646
647 """
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000648 debuglevel = 0
649 while sys.argv[1:] and sys.argv[1] == '-d':
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000650 debuglevel = debuglevel+1
651 del sys.argv[1]
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000652 host = 'localhost'
653 if sys.argv[1:]:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000654 host = sys.argv[1]
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000655 port = 0
656 if sys.argv[2:]:
Guido van Rossum45e2fbc1998-03-26 21:13:24 +0000657 portstr = sys.argv[2]
658 try:
659 port = int(portstr)
660 except ValueError:
661 port = socket.getservbyname(portstr, 'tcp')
Guido van Rossumb9b50eb1997-12-24 21:07:04 +0000662 tn = Telnet()
663 tn.set_debuglevel(debuglevel)
664 tn.open(host, port)
665 tn.interact()
666 tn.close()
667
668if __name__ == '__main__':
669 test()