125 lines
2.5 KiB
Ruby
125 lines
2.5 KiB
Ruby
require "socket"
|
|
require "colorize"
|
|
|
|
class Router
|
|
class Admin
|
|
def initialize(ip: ENV["VR400_IP"] || "192.168.1.1", port: 23)
|
|
@ip = ip
|
|
@port = port
|
|
@socket = TCPSocket.new(ip, port)
|
|
@connected = false
|
|
@display_router_ip = "Router(#{@ip})".ljust(20, " ")
|
|
@display_local_ip = "Local(127.0.0.1)".ljust(20, " ")
|
|
end
|
|
|
|
attr_accessor :socket
|
|
|
|
def connected?
|
|
@connected
|
|
end
|
|
|
|
private def ensure_connected
|
|
raise "No connected" if !connected?
|
|
end
|
|
|
|
private def log_server(s)
|
|
s.split("\n").each do
|
|
warn "#{@display_router_ip}> #{_1}".blue
|
|
end
|
|
end
|
|
|
|
private def log_command(s)
|
|
warn "#{@display_local_ip}> #{s}".on_blue
|
|
end
|
|
|
|
private def log(s)
|
|
$stdout.puts s.bold
|
|
end
|
|
|
|
private def sync!
|
|
sleep 0.1
|
|
@socket.sync
|
|
end
|
|
|
|
# ignore_prompt remove last line from the logs
|
|
# ignore remove n first lines from the logs (1 by default for the inputed command)
|
|
private def read!(ignore: 1, ignore_prompt: true)
|
|
raw = ""
|
|
while readable?
|
|
@socket.read_nonblock(4096).tap { raw << _1 }
|
|
end
|
|
lines = raw.split("\n")
|
|
lines.shift(ignore)
|
|
lines.pop if ignore_prompt
|
|
lines.each { |line| log_server(line) }
|
|
lines
|
|
rescue IO::EAGAINWaitReadable => _e
|
|
nil
|
|
end
|
|
|
|
private def readable?
|
|
sync!
|
|
# print @socket.ready? ? "?".green : "?".red
|
|
@socket.readable?
|
|
end
|
|
|
|
private def ensure_readable
|
|
raise "Not readable" if !readable?
|
|
end
|
|
|
|
private def writable?
|
|
!readable? && @socket.writable?
|
|
end
|
|
|
|
private def ensure_writable
|
|
raise "Not writable" if !writable?
|
|
end
|
|
|
|
def command!(str)
|
|
ensure_connected
|
|
ensure_writable
|
|
log_command str
|
|
@socket.puts str
|
|
sync!
|
|
end
|
|
|
|
def auto_login!
|
|
raise "No password asked" if !readable?
|
|
read!
|
|
|
|
@socket.puts ENV["VR400_PASSWORD"]
|
|
raise "Login failed" if !readable?
|
|
|
|
read!(ignore: 0, ignore_prompt: false)
|
|
@connected = true
|
|
end
|
|
|
|
def help!
|
|
command! "help"
|
|
read!
|
|
end
|
|
|
|
def reboot!
|
|
command! "dev reboot"
|
|
end
|
|
|
|
def show!
|
|
command! "dev show prodName"
|
|
name = read!.first
|
|
command! "dev show prodVer"
|
|
version = read!.first
|
|
log("name = #{name}")
|
|
log("version = #{version}")
|
|
end
|
|
|
|
def arbitrary!(str)
|
|
ensure_connected
|
|
ensure_writable
|
|
@socket.puts str
|
|
sync!
|
|
read!
|
|
end
|
|
|
|
end
|
|
end
|