admin_vr400_script/lib/router/admin.rb

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