kkirsche/net-netconf

View on GitHub
lib/net/netconf/serial.rb

Summary

Maintainability
A
35 mins
Test Coverage
require 'serialport'

module Netconf

  class Serial < Netconf::Transport

    DEFAULT_BAUD = 9600
    DEFAULT_DATABITS = 8
    DEFAULT_STOPBITS = 1
    DEFAULT_PARITY = SerialPort::NONE
    DEFAULT_RDBLKSZ = (1024*1024)

    attr_reader :args

    def initialize( args_h, &block )
      os_type = args_h[:os_type] || Netconf::DEFAULT_OS_TYPE

      raise Netconf::InitError, "Missing 'port' param" unless args_h[:port]
      raise Netconf::InitError, "Missing 'username' param" unless args_h[:username]

      @args = args_h.clone
      @args[:prompt] ||= /([%>])\s+$/

      # extend this instance with the capabilities of the specific console
      # type; it needs to define #trans_start_netconf session
      # this must be provided! if the caller does not, this will
      # throw a NameError exception.

      extend Netconf::const_get( os_type )::TransSerial

      @trans_timeout = @args[:timeout] || Netconf::DEFAULT_TIMEOUT
      @trans_waitio = @args[:waitio] || Netconf::DEFAULT_WAITIO

      super( &block )
    end

    def login

      begin
        puts
        waitfor(/ogin:/)
      rescue Timeout::Error
        puts
        waitfor(/ogin:/)
      end

      puts @args[:username]

      waitfor(/assword:/)
      puts @args[:password]

      waitfor( @args[:prompt] )
    end

    def trans_open # :yield: self

      baud = @args[:speed] || DEFAULT_BAUD
      data_bits = @args[:bits] || DEFAULT_DATABITS
      stop_bits = @args[:stop] || DEFAULT_STOPBITS
      parity = @args[:parity] || DEFAULT_PARITY

      @trans = SerialPort.new( @args[:port], baud, data_bits, stop_bits, parity )

      got = login()
      yield self if block_given?
      trans_start_netconf( got )

      self
    end

    def trans_receive_hello
      hello_str = trans_receive()
      so_xml = hello_str.index("\n") + 1
      hello_str.slice!(0, so_xml)
      hello_str
    end

    def trans_send_hello
      nil
    end

    def trans_close
      @trans.write Netconf::RPC::MSG_CLOSE_SESSION
      @trans.close
    end

    def trans_send( cmd_str )
      @trans.write( cmd_str )
    end

    def trans_receive
      Netconf.trans_receive
    end

    def puts( str = nil )
      @trans.puts str
    end

    def waitfor( this_re = nil )
      Netconf.waitfor(on_re)
    end

  end # class: Serial
end # module: Netconf