net-netconf 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b84dffc3bef4a7c78fa7c383945452a1319f186c
4
- data.tar.gz: 850b49f0af7e175a8590f7ef447a3d712d81cc4b
3
+ metadata.gz: 882b8dffb9e72058c0cfc8d9d245d2a33c445e94
4
+ data.tar.gz: 6965b0162647568257b9d7f413faf8cc99952301
5
5
  SHA512:
6
- metadata.gz: ee2f9173a0d140b1a1120b52ada2ea4f4fcc880ee83d1320ff569c10c069a81f17e0c8157247756b58ba7452d7888165311042905d2eafbd9e82a4709d488cfc
7
- data.tar.gz: 9b2605221513738aa169b05c828b5dbbecc4578d1590a0ae8a8abf4a22eb70832d27e342492aef141cabd7f562c2817733d17be505c29a4e0b0fd91b103f30b2
6
+ metadata.gz: f74d7e05706421321cc163259181dbb05321440787663a823af37c79c5b70e0b63737cd4cac6912a8ab69c0d4a42f701d93ea4afc4a5c95ac8a567a9b36595dc
7
+ data.tar.gz: f079cf1748209eb9df67c347c1c225fab5bb2a0d4aae43667dfa759b327e51fd5d1c21dc16edd48b929f553622d598950f5a54b4fa5ba1b8272af7ec8a571f6d
@@ -1,9 +1,9 @@
1
- module Netconf
1
+ module Netconf
2
2
  module RPC
3
-
4
- MSG_END = "]]>]]>"
3
+
4
+ MSG_END = ']]>]]>'
5
5
  MSG_END_RE = /\]\]>\]\]>[\r\n]*$/
6
- MSG_CLOSE_SESSION = '<rpc><close-session/></rpc>'
6
+ MSG_CLOSE_SESSION = '<rpc><close-session/></rpc>'
7
7
  MSG_HELLO = <<-EOM
8
8
  <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
9
9
  <capabilities>
@@ -13,55 +13,55 @@ module Netconf
13
13
  EOM
14
14
 
15
15
  module Standard
16
-
17
- def lock( target )
16
+
17
+ def lock( target )
18
18
  rpc = Nokogiri::XML( "<rpc><lock><target><#{target}/></target></lock></rpc>" ).root
19
19
  Netconf::RPC.set_exception( rpc, Netconf::LockError )
20
- @trans.rpc_exec( rpc )
20
+ @trans.rpc_exec( rpc )
21
21
  end
22
-
22
+
23
23
  def unlock( target )
24
24
  rpc = Nokogiri::XML( "<rpc><unlock><target><#{target}/></target></unlock></rpc>" ).root
25
- @trans.rpc_exec( rpc )
25
+ @trans.rpc_exec( rpc )
26
26
  end
27
-
27
+
28
28
  def validate( source )
29
29
  rpc = Nokogiri::XML( "<rpc><validate><source><#{source}/></source></validate></rpc>" ).root
30
- Netconf::RPC.set_exception( rpc, Netconf::ValidateError )
31
- @trans.rpc_exec( rpc )
30
+ Netconf::RPC.set_exception( rpc, Netconf::ValidateError )
31
+ @trans.rpc_exec( rpc )
32
32
  end
33
-
33
+
34
34
  def commit
35
35
  rpc = Nokogiri::XML( "<rpc><commit/></rpc>" ).root
36
- Netconf::RPC.set_exception( rpc, Netconf::CommitError )
37
- @trans.rpc_exec( rpc )
36
+ Netconf::RPC.set_exception( rpc, Netconf::CommitError )
37
+ @trans.rpc_exec( rpc )
38
38
  end
39
-
39
+
40
40
  def delete_config( target )
41
41
  rpc = Nokogiri::XML( "<rpc><delete-config><target><#{target}/></target></delete-config></rpc>" ).root
42
- @trans.rpc_exec( rpc )
42
+ @trans.rpc_exec( rpc )
43
43
  end
44
-
44
+
45
45
  def get_config( *args ) # :yeield: filter_builder
46
-
46
+
47
47
  source = 'running' # default source is 'running'
48
48
  filter = nil # no filter by default
49
-
49
+
50
50
  while arg = args.shift
51
51
  case arg.class.to_s
52
- when /^Nokogiri/
52
+ when /^Nokogiri/
53
53
  filter = case arg
54
54
  when Nokogiri::XML::Builder then arg.doc.root
55
55
  when Nokogiri::XML::Document then arg.root
56
56
  else arg
57
- end
57
+ end
58
58
  when 'Hash' then attrs = arg
59
59
  when 'String' then source = arg
60
60
  end
61
61
  end
62
-
62
+
63
63
  rpc = Nokogiri::XML("<rpc><get-config><source><#{source}/></source></get-config></rpc>").root
64
-
64
+
65
65
  if block_given?
66
66
  Nokogiri::XML::Builder.with( rpc.at( 'get-config' )){ |xml|
67
67
  xml.filter( :type => 'subtree' ) {
@@ -69,37 +69,37 @@ EOM
69
69
  }
70
70
  }
71
71
  end
72
-
72
+
73
73
  if filter
74
74
  f_node = Nokogiri::XML::Node.new( 'filter', rpc )
75
75
  f_node['type'] = 'subtree'
76
76
  f_node << filter.dup # copy filter, don't mess with the original since it may be re-used
77
77
  rpc.at('get-config') << f_node
78
- end
79
-
80
- @trans.rpc_exec( rpc )
78
+ end
79
+
80
+ @trans.rpc_exec( rpc )
81
81
  end
82
82
 
83
83
  def edit_config( *args ) # :yeield: config_builder
84
-
84
+
85
85
  toplevel = 'config' # default toplevel config element
86
86
  target = 'candidate' # default source is 'candidate' @@@/JLS hack; need to fix this
87
87
  config = nil
88
88
  options = {}
89
-
89
+
90
90
  while arg = args.shift
91
91
  case arg.class.to_s
92
- when /^Nokogiri/
92
+ when /^Nokogiri/
93
93
  config = case arg
94
94
  when Nokogiri::XML::Builder then arg.doc.root
95
95
  when Nokogiri::XML::Document then arg.root
96
96
  else arg
97
- end
97
+ end
98
98
  when 'Hash' then options = arg
99
99
  when 'String' then target = arg
100
100
  end
101
101
  end
102
-
102
+
103
103
  toplevel = options[:toplevel] if options[:toplevel]
104
104
 
105
105
  rpc_str = <<-EO_RPC
@@ -112,7 +112,7 @@ EOM
112
112
  EO_RPC
113
113
 
114
114
  rpc = Nokogiri::XML( rpc_str ).root
115
-
115
+
116
116
  if block_given?
117
117
  Nokogiri::XML::Builder.with(rpc.at( toplevel )){ |xml|
118
118
  yield( xml )
@@ -120,14 +120,14 @@ EO_RPC
120
120
  elsif config
121
121
  rpc.at( toplevel ) << config.dup
122
122
  else
123
- raise ArgumentError, "You must specify edit-config data!"
124
- end
125
-
126
- Netconf::RPC.set_exception( rpc, Netconf::EditError )
127
- @trans.rpc_exec( rpc )
128
- end
129
-
123
+ raise ArgumentError, "You must specify edit-config data!"
124
+ end
125
+
126
+ Netconf::RPC.set_exception( rpc, Netconf::EditError )
127
+ @trans.rpc_exec( rpc )
128
+ end
129
+
130
130
  end
131
131
 
132
- end # module: RPC
132
+ end # module: RPC
133
133
  end # module: Netconf
@@ -12,145 +12,146 @@
12
12
 
13
13
  module Netconf
14
14
  class Transport
15
-
15
+
16
16
  attr_reader :rpc, :state, :session_id, :capabilities
17
17
  attr_writer :timeout, :waitio
18
-
19
- def initialize( &block )
20
-
18
+
19
+ def initialize( &block )
20
+
21
21
  @state = :NETCONF_CLOSED
22
22
  @os_type = @args[:os_type] || Netconf::DEFAULT_OS_TYPE
23
-
23
+
24
24
  @rpc = Netconf::RPC::Executor.new( self, @os_type )
25
25
  @rpc_message_id = 1
26
-
26
+
27
27
  if block_given?
28
28
  open( &block = nil ) # do not pass this block to open()
29
29
  yield self
30
30
  close()
31
31
  end
32
-
32
+
33
33
  end # initialize
34
-
34
+
35
35
  def open?
36
36
  @state == :NETCONF_OPEN
37
37
  end
38
-
38
+
39
39
  def closed?
40
40
  @state == :NECONF_CLOSED
41
41
  end
42
-
42
+
43
43
  def open( &block ) # :yield: specialized transport open, generally not used
44
-
44
+
45
45
  raise Netconf::StateError if @state == :NETCONF_OPEN
46
-
46
+
47
47
  # block is used to deal with special open processing ...
48
48
  # this is *NOT* the block passed to initialize()
49
- raise Netconf::OpenError unless trans_open( &block )
50
-
49
+ raise Netconf::OpenError unless trans_open( &block )
50
+
51
51
  # read the <hello> from the server and parse out
52
52
  # the capabilities and session-id
53
-
53
+
54
54
  hello_rsp = Nokogiri::XML( trans_receive_hello() )
55
55
  hello_rsp.remove_namespaces!
56
-
56
+
57
57
  @capabilities = hello_rsp.xpath('//capability').map{ |c| c.text }
58
58
  @session_id = hello_rsp.xpath('//session-id').text
59
-
60
- # send the <hello>
59
+
60
+ # send the <hello>
61
61
  trans_send_hello()
62
-
63
- @state = :NETCONF_OPEN
64
- self
62
+
63
+ @state = :NETCONF_OPEN
64
+ self
65
65
  end
66
-
66
+
67
67
  def trans_receive_hello
68
68
  trans_receive()
69
69
  end
70
-
70
+
71
71
  def trans_send_hello
72
72
  trans_send( Netconf::RPC::MSG_HELLO )
73
+ trans_send( RPC::MSG_END )
73
74
  end
74
-
75
+
75
76
  def has_capability?( capability )
76
77
  @capabilities.select{|c| c.include? capability }.pop
77
78
  # note: the caller could also simply use #grep on @capabilities
78
79
  end
79
-
80
+
80
81
  def close
81
- raise Netconf::StateError unless @state == :NETCONF_OPEN
82
+ raise Netconf::StateError unless @state == :NETCONF_OPEN
82
83
  trans_close()
83
- @state = :NETCONF_CLOSED
84
+ @state = :NETCONF_CLOSED
84
85
  self
85
86
  end
86
-
87
+
87
88
  # string in; string out
88
89
  def send_and_receive( cmd_str )
89
90
  trans_send( cmd_str )
90
91
  trans_send( RPC::MSG_END )
91
92
  trans_receive()
92
93
  end
93
-
94
+
94
95
  def rpc_exec( cmd_nx )
95
- raise Netconf::StateError unless @state == :NETCONF_OPEN
96
-
96
+ raise Netconf::StateError unless @state == :NETCONF_OPEN
97
+
97
98
  # add the mandatory message-id and namespace to the RPC
98
-
99
+
99
100
  rpc_nx = cmd_nx.parent.root
100
101
  rpc_nx.default_namespace = Netconf::NAMESPACE
101
102
  rpc_nx['message-id'] = @rpc_message_id.to_s
102
103
  @rpc_message_id += 1
103
-
104
- # send the XML command through the transport and
104
+
105
+ # send the XML command through the transport and
105
106
  # receive the response; then covert it to a Nokogiri XML
106
107
  # object so we can process it.
107
-
108
+
108
109
  rsp_nx = Nokogiri::XML( send_and_receive( cmd_nx.to_xml ))
109
-
110
+
110
111
  # the following removes only the default namespace (xmlns)
111
112
  # definitions from the document. This is an alternative
112
113
  # to using #remove_namespaces! which would remove everything
113
- # including vendor specific namespaces. So this approach is a
114
- # nice "compromise" ... just don't know what it does
114
+ # including vendor specific namespaces. So this approach is a
115
+ # nice "compromise" ... just don't know what it does
115
116
  # performance-wise on large datasets.
116
117
 
117
118
  rsp_nx.traverse{ |n| n.namespace = nil }
118
-
119
+
119
120
  # set the response context to the root node; <rpc-reply>
120
-
121
+
121
122
  rsp_nx = rsp_nx.root
122
-
123
+
123
124
  # check for rpc-error elements. these could be
124
125
  # located anywhere in the structured response
125
-
126
+
126
127
  rpc_errs = rsp_nx.xpath('//self::rpc-error')
127
128
  if rpc_errs.count > 0
128
-
129
+
129
130
  # look for rpc-errors that have a severity == 'error'
130
131
  # in some cases the rpc-error is generated with
131
132
  # severity == 'warning'
132
-
133
+
133
134
  sev_err = rpc_errs.xpath('error-severity[. = "error"]')
134
-
135
+
135
136
  # if there are rpc-error with severity == 'error'
136
137
  # or if the caller wants to raise if severity == 'warning'
137
138
  # then generate the exception
138
-
139
+
139
140
  if(( sev_err.count > 0 ) || Netconf::raise_on_warning )
140
- exception = Netconf::RPC.get_exception( cmd_nx )
141
+ exception = Netconf::RPC.get_exception( cmd_nx )
141
142
  raise exception.new( self, cmd_nx, rsp_nx )
142
- end
143
- end
144
-
143
+ end
144
+ end
145
+
145
146
  # return the XML with context at toplevel element; i.e.
146
147
  # after the <rpc-reply> element
147
148
  # @@@/JLS: might this be <ok> ? isn't for Junos, but need to check
148
149
  # @@@/JLS: the generic case.
149
-
150
+
150
151
  rsp_nx.first_element_child
151
-
152
+
152
153
  end
153
-
154
154
 
155
- end #--class: Transport
155
+
156
+ end #--class: Transport
156
157
  end #--module: Netconf
@@ -1,3 +1,3 @@
1
1
  module Netconf
2
- VERSION = "0.4.0"
2
+ VERSION = '0.4.1'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-netconf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Kirsche
@@ -52,7 +52,7 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.2'
55
- description: Ruby NetConf client
55
+ description: Updated and maintained fork of the Juniper Ruby NetConf client
56
56
  email: kev.kirsche@gmail.com
57
57
  executables: []
58
58
  extensions: []
@@ -112,5 +112,5 @@ rubyforge_project:
112
112
  rubygems_version: 2.4.6
113
113
  signing_key:
114
114
  specification_version: 4
115
- summary: NetConf client
115
+ summary: Updated NetConf client
116
116
  test_files: []