|
@@ -30,7 +30,13 @@ class Client
|
|
@busy = true
|
|
@busy = true
|
|
# telnet event queue
|
|
# telnet event queue
|
|
@telnet_events = []
|
|
@telnet_events = []
|
|
- @timeout_at = nil
|
|
|
|
|
|
+ @timeout_at = nil
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ # Closes up the client
|
|
|
|
+ def close
|
|
|
|
+ @telnet.close
|
|
|
|
+ @io.close
|
|
end
|
|
end
|
|
|
|
|
|
def alive?
|
|
def alive?
|
|
@@ -41,10 +47,15 @@ class Client
|
|
@fiber.resume(cmd, args)
|
|
@fiber.resume(cmd, args)
|
|
end
|
|
end
|
|
|
|
|
|
- def write(data)
|
|
|
|
|
|
+ def write_raw(data)
|
|
@io.write(data)
|
|
@io.write(data)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
+
|
|
|
|
+ def write(data)
|
|
|
|
+ @telnet.send_escaped(data)
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
|
|
def on_start
|
|
def on_start
|
|
p "Starting client fiber"
|
|
p "Starting client fiber"
|
|
@@ -80,7 +91,7 @@ class Client
|
|
def telnet_send_data(buf)
|
|
def telnet_send_data(buf)
|
|
# @telnet_events << TelnetEvent.new(:command, buf)
|
|
# @telnet_events << TelnetEvent.new(:command, buf)
|
|
p "Sending telnet data."
|
|
p "Sending telnet data."
|
|
- self.write(buf)
|
|
|
|
|
|
+ self.write_raw(buf)
|
|
end
|
|
end
|
|
|
|
|
|
def process_telnet_events
|
|
def process_telnet_events
|
|
@@ -88,8 +99,7 @@ class Client
|
|
end
|
|
end
|
|
|
|
|
|
def on_read
|
|
def on_read
|
|
- data = @io.readpartial(4096)
|
|
|
|
- p "After read: #{data}"
|
|
|
|
|
|
+ data = @io.readpartial(4096)
|
|
@io.flush
|
|
@io.flush
|
|
@telnet.telnet_receive(data)
|
|
@telnet.telnet_receive(data)
|
|
# now, the data and any telnet events are in @telnet_events
|
|
# now, the data and any telnet events are in @telnet_events
|
|
@@ -146,7 +156,7 @@ class Client
|
|
@window_h, @window_w = *tev.data
|
|
@window_h, @window_w = *tev.data
|
|
log_info("Client #{@id} window size #{@window_w}x#{@window_h}")
|
|
log_info("Client #{@id} window size #{@window_w}x#{@window_h}")
|
|
else
|
|
else
|
|
- log_info('Telnet event #{tev} ignored')
|
|
|
|
|
|
+ log_info("Telnet event #{tev} ignored")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
@@ -194,13 +204,28 @@ class Client
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
- def setup_naws
|
|
|
|
- # Negotiate NAWS (window size) support
|
|
|
|
- @telnet.telnet_send_negotiate(TELNET_DO, TELNET_TELOPT_NAWS)
|
|
|
|
|
|
+ # generic negotiation
|
|
|
|
+ def setup_negotiate(command, option, yes_event, no_event)
|
|
|
|
+ @telnet.telnet_send_negotiate(command, option)
|
|
tev = wait_for_input(0.5)
|
|
tev = wait_for_input(0.5)
|
|
- return nil unless tev
|
|
|
|
- ask, cmd, opt = *tev.data
|
|
|
|
- return tev unless tev.type == :will
|
|
|
|
|
|
+ return false, nil unless tev
|
|
|
|
+ return false, nil if tev.type == no_event
|
|
|
|
+ return false, tev unless tev.type == yes_event && tev.data[0] == option
|
|
|
|
+ return true, nil
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ # Negotiate COMPRESS2 support
|
|
|
|
+ def setup_compress2
|
|
|
|
+ ok, tev = setup_negotiate(TELNET_WILL, TELNET_TELOPT_COMPRESS2, :do, :dont)
|
|
|
|
+ return tev unless ok
|
|
|
|
+ @telnet.telnet_begin_compress2
|
|
|
|
+ log_info("Client #{@id} started COMPRESS2 compression")
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+ # Negotiate NAWS (window size) support
|
|
|
|
+ def setup_naws
|
|
|
|
+ ok, tev = setup_negotiate(TELNET_DO, TELNET_TELOPT_NAWS, :will, :wont)
|
|
|
|
+ return tev unless ok
|
|
tev2 = wait_for_input(0.5)
|
|
tev2 = wait_for_input(0.5)
|
|
return tev2 unless tev2 && tev2.type == :naws
|
|
return tev2 unless tev2 && tev2.type == :naws
|
|
@window_h, @window_w = *tev2.data
|
|
@window_h, @window_w = *tev2.data
|
|
@@ -208,6 +233,18 @@ class Client
|
|
return nil
|
|
return nil
|
|
end
|
|
end
|
|
|
|
|
|
|
|
+
|
|
|
|
+ # Negotiate MSSP (mud server status protocol) support
|
|
|
|
+ def setup_mssp
|
|
|
|
+ ok, tev = setup_negotiate(TELNET_WILL, TELNET_TELOPT_MSSP, :do, :dont)
|
|
|
|
+ return tev unless ok
|
|
|
|
+ mssp = @server.mssp
|
|
|
|
+ @telnet.telnet_send_mssp(mssp)
|
|
|
|
+ return nil
|
|
|
|
+ end
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
def setup_telnet
|
|
def setup_telnet
|
|
loop do
|
|
loop do
|
|
tev = wait_for_input(0.5)
|
|
tev = wait_for_input(0.5)
|
|
@@ -218,7 +255,8 @@ class Client
|
|
break
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-
|
|
|
|
|
|
+ setup_mssp
|
|
|
|
+ setup_compress2
|
|
setup_naws
|
|
setup_naws
|
|
|
|
|
|
#p "mssp ev #{tev}"
|
|
#p "mssp ev #{tev}"
|