netconf 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/examples/confd/get-running.rb +27 -27
- data/examples/jnpr/edit-config-jnpr-set.rb +55 -55
- data/examples/jnpr/edit-config-jnpr-text.rb +64 -64
- data/examples/jnpr/edit-config-jnpr.rb +73 -73
- data/examples/jnpr/edit-config-std.rb +64 -64
- data/examples/jnpr/edit-config-text-std.rb +68 -68
- data/examples/jnpr/get-config-jnpr.rb +62 -62
- data/examples/jnpr/get-config-matching.rb +20 -20
- data/examples/jnpr/get-config-std.rb +49 -49
- data/examples/jnpr/get-inventory-serial-explicit.rb +27 -27
- data/examples/jnpr/get-inventory-serial.rb +25 -25
- data/examples/jnpr/get-inventory-telnet.rb +14 -14
- data/examples/jnpr/get-inventory.rb +16 -16
- data/examples/jnpr/scp.rb +22 -22
- data/lib/net/netconf.rb +11 -1
- data/lib/net/netconf/exception.rb +38 -38
- data/lib/net/netconf/ioproc.rb +88 -88
- data/lib/net/netconf/jnpr.rb +9 -9
- data/lib/net/netconf/jnpr/ioproc.rb +14 -14
- data/lib/net/netconf/jnpr/rpc.rb +162 -140
- data/lib/net/netconf/jnpr/serial.rb +15 -15
- data/lib/net/netconf/jnpr/telnet.rb +23 -23
- data/lib/net/netconf/rpc.rb +71 -71
- data/lib/net/netconf/rpc_std.rb +133 -134
- data/lib/net/netconf/serial.rb +135 -135
- data/lib/net/netconf/ssh.rb +78 -77
- data/lib/net/netconf/telnet.rb +52 -52
- data/lib/net/netconf/transport.rb +28 -5
- data/lib/net/netconf/version.rb +3 -0
- metadata +21 -12
| @@ -1,27 +1,27 @@ | |
| 1 | 
            -
            require 'net/netconf/jnpr/serial'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            puts "NETCONF v.#{Netconf::VERSION}"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            login = { 
         | 
| 6 | 
            -
              :port => '/dev/ttyS4', 
         | 
| 7 | 
            -
              :username => "root", :password => "juniper1" 
         | 
| 8 | 
            -
            }
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            # we want to mount the USB drive, so we need to explicity
         | 
| 11 | 
            -
            # do something special when opening the serial console ...
         | 
| 12 | 
            -
            # therefore, we can *NOT* pass a block directly to new()
         | 
| 13 | 
            -
             | 
| 14 | 
            -
            dev = Netconf::Serial.new( login )
         | 
| 15 | 
            -
            dev.open { |con|
         | 
| 16 | 
            -
              # login has occurred successfully
         | 
| 17 | 
            -
              
         | 
| 18 | 
            -
              con.puts 'mount_msdosfs /dev/da1s1 /mnt'  
         | 
| 19 | 
            -
              
         | 
| 20 | 
            -
              # netconf will be started once block completes
         | 
| 21 | 
            -
            }
         | 
| 22 | 
            -
             | 
| 23 | 
            -
            inv = dev.rpc.get_chassis_inventory
         | 
| 24 | 
            -
             | 
| 25 | 
            -
            dev.close
         | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 1 | 
            +
            require 'net/netconf/jnpr/serial'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            puts "NETCONF v.#{Netconf::VERSION}"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            login = { 
         | 
| 6 | 
            +
              :port => '/dev/ttyS4', 
         | 
| 7 | 
            +
              :username => "root", :password => "juniper1" 
         | 
| 8 | 
            +
            }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            # we want to mount the USB drive, so we need to explicity
         | 
| 11 | 
            +
            # do something special when opening the serial console ...
         | 
| 12 | 
            +
            # therefore, we can *NOT* pass a block directly to new()
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            dev = Netconf::Serial.new( login )
         | 
| 15 | 
            +
            dev.open { |con|
         | 
| 16 | 
            +
              # login has occurred successfully
         | 
| 17 | 
            +
              
         | 
| 18 | 
            +
              con.puts 'mount_msdosfs /dev/da1s1 /mnt'  
         | 
| 19 | 
            +
              
         | 
| 20 | 
            +
              # netconf will be started once block completes
         | 
| 21 | 
            +
            }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            inv = dev.rpc.get_chassis_inventory
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            dev.close
         | 
| 26 | 
            +
             | 
| 27 | 
            +
             | 
| @@ -1,25 +1,25 @@ | |
| 1 | 
            -
            require 'net/netconf/jnpr/serial'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            puts "NETCONF v.#{Netconf::VERSION}"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            serial_port = '/dev/ttyS4'
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            login = { :port => serial_port,
         | 
| 8 | 
            -
              :username => "jeremy", :password => "jeremy1" }
         | 
| 9 | 
            -
             | 
| 10 | 
            -
            puts "Connecting to SERIAL: #{serial_port} ... please wait."
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            Netconf::Serial.new( login ){ |dev|
         | 
| 13 | 
            -
              
         | 
| 14 | 
            -
              puts "Connected."
         | 
| 15 | 
            -
              puts "Nabbing Inventory ..."
         | 
| 16 | 
            -
             | 
| 17 | 
            -
              inv = dev.rpc.get_chassis_inventory      
         | 
| 18 | 
            -
              
         | 
| 19 | 
            -
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 20 | 
            -
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text
         | 
| 21 | 
            -
              
         | 
| 22 | 
            -
            }
         | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 1 | 
            +
            require 'net/netconf/jnpr/serial'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            puts "NETCONF v.#{Netconf::VERSION}"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            serial_port = '/dev/ttyS4'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            login = { :port => serial_port,
         | 
| 8 | 
            +
              :username => "jeremy", :password => "jeremy1" }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            puts "Connecting to SERIAL: #{serial_port} ... please wait."
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Netconf::Serial.new( login ){ |dev|
         | 
| 13 | 
            +
              
         | 
| 14 | 
            +
              puts "Connected."
         | 
| 15 | 
            +
              puts "Nabbing Inventory ..."
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              inv = dev.rpc.get_chassis_inventory      
         | 
| 18 | 
            +
              
         | 
| 19 | 
            +
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 20 | 
            +
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text
         | 
| 21 | 
            +
              
         | 
| 22 | 
            +
            }
         | 
| 23 | 
            +
             | 
| 24 | 
            +
             | 
| 25 | 
            +
             | 
| @@ -1,14 +1,14 @@ | |
| 1 | 
            -
            require 'net/netconf/jnpr/telnet'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            puts "NETCONF v#{Netconf::VERSION}"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            login = { :target => 'vsrx', :username => "jeremy", :password => "jeremy1" }
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            Netconf::Telnet.new( login ){ |dev|  
         | 
| 8 | 
            -
              inv = dev.rpc.get_chassis_inventory    
         | 
| 9 | 
            -
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 10 | 
            -
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text
         | 
| 11 | 
            -
              
         | 
| 12 | 
            -
            }
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 1 | 
            +
            require 'net/netconf/jnpr/telnet'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            puts "NETCONF v#{Netconf::VERSION}"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            login = { :target => 'vsrx', :username => "jeremy", :password => "jeremy1" }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Netconf::Telnet.new( login ){ |dev|  
         | 
| 8 | 
            +
              inv = dev.rpc.get_chassis_inventory    
         | 
| 9 | 
            +
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 10 | 
            +
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
            }
         | 
| 13 | 
            +
             | 
| 14 | 
            +
             | 
| @@ -1,16 +1,16 @@ | |
| 1 | 
            -
            require 'net/netconf'
         | 
| 2 | 
            -
             | 
| 3 | 
            -
            puts "NETCONF v#{Netconf::VERSION}"
         | 
| 4 | 
            -
             | 
| 5 | 
            -
            login = { :target => 'vsrx', :username => "jeremy", :password => "jeremy1" }
         | 
| 6 | 
            -
             | 
| 7 | 
            -
            Netconf::SSH.new( login ){ |dev|  
         | 
| 8 | 
            -
                
         | 
| 9 | 
            -
              inv = dev.rpc.get_chassis_inventory  
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 12 | 
            -
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text      
         | 
| 13 | 
            -
            }
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 1 | 
            +
            require 'net/netconf'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            puts "NETCONF v#{Netconf::VERSION}"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            login = { :target => 'vsrx', :username => "jeremy", :password => "jeremy1" }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Netconf::SSH.new( login ){ |dev|  
         | 
| 8 | 
            +
                
         | 
| 9 | 
            +
              inv = dev.rpc.get_chassis_inventory  
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 12 | 
            +
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text      
         | 
| 13 | 
            +
            }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
    
        data/examples/jnpr/scp.rb
    CHANGED
    
    | @@ -1,22 +1,22 @@ | |
| 1 | 
            -
            require 'net/netconf'
         | 
| 2 | 
            -
            require 'net/scp'
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            login = { :target => 'vsrx', :username => "jeremy", :password => "jeremy1" }
         | 
| 5 | 
            -
             | 
| 6 | 
            -
            file_name = __FILE__  
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            Netconf::SSH.new( login ){ |dev|  
         | 
| 9 | 
            -
             | 
| 10 | 
            -
              inv = dev.rpc.get_chassis_inventory  
         | 
| 11 | 
            -
             | 
| 12 | 
            -
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 13 | 
            -
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text  
         | 
| 14 | 
            -
                
         | 
| 15 | 
            -
              puts "Copying file #{file_name} to home directory ..."  
         | 
| 16 | 
            -
              dev.scp.upload! file_name, file_name
         | 
| 17 | 
            -
             
         | 
| 18 | 
            -
              puts "Copying latest config file from target to local machine ..."
         | 
| 19 | 
            -
              
         | 
| 20 | 
            -
              dev.scp.download! "/config/juniper.conf.gz", "/var/tmp/config.gz"
         | 
| 21 | 
            -
            }
         | 
| 22 | 
            -
             | 
| 1 | 
            +
            require 'net/netconf'
         | 
| 2 | 
            +
            require 'net/scp'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            login = { :target => 'vsrx', :username => "jeremy", :password => "jeremy1" }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            file_name = __FILE__  
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            Netconf::SSH.new( login ){ |dev|  
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              inv = dev.rpc.get_chassis_inventory  
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              puts "Chassis: " + inv.xpath('chassis/description').text
         | 
| 13 | 
            +
              puts "Chassis Serial-Number: " + inv.xpath('chassis/serial-number').text  
         | 
| 14 | 
            +
                
         | 
| 15 | 
            +
              puts "Copying file #{file_name} to home directory ..."  
         | 
| 16 | 
            +
              dev.scp.upload! file_name, file_name
         | 
| 17 | 
            +
             
         | 
| 18 | 
            +
              puts "Copying latest config file from target to local machine ..."
         | 
| 19 | 
            +
              
         | 
| 20 | 
            +
              dev.scp.download! "/config/juniper.conf.gz", "/var/tmp/config.gz"
         | 
| 21 | 
            +
            }
         | 
| 22 | 
            +
             | 
    
        data/lib/net/netconf.rb
    CHANGED
    
    | @@ -1,15 +1,25 @@ | |
| 1 1 |  | 
| 2 2 | 
             
            require 'nokogiri'
         | 
| 3 3 |  | 
| 4 | 
            +
            require 'net/netconf/version'
         | 
| 4 5 | 
             
            require 'net/netconf/rpc'
         | 
| 5 6 | 
             
            require 'net/netconf/exception'         
         | 
| 6 7 | 
             
            require 'net/netconf/transport'
         | 
| 7 8 | 
             
            require 'net/netconf/ssh'
         | 
| 8 9 |  | 
| 9 10 | 
             
            module Netconf  
         | 
| 10 | 
            -
              VERSION = "0.2.5"   
         | 
| 11 11 | 
             
              NAMESPACE = "urn:ietf:params:xml:ns:netconf:base:1.0"  
         | 
| 12 12 | 
             
              DEFAULT_OS_TYPE = :Junos  
         | 
| 13 13 | 
             
              DEFAULT_TIMEOUT = 10
         | 
| 14 14 | 
             
              DEFAULT_WAITIO = 0
         | 
| 15 | 
            +
              
         | 
| 16 | 
            +
              @raise_on_warning = false          # rpc-error with <error-severity> = 'warning' will not raise RpcError excption
         | 
| 17 | 
            +
              
         | 
| 18 | 
            +
              def self.raise_on_warning=( bool )
         | 
| 19 | 
            +
                @raise_on_warning = bool
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
              def self.raise_on_warning
         | 
| 22 | 
            +
                @raise_on_warning
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
             | 
| 15 25 | 
             
            end
         | 
| @@ -1,38 +1,38 @@ | |
| 1 | 
            -
            module Netconf
         | 
| 2 | 
            -
              
         | 
| 3 | 
            -
              class InitError < StandardError
         | 
| 4 | 
            -
              end
         | 
| 5 | 
            -
              
         | 
| 6 | 
            -
              class StateError < StandardError
         | 
| 7 | 
            -
              end
         | 
| 8 | 
            -
              
         | 
| 9 | 
            -
              class OpenError < StandardError
         | 
| 10 | 
            -
              end
         | 
| 11 | 
            -
              
         | 
| 12 | 
            -
              class RpcError < StandardError
         | 
| 13 | 
            -
                attr_reader :trans
         | 
| 14 | 
            -
                attr_reader :cmd, :rsp
         | 
| 15 | 
            -
                
         | 
| 16 | 
            -
                def initialize( trans, cmd, rsp )
         | 
| 17 | 
            -
                  @trans = trans
         | 
| 18 | 
            -
                  @cmd = cmd; @rsp = rsp; 
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
                
         | 
| 21 | 
            -
                def to_s
         | 
| 22 | 
            -
                  "RPC command error: #{cmd.first_element_child.name}"
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
              end
         | 
| 25 | 
            -
              
         | 
| 26 | 
            -
              class EditError < Netconf::RpcError
         | 
| 27 | 
            -
              end
         | 
| 28 | 
            -
              
         | 
| 29 | 
            -
              class LockError < Netconf::RpcError
         | 
| 30 | 
            -
              end
         | 
| 31 | 
            -
              
         | 
| 32 | 
            -
              class CommitError < Netconf::RpcError
         | 
| 33 | 
            -
              end
         | 
| 34 | 
            -
              
         | 
| 35 | 
            -
              class ValidateError < Netconf::RpcError
         | 
| 36 | 
            -
              end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
            end
         | 
| 1 | 
            +
            module Netconf
         | 
| 2 | 
            +
              
         | 
| 3 | 
            +
              class InitError < StandardError
         | 
| 4 | 
            +
              end
         | 
| 5 | 
            +
              
         | 
| 6 | 
            +
              class StateError < StandardError
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
              
         | 
| 9 | 
            +
              class OpenError < StandardError
         | 
| 10 | 
            +
              end
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
              class RpcError < StandardError
         | 
| 13 | 
            +
                attr_reader :trans
         | 
| 14 | 
            +
                attr_reader :cmd, :rsp
         | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                def initialize( trans, cmd, rsp )
         | 
| 17 | 
            +
                  @trans = trans
         | 
| 18 | 
            +
                  @cmd = cmd; @rsp = rsp; 
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
                
         | 
| 21 | 
            +
                def to_s
         | 
| 22 | 
            +
                  "RPC command error: #{cmd.first_element_child.name}\n#{rsp.to_xml}"
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
              
         | 
| 26 | 
            +
              class EditError < Netconf::RpcError
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
              
         | 
| 29 | 
            +
              class LockError < Netconf::RpcError
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
              
         | 
| 32 | 
            +
              class CommitError < Netconf::RpcError
         | 
| 33 | 
            +
              end
         | 
| 34 | 
            +
              
         | 
| 35 | 
            +
              class ValidateError < Netconf::RpcError
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            end
         | 
    
        data/lib/net/netconf/ioproc.rb
    CHANGED
    
    | @@ -1,88 +1,88 @@ | |
| 1 | 
            -
            module Netconf
         | 
| 2 | 
            -
              
         | 
| 3 | 
            -
              class IOProc < Netconf::Transport
         | 
| 4 | 
            -
                
         | 
| 5 | 
            -
                DEFAULT_RDBLKSZ = (1024*1024)
         | 
| 6 | 
            -
                
         | 
| 7 | 
            -
                attr_reader :args
         | 
| 8 | 
            -
                    
         | 
| 9 | 
            -
                def initialize( args_h = {}, &block )
         | 
| 10 | 
            -
                  os_type = args_h[:os_type] || Netconf::DEFAULT_OS_TYPE
         | 
| 11 | 
            -
                        
         | 
| 12 | 
            -
                  @args = args_h.clone
         | 
| 13 | 
            -
                  
         | 
| 14 | 
            -
                  # an OS specific implementation must exist to support this transport type
         | 
| 15 | 
            -
                  extend Netconf::const_get( os_type )::IOProc        
         | 
| 16 | 
            -
                  
         | 
| 17 | 
            -
                  @trans_timeout = @args[:timeout] || Netconf::DEFAULT_TIMEOUT
         | 
| 18 | 
            -
                  @trans_waitio = @args[:waitio] || Netconf::DEFAULT_WAITIO
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                  super( &block )      
         | 
| 21 | 
            -
                end      
         | 
| 22 | 
            -
                    
         | 
| 23 | 
            -
                # the OS specific transport must implement this method
         | 
| 24 | 
            -
                def trans_open # :yield: self      
         | 
| 25 | 
            -
                  raise "Unsupported IOProc"
         | 
| 26 | 
            -
                end
         | 
| 27 | 
            -
                
         | 
| 28 | 
            -
                def trans_receive_hello
         | 
| 29 | 
            -
                  trans_receive()
         | 
| 30 | 
            -
                end
         | 
| 31 | 
            -
                
         | 
| 32 | 
            -
                def trans_send_hello
         | 
| 33 | 
            -
                  nil
         | 
| 34 | 
            -
                end
         | 
| 35 | 
            -
                
         | 
| 36 | 
            -
                def trans_close
         | 
| 37 | 
            -
                  @trans.write Netconf::RPC::MSG_CLOSE_SESSION
         | 
| 38 | 
            -
                  @trans.close
         | 
| 39 | 
            -
                end
         | 
| 40 | 
            -
                
         | 
| 41 | 
            -
                def trans_send( cmd_str )
         | 
| 42 | 
            -
                  @trans.write( cmd_str )
         | 
| 43 | 
            -
                end
         | 
| 44 | 
            -
                
         | 
| 45 | 
            -
                def trans_receive
         | 
| 46 | 
            -
                  got = waitfor( Netconf::RPC::MSG_END_RE )
         | 
| 47 | 
            -
                  msg_end = got.rindex( Netconf::RPC::MSG_END )
         | 
| 48 | 
            -
                  got[msg_end .. -1] = ''
         | 
| 49 | 
            -
                  got
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
                    
         | 
| 52 | 
            -
                def puts( str = nil )
         | 
| 53 | 
            -
                  @trans.puts( str )
         | 
| 54 | 
            -
                end
         | 
| 55 | 
            -
                    
         | 
| 56 | 
            -
                def waitfor( on_re )      
         | 
| 57 | 
            -
                  
         | 
| 58 | 
            -
                  time_out = @trans_timeout
         | 
| 59 | 
            -
                  wait_io = @trans_waitio
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                  time_out = nil if time_out == false
         | 
| 62 | 
            -
                  done = false
         | 
| 63 | 
            -
                  rx_buf = ''      
         | 
| 64 | 
            -
                              
         | 
| 65 | 
            -
                  until( rx_buf.match( on_re ) and not IO::select( [@trans], nil, nil, wait_io ) )
         | 
| 66 | 
            -
                          
         | 
| 67 | 
            -
                    unless IO::select( [@trans], nil, nil, time_out )
         | 
| 68 | 
            -
                      raise TimeoutError, "Netconf IO timed out while waiting for more data"
         | 
| 69 | 
            -
                    end
         | 
| 70 | 
            -
                  
         | 
| 71 | 
            -
                    begin                   
         | 
| 72 | 
            -
                      
         | 
| 73 | 
            -
                      rx_some = @trans.readpartial( DEFAULT_RDBLKSZ )                       
         | 
| 74 | 
            -
                      
         | 
| 75 | 
            -
                      rx_buf += rx_some
         | 
| 76 | 
            -
                      break if rx_buf.match( on_re )
         | 
| 77 | 
            -
                      
         | 
| 78 | 
            -
                    rescue EOFError # End of file reached
         | 
| 79 | 
            -
                      rx_buf = nil if rx_buf == ''
         | 
| 80 | 
            -
                      break   # out of outer 'until' loop
         | 
| 81 | 
            -
                    end        
         | 
| 82 | 
            -
                    
         | 
| 83 | 
            -
                  end      
         | 
| 84 | 
            -
                  rx_buf
         | 
| 85 | 
            -
                end     
         | 
| 86 | 
            -
                
         | 
| 87 | 
            -
              end # class: IOProc
         | 
| 88 | 
            -
            end # module: Netconf
         | 
| 1 | 
            +
            module Netconf
         | 
| 2 | 
            +
              
         | 
| 3 | 
            +
              class IOProc < Netconf::Transport
         | 
| 4 | 
            +
                
         | 
| 5 | 
            +
                DEFAULT_RDBLKSZ = (1024*1024)
         | 
| 6 | 
            +
                
         | 
| 7 | 
            +
                attr_reader :args
         | 
| 8 | 
            +
                    
         | 
| 9 | 
            +
                def initialize( args_h = {}, &block )
         | 
| 10 | 
            +
                  os_type = args_h[:os_type] || Netconf::DEFAULT_OS_TYPE
         | 
| 11 | 
            +
                        
         | 
| 12 | 
            +
                  @args = args_h.clone
         | 
| 13 | 
            +
                  
         | 
| 14 | 
            +
                  # an OS specific implementation must exist to support this transport type
         | 
| 15 | 
            +
                  extend Netconf::const_get( os_type )::IOProc        
         | 
| 16 | 
            +
                  
         | 
| 17 | 
            +
                  @trans_timeout = @args[:timeout] || Netconf::DEFAULT_TIMEOUT
         | 
| 18 | 
            +
                  @trans_waitio = @args[:waitio] || Netconf::DEFAULT_WAITIO
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  super( &block )      
         | 
| 21 | 
            +
                end      
         | 
| 22 | 
            +
                    
         | 
| 23 | 
            +
                # the OS specific transport must implement this method
         | 
| 24 | 
            +
                def trans_open # :yield: self      
         | 
| 25 | 
            +
                  raise "Unsupported IOProc"
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
                
         | 
| 28 | 
            +
                def trans_receive_hello
         | 
| 29 | 
            +
                  trans_receive()
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
                
         | 
| 32 | 
            +
                def trans_send_hello
         | 
| 33 | 
            +
                  nil
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                
         | 
| 36 | 
            +
                def trans_close
         | 
| 37 | 
            +
                  @trans.write Netconf::RPC::MSG_CLOSE_SESSION
         | 
| 38 | 
            +
                  @trans.close
         | 
| 39 | 
            +
                end
         | 
| 40 | 
            +
                
         | 
| 41 | 
            +
                def trans_send( cmd_str )
         | 
| 42 | 
            +
                  @trans.write( cmd_str )
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
                
         | 
| 45 | 
            +
                def trans_receive
         | 
| 46 | 
            +
                  got = waitfor( Netconf::RPC::MSG_END_RE )
         | 
| 47 | 
            +
                  msg_end = got.rindex( Netconf::RPC::MSG_END )
         | 
| 48 | 
            +
                  got[msg_end .. -1] = ''
         | 
| 49 | 
            +
                  got
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
                    
         | 
| 52 | 
            +
                def puts( str = nil )
         | 
| 53 | 
            +
                  @trans.puts( str )
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
                    
         | 
| 56 | 
            +
                def waitfor( on_re )      
         | 
| 57 | 
            +
                  
         | 
| 58 | 
            +
                  time_out = @trans_timeout
         | 
| 59 | 
            +
                  wait_io = @trans_waitio
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                  time_out = nil if time_out == false
         | 
| 62 | 
            +
                  done = false
         | 
| 63 | 
            +
                  rx_buf = ''      
         | 
| 64 | 
            +
                              
         | 
| 65 | 
            +
                  until( rx_buf.match( on_re ) and not IO::select( [@trans], nil, nil, wait_io ) )
         | 
| 66 | 
            +
                          
         | 
| 67 | 
            +
                    unless IO::select( [@trans], nil, nil, time_out )
         | 
| 68 | 
            +
                      raise TimeoutError, "Netconf IO timed out while waiting for more data"
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
                  
         | 
| 71 | 
            +
                    begin                   
         | 
| 72 | 
            +
                      
         | 
| 73 | 
            +
                      rx_some = @trans.readpartial( DEFAULT_RDBLKSZ )                       
         | 
| 74 | 
            +
                      
         | 
| 75 | 
            +
                      rx_buf += rx_some
         | 
| 76 | 
            +
                      break if rx_buf.match( on_re )
         | 
| 77 | 
            +
                      
         | 
| 78 | 
            +
                    rescue EOFError # End of file reached
         | 
| 79 | 
            +
                      rx_buf = nil if rx_buf == ''
         | 
| 80 | 
            +
                      break   # out of outer 'until' loop
         | 
| 81 | 
            +
                    end        
         | 
| 82 | 
            +
                    
         | 
| 83 | 
            +
                  end      
         | 
| 84 | 
            +
                  rx_buf
         | 
| 85 | 
            +
                end     
         | 
| 86 | 
            +
                
         | 
| 87 | 
            +
              end # class: IOProc
         | 
| 88 | 
            +
            end # module: Netconf
         |