hrr_rb_netconf 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +28 -0
- data/.rspec +3 -0
- data/.travis.yml +32 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE +201 -0
- data/README.md +220 -0
- data/Rakefile +6 -0
- data/demo/server.rb +54 -0
- data/demo/server_over_ssh.rb +97 -0
- data/demo/server_with_session-oriented-database.rb +134 -0
- data/demo/server_with_sessionless-database.rb +81 -0
- data/hrr_rb_netconf.gemspec +28 -0
- data/lib/hrr_rb_netconf.rb +10 -0
- data/lib/hrr_rb_netconf/logger.rb +56 -0
- data/lib/hrr_rb_netconf/server.rb +109 -0
- data/lib/hrr_rb_netconf/server/capabilities.rb +75 -0
- data/lib/hrr_rb_netconf/server/capability.rb +206 -0
- data/lib/hrr_rb_netconf/server/capability/base_1_0.rb +183 -0
- data/lib/hrr_rb_netconf/server/capability/base_1_1.rb +247 -0
- data/lib/hrr_rb_netconf/server/capability/candidate_1_0.rb +34 -0
- data/lib/hrr_rb_netconf/server/capability/confirmed_commit_1_0.rb +24 -0
- data/lib/hrr_rb_netconf/server/capability/confirmed_commit_1_1.rb +24 -0
- data/lib/hrr_rb_netconf/server/capability/rollback_on_error_1_0.rb +16 -0
- data/lib/hrr_rb_netconf/server/capability/startup_1_0.rb +22 -0
- data/lib/hrr_rb_netconf/server/capability/url_1_0.rb +23 -0
- data/lib/hrr_rb_netconf/server/capability/validate_1_0.rb +25 -0
- data/lib/hrr_rb_netconf/server/capability/validate_1_1.rb +25 -0
- data/lib/hrr_rb_netconf/server/capability/writable_running_1_0.rb +17 -0
- data/lib/hrr_rb_netconf/server/capability/xpath_1_0.rb +14 -0
- data/lib/hrr_rb_netconf/server/datastore.rb +30 -0
- data/lib/hrr_rb_netconf/server/datastore/oper_handler.rb +29 -0
- data/lib/hrr_rb_netconf/server/datastore/session.rb +52 -0
- data/lib/hrr_rb_netconf/server/error.rb +52 -0
- data/lib/hrr_rb_netconf/server/error/access_denied.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/bad_attribute.rb +20 -0
- data/lib/hrr_rb_netconf/server/error/bad_element.rb +20 -0
- data/lib/hrr_rb_netconf/server/error/data_exists.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/data_missing.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/in_use.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/invalid_value.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/lock_denied.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/malformed_message.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/missing_attribute.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/missing_element.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/operation_failed.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/operation_not_supported.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/partial_operation.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/resource_denied.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/rollback_failed.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/rpc_errorable.rb +138 -0
- data/lib/hrr_rb_netconf/server/error/too_big.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/unknown_attribute.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/unknown_element.rb +19 -0
- data/lib/hrr_rb_netconf/server/error/unknown_namespace.rb +19 -0
- data/lib/hrr_rb_netconf/server/errors.rb +28 -0
- data/lib/hrr_rb_netconf/server/filter.rb +48 -0
- data/lib/hrr_rb_netconf/server/filter/subtree.rb +135 -0
- data/lib/hrr_rb_netconf/server/filter/xpath.rb +59 -0
- data/lib/hrr_rb_netconf/server/model.rb +123 -0
- data/lib/hrr_rb_netconf/server/model/node.rb +19 -0
- data/lib/hrr_rb_netconf/server/operation.rb +92 -0
- data/lib/hrr_rb_netconf/server/session.rb +177 -0
- data/lib/hrr_rb_netconf/version.rb +6 -0
- metadata +149 -0
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
module HrrRbNetconf
|
5
|
+
class Server
|
6
|
+
class Capability
|
7
|
+
class WritableRunning_1_0 < Capability
|
8
|
+
ID = 'urn:ietf:params:netconf:capability:writable-running:1.0'
|
9
|
+
DEPENDENCIES = []
|
10
|
+
IF_FEATURES = ['writable-running']
|
11
|
+
|
12
|
+
model 'edit-config', ['target', 'config-target', 'running'], 'leaf', 'type' => 'empty'
|
13
|
+
model 'copy-config', ['target', 'config-target', 'running'], 'leaf', 'type' => 'empty'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
module HrrRbNetconf
|
5
|
+
class Server
|
6
|
+
class Capability
|
7
|
+
class Xpath_1_0 < Capability
|
8
|
+
ID = 'urn:ietf:params:netconf:capability:xpath:1.0'
|
9
|
+
DEPENDENCIES = []
|
10
|
+
IF_FEATURES = ['xpath']
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/logger'
|
5
|
+
require 'hrr_rb_netconf/server/datastore/session'
|
6
|
+
|
7
|
+
module HrrRbNetconf
|
8
|
+
class Server
|
9
|
+
class Datastore
|
10
|
+
def initialize database, &blk
|
11
|
+
@logger = Logger.new self.class.name
|
12
|
+
@database = database
|
13
|
+
@oper_procs = Hash.new
|
14
|
+
@session_proc = blk
|
15
|
+
end
|
16
|
+
|
17
|
+
def oper_proc oper_name, &oper_proc
|
18
|
+
if oper_proc
|
19
|
+
@oper_procs[oper_name] = oper_proc
|
20
|
+
@logger.info { "Operation registered: #{oper_name}" }
|
21
|
+
end
|
22
|
+
@oper_procs[oper_name]
|
23
|
+
end
|
24
|
+
|
25
|
+
def new_session session
|
26
|
+
Session.new @database, @oper_procs, @session_proc, session
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/logger'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Datastore
|
9
|
+
class OperHandler
|
10
|
+
def initialize
|
11
|
+
@logger = Logger.new self.class.name
|
12
|
+
end
|
13
|
+
|
14
|
+
def start *args
|
15
|
+
@logger.info { "Starting OperHandler" }
|
16
|
+
@logger.debug { "args: #{args.inspect}" }
|
17
|
+
@args = args
|
18
|
+
Fiber.yield
|
19
|
+
@logger.info { "Exiting OperHandler" }
|
20
|
+
end
|
21
|
+
|
22
|
+
def run oper, input
|
23
|
+
@logger.debug { "run with oper, input: #{oper.inspect}, #{input.inspect}" }
|
24
|
+
oper.call(*(@args + [input]))
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/logger'
|
5
|
+
require 'hrr_rb_netconf/server/datastore/oper_handler'
|
6
|
+
|
7
|
+
module HrrRbNetconf
|
8
|
+
class Server
|
9
|
+
class Datastore
|
10
|
+
class Session
|
11
|
+
def initialize database, oper_procs, session_proc, session
|
12
|
+
@logger = Logger.new self.class.name
|
13
|
+
@database = database
|
14
|
+
@oper_procs = oper_procs
|
15
|
+
@session_proc = session_proc
|
16
|
+
@session = session
|
17
|
+
|
18
|
+
if @session_proc
|
19
|
+
@oper_handler = OperHandler.new
|
20
|
+
@oper_thread = Fiber.new do |session|
|
21
|
+
@session_proc.call @database, session, @oper_handler
|
22
|
+
end
|
23
|
+
@oper_thread.resume(session)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def close
|
28
|
+
if @oper_thread
|
29
|
+
while true
|
30
|
+
begin
|
31
|
+
@oper_thread.resume
|
32
|
+
rescue FiberError
|
33
|
+
break
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def run oper_name, input
|
40
|
+
unless @oper_procs.has_key? oper_name
|
41
|
+
raise Error['operation-not-supported'].new('protocol', 'error')
|
42
|
+
end
|
43
|
+
if @oper_thread
|
44
|
+
@oper_handler.run @oper_procs[oper_name], input
|
45
|
+
else
|
46
|
+
@oper_procs[oper_name].call @database, input
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
module HrrRbNetconf
|
5
|
+
class Server
|
6
|
+
class Error < StandardError
|
7
|
+
@subclass_list = Array.new
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def inherited klass
|
11
|
+
@subclass_list.push klass if @subclass_list
|
12
|
+
end
|
13
|
+
|
14
|
+
def [] key
|
15
|
+
__subclass_list__(__method__).find{ |klass| klass::TAG == key }
|
16
|
+
end
|
17
|
+
|
18
|
+
def list
|
19
|
+
__subclass_list__(__method__).map{ |klass| klass::TAG }
|
20
|
+
end
|
21
|
+
|
22
|
+
def __subclass_list__ method_name
|
23
|
+
send(:method_missing, method_name) unless @subclass_list
|
24
|
+
@subclass_list
|
25
|
+
end
|
26
|
+
|
27
|
+
private :__subclass_list__
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
require 'hrr_rb_netconf/server/error/in_use'
|
34
|
+
require 'hrr_rb_netconf/server/error/invalid_value'
|
35
|
+
require 'hrr_rb_netconf/server/error/too_big'
|
36
|
+
require 'hrr_rb_netconf/server/error/missing_attribute'
|
37
|
+
require 'hrr_rb_netconf/server/error/bad_attribute'
|
38
|
+
require 'hrr_rb_netconf/server/error/unknown_attribute'
|
39
|
+
require 'hrr_rb_netconf/server/error/missing_element'
|
40
|
+
require 'hrr_rb_netconf/server/error/bad_element'
|
41
|
+
require 'hrr_rb_netconf/server/error/unknown_element'
|
42
|
+
require 'hrr_rb_netconf/server/error/unknown_namespace'
|
43
|
+
require 'hrr_rb_netconf/server/error/access_denied'
|
44
|
+
require 'hrr_rb_netconf/server/error/lock_denied'
|
45
|
+
require 'hrr_rb_netconf/server/error/resource_denied'
|
46
|
+
require 'hrr_rb_netconf/server/error/rollback_failed'
|
47
|
+
require 'hrr_rb_netconf/server/error/data_exists'
|
48
|
+
require 'hrr_rb_netconf/server/error/data_missing'
|
49
|
+
require 'hrr_rb_netconf/server/error/operation_not_supported'
|
50
|
+
require 'hrr_rb_netconf/server/error/operation_failed'
|
51
|
+
require 'hrr_rb_netconf/server/error/partial_operation'
|
52
|
+
require 'hrr_rb_netconf/server/error/malformed_message'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class AccessDenied < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'access-denied'
|
13
|
+
TYPE = ['protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class BadAttribute < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'bad-attribute'
|
13
|
+
TYPE = ['rpc', 'protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = ['bad-attribute', 'bad-element']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class BadElement < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'bad-element'
|
13
|
+
TYPE = ['protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = ['bad-element']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class DataExists < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'data-exists'
|
13
|
+
TYPE = ['application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class DataMissing < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'data-missing'
|
13
|
+
TYPE = ['application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class InUse < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'in-use'
|
13
|
+
TYPE = ['protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class InvalidValue < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'invalid-value'
|
13
|
+
TYPE = ['protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class LockDenied < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'lock-denied'
|
13
|
+
TYPE = ['protocol']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = ['session-id']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class MalformedMessage < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'malformed-message'
|
13
|
+
TYPE = ['rpc']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class MissingAttribute < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'missing-attribute'
|
13
|
+
TYPE = ['rpc', 'protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = ['bad-attribute', 'bad-element']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class MissingElement < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'missing-element'
|
13
|
+
TYPE = ['protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = ['bad-element']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# vim: et ts=2 sw=2
|
3
|
+
|
4
|
+
require 'hrr_rb_netconf/server/error/rpc_errorable'
|
5
|
+
|
6
|
+
module HrrRbNetconf
|
7
|
+
class Server
|
8
|
+
class Error
|
9
|
+
class OperationFailed < Error
|
10
|
+
include RpcErrorable
|
11
|
+
|
12
|
+
TAG = 'operation-failed'
|
13
|
+
TYPE = ['rpc', 'protocol', 'application']
|
14
|
+
SEVERITY = ['error']
|
15
|
+
INFO = []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|