knot-ruby 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/lib/knot/interface.rb +18 -16
- data/lib/knot/protocol.rb +89 -44
- data/lib/knot/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 431bf7db78b2a1b8e1698f53eec8ae8726ef3aca3a9c3b38c77f06ef592fd9c9
|
4
|
+
data.tar.gz: 8dcf78f6703e9c1c00149f629684b1cda175f20f2148c9780cd4eead1a9e78fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68642c8b64d37524a7ee4b53187e444dfe003fc5e47ee6208954b078c9849fabbfcd5080472a7bd42f2fa9721cac6060a04ff26233ba3ee891698cd4227ff919
|
7
|
+
data.tar.gz: 7bcbe887741d86b4fdc09212ae92a8ffc08e824aaaf9ec82fa225e4faf3a5db9434ab99bfff14cc0e918f24f9df6ea792b074f66c1a58ba7a25f8b12d32c1dfd
|
data/lib/knot/interface.rb
CHANGED
@@ -127,37 +127,39 @@ class Knot::Conf
|
|
127
127
|
self.commit
|
128
128
|
end
|
129
129
|
|
130
|
-
def parse_item
|
131
|
-
case
|
130
|
+
def parse_item kv
|
131
|
+
case kv
|
132
132
|
when Hash
|
133
|
-
|
134
|
-
|
135
|
-
|
133
|
+
r = {}
|
134
|
+
kv.each {|k,v| r[k.to_s.to_sym] = v }
|
135
|
+
case r.keys.sort
|
136
|
+
when %i[section], %i[id section], %i[item section], %i[id item section]
|
137
|
+
r
|
136
138
|
else
|
137
|
-
raise ArgumentError, "Invalid Item-format"
|
139
|
+
raise ArgumentError, "Invalid Item-format: #{k}"
|
138
140
|
end
|
139
141
|
|
140
142
|
when Array
|
141
|
-
case
|
142
|
-
when 1 then {section:
|
143
|
-
when 2 then {section:
|
144
|
-
when 3 then {section:
|
145
|
-
else raise ArgumentError, "Invalid Item-format"
|
143
|
+
case kv.length
|
144
|
+
when 1 then {section: kv[0]}
|
145
|
+
when 2 then {section: kv[0], item: kv[1]}
|
146
|
+
when 3 then {section: kv[0], id: kv[1], item: kv[2]}
|
147
|
+
else raise ArgumentError, "Invalid Item-format: #{kv}"
|
146
148
|
end
|
147
149
|
|
148
150
|
when /\A
|
149
|
-
|
150
|
-
|
151
|
-
|
151
|
+
(?<section> [a-z0-9_-]+ )
|
152
|
+
(?: \[ (?<id> [a-z0-9_.-]+) \] )?
|
153
|
+
(?: \. (?<item>[a-z0-9_-]+) )?
|
152
154
|
\z/xi
|
153
155
|
|
154
|
-
|
156
|
+
$~.named_captures.delete_if {|_,v| v.nil? }
|
155
157
|
|
156
158
|
when nil
|
157
159
|
{}
|
158
160
|
|
159
161
|
else
|
160
|
-
raise ArgumentError, "Invalid Item-format"
|
162
|
+
raise ArgumentError, "Invalid Item-format: #{kv}"
|
161
163
|
end
|
162
164
|
end
|
163
165
|
|
data/lib/knot/protocol.rb
CHANGED
@@ -53,7 +53,7 @@ module Knot::Protocol::Type
|
|
53
53
|
end
|
54
54
|
|
55
55
|
#class Knot::KnotC
|
56
|
-
# attr_accessor :
|
56
|
+
# attr_accessor :binary
|
57
57
|
#
|
58
58
|
# def initialize path = nil, binary: nil
|
59
59
|
# @path = path
|
@@ -73,43 +73,77 @@ end
|
|
73
73
|
#end
|
74
74
|
|
75
75
|
module Knot::Protocol::Idx
|
76
|
+
class Id
|
77
|
+
include Comparable
|
78
|
+
attr_reader :name, :code, :cname, :description
|
79
|
+
|
80
|
+
def initialize name, code, cname, description
|
81
|
+
raise ArgumentError, "Expecting Symbol for #{self.class.name} instead of: #{name.inspect}" unless Symbol === name
|
82
|
+
raise ArgumentError, "Expecting Integer for #{self.class.name} instead of: #{code.inspect}" unless Integer === code
|
83
|
+
@name, @code, @cname, @description = name, code, cname, description
|
84
|
+
freeze
|
85
|
+
end
|
86
|
+
|
87
|
+
def === x
|
88
|
+
case x
|
89
|
+
when self.class then self == x
|
90
|
+
when Symbol then @name == x
|
91
|
+
when String then @name == x.to_sym
|
92
|
+
when Integer then @code == x
|
93
|
+
else nil
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def <=>( x) @id <=> x.id end
|
98
|
+
def to_s() @name.to_s end
|
99
|
+
def to_sym() @name end
|
100
|
+
def to_i() @code end
|
101
|
+
end
|
102
|
+
|
76
103
|
Idx = [
|
77
|
-
:command,
|
78
|
-
:flags,
|
79
|
-
:error,
|
80
|
-
:section,
|
81
|
-
:item,
|
82
|
-
:id,
|
83
|
-
:zone,
|
84
|
-
:owner,
|
85
|
-
:ttl,
|
86
|
-
:type,
|
87
|
-
:data,
|
88
|
-
:filter,
|
104
|
+
Id.new( :command, 0x10, :CMD, 'Control command name.'),
|
105
|
+
Id.new( :flags, 0x11, :FLAGS, 'Control command flags.'),
|
106
|
+
Id.new( :error, 0x12, :ERROR, 'Error message.'),
|
107
|
+
Id.new( :section, 0x13, :SECTION, 'Configuration section name.'),
|
108
|
+
Id.new( :item, 0x14, :ITEM, 'Configuration item name.'),
|
109
|
+
Id.new( :id, 0x15, :ID, 'Congiguration item identifier.'),
|
110
|
+
Id.new( :zone, 0x16, :ZONE, 'Zone name.'),
|
111
|
+
Id.new( :owner, 0x17, :OWNER, 'Zone record owner'),
|
112
|
+
Id.new( :ttl, 0x18, :TTL, 'Zone record TTL.'),
|
113
|
+
Id.new( :type, 0x19, :TYPE, 'Zone record type name.'),
|
114
|
+
Id.new( :data, 0x1a, :DATA, 'Configuration item/zone record data.'),
|
115
|
+
Id.new( :filter, 0x1b, :FILTER, 'An option or a filter for output data processing.'),
|
89
116
|
]
|
90
117
|
Name = {}
|
91
118
|
Code = {}
|
92
|
-
|
93
|
-
|
94
|
-
|
119
|
+
|
120
|
+
Idx.each do |id|
|
121
|
+
Code[id.to_i] = id
|
122
|
+
Name[id.to_sym] = id
|
95
123
|
end
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
124
|
+
|
125
|
+
class <<self
|
126
|
+
def [] k
|
127
|
+
case k
|
128
|
+
when Symbol
|
129
|
+
Name[k] or raise Knot::Errors::EINVAL, "Unknown Idx: #{k}"
|
130
|
+
when Integer
|
131
|
+
Code[k] or raise Knot::Errors::EINVAL, "Unknown Idx: #{k}"
|
132
|
+
else
|
133
|
+
raise ArgumentError, "Unknown Idx-Type: #{k}"
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def each &exe
|
138
|
+
block_given? ? Idx.each( &exe) : Idx.to_enum( :each)
|
104
139
|
end
|
105
140
|
end
|
106
141
|
end
|
107
142
|
|
108
143
|
class Knot::Protocol
|
109
|
-
attr_reader :sock, :conf, :zones
|
110
|
-
attr_accessor :debug
|
144
|
+
attr_reader :sock, :conf, :zones, :logger
|
111
145
|
|
112
|
-
def initialize path_or_sock = nil
|
146
|
+
def initialize path_or_sock = nil, logger: nil
|
113
147
|
case path_or_sock
|
114
148
|
when String, Pathname
|
115
149
|
@sock = UNIXSocket.new path_or_sock.to_s
|
@@ -118,24 +152,32 @@ class Knot::Protocol
|
|
118
152
|
when nil
|
119
153
|
@sock = UNIXSocket.new '/run/knot/knot.sock'
|
120
154
|
end
|
121
|
-
@
|
155
|
+
@logger = logger || Logger.new(STDERR)
|
122
156
|
@conf = Knot::Conf.new self
|
123
157
|
@zones = Hash.new {|h, zone| h[zone] = Knot::Zone.new zone, self }
|
124
158
|
end
|
125
159
|
|
126
160
|
def snd sock: nil, **data
|
127
161
|
rsock = sock || @sock
|
128
|
-
s = ''
|
129
|
-
sock = StringIO.new s
|
130
|
-
sock.write [1].pack( 'c')
|
162
|
+
#s = ''.b
|
163
|
+
#sock = StringIO.new s
|
164
|
+
#sock.write [1].pack( 'c')
|
131
165
|
data[:flags] ||= ''
|
132
|
-
|
133
|
-
|
134
|
-
|
166
|
+
ds =
|
167
|
+
Idx::Idx.
|
168
|
+
select {|n| data[n.to_sym] }.
|
169
|
+
map {|n| v = data[n.to_sym].to_s.b; [n.to_i, v.size, v ] }
|
170
|
+
s = (ds.flatten+[3]).pack( ('c na*'*ds.length)+'c').b
|
171
|
+
#Idx::Idx.each do |n|
|
172
|
+
# v = data[n.to_sym]&.to_s&.b
|
173
|
+
# sock.write [n.to_i, v.size, v].pack( 'c na*') if v
|
174
|
+
#end
|
175
|
+
#sock.write [3].pack( 'c')
|
176
|
+
#sock.flush
|
177
|
+
if 0 >= @logger.sev_threshold
|
178
|
+
@logger.debug "send data #{data.inspect}"
|
179
|
+
@logger.debug "send raw #{s.inspect}"
|
135
180
|
end
|
136
|
-
sock.write [3].pack( 'c')
|
137
|
-
sock.flush
|
138
|
-
STDERR.puts( {data: data, _: s}.inspect) if @debug
|
139
181
|
rsock.write s
|
140
182
|
rsock.flush
|
141
183
|
end
|
@@ -144,28 +186,28 @@ class Knot::Protocol
|
|
144
186
|
attr_reader :str
|
145
187
|
|
146
188
|
def initialize sock, str = nil
|
147
|
-
@str, @sock = str || '', sock
|
189
|
+
@str, @sock = str || ''.b, sock
|
148
190
|
end
|
149
191
|
|
150
192
|
def unpack pattern
|
151
|
-
IOUnpack.new(pattern).unpack self
|
193
|
+
IOUnpack.new( pattern).unpack self
|
152
194
|
end
|
153
195
|
|
154
196
|
def unpack1 pattern
|
155
|
-
IOUnpack.new(pattern).unpack1 self
|
197
|
+
IOUnpack.new( pattern).unpack1 self
|
156
198
|
end
|
157
199
|
|
158
200
|
def read n
|
159
201
|
s = @sock.read n
|
160
|
-
@str.insert -1, s
|
161
|
-
s
|
202
|
+
@str.insert -1, s unless s.nil?
|
203
|
+
s || ''
|
162
204
|
end
|
163
205
|
end
|
164
206
|
|
165
207
|
def rcv sock: nil
|
166
208
|
ret, r = [], nil
|
167
209
|
sock = sock || @sock
|
168
|
-
sock = RecordIO.new sock if @
|
210
|
+
sock = RecordIO.new sock if 0 >= @logger.sev_threshold
|
169
211
|
loop do
|
170
212
|
t = sock.unpack1 'c'
|
171
213
|
case t
|
@@ -182,7 +224,10 @@ class Knot::Protocol
|
|
182
224
|
end
|
183
225
|
end
|
184
226
|
ensure
|
185
|
-
|
227
|
+
if RecordIO === sock
|
228
|
+
@logger.debug "rcvd raw #{sock.str.inspect}"
|
229
|
+
@logger.debug "rcvd data #{ret.inspect}"
|
230
|
+
end
|
186
231
|
ret
|
187
232
|
end
|
188
233
|
|
data/lib/knot/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knot-ruby
|
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
|
- Denis Knauf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: iounpack
|
@@ -64,8 +64,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
64
64
|
- !ruby/object:Gem::Version
|
65
65
|
version: '0'
|
66
66
|
requirements: []
|
67
|
-
|
68
|
-
rubygems_version: 2.7.6.2
|
67
|
+
rubygems_version: 3.2.5
|
69
68
|
signing_key:
|
70
69
|
specification_version: 4
|
71
70
|
summary: Provides interface to knot-server.
|