rubysl-net-telnet 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d353089dab3645fd5ca605d81306dfcebd266b6
4
- data.tar.gz: e7ca71d78d8d85227baaea39533740ac5b55ea63
3
+ metadata.gz: 8967a940f0b7bd40863d0c33da78c9b4695c9620
4
+ data.tar.gz: 9f57926d7208c5c1a112f27c63fbb63988ac2e93
5
5
  SHA512:
6
- metadata.gz: 53b69e7936e45819196ebe17322e132769d14790fb910f77d4681cbdf3e0e5d97570ba1f33597f4b862cd585547e5c92a5842c2dd1312afd540acf9d6103d059
7
- data.tar.gz: 3540d9a078d8671651859ac4b2417e3c79dd884e4ea19fba34d21d1d582a10b1916ee3a1727a99ac6296d5cf08e687c40927871b48ae720db4cf07e83c20d8fd
6
+ metadata.gz: 84a1ed324893d9a06243a9d69169e8c80d95f3920bb94a6c1e17afef00f0edef341fb815ab5f15c398e3bcc2fa22df4a9b3ff5443beb4fc955ec7fc9749ae7c9
7
+ data.tar.gz: 7293c743dc6834d10de079127fb578fd8ea2a59f78d4bc67afd949a5557bfdf97f874422d878f5b0cc8e0a17cb6acdc484ec4abaa627170a26d3e8993497a467
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
- before_install:
3
- - gem update --system
4
- - gem --version
5
- - gem install rubysl-bundler
6
- script: bundle exec mspec spec
2
+ env:
3
+ - RUBYLIB=lib
4
+ script: bundle exec mspec
7
5
  rvm:
8
- - rbx-nightly-18mode
6
+ - 1.9.3
7
+ - rbx-nightly-19mode
@@ -1,7 +1,7 @@
1
1
  # = net/telnet.rb - Simple Telnet Client Library
2
- #
2
+ #
3
3
  # Author:: Wakou Aoyama <wakou@ruby-lang.org>
4
- # Documentation:: William Webber and Wakou Aoyama
4
+ # Documentation:: William Webber and Wakou Aoyama
5
5
  #
6
6
  # This file holds the class Net::Telnet, which provides client-side
7
7
  # telnet functionality.
@@ -9,11 +9,9 @@
9
9
  # For documentation, see Net::Telnet.
10
10
  #
11
11
 
12
- require "socket"
13
- require "delegate"
14
- require "timeout"
12
+ require "net/protocol"
15
13
  require "English"
16
-
14
+
17
15
  module Net
18
16
 
19
17
  #
@@ -50,11 +48,11 @@ module Net
50
48
  # have to handle authentication yourself.
51
49
  #
52
50
  # For some protocols, it will be possible to specify the +Prompt+
53
- # option once when you create the Telnet object and use #cmd() calls;
51
+ # option once when you create the Telnet object and use #cmd() calls;
54
52
  # for others, you will have to specify the response sequence to
55
53
  # look for as the Match option to every #cmd() call, or call
56
- # #puts() and #waitfor() directly; for yet others, you will have
57
- # to use #sysread() instead of #waitfor() and parse server
54
+ # #puts() and #waitfor() directly; for yet others, you will have
55
+ # to use #sysread() instead of #waitfor() and parse server
58
56
  # responses yourself.
59
57
  #
60
58
  # It is worth noting that when you create a new Net::Telnet object,
@@ -63,21 +61,21 @@ module Net
63
61
  # to already open sockets, or to any read-write IO object. This
64
62
  # can be useful, for instance, for setting up a test fixture for
65
63
  # unit testing.
66
- #
64
+ #
67
65
  # == Examples
68
- #
66
+ #
69
67
  # === Log in and send a command, echoing all output to stdout
70
- #
68
+ #
71
69
  # localhost = Net::Telnet::new("Host" => "localhost",
72
70
  # "Timeout" => 10,
73
71
  # "Prompt" => /[$%#>] \z/n)
74
72
  # localhost.login("username", "password") { |c| print c }
75
73
  # localhost.cmd("command") { |c| print c }
76
74
  # localhost.close
77
- #
78
- #
75
+ #
76
+ #
79
77
  # === Check a POP server to see if you have mail
80
- #
78
+ #
81
79
  # pop = Net::Telnet::new("Host" => "your_destination_host_here",
82
80
  # "Port" => 110,
83
81
  # "Telnetmode" => false,
@@ -93,77 +91,77 @@ module Net
93
91
  # of relevant RFCs, see
94
92
  # http://www.omnifarious.org/~hopper/technical/telnet-rfc.html
95
93
  #
96
- class Telnet < SimpleDelegator
94
+ class Telnet
97
95
 
98
96
  # :stopdoc:
99
97
  IAC = 255.chr # "\377" # "\xff" # interpret as command
100
- DONT = 254.chr # "\376" # "\xfe" # you are not to use option
101
- DO = 253.chr # "\375" # "\xfd" # please, you use option
102
- WONT = 252.chr # "\374" # "\xfc" # I won't use option
103
- WILL = 251.chr # "\373" # "\xfb" # I will use option
104
- SB = 250.chr # "\372" # "\xfa" # interpret as subnegotiation
105
- GA = 249.chr # "\371" # "\xf9" # you may reverse the line
106
- EL = 248.chr # "\370" # "\xf8" # erase the current line
107
- EC = 247.chr # "\367" # "\xf7" # erase the current character
108
- AYT = 246.chr # "\366" # "\xf6" # are you there
109
- AO = 245.chr # "\365" # "\xf5" # abort output--but let prog finish
110
- IP = 244.chr # "\364" # "\xf4" # interrupt process--permanently
111
- BREAK = 243.chr # "\363" # "\xf3" # break
112
- DM = 242.chr # "\362" # "\xf2" # data mark--for connect. cleaning
113
- NOP = 241.chr # "\361" # "\xf1" # nop
114
- SE = 240.chr # "\360" # "\xf0" # end sub negotiation
115
- EOR = 239.chr # "\357" # "\xef" # end of record (transparent mode)
116
- ABORT = 238.chr # "\356" # "\xee" # Abort process
117
- SUSP = 237.chr # "\355" # "\xed" # Suspend process
118
- EOF = 236.chr # "\354" # "\xec" # End of file
119
- SYNCH = 242.chr # "\362" # "\xf2" # for telfunc calls
120
-
121
- OPT_BINARY = 0.chr # "\000" # "\x00" # Binary Transmission
122
- OPT_ECHO = 1.chr # "\001" # "\x01" # Echo
123
- OPT_RCP = 2.chr # "\002" # "\x02" # Reconnection
124
- OPT_SGA = 3.chr # "\003" # "\x03" # Suppress Go Ahead
125
- OPT_NAMS = 4.chr # "\004" # "\x04" # Approx Message Size Negotiation
126
- OPT_STATUS = 5.chr # "\005" # "\x05" # Status
127
- OPT_TM = 6.chr # "\006" # "\x06" # Timing Mark
128
- OPT_RCTE = 7.chr # "\a" # "\x07" # Remote Controlled Trans and Echo
129
- OPT_NAOL = 8.chr # "\010" # "\x08" # Output Line Width
130
- OPT_NAOP = 9.chr # "\t" # "\x09" # Output Page Size
131
- OPT_NAOCRD = 10.chr # "\n" # "\x0a" # Output Carriage-Return Disposition
132
- OPT_NAOHTS = 11.chr # "\v" # "\x0b" # Output Horizontal Tab Stops
133
- OPT_NAOHTD = 12.chr # "\f" # "\x0c" # Output Horizontal Tab Disposition
134
- OPT_NAOFFD = 13.chr # "\r" # "\x0d" # Output Formfeed Disposition
135
- OPT_NAOVTS = 14.chr # "\016" # "\x0e" # Output Vertical Tabstops
136
- OPT_NAOVTD = 15.chr # "\017" # "\x0f" # Output Vertical Tab Disposition
137
- OPT_NAOLFD = 16.chr # "\020" # "\x10" # Output Linefeed Disposition
138
- OPT_XASCII = 17.chr # "\021" # "\x11" # Extended ASCII
139
- OPT_LOGOUT = 18.chr # "\022" # "\x12" # Logout
140
- OPT_BM = 19.chr # "\023" # "\x13" # Byte Macro
141
- OPT_DET = 20.chr # "\024" # "\x14" # Data Entry Terminal
142
- OPT_SUPDUP = 21.chr # "\025" # "\x15" # SUPDUP
143
- OPT_SUPDUPOUTPUT = 22.chr # "\026" # "\x16" # SUPDUP Output
144
- OPT_SNDLOC = 23.chr # "\027" # "\x17" # Send Location
145
- OPT_TTYPE = 24.chr # "\030" # "\x18" # Terminal Type
146
- OPT_EOR = 25.chr # "\031" # "\x19" # End of Record
147
- OPT_TUID = 26.chr # "\032" # "\x1a" # TACACS User Identification
148
- OPT_OUTMRK = 27.chr # "\e" # "\x1b" # Output Marking
149
- OPT_TTYLOC = 28.chr # "\034" # "\x1c" # Terminal Location Number
150
- OPT_3270REGIME = 29.chr # "\035" # "\x1d" # Telnet 3270 Regime
151
- OPT_X3PAD = 30.chr # "\036" # "\x1e" # X.3 PAD
152
- OPT_NAWS = 31.chr # "\037" # "\x1f" # Negotiate About Window Size
153
- OPT_TSPEED = 32.chr # " " # "\x20" # Terminal Speed
154
- OPT_LFLOW = 33.chr # "!" # "\x21" # Remote Flow Control
155
- OPT_LINEMODE = 34.chr # "\"" # "\x22" # Linemode
156
- OPT_XDISPLOC = 35.chr # "#" # "\x23" # X Display Location
157
- OPT_OLD_ENVIRON = 36.chr # "$" # "\x24" # Environment Option
158
- OPT_AUTHENTICATION = 37.chr # "%" # "\x25" # Authentication Option
159
- OPT_ENCRYPT = 38.chr # "&" # "\x26" # Encryption Option
160
- OPT_NEW_ENVIRON = 39.chr # "'" # "\x27" # New Environment Option
161
- OPT_EXOPL = 255.chr # "\377" # "\xff" # Extended-Options-List
162
-
163
- NULL = "\000"
164
- CR = "\015"
165
- LF = "\012"
166
- EOL = CR + LF
98
+ DONT = 254.chr # "\376" # "\xfe" # you are not to use option
99
+ DO = 253.chr # "\375" # "\xfd" # please, you use option
100
+ WONT = 252.chr # "\374" # "\xfc" # I won't use option
101
+ WILL = 251.chr # "\373" # "\xfb" # I will use option
102
+ SB = 250.chr # "\372" # "\xfa" # interpret as subnegotiation
103
+ GA = 249.chr # "\371" # "\xf9" # you may reverse the line
104
+ EL = 248.chr # "\370" # "\xf8" # erase the current line
105
+ EC = 247.chr # "\367" # "\xf7" # erase the current character
106
+ AYT = 246.chr # "\366" # "\xf6" # are you there
107
+ AO = 245.chr # "\365" # "\xf5" # abort output--but let prog finish
108
+ IP = 244.chr # "\364" # "\xf4" # interrupt process--permanently
109
+ BREAK = 243.chr # "\363" # "\xf3" # break
110
+ DM = 242.chr # "\362" # "\xf2" # data mark--for connect. cleaning
111
+ NOP = 241.chr # "\361" # "\xf1" # nop
112
+ SE = 240.chr # "\360" # "\xf0" # end sub negotiation
113
+ EOR = 239.chr # "\357" # "\xef" # end of record (transparent mode)
114
+ ABORT = 238.chr # "\356" # "\xee" # Abort process
115
+ SUSP = 237.chr # "\355" # "\xed" # Suspend process
116
+ EOF = 236.chr # "\354" # "\xec" # End of file
117
+ SYNCH = 242.chr # "\362" # "\xf2" # for telfunc calls
118
+
119
+ OPT_BINARY = 0.chr # "\000" # "\x00" # Binary Transmission
120
+ OPT_ECHO = 1.chr # "\001" # "\x01" # Echo
121
+ OPT_RCP = 2.chr # "\002" # "\x02" # Reconnection
122
+ OPT_SGA = 3.chr # "\003" # "\x03" # Suppress Go Ahead
123
+ OPT_NAMS = 4.chr # "\004" # "\x04" # Approx Message Size Negotiation
124
+ OPT_STATUS = 5.chr # "\005" # "\x05" # Status
125
+ OPT_TM = 6.chr # "\006" # "\x06" # Timing Mark
126
+ OPT_RCTE = 7.chr # "\a" # "\x07" # Remote Controlled Trans and Echo
127
+ OPT_NAOL = 8.chr # "\010" # "\x08" # Output Line Width
128
+ OPT_NAOP = 9.chr # "\t" # "\x09" # Output Page Size
129
+ OPT_NAOCRD = 10.chr # "\n" # "\x0a" # Output Carriage-Return Disposition
130
+ OPT_NAOHTS = 11.chr # "\v" # "\x0b" # Output Horizontal Tab Stops
131
+ OPT_NAOHTD = 12.chr # "\f" # "\x0c" # Output Horizontal Tab Disposition
132
+ OPT_NAOFFD = 13.chr # "\r" # "\x0d" # Output Formfeed Disposition
133
+ OPT_NAOVTS = 14.chr # "\016" # "\x0e" # Output Vertical Tabstops
134
+ OPT_NAOVTD = 15.chr # "\017" # "\x0f" # Output Vertical Tab Disposition
135
+ OPT_NAOLFD = 16.chr # "\020" # "\x10" # Output Linefeed Disposition
136
+ OPT_XASCII = 17.chr # "\021" # "\x11" # Extended ASCII
137
+ OPT_LOGOUT = 18.chr # "\022" # "\x12" # Logout
138
+ OPT_BM = 19.chr # "\023" # "\x13" # Byte Macro
139
+ OPT_DET = 20.chr # "\024" # "\x14" # Data Entry Terminal
140
+ OPT_SUPDUP = 21.chr # "\025" # "\x15" # SUPDUP
141
+ OPT_SUPDUPOUTPUT = 22.chr # "\026" # "\x16" # SUPDUP Output
142
+ OPT_SNDLOC = 23.chr # "\027" # "\x17" # Send Location
143
+ OPT_TTYPE = 24.chr # "\030" # "\x18" # Terminal Type
144
+ OPT_EOR = 25.chr # "\031" # "\x19" # End of Record
145
+ OPT_TUID = 26.chr # "\032" # "\x1a" # TACACS User Identification
146
+ OPT_OUTMRK = 27.chr # "\e" # "\x1b" # Output Marking
147
+ OPT_TTYLOC = 28.chr # "\034" # "\x1c" # Terminal Location Number
148
+ OPT_3270REGIME = 29.chr # "\035" # "\x1d" # Telnet 3270 Regime
149
+ OPT_X3PAD = 30.chr # "\036" # "\x1e" # X.3 PAD
150
+ OPT_NAWS = 31.chr # "\037" # "\x1f" # Negotiate About Window Size
151
+ OPT_TSPEED = 32.chr # " " # "\x20" # Terminal Speed
152
+ OPT_LFLOW = 33.chr # "!" # "\x21" # Remote Flow Control
153
+ OPT_LINEMODE = 34.chr # "\"" # "\x22" # Linemode
154
+ OPT_XDISPLOC = 35.chr # "#" # "\x23" # X Display Location
155
+ OPT_OLD_ENVIRON = 36.chr # "$" # "\x24" # Environment Option
156
+ OPT_AUTHENTICATION = 37.chr # "%" # "\x25" # Authentication Option
157
+ OPT_ENCRYPT = 38.chr # "&" # "\x26" # Encryption Option
158
+ OPT_NEW_ENVIRON = 39.chr # "'" # "\x27" # New Environment Option
159
+ OPT_EXOPL = 255.chr # "\377" # "\xff" # Extended-Options-List
160
+
161
+ NULL = "\000"
162
+ CR = "\015"
163
+ LF = "\012"
164
+ EOL = CR + LF
167
165
  REVISION = '$Id$'
168
166
  # :startdoc:
169
167
 
@@ -174,13 +172,13 @@ module Net
174
172
  # provided: see below). If a block is provided, it is yielded
175
173
  # status messages on the attempt to connect to the server, of
176
174
  # the form:
177
- #
175
+ #
178
176
  # Trying localhost...
179
177
  # Connected to localhost.
180
178
  #
181
179
  # +options+ is a hash of options. The following example lists
182
180
  # all options and their default values.
183
- #
181
+ #
184
182
  # host = Net::Telnet::new(
185
183
  # "Host" => "localhost", # default: "localhost"
186
184
  # "Port" => 23, # default: 23
@@ -198,16 +196,16 @@ module Net
198
196
  #
199
197
  # The options have the following meanings:
200
198
  #
201
- # Host:: the hostname or IP address of the host to connect to, as a String.
199
+ # Host:: the hostname or IP address of the host to connect to, as a String.
202
200
  # Defaults to "localhost".
203
201
  #
204
202
  # Port:: the port to connect to. Defaults to 23.
205
203
  #
206
- # Binmode:: if false (the default), newline substitution is performed.
204
+ # Binmode:: if false (the default), newline substitution is performed.
207
205
  # Outgoing LF is
208
206
  # converted to CRLF, and incoming CRLF is converted to LF. If
209
207
  # true, this substitution is not performed. This value can
210
- # also be set with the #binmode() method. The
208
+ # also be set with the #binmode() method. The
211
209
  # outgoing conversion only applies to the #puts() and #print()
212
210
  # methods, not the #write() method. The precise nature of
213
211
  # the newline conversion is also affected by the telnet options
@@ -217,13 +215,13 @@ module Net
217
215
  # and all received traffic to. In the case of a proper
218
216
  # Telnet session, this will include the client input as
219
217
  # echoed by the host; otherwise, it only includes server
220
- # responses. Output is appended verbatim to this file.
218
+ # responses. Output is appended verbatim to this file.
221
219
  # By default, no output log is kept.
222
220
  #
223
221
  # Dump_log:: as for Output_log, except that output is written in hexdump
224
222
  # format (16 bytes per line as hex pairs, followed by their
225
223
  # printable equivalent), with connection status messages
226
- # preceded by '#', sent traffic preceded by '>', and
224
+ # preceded by '#', sent traffic preceded by '>', and
227
225
  # received traffic preceded by '<'. By default, not dump log
228
226
  # is kept.
229
227
  #
@@ -233,7 +231,7 @@ module Net
233
231
  # ready to receive a new command. By default, this regular
234
232
  # expression is /[$%#>] \z/n.
235
233
  #
236
- # Telnetmode:: a boolean value, true by default. In telnet mode,
234
+ # Telnetmode:: a boolean value, true by default. In telnet mode,
237
235
  # traffic received from the host is parsed for special
238
236
  # command sequences, and these sequences are escaped
239
237
  # in outgoing traffic sent using #puts() or #print()
@@ -245,21 +243,21 @@ module Net
245
243
  #
246
244
  # Timeout:: the number of seconds to wait before timing out both the
247
245
  # initial attempt to connect to host (in this constructor),
248
- # and all attempts to read data from the host (in #waitfor(),
249
- # #cmd(), and #login()). Exceeding this timeout causes a
250
- # TimeoutError to be raised. The default value is 10 seconds.
246
+ # which raises a Net::OpenTimeout, and all attempts to read data
247
+ # from the host, which raises a Net::ReadTimeout (in #waitfor(),
248
+ # #cmd(), and #login()). The default value is 10 seconds.
251
249
  # You can disable the timeout by setting this value to false.
252
250
  # In this case, the connect attempt will eventually timeout
253
251
  # on the underlying connect(2) socket call with an
254
252
  # Errno::ETIMEDOUT error (but generally only after a few
255
253
  # minutes), but other attempts to read data from the host
256
- # will hand indefinitely if no data is forthcoming.
254
+ # will hang indefinitely if no data is forthcoming.
257
255
  #
258
- # Waittime:: the amount of time to wait after seeing what looks like a
256
+ # Waittime:: the amount of time to wait after seeing what looks like a
259
257
  # prompt (that is, received data that matches the Prompt
260
258
  # option regular expression) to see if more data arrives.
261
259
  # If more data does arrive in this time, Net::Telnet assumes
262
- # that what it saw was not really a prompt. This is to try to
260
+ # that what it saw was not really a prompt. This is to try to
263
261
  # avoid false matches, but it can also lead to missing real
264
262
  # prompts (if, for instance, a background process writes to
265
263
  # the terminal soon after the prompt is displayed). By
@@ -267,12 +265,12 @@ module Net
267
265
  #
268
266
  # Proxy:: a proxy object to used instead of opening a direct connection
269
267
  # to the host. Must be either another Net::Telnet object or
270
- # an IO object. If it is another Net::Telnet object, this
268
+ # an IO object. If it is another Net::Telnet object, this
271
269
  # instance will use that one's socket for communication. If an
272
270
  # IO object, it is used directly for communication. Any other
273
271
  # kind of object will cause an error to be raised.
274
272
  #
275
- def initialize(options) # :yield: mesg
273
+ def initialize(options) # :yield: mesg
276
274
  @options = options
277
275
  @options["Host"] = "localhost" unless @options.has_key?("Host")
278
276
  @options["Port"] = 23 unless @options.has_key?("Port")
@@ -280,7 +278,7 @@ module Net
280
278
  @options["Timeout"] = 10 unless @options.has_key?("Timeout")
281
279
  @options["Waittime"] = 0 unless @options.has_key?("Waittime")
282
280
  unless @options.has_key?("Binmode")
283
- @options["Binmode"] = false
281
+ @options["Binmode"] = false
284
282
  else
285
283
  unless (true == @options["Binmode"] or false == @options["Binmode"])
286
284
  raise ArgumentError, "Binmode option must be true or false"
@@ -288,7 +286,7 @@ module Net
288
286
  end
289
287
 
290
288
  unless @options.has_key?("Telnetmode")
291
- @options["Telnetmode"] = true
289
+ @options["Telnetmode"] = true
292
290
  else
293
291
  unless (true == @options["Telnetmode"] or false == @options["Telnetmode"])
294
292
  raise ArgumentError, "Telnetmode option must be true or false"
@@ -348,12 +346,12 @@ module Net
348
346
  if @options["Timeout"] == false
349
347
  @sock = TCPSocket.open(@options["Host"], @options["Port"])
350
348
  else
351
- timeout(@options["Timeout"]) do
349
+ Timeout.timeout(@options["Timeout"], Net::OpenTimeout) do
352
350
  @sock = TCPSocket.open(@options["Host"], @options["Port"])
353
351
  end
354
352
  end
355
- rescue TimeoutError
356
- raise TimeoutError, "timed out while opening a connection to the host"
353
+ rescue Net::OpenTimeout
354
+ raise Net::OpenTimeout, "timed out while opening a connection to the host"
357
355
  rescue
358
356
  @log.write($ERROR_INFO.to_s + "\n") if @options.has_key?("Output_log")
359
357
  @dumplog.log_dump('#', $ERROR_INFO.to_s + "\n") if @options.has_key?("Dump_log")
@@ -368,13 +366,12 @@ module Net
368
366
  @dumplog.log_dump('#', message) if @options.has_key?("Dump_log")
369
367
  end
370
368
 
371
- super(@sock)
372
369
  end # initialize
373
370
 
374
371
  # The socket the Telnet object is using. Note that this object becomes
375
372
  # a delegate of the Telnet object, so normally you invoke its methods
376
373
  # directly on the Telnet object.
377
- attr :sock
374
+ attr :sock
378
375
 
379
376
  # Set telnet command interpretation on (+mode+ == true) or off
380
377
  # (+mode+ == false), or return the current value (+mode+ not
@@ -408,7 +405,7 @@ module Net
408
405
  def binmode(mode = nil)
409
406
  case mode
410
407
  when nil
411
- @options["Binmode"]
408
+ @options["Binmode"]
412
409
  when true, false
413
410
  @options["Binmode"] = mode
414
411
  else
@@ -428,7 +425,7 @@ module Net
428
425
  # Preprocess received data from the host.
429
426
  #
430
427
  # Performs newline conversion and detects telnet command sequences.
431
- # Called automatically by #waitfor(). You should only use this
428
+ # Called automatically by #waitfor(). You should only use this
432
429
  # method yourself if you have read input directly using sysread()
433
430
  # or similar, and even then only if in telnet mode.
434
431
  def preprocess(string)
@@ -438,6 +435,9 @@ module Net
438
435
  # combine EOL into "\n"
439
436
  string = string.gsub(/#{EOL}/no, "\n") unless @options["Binmode"]
440
437
 
438
+ # remove NULL
439
+ string = string.gsub(/#{NULL}/no, '') unless @options["Binmode"]
440
+
441
441
  string.gsub(/#{IAC}(
442
442
  [#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]|
443
443
  [#{DO}#{DONT}#{WILL}#{WONT}]
@@ -491,9 +491,9 @@ module Net
491
491
  # Read data from the host until a certain sequence is matched.
492
492
  #
493
493
  # If a block is given, the received data will be yielded as it
494
- # is read in (not necessarily all in one go), or nil if EOF
494
+ # is read in (not necessarily all in one go), or nil if EOF
495
495
  # occurs before any data is received. Whether a block is given
496
- # or not, all data read will be returned in a single string, or again
496
+ # or not, all data read will be returned in a single string, or again
497
497
  # nil if EOF occurs before any data is received. Note that
498
498
  # received data includes the matched sequence we were looking for.
499
499
  #
@@ -507,7 +507,7 @@ module Net
507
507
  # into a regular expression. Used only if Match and
508
508
  # Prompt are not specified.
509
509
  # Timeout:: the number of seconds to wait for data from the host
510
- # before raising a TimeoutError. If set to false,
510
+ # before raising a Timeout::Error. If set to false,
511
511
  # no timeout will occur. If not specified, the
512
512
  # Timeout option value specified when this instance
513
513
  # was created will be used, or, failing that, the
@@ -524,7 +524,7 @@ module Net
524
524
  # EOFError will be raised. Otherwise, defaults to the old
525
525
  # behaviour that the function will return whatever data
526
526
  # has been received already, or nil if nothing was received.
527
- #
527
+ #
528
528
  def waitfor(options) # :yield: recvdata
529
529
  time_out = @options["Timeout"]
530
530
  waittime = @options["Waittime"]
@@ -554,15 +554,15 @@ module Net
554
554
  rest = ''
555
555
  until(prompt === line and not IO::select([@sock], nil, nil, waittime))
556
556
  unless IO::select([@sock], nil, nil, time_out)
557
- raise TimeoutError, "timed out while waiting for more data"
557
+ raise Net::ReadTimeout, "timed out while waiting for more data"
558
558
  end
559
559
  begin
560
560
  c = @sock.readpartial(1024 * 1024)
561
561
  @dumplog.log_dump('<', c) if @options.has_key?("Dump_log")
562
562
  if @options["Telnetmode"]
563
563
  c = rest + c
564
- if Integer(c.rindex(/#{IAC}#{SE}/no)) <
565
- Integer(c.rindex(/#{IAC}#{SB}/no))
564
+ if Integer(c.rindex(/#{IAC}#{SE}/no) || 0) <
565
+ Integer(c.rindex(/#{IAC}#{SB}/no) || 0)
566
566
  buf = preprocess(c[0 ... c.rindex(/#{IAC}#{SB}/no)])
567
567
  rest = c[c.rindex(/#{IAC}#{SB}/no) .. -1]
568
568
  elsif pt = c.rindex(/#{IAC}[^#{IAC}#{AO}#{AYT}#{DM}#{IP}#{NOP}]?\z/no) ||
@@ -619,7 +619,7 @@ module Net
619
619
  # Sends a string to the host.
620
620
  #
621
621
  # This does _not_ automatically append a newline to the string. Embedded
622
- # newlines may be converted and telnet command sequences escaped
622
+ # newlines may be converted and telnet command sequences escaped
623
623
  # depending upon the values of telnetmode, binmode, and telnet options
624
624
  # set by the host.
625
625
  def print(string)
@@ -654,7 +654,7 @@ module Net
654
654
  # data until is sees the prompt or other matched sequence.
655
655
  #
656
656
  # If a block is given, the received data will be yielded to it as
657
- # it is read in. Whether a block is given or not, the received data
657
+ # it is read in. Whether a block is given or not, the received data
658
658
  # will be return as a string. Note that the received data includes
659
659
  # the prompt and in most cases the host's echo of our command.
660
660
  #
@@ -678,20 +678,22 @@ module Net
678
678
  def cmd(options) # :yield: recvdata
679
679
  match = @options["Prompt"]
680
680
  time_out = @options["Timeout"]
681
+ fail_eof = @options["FailEOF"]
681
682
 
682
683
  if options.kind_of?(Hash)
683
684
  string = options["String"]
684
685
  match = options["Match"] if options.has_key?("Match")
685
686
  time_out = options["Timeout"] if options.has_key?("Timeout")
687
+ fail_eof = options["FailEOF"] if options.has_key?("FailEOF")
686
688
  else
687
689
  string = options
688
690
  end
689
691
 
690
692
  self.puts(string)
691
693
  if block_given?
692
- waitfor({"Prompt" => match, "Timeout" => time_out}){|c| yield c }
694
+ waitfor({"Prompt" => match, "Timeout" => time_out, "FailEOF" => fail_eof}){|c| yield c }
693
695
  else
694
- waitfor({"Prompt" => match, "Timeout" => time_out})
696
+ waitfor({"Prompt" => match, "Timeout" => time_out, "FailEOF" => fail_eof})
695
697
  end
696
698
  end
697
699
 
@@ -699,7 +701,7 @@ module Net
699
701
  #
700
702
  # The username and password can either be provided as two string
701
703
  # arguments in that order, or as a hash with keys "Name" and
702
- # "Password".
704
+ # "Password".
703
705
  #
704
706
  # This method looks for the strings "login" and "Password" from the
705
707
  # host to determine when to send the username and password. If the
@@ -723,8 +725,8 @@ module Net
723
725
  if options.kind_of?(Hash)
724
726
  username = options["Name"]
725
727
  password = options["Password"]
726
- login_prompt = options["LoginPrompt"] if options["LoginPrompt"]
727
- password_prompt = options["PasswordPrompt"] if options["PasswordPrompt"]
728
+ login_prompt = options["LoginPrompt"] if options["LoginPrompt"]
729
+ password_prompt = options["PasswordPrompt"] if options["PasswordPrompt"]
728
730
  else
729
731
  username = options
730
732
  end
@@ -751,6 +753,11 @@ module Net
751
753
  line
752
754
  end
753
755
 
756
+ # Closes the connection
757
+ def close
758
+ @sock.close
759
+ end
760
+
754
761
  end # class Telnet
755
762
  end # module Net
756
763
 
@@ -1,7 +1,7 @@
1
1
  module RubySL
2
2
  module Net
3
3
  module Telnet
4
- VERSION = "1.0.0"
4
+ VERSION = "2.0.0"
5
5
  end
6
6
  end
7
7
  end
@@ -19,5 +19,4 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency "bundler", "~> 1.3"
20
20
  spec.add_development_dependency "rake", "~> 10.0"
21
21
  spec.add_development_dependency "mspec", "~> 1.5"
22
- spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
23
- end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-net-telnet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-26 00:00:00.000000000 Z
11
+ date: 2013-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.5'
55
- - !ruby/object:Gem::Dependency
56
- name: rubysl-prettyprint
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ~>
60
- - !ruby/object:Gem::Version
61
- version: '1.0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ~>
67
- - !ruby/object:Gem::Version
68
- version: '1.0'
69
55
  description: Ruby standard library telnet.
70
56
  email:
71
57
  - brixen@gmail.com
@@ -80,7 +66,6 @@ files:
80
66
  - README.md
81
67
  - Rakefile
82
68
  - lib/net/telnet.rb
83
- - lib/net/telnets.rb
84
69
  - lib/rubysl/net/telnet.rb
85
70
  - lib/rubysl/net/telnet/telnet.rb
86
71
  - lib/rubysl/net/telnet/version.rb
@@ -1 +0,0 @@
1
- require 'openssl/net/telnets'