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
data/lib/net/netconf/ssh.rb
CHANGED
@@ -1,77 +1,78 @@
|
|
1
|
-
require 'net/ssh'
|
2
|
-
|
3
|
-
module Netconf
|
4
|
-
class SSH < Netconf::Transport
|
5
|
-
|
6
|
-
NETCONF_PORT = 830
|
7
|
-
NETCONF_SUBSYSTEM = 'netconf'
|
8
|
-
|
9
|
-
def initialize( args_h, &block )
|
10
|
-
@args = args_h.clone
|
11
|
-
@trans = Hash.new
|
12
|
-
|
13
|
-
super( &block )
|
14
|
-
end
|
15
|
-
|
16
|
-
def trans_open( &block )
|
17
|
-
# open a connection to the NETCONF subsystem
|
18
|
-
start_args = Hash.new
|
19
|
-
start_args[:password] ||= @args[:password]
|
20
|
-
start_args[:passphrase] = @args[:passphrase] || nil
|
21
|
-
start_args[:port] = @args[:port] || NETCONF_PORT
|
22
|
-
|
23
|
-
|
24
|
-
@trans[:
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@trans[:
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@trans[:
|
35
|
-
|
36
|
-
|
37
|
-
# the
|
38
|
-
# the
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
@trans[:
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
@trans[:
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
#
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
#
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end #
|
76
|
-
|
77
|
-
|
1
|
+
require 'net/ssh'
|
2
|
+
|
3
|
+
module Netconf
|
4
|
+
class SSH < Netconf::Transport
|
5
|
+
|
6
|
+
NETCONF_PORT = 830
|
7
|
+
NETCONF_SUBSYSTEM = 'netconf'
|
8
|
+
|
9
|
+
def initialize( args_h, &block )
|
10
|
+
@args = args_h.clone
|
11
|
+
@trans = Hash.new
|
12
|
+
|
13
|
+
super( &block )
|
14
|
+
end
|
15
|
+
|
16
|
+
def trans_open( &block )
|
17
|
+
# open a connection to the NETCONF subsystem
|
18
|
+
start_args = Hash.new
|
19
|
+
start_args[:password] ||= @args[:password]
|
20
|
+
start_args[:passphrase] = @args[:passphrase] || nil
|
21
|
+
start_args[:port] = @args[:port] || NETCONF_PORT
|
22
|
+
start_args.merge!(@args[:ssh_args]) if @args[:ssh_args]
|
23
|
+
|
24
|
+
@trans[:conn] = Net::SSH.start( @args[:target], @args[:username], start_args )
|
25
|
+
@trans[:chan] = @trans[:conn].open_channel{ |ch| ch.subsystem( NETCONF_SUBSYSTEM ) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def trans_close
|
29
|
+
@trans[:chan].close if @trans[:chan]
|
30
|
+
@trans[:conn].close if @trans[:conn]
|
31
|
+
end
|
32
|
+
|
33
|
+
def trans_receive
|
34
|
+
@trans[:rx_buf] = ''
|
35
|
+
@trans[:more] = true
|
36
|
+
|
37
|
+
# collect the response data as it comes back ...
|
38
|
+
# the "on" functions must be set before calling
|
39
|
+
# the #loop method
|
40
|
+
|
41
|
+
@trans[:chan].on_data do |ch, data|
|
42
|
+
if data.include?( RPC::MSG_END )
|
43
|
+
data.slice!( RPC::MSG_END )
|
44
|
+
@trans[:rx_buf] << data unless data.empty?
|
45
|
+
@trans[:more] = false
|
46
|
+
else
|
47
|
+
@trans[:rx_buf] << data
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
# ... if there are errors ...
|
52
|
+
@trans[:chan].on_extended_data do |ch, type, data|
|
53
|
+
@trans[:rx_err] = data
|
54
|
+
@trans[:more] = false
|
55
|
+
end
|
56
|
+
|
57
|
+
# the #loop method is what actually performs
|
58
|
+
# ssh event processing ...
|
59
|
+
|
60
|
+
@trans[:conn].loop { @trans[:more] }
|
61
|
+
|
62
|
+
return @trans[:rx_buf]
|
63
|
+
end
|
64
|
+
|
65
|
+
def trans_send( cmd_str )
|
66
|
+
@trans[:chan].send_data( cmd_str )
|
67
|
+
end
|
68
|
+
|
69
|
+
# accessor to create an Net::SCP object so the caller can perform
|
70
|
+
# secure-copy operations (see Net::SCP) for details
|
71
|
+
def scp
|
72
|
+
@scp ||= Net::SCP.start( @args[:target], @args[:username], :password => @args[:password] )
|
73
|
+
end
|
74
|
+
|
75
|
+
end # class: SSH
|
76
|
+
end #module: Netconf
|
77
|
+
|
78
|
+
require 'net/netconf/ssh'
|
data/lib/net/netconf/telnet.rb
CHANGED
@@ -1,52 +1,52 @@
|
|
1
|
-
require 'net/telnet'
|
2
|
-
|
3
|
-
module Netconf
|
4
|
-
|
5
|
-
class Telnet < Netconf::Transport
|
6
|
-
|
7
|
-
def initialize( args, trans_args = nil, &block )
|
8
|
-
os_type = args[:os_type] || Netconf::DEFAULT_OS_TYPE
|
9
|
-
@args = args.clone
|
10
|
-
|
11
|
-
# extend this instance with the capabilities of the specific console
|
12
|
-
# type; it needs to define #login and #start_netconf session
|
13
|
-
begin
|
14
|
-
extend Netconf::const_get( os_type )::TransTelnet
|
15
|
-
rescue NameError
|
16
|
-
# no extensions available ...
|
17
|
-
end
|
18
|
-
|
19
|
-
my_trans_args = {}
|
20
|
-
my_trans_args["Host"] = @args[:target]
|
21
|
-
my_trans_args["Port"] = @args[:port] if @args[:port]
|
22
|
-
|
23
|
-
@trans = Net::Telnet.new( my_trans_args )
|
24
|
-
|
25
|
-
@trans_timeout = @args[:timeout] || Netconf::DEFAULT_TIMEOUT
|
26
|
-
@trans_waitio = @args[:waitio] || Netconf::DEFAULT_WAITIO
|
27
|
-
|
28
|
-
super( &block )
|
29
|
-
end
|
30
|
-
|
31
|
-
def trans_open( &block )
|
32
|
-
trans_login()
|
33
|
-
trans_start_netconf()
|
34
|
-
self
|
35
|
-
end
|
36
|
-
|
37
|
-
def trans_close
|
38
|
-
@trans.write Netconf::RPC::MSG_CLOSE_SESSION
|
39
|
-
@trans.close
|
40
|
-
end
|
41
|
-
|
42
|
-
def trans_send( cmd_str )
|
43
|
-
@trans.write( cmd_str )
|
44
|
-
end
|
45
|
-
|
46
|
-
def trans_receive
|
47
|
-
rsp = @trans.waitfor( Netconf::RPC::MSG_END_RE )
|
48
|
-
rsp.chomp!( Netconf::RPC::MSG_END + "\n" )
|
49
|
-
end
|
50
|
-
|
51
|
-
end # class: Serial
|
52
|
-
end # module: Netconf
|
1
|
+
require 'net/telnet'
|
2
|
+
|
3
|
+
module Netconf
|
4
|
+
|
5
|
+
class Telnet < Netconf::Transport
|
6
|
+
|
7
|
+
def initialize( args, trans_args = nil, &block )
|
8
|
+
os_type = args[:os_type] || Netconf::DEFAULT_OS_TYPE
|
9
|
+
@args = args.clone
|
10
|
+
|
11
|
+
# extend this instance with the capabilities of the specific console
|
12
|
+
# type; it needs to define #login and #start_netconf session
|
13
|
+
begin
|
14
|
+
extend Netconf::const_get( os_type )::TransTelnet
|
15
|
+
rescue NameError
|
16
|
+
# no extensions available ...
|
17
|
+
end
|
18
|
+
|
19
|
+
my_trans_args = {}
|
20
|
+
my_trans_args["Host"] = @args[:target]
|
21
|
+
my_trans_args["Port"] = @args[:port] if @args[:port]
|
22
|
+
|
23
|
+
@trans = Net::Telnet.new( my_trans_args )
|
24
|
+
|
25
|
+
@trans_timeout = @args[:timeout] || Netconf::DEFAULT_TIMEOUT
|
26
|
+
@trans_waitio = @args[:waitio] || Netconf::DEFAULT_WAITIO
|
27
|
+
|
28
|
+
super( &block )
|
29
|
+
end
|
30
|
+
|
31
|
+
def trans_open( &block )
|
32
|
+
trans_login()
|
33
|
+
trans_start_netconf()
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def trans_close
|
38
|
+
@trans.write Netconf::RPC::MSG_CLOSE_SESSION
|
39
|
+
@trans.close
|
40
|
+
end
|
41
|
+
|
42
|
+
def trans_send( cmd_str )
|
43
|
+
@trans.write( cmd_str )
|
44
|
+
end
|
45
|
+
|
46
|
+
def trans_receive
|
47
|
+
rsp = @trans.waitfor( Netconf::RPC::MSG_END_RE )
|
48
|
+
rsp.chomp!( Netconf::RPC::MSG_END + "\n" )
|
49
|
+
end
|
50
|
+
|
51
|
+
end # class: Serial
|
52
|
+
end # module: Netconf
|
@@ -32,6 +32,14 @@ module Netconf
|
|
32
32
|
|
33
33
|
end # initialize
|
34
34
|
|
35
|
+
def open?
|
36
|
+
@state == :NETCONF_OPEN
|
37
|
+
end
|
38
|
+
|
39
|
+
def closed?
|
40
|
+
@state == :NECONF_CLOSED
|
41
|
+
end
|
42
|
+
|
35
43
|
def open( &block ) # :yield: specialized transport open, generally not used
|
36
44
|
|
37
45
|
raise Netconf::StateError if @state == :NETCONF_OPEN
|
@@ -79,6 +87,7 @@ module Netconf
|
|
79
87
|
# string in; string out
|
80
88
|
def send_and_receive( cmd_str )
|
81
89
|
trans_send( cmd_str )
|
90
|
+
trans_send( RPC::MSG_END )
|
82
91
|
trans_receive()
|
83
92
|
end
|
84
93
|
|
@@ -111,12 +120,26 @@ module Netconf
|
|
111
120
|
|
112
121
|
rsp_nx = rsp_nx.root
|
113
122
|
|
114
|
-
#
|
115
|
-
#
|
123
|
+
# check for rpc-error elements. these could be
|
124
|
+
# located anywhere in the structured response
|
116
125
|
|
117
|
-
|
118
|
-
|
119
|
-
|
126
|
+
rpc_errs = rsp_nx.xpath('//self::rpc-error')
|
127
|
+
if rpc_errs.count > 0
|
128
|
+
|
129
|
+
# look for rpc-errors that have a severity == 'error'
|
130
|
+
# in some cases the rpc-error is generated with
|
131
|
+
# severity == 'warning'
|
132
|
+
|
133
|
+
sev_err = rpc_errs.xpath('error-severity[. = "error"]')
|
134
|
+
|
135
|
+
# if there are rpc-error with severity == 'error'
|
136
|
+
# or if the caller wants to raise if severity == 'warning'
|
137
|
+
# then generate the exception
|
138
|
+
|
139
|
+
if(( sev_err.count > 0 ) || Netconf::raise_on_warning )
|
140
|
+
exception = Netconf::RPC.get_exception( cmd_nx )
|
141
|
+
raise exception.new( self, cmd_nx, rsp_nx )
|
142
|
+
end
|
120
143
|
end
|
121
144
|
|
122
145
|
# return the XML with context at toplevel element; i.e.
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netconf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jeremy Schulman
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2013-
|
12
|
+
date: 2013-07-24 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: nokogiri
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - ! '>='
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - ! '>='
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,7 +28,6 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: net-ssh
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
32
|
- - ! '>='
|
37
33
|
- !ruby/object:Gem::Version
|
@@ -39,11 +35,24 @@ dependencies:
|
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
39
|
- - ! '>='
|
45
40
|
- !ruby/object:Gem::Version
|
46
41
|
version: 2.5.2
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: net-scp
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - ! '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.1.1
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.1.1
|
47
56
|
description: Extensible Ruby-based NETCONF client
|
48
57
|
email: jschulman@juniper.net
|
49
58
|
executables: []
|
@@ -64,6 +73,7 @@ files:
|
|
64
73
|
- lib/net/netconf/ssh.rb
|
65
74
|
- lib/net/netconf/telnet.rb
|
66
75
|
- lib/net/netconf/transport.rb
|
76
|
+
- lib/net/netconf/version.rb
|
67
77
|
- lib/net/netconf.rb
|
68
78
|
- examples/confd/get-running.rb
|
69
79
|
- examples/jnpr/edit-config-jnpr-set.rb
|
@@ -79,28 +89,27 @@ files:
|
|
79
89
|
- examples/jnpr/get-inventory-telnet.rb
|
80
90
|
- examples/jnpr/get-inventory.rb
|
81
91
|
- examples/jnpr/scp.rb
|
82
|
-
homepage: https://github.com/Juniper
|
92
|
+
homepage: https://github.com/Juniper/net-netconf
|
83
93
|
licenses: []
|
94
|
+
metadata: {}
|
84
95
|
post_install_message:
|
85
96
|
rdoc_options: []
|
86
97
|
require_paths:
|
87
98
|
- lib
|
88
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
100
|
requirements:
|
91
101
|
- - ! '>='
|
92
102
|
- !ruby/object:Gem::Version
|
93
103
|
version: '0'
|
94
104
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
105
|
requirements:
|
97
106
|
- - ! '>='
|
98
107
|
- !ruby/object:Gem::Version
|
99
108
|
version: '0'
|
100
109
|
requirements: []
|
101
110
|
rubyforge_project:
|
102
|
-
rubygems_version:
|
111
|
+
rubygems_version: 2.0.4
|
103
112
|
signing_key:
|
104
|
-
specification_version:
|
113
|
+
specification_version: 4
|
105
114
|
summary: NETCONF client
|
106
115
|
test_files: []
|