net-telnet-rfc2217 0.0.3 → 1.0.1

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
  SHA256:
3
- metadata.gz: 8c22526ce99613e2c561a64f7b7c9063591eaac34fce16602374afbc7461287c
4
- data.tar.gz: 18d1b8c6679c93ec46d69ad0a6f6e0942b868f3bb2b82022d6d50f88a01b411d
3
+ metadata.gz: 0c39563771f3856b4bc00958b23c0dfd9fbc1dddc74f1296576450ecba9c63d1
4
+ data.tar.gz: 5ac03d21506442c8b686ae9d5f1d9d452a40f7a2404eaf6cc941c7ebdd703bf0
5
5
  SHA512:
6
- metadata.gz: a92d336bd6cc302a1f1b2d3aba4ab57d45115556e954da8937afbdef7a4f7a1056ebdb5911fa6f3685b01e2123734c66166fef9c510c9055e6959f855b117108
7
- data.tar.gz: cceb6cf145dcbffa1fb0132f7bc7d2f9c73b9b80c2bc993d2865e339e0e5a52aca0330f0b0eeb799c39b1984a41697bc56cdbee0c99b65f70fe82129fb9e3944
6
+ metadata.gz: 1e6c931590c7d2cca1127f3291fa2596b338ab10fe3fe2f128860b405cd02e59c6d49876c37c821cb4c3da3e91e079a0ec34b3aa553dca3359e5b6e702e0a5f3
7
+ data.tar.gz: 6c589b90e212849f27283d9ff71eb44a674ed3831e23d695900991716e977f0f7f3bdfbd613a7c15845b836a6f3a0b6fb696b32452388f4254b6172546e828f8
@@ -1,7 +1,7 @@
1
1
  module Net
2
2
  class Telnet
3
3
  class RFC2217
4
- VERSION = '0.0.3'
4
+ VERSION = '1.0.1'
5
5
  end
6
6
  end
7
7
  end
@@ -1,5 +1,4 @@
1
1
  require 'net/telnet'
2
- require 'byebug'
3
2
 
4
3
  # have to patch Telnet to allow us to read control sequences
5
4
  require 'net/telnet/rfc2217/telnet'
@@ -14,43 +13,9 @@ module Net
14
13
 
15
14
  attr_reader :telnet
16
15
 
17
- COM_PORT_OPTION = 44.chr
18
-
19
- SET_BAUDRATE = 1.chr
20
- SET_DATASIZE = 2.chr
21
- SET_PARITY = 3.chr
22
- SET_STOPSIZE = 4.chr
23
- SET_CONTROL = 5.chr
24
- NOTIFY_LINESTATE = 6.chr
25
- NOTIFY_MODEMSTATE = 7.chr
26
- FLOWCONTROL_SUSPEND = 8.chr
27
- SET_LINESTATE_MASK = 10.chr
28
- SET_MODEMSTATE_MASK = 11.chr
29
- PURGE_DATA = 12.chr
30
-
31
- SET_BAUDRATE_RESPONSE = 101.chr
32
- SET_DATASIZE_RESPONSE = 102.chr
33
- SET_PARITY_RESPONSE = 103.chr
34
- SET_STOPSIZE_RESPONSE = 104.chr
35
- SET_CONTROL_RESPONSE = 105.chr
36
- NOTIFY_LINESTATE_RESPONSE = 106.chr
37
- NOTIFY_MODEMSTATE_RESPONSE = 107.chr
38
- FLOWCONTROL_SUSPEND_RESPONSE = 108.chr
39
- SET_LINESTATE_MASK_RESPONSE = 110.chr
40
- SET_MODEMSTATE_MASK_RESPONSE = 111.chr
41
- PURGE_DATA_RESPONSE = 112.chr
42
-
43
- NONE = 1
44
- ODD = 2
45
- EVEN = 3
46
- MARK = 4
47
- SPACE = 5
48
-
49
- SERIAL_PORT_PARAMS = %w{baud data_bits stop_bits parity}.freeze
50
-
51
16
  class << self
52
- def open(options)
53
- sp = new(options)
17
+ def open(**kwargs)
18
+ sp = new(opt**kwargs)
54
19
  if block_given?
55
20
  begin
56
21
  yield sp
@@ -64,9 +29,15 @@ module Net
64
29
  end
65
30
  end
66
31
 
67
- def initialize(options = {}, &block)
68
- set_modem_params(options.slice(*SERIAL_PORT_PARAMS))
32
+ attr_reader :baud, :data_bits, :parity, :stop_bits
69
33
 
34
+ def initialize(host, port: 23, baud: 115200, data_bits: 8, parity: :none, stop_bits: 1, &block)
35
+ set_modem_params(baud: baud, data_bits: data_bits, parity: parity, stop_bits: stop_bits)
36
+
37
+ options = {
38
+ 'Host' => host,
39
+ 'Port' => port,
40
+ }
70
41
  options['Binmode'] = true
71
42
  options['Telnetmode'] = false
72
43
  @telnet = Telnet.new(options, &block)
@@ -81,35 +52,15 @@ module Net
81
52
  end
82
53
  end
83
54
 
84
- def get_modem_params
85
- @modem_params
86
- end
87
-
88
- def set_modem_params(modem_params)
89
- @modem_params = modem_params.dup
90
- @modem_params['baud'] = 115200 unless @modem_params.key?('baud')
91
- @modem_params['data_bits'] = 8 unless @modem_params.key?('data_bits')
92
- @modem_params['stop_bits'] = 1 unless @modem_params.key?('stop_bits')
93
- unless @modem_params.key?('parity')
94
- @modem_params['parity'] = (data_bits == 8 ? NONE : EVEN)
95
- end
96
- write_modem_params if telnet
97
- end
98
-
99
- def baud
100
- get_modem_params['baud']
101
- end
55
+ def set_modem_params(baud: nil, data_bits: nil, parity: nil, stop_bits: nil)
56
+ raise ArgumentError, "Parity must be :none, :even, :odd, :mark, or :space" unless parity.nil? || %i{none even odd mark space}.include?(parity)
102
57
 
103
- def data_bits
104
- get_modem_params['data_bits']
105
- end
58
+ @baud ||= baud || 115200
59
+ @data_bits ||= data_bits || 8
60
+ @parity ||= parity || :none
61
+ @stop_bits ||= stop_bits || 1
106
62
 
107
- def stop_bits
108
- get_modem_params['stop_bits']
109
- end
110
-
111
- def parity
112
- get_modem_params['parity']
63
+ write_modem_params if telnet
113
64
  end
114
65
 
115
66
  def sock
@@ -119,11 +70,16 @@ module Net
119
70
  def read(length, outbuf = '')
120
71
  readpartial(length, outbuf)
121
72
  while outbuf.length < length
122
- outbuf.concat(length - outbuf.length)
73
+ outbuf.concat(readpartial(length - outbuf.length))
123
74
  end
124
75
  outbuf
125
76
  end
126
77
 
78
+ def readbyte
79
+ read(1)&.[](0)
80
+ end
81
+ alias getbyte readbyte
82
+
127
83
  def readpartial(length, outbuf = '')
128
84
  loop do
129
85
  # 0 is special and means "just see if there's data to read"
@@ -189,6 +145,15 @@ module Net
189
145
  result
190
146
  end
191
147
 
148
+ def ready?
149
+ loop do
150
+ return true unless @buffer.empty?
151
+ return false if sock.wait_readable(0).nil?
152
+ # consume control characters first
153
+ readpartial(0)
154
+ end
155
+ end
156
+
192
157
  def ungetbyte(b)
193
158
  @buffer.insert(0, b.chr)
194
159
  end
@@ -212,12 +177,46 @@ module Net
212
177
 
213
178
  private
214
179
 
180
+ COM_PORT_OPTION = 44.chr
181
+
182
+ SET_BAUDRATE = 1.chr
183
+ SET_DATASIZE = 2.chr
184
+ SET_PARITY = 3.chr
185
+ SET_STOPSIZE = 4.chr
186
+ SET_CONTROL = 5.chr
187
+ NOTIFY_LINESTATE = 6.chr
188
+ NOTIFY_MODEMSTATE = 7.chr
189
+ FLOWCONTROL_SUSPEND = 8.chr
190
+ SET_LINESTATE_MASK = 10.chr
191
+ SET_MODEMSTATE_MASK = 11.chr
192
+ PURGE_DATA = 12.chr
193
+
194
+ SET_BAUDRATE_RESPONSE = 101.chr
195
+ SET_DATASIZE_RESPONSE = 102.chr
196
+ SET_PARITY_RESPONSE = 103.chr
197
+ SET_STOPSIZE_RESPONSE = 104.chr
198
+ SET_CONTROL_RESPONSE = 105.chr
199
+ NOTIFY_LINESTATE_RESPONSE = 106.chr
200
+ NOTIFY_MODEMSTATE_RESPONSE = 107.chr
201
+ FLOWCONTROL_SUSPEND_RESPONSE = 108.chr
202
+ SET_LINESTATE_MASK_RESPONSE = 110.chr
203
+ SET_MODEMSTATE_MASK_RESPONSE = 111.chr
204
+ PURGE_DATA_RESPONSE = 112.chr
205
+
206
+ NONE = 1
207
+ ODD = 2
208
+ EVEN = 3
209
+ MARK = 4
210
+ SPACE = 5
211
+
212
+ private_constant *(constants - [:WaitReadable])
213
+
215
214
  def write_modem_params
216
215
  telnet.write(
217
216
  IAC + SB + COM_PORT_OPTION + SET_BAUDRATE + [baud].pack("N") + IAC + SE +
218
217
  IAC + SB + COM_PORT_OPTION + SET_DATASIZE + data_bits.chr + IAC + SE +
219
218
  IAC + SB + COM_PORT_OPTION + SET_STOPSIZE + stop_bits.chr + IAC + SE +
220
- IAC + SB + COM_PORT_OPTION + SET_PARITY + parity.chr + IAC + SE)
219
+ IAC + SB + COM_PORT_OPTION + SET_PARITY + const_get(parity.upcase, false).chr + IAC + SE)
221
220
  sock.flush
222
221
  end
223
222
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-telnet-rfc2217
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cody Cutrer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-15 00:00:00.000000000 Z
11
+ date: 2021-08-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: net-telnet
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  requirements: []
84
- rubygems_version: 3.0.3
84
+ rubygems_version: 3.1.2
85
85
  signing_key:
86
86
  specification_version: 4
87
87
  summary: Library for getting an IO-like object for a remote serial port