class Dumbcli::Device::Base

Public Class Methods

new(host, options={}) click to toggle source
# File lib/dumbcli/device/base.rb, line 6
def initialize(host, options={})
  raise ArgumentError, 'host is required' unless host
  @host = host
  @options = options
end

Public Instance Methods

close() click to toggle source
# File lib/dumbcli/device/base.rb, line 48
def close
  return unless established?

  execute_exit
end
connect() click to toggle source
# File lib/dumbcli/device/base.rb, line 28
def connect
  return if established?

  Dumbcli.logger.info "Trying to connect #{@host}"
  @connection = Net::Telnet.new('Prompt' => prompt,
                                'Proxy' => IO.popen(login_cmd, 'r+'),
                                'Timeout' => @options[:timeout] || 30)

  begin
    result = @connection.waitfor(prompt)
    if result =~ error_code
      @connection.close
      raise $1
    end
  rescue
    @connection.close
    raise
  end
end
established?() click to toggle source
# File lib/dumbcli/device/base.rb, line 24
def established?
  @connection && !@connection.sock.closed?
end
exec(cmd)
Alias for: execute
execute(cmd) click to toggle source
# File lib/dumbcli/device/base.rb, line 12
def execute(cmd)
  raise ArgumentError, 'cmd is required' unless cmd

  connect unless established?

  Dumbcli.logger.info "Executing: #{cmd}"
  @connection.cmd(cmd).tap {|result|
    Dumbcli.logger.debug result
  }
end
Also aliased as: exec

Private Instance Methods

error_code() click to toggle source
# File lib/dumbcli/device/base.rb, line 66
def error_code
  /^Error:\s*(.*)$/
end
execute_exit() click to toggle source
# File lib/dumbcli/device/base.rb, line 70
def execute_exit
  unless execute('exit') =~ /connection closed|Connection to \S+ closed\./i  # see clogin
    sleep 1         # wait a bit until completely close
    execute 'exit'  # even from 'configure terminal' mode. see clogin
  end
end
flush() click to toggle source
# File lib/dumbcli/device/base.rb, line 91
def flush
  result = ''
  sleep 0.5

  until (remainder = read).empty?
    result << remainder
  end

  result
end
login_cmd() click to toggle source
# File lib/dumbcli/device/base.rb, line 57
def login_cmd
  raise 'Not implemented yet'
end
prompt() click to toggle source
# File lib/dumbcli/device/base.rb, line 61
def prompt
  p = /\S+(?:>|#)\s*/
  /#{p}(?:[\n\r]+#{p})*/
end
read() click to toggle source
# File lib/dumbcli/device/base.rb, line 77
def read
  return unless established?
  result = ''

  begin
    loop do
      result << @connection.sock.read_nonblock(1024)
    end
  rescue Errno::EAGAIN, Errno::EINTR, EOFError
  end

  result
end