hrr_rb_netconf 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +0 -3
- data/README.md +12 -10
- data/demo/server.rb +8 -0
- data/demo/server_over_ssh.rb +8 -0
- data/demo/server_with_session-oriented-database.rb +8 -0
- data/demo/server_with_sessionless-database.rb +8 -0
- data/lib/hrr_rb_netconf/server.rb +5 -6
- data/lib/hrr_rb_netconf/server/error/rpc_errorable.rb +1 -1
- data/lib/hrr_rb_netconf/server/filter.rb +1 -1
- data/lib/hrr_rb_netconf/server/operation.rb +7 -2
- data/lib/hrr_rb_netconf/server/session.rb +5 -4
- data/lib/hrr_rb_netconf/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd342f37e0e13f7459c4de78725b3ef7ede91625be95a97149ac380e3074d458
|
4
|
+
data.tar.gz: d93a52b7e3b511f2724d8fcc8b2021713800f301a68d8cb44fdc196f6cd0a5b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 499d26b160c49904e7f6b9e6cbde6952e273c3f238bb55f8f48c2fa36620a2e7f32e8bd30677441652713321b494a30bcae86df85b8494a40be2e4a56a7b0b40
|
7
|
+
data.tar.gz: 78f35c4f9fb0fee405b7546558997ae20ae037876328792cd3b0bea49afc12c8d8a938371db8fe2a807698cc885ca98e262884b3d6017db1ecd74f5672cb9e14
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -71,25 +71,27 @@ Where, the `datastore` variable is an instance of `HrrRbNetconf::Server::Datasto
|
|
71
71
|
|
72
72
|
#### Logging
|
73
73
|
|
74
|
-
The library provides logging functionality. To enable logging
|
74
|
+
The library provides logging functionality. To enable logging in the library, give a `logger` to `Server.new`.
|
75
75
|
|
76
76
|
```ruby
|
77
|
-
HrrRbNetconf::
|
77
|
+
HrrRbNetconf::Server.new datastore, logger: logger
|
78
78
|
```
|
79
79
|
|
80
|
-
Where, the `logger` variable can be an instance of standard Logger class or user-defined logger class. What
|
81
|
-
|
82
|
-
For instance, `logger` variable can be prepared like below.
|
80
|
+
Where, the `logger` variable can be an instance of standard Logger class or user-defined logger class. What the library requires for `logger` variable is that the `logger` instance responds to `#fatal`, `#error`, `#warn`, `#info` and `#debug` with the following syntax.
|
83
81
|
|
84
82
|
```ruby
|
85
|
-
logger
|
86
|
-
logger.
|
83
|
+
logger.fatal(progname){ message }
|
84
|
+
logger.error(progname){ message }
|
85
|
+
logger.warn(progname){ message }
|
86
|
+
logger.info(progname){ message }
|
87
|
+
logger.debug(progname){ message }
|
87
88
|
```
|
88
89
|
|
89
|
-
|
90
|
+
For instance, `logger` variable can be prepared like below.
|
90
91
|
|
91
92
|
```ruby
|
92
|
-
|
93
|
+
logger = Logger.new STDOUT
|
94
|
+
logger.level = Logger::INFO
|
93
95
|
```
|
94
96
|
|
95
97
|
#### Handling datastore operations
|
@@ -220,7 +222,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/hirura
|
|
220
222
|
|
221
223
|
## Code of Conduct
|
222
224
|
|
223
|
-
Everyone interacting in the HrrRbNetconf project
|
225
|
+
Everyone interacting in the HrrRbNetconf project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/hirura/hrr_rb_netconf/blob/master/CODE_OF_CONDUCT.md).
|
224
226
|
|
225
227
|
## License
|
226
228
|
|
data/demo/server.rb
CHANGED
@@ -12,8 +12,16 @@ rescue LoadError
|
|
12
12
|
end
|
13
13
|
|
14
14
|
|
15
|
+
class MyLoggerFormatter < ::Logger::Formatter
|
16
|
+
def call severity, time, progname, msg
|
17
|
+
"%s, [%s#%d.%x] %5s -- %s: %s\n" % [severity[0..0], format_datetime(time), Process.pid, Thread.current.object_id, severity, progname, msg2str(msg)]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
15
22
|
logger = Logger.new STDOUT
|
16
23
|
logger.level = Logger::DEBUG
|
24
|
+
logger.formatter = MyLoggerFormatter.new
|
17
25
|
|
18
26
|
datastore = HrrRbNetconf::Server::Datastore.new('dummy', logger: logger){ |db, session, oper_handler|
|
19
27
|
begin
|
data/demo/server_over_ssh.rb
CHANGED
@@ -20,8 +20,16 @@ rescue LoadError
|
|
20
20
|
end
|
21
21
|
|
22
22
|
|
23
|
+
class MyLoggerFormatter < ::Logger::Formatter
|
24
|
+
def call severity, time, progname, msg
|
25
|
+
"%s, [%s#%d.%x] %5s -- %s: %s\n" % [severity[0..0], format_datetime(time), Process.pid, Thread.current.object_id, severity, progname, msg2str(msg)]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
23
30
|
logger = Logger.new STDOUT
|
24
31
|
logger.level = Logger::DEBUG
|
32
|
+
logger.formatter = MyLoggerFormatter.new
|
25
33
|
|
26
34
|
|
27
35
|
db = '<root />'
|
@@ -68,8 +68,16 @@ class SessionOrientedDatabase
|
|
68
68
|
end
|
69
69
|
|
70
70
|
|
71
|
+
class MyLoggerFormatter < ::Logger::Formatter
|
72
|
+
def call severity, time, progname, msg
|
73
|
+
"%s, [%s#%d.%x] %5s -- %s: %s\n" % [severity[0..0], format_datetime(time), Process.pid, Thread.current.object_id, severity, progname, msg2str(msg)]
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
71
78
|
logger = Logger.new STDOUT
|
72
79
|
logger.level = Logger::DEBUG
|
80
|
+
logger.formatter = MyLoggerFormatter.new
|
73
81
|
|
74
82
|
|
75
83
|
db = SessionOrientedDatabase.new
|
@@ -33,8 +33,16 @@ class SessionlessDatabase
|
|
33
33
|
end
|
34
34
|
|
35
35
|
|
36
|
+
class MyLoggerFormatter < ::Logger::Formatter
|
37
|
+
def call severity, time, progname, msg
|
38
|
+
"%s, [%s#%d.%x] %5s -- %s: %s\n" % [severity[0..0], format_datetime(time), Process.pid, Thread.current.object_id, severity, progname, msg2str(msg)]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
36
43
|
logger = Logger.new STDOUT
|
37
44
|
logger.level = Logger::DEBUG
|
45
|
+
logger.formatter = MyLoggerFormatter.new
|
38
46
|
|
39
47
|
|
40
48
|
db = SessionlessDatabase.new
|
@@ -22,11 +22,12 @@ module HrrRbNetconf
|
|
22
22
|
SESSION_ID_MAX = 2**32 - 1
|
23
23
|
SESSION_ID_MODULO = SESSION_ID_MAX - SESSION_ID_MIN + 1
|
24
24
|
|
25
|
-
def initialize datastore, capabilities: nil, strict_capabilities: false, logger: nil
|
25
|
+
def initialize datastore, capabilities: nil, strict_capabilities: false, enable_filter: true, logger: nil
|
26
26
|
self.logger = logger
|
27
27
|
@datastore = datastore
|
28
28
|
@capabilities = capabilities || Capabilities.new(logger: logger)
|
29
29
|
@strict_capabilities = strict_capabilities
|
30
|
+
@enable_filter = enable_filter
|
30
31
|
@mutex = Mutex.new
|
31
32
|
@sessions = Hash.new
|
32
33
|
@locks = Hash.new
|
@@ -57,14 +58,11 @@ module HrrRbNetconf
|
|
57
58
|
@mutex.synchronize do
|
58
59
|
session_id = allocate_session_id
|
59
60
|
log_info { "Session ID: #{session_id}" }
|
60
|
-
@sessions[session_id] = Session.new self, @capabilities, @datastore, session_id, io, @strict_capabilities, logger: logger
|
61
|
+
@sessions[session_id] = Session.new self, @capabilities, @datastore, session_id, io, @strict_capabilities, @enable_filter, logger: logger
|
61
62
|
end
|
62
63
|
@sessions[session_id].start
|
63
64
|
rescue => e
|
64
|
-
log_error { "
|
65
|
-
raise
|
66
|
-
else
|
67
|
-
log_info { "Session closed: Session ID: #{session_id}" }
|
65
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
68
66
|
ensure
|
69
67
|
@lock_mutex.synchronize do
|
70
68
|
@locks.delete_if{ |tgt, sid| sid == session_id }
|
@@ -72,6 +70,7 @@ module HrrRbNetconf
|
|
72
70
|
@mutex.synchronize do
|
73
71
|
delete_session session_id
|
74
72
|
end
|
73
|
+
log_info { "Session closed: Session ID: #{session_id}" }
|
75
74
|
end
|
76
75
|
end
|
77
76
|
|
@@ -50,7 +50,7 @@ module HrrRbNetconf
|
|
50
50
|
unless @info.kind_of? Hash
|
51
51
|
raise ArgumentError.new "error-info arg must be a kind of Hash, but given #{@info.class}"
|
52
52
|
end
|
53
|
-
unless self.class::INFO.all?{ |
|
53
|
+
unless self.class::INFO.all?{ |k| @info.has_key? k }
|
54
54
|
raise ArgumentError.new "error-info arg must contain #{self.class::INFO} as keys, but given #{@info}"
|
55
55
|
end
|
56
56
|
end
|
@@ -27,7 +27,7 @@ module HrrRbNetconf
|
|
27
27
|
def filter raw_output_e, input_e
|
28
28
|
filter_e = input_e.elements['filter']
|
29
29
|
if filter_e
|
30
|
-
filter_type = filter_e.attributes['type']
|
30
|
+
filter_type = filter_e.attributes['type'] || 'subtree'
|
31
31
|
if self[filter_type]
|
32
32
|
self[filter_type].filter raw_output_e, filter_e
|
33
33
|
else
|
@@ -10,12 +10,13 @@ module HrrRbNetconf
|
|
10
10
|
class Operation
|
11
11
|
include Loggable
|
12
12
|
|
13
|
-
def initialize session, capabilities, datastore_session, strict_capabilities, logger: nil
|
13
|
+
def initialize session, capabilities, datastore_session, strict_capabilities, enable_filter, logger: nil
|
14
14
|
self.logger = logger
|
15
15
|
@session = session
|
16
16
|
@capabilities = capabilities
|
17
17
|
@datastore_session = datastore_session
|
18
18
|
@strict_capabilities = strict_capabilities
|
19
|
+
@enable_filter = enable_filter
|
19
20
|
@models = Hash.new
|
20
21
|
@oper_procs = Hash.new
|
21
22
|
|
@@ -83,7 +84,11 @@ module HrrRbNetconf
|
|
83
84
|
else
|
84
85
|
raise "Unexpected output: #{raw_output.inspect}"
|
85
86
|
end
|
86
|
-
|
87
|
+
if @enable_filter
|
88
|
+
output_e = Filter.filter(raw_output_e, input_e)
|
89
|
+
else
|
90
|
+
output_e = raw_output_e
|
91
|
+
end
|
87
92
|
rpc_reply_e = xml_doc.clone
|
88
93
|
rpc_reply_e.name = "rpc-reply"
|
89
94
|
rpc_reply_e.add output_e
|
@@ -18,7 +18,7 @@ module HrrRbNetconf
|
|
18
18
|
|
19
19
|
attr_reader :session_id
|
20
20
|
|
21
|
-
def initialize server, capabilities, datastore, session_id, io, strict_capabilities, logger: nil
|
21
|
+
def initialize server, capabilities, datastore, session_id, io, strict_capabilities, enable_filter, logger: nil
|
22
22
|
self.logger = logger
|
23
23
|
@server = server
|
24
24
|
@local_capabilities = capabilities
|
@@ -34,6 +34,7 @@ module HrrRbNetconf
|
|
34
34
|
raise ArgumentError, "io must be an instance of IO or Array"
|
35
35
|
end
|
36
36
|
@strict_capabilities = strict_capabilities
|
37
|
+
@enable_filter = enable_filter
|
37
38
|
@closed = false
|
38
39
|
@notification_enabled = false
|
39
40
|
@monitor = Monitor.new
|
@@ -127,7 +128,7 @@ module HrrRbNetconf
|
|
127
128
|
|
128
129
|
def operation_loop
|
129
130
|
datastore_session = @datastore.new_session self
|
130
|
-
operation = Operation.new self, @capabilities, datastore_session, @strict_capabilities, logger: logger
|
131
|
+
operation = Operation.new self, @capabilities, datastore_session, @strict_capabilities, @enable_filter, logger: logger
|
131
132
|
|
132
133
|
begin
|
133
134
|
loop do
|
@@ -140,7 +141,7 @@ module HrrRbNetconf
|
|
140
141
|
rpc_reply_e.add_namespace("urn:ietf:params:xml:ns:netconf:base:1.0")
|
141
142
|
rpc_reply_e.add e.to_rpc_error
|
142
143
|
rescue => e
|
143
|
-
log_error { e.message }
|
144
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
144
145
|
raise
|
145
146
|
end
|
146
147
|
@monitor.synchronize do
|
@@ -151,7 +152,7 @@ module HrrRbNetconf
|
|
151
152
|
rpc_reply_e.name = "rpc-reply"
|
152
153
|
rpc_reply_e.add e.to_rpc_error
|
153
154
|
rescue => e
|
154
|
-
log_error { e.message }
|
155
|
+
log_error { [e.backtrace[0], ": ", e.message, " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join }
|
155
156
|
raise
|
156
157
|
ensure
|
157
158
|
begin
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hrr_rb_netconf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hirura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: hrr_rb_relaxed_xml
|