hrr_rb_netconf 0.2.0 → 0.2.1
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 +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
|