nl-linux 0.2.3 → 0.3.0

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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/CHANGELOG.md +8 -0
  4. data/NLSPEC_VERSION +1 -1
  5. data/Rakefile +13 -3
  6. data/generated/nl/linux/binder.rb +80 -0
  7. data/generated/nl/linux/conntrack.rb +39 -2
  8. data/generated/nl/linux/dev_energymodel.rb +106 -0
  9. data/generated/nl/linux/devlink.rb +1478 -200
  10. data/generated/nl/linux/dpll.rb +790 -66
  11. data/generated/nl/linux/drm_ras.rb +309 -0
  12. data/generated/nl/linux/ethtool.rb +1597 -248
  13. data/generated/nl/linux/fou.rb +82 -13
  14. data/generated/nl/linux/handshake.rb +93 -1
  15. data/generated/nl/linux/lockd.rb +50 -0
  16. data/generated/nl/linux/mptcp_pm.rb +159 -0
  17. data/generated/nl/linux/net_shaper.rb +124 -1
  18. data/generated/nl/linux/netdev.rb +515 -6
  19. data/generated/nl/linux/nfsd.rb +878 -10
  20. data/generated/nl/linux/nftables.rb +2134 -179
  21. data/generated/nl/linux/nl80211.rb +81 -22
  22. data/generated/nl/linux/nlctrl.rb +59 -8
  23. data/generated/nl/linux/ovpn.rb +207 -12
  24. data/generated/nl/linux/ovs_datapath.rb +59 -10
  25. data/generated/nl/linux/ovs_flow.rb +63 -20
  26. data/generated/nl/linux/ovs_packet.rb +277 -0
  27. data/generated/nl/linux/ovs_vport.rb +59 -10
  28. data/generated/nl/linux/psp.rb +453 -6
  29. data/generated/nl/linux/rt_addr.rb +69 -14
  30. data/generated/nl/linux/rt_link.rb +452 -112
  31. data/generated/nl/linux/rt_neigh.rb +227 -16
  32. data/generated/nl/linux/rt_route.rb +92 -49
  33. data/generated/nl/linux/rt_rule.rb +300 -11
  34. data/generated/nl/linux/sunrpc_cache.rb +423 -0
  35. data/generated/nl/linux/tc.rb +168 -54
  36. data/generated/nl/linux/tcp_metrics.rb +69 -12
  37. data/generated/nl/linux/team.rb +80 -0
  38. data/generated/nl/linux/wireguard.rb +99 -7
  39. data/generated/nl/linux.rb +3 -0
  40. data/lib/nl/linux/version.rb +1 -1
  41. data/linux/devlink.yaml +92 -2
  42. data/linux/dpll.yaml +94 -5
  43. data/linux/drm_ras.yaml +126 -0
  44. data/linux/ethtool.yaml +21 -4
  45. data/linux/handshake.yaml +9 -0
  46. data/linux/mptcp_pm.yaml +1 -0
  47. data/linux/net_shaper.yaml +13 -6
  48. data/linux/netdev.yaml +61 -2
  49. data/linux/nfsd.yaml +303 -2
  50. data/linux/nftables.yaml +640 -49
  51. data/linux/ovpn.yaml +26 -1
  52. data/linux/ovs_packet.yaml +130 -0
  53. data/linux/psp.yaml +80 -3
  54. data/linux/rt-link.yaml +70 -24
  55. data/linux/sunrpc_cache.yaml +149 -0
  56. data/linux/tc.yaml +3 -0
  57. metadata +17 -9
@@ -0,0 +1,423 @@
1
+ # SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
2
+ #
3
+ # This file is based on Documentation/netlink/specs/sunrpc_cache.yaml from Linux v7.2.
4
+ #--
5
+ # frozen_string_literal: true
6
+ # rbs_inline: enabled
7
+ # This code is generated by Ynl::Generator. DO NOT EDIT.
8
+ require 'nl'
9
+ module Nl; module Linux
10
+ # SUNRPC cache upcall support over generic netlink.
11
+ class Sunrpc < ::Nl::Family
12
+ NAME = "sunrpc"
13
+ PROTOCOL = Ractor.make_shareable(::Nl::Protocols::Genl.new("sunrpc"))
14
+ MCAST_GROUPS = Ractor.make_shareable({:"none" => ::Nl::McastGroup.new("none", nil), :"exportd" => ::Nl::McastGroup.new("exportd", nil)}) #: Hash[::Symbol, ::Nl::McastGroup]
15
+ module Structs
16
+ end
17
+ module AttributeSets
18
+ class CacheNotify < ::Nl::Protocols::Genl::AttributeSet
19
+ # Abstract class
20
+ class Attribute < ::Nl::Protocols::Genl::AttributeSet::Attribute
21
+ end
22
+ class CacheType < Attribute
23
+ TYPE = 1
24
+ NAME = :"cache_type"
25
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U32, check: nil)
26
+ end
27
+ # :nodoc:
28
+ BY_NAME = Ractor.make_shareable({:"cache_type" => CacheType}) #: Hash[::Symbol, Attribute]
29
+ # :nodoc:
30
+ BY_TYPE = Ractor.make_shareable({1 => CacheType}) #: Hash[::Integer, Attribute]
31
+ class << self
32
+ # Looks up Attribute class by name.
33
+ #--
34
+ # @rbs name: Symbol
35
+ # @rbs return: Attribute
36
+ def by_name(name); BY_NAME.fetch(name); end
37
+ # Looks up Attribute class by type value.
38
+ #--
39
+ # @rbs type: Integer
40
+ # @rbs return: Attribute
41
+ def by_type(type); BY_TYPE.fetch(type); end
42
+ end
43
+ end
44
+ class IpMap < ::Nl::Protocols::Genl::AttributeSet
45
+ # Abstract class
46
+ class Attribute < ::Nl::Protocols::Genl::AttributeSet::Attribute
47
+ end
48
+ class Seqno < Attribute
49
+ TYPE = 1
50
+ NAME = :"seqno"
51
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U64, check: nil)
52
+ end
53
+ class Class < Attribute
54
+ TYPE = 2
55
+ NAME = :"class"
56
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::String.new(check: nil)
57
+ end
58
+ class Addr < Attribute
59
+ TYPE = 3
60
+ NAME = :"addr"
61
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::String.new(check: nil)
62
+ end
63
+ class Domain < Attribute
64
+ TYPE = 4
65
+ NAME = :"domain"
66
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::String.new(check: nil)
67
+ end
68
+ class Negative < Attribute
69
+ TYPE = 5
70
+ NAME = :"negative"
71
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Flag.new
72
+ end
73
+ class Expiry < Attribute
74
+ TYPE = 6
75
+ NAME = :"expiry"
76
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U64, check: nil)
77
+ end
78
+ # :nodoc:
79
+ BY_NAME = Ractor.make_shareable({:"seqno" => Seqno, :"class" => Class, :"addr" => Addr, :"domain" => Domain, :"negative" => Negative, :"expiry" => Expiry}) #: Hash[::Symbol, Attribute]
80
+ # :nodoc:
81
+ BY_TYPE = Ractor.make_shareable({1 => Seqno, 2 => Class, 3 => Addr, 4 => Domain, 5 => Negative, 6 => Expiry}) #: Hash[::Integer, Attribute]
82
+ class << self
83
+ # Looks up Attribute class by name.
84
+ #--
85
+ # @rbs name: Symbol
86
+ # @rbs return: Attribute
87
+ def by_name(name); BY_NAME.fetch(name); end
88
+ # Looks up Attribute class by type value.
89
+ #--
90
+ # @rbs type: Integer
91
+ # @rbs return: Attribute
92
+ def by_type(type); BY_TYPE.fetch(type); end
93
+ end
94
+ end
95
+ class IpMapReqs < ::Nl::Protocols::Genl::AttributeSet
96
+ # Abstract class
97
+ class Attribute < ::Nl::Protocols::Genl::AttributeSet::Attribute
98
+ end
99
+ class Requests < Attribute
100
+ TYPE = 1
101
+ NAME = :"requests"
102
+ end
103
+ # :nodoc:
104
+ BY_NAME = Ractor.make_shareable({:"requests" => Requests}) #: Hash[::Symbol, Attribute]
105
+ # :nodoc:
106
+ BY_TYPE = Ractor.make_shareable({1 => Requests}) #: Hash[::Integer, Attribute]
107
+ class << self
108
+ # Looks up Attribute class by name.
109
+ #--
110
+ # @rbs name: Symbol
111
+ # @rbs return: Attribute
112
+ def by_name(name); BY_NAME.fetch(name); end
113
+ # Looks up Attribute class by type value.
114
+ #--
115
+ # @rbs type: Integer
116
+ # @rbs return: Attribute
117
+ def by_type(type); BY_TYPE.fetch(type); end
118
+ end
119
+ end
120
+ class UnixGid < ::Nl::Protocols::Genl::AttributeSet
121
+ # Abstract class
122
+ class Attribute < ::Nl::Protocols::Genl::AttributeSet::Attribute
123
+ end
124
+ class Seqno < Attribute
125
+ TYPE = 1
126
+ NAME = :"seqno"
127
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U64, check: nil)
128
+ end
129
+ class Uid < Attribute
130
+ TYPE = 2
131
+ NAME = :"uid"
132
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U32, check: nil)
133
+ end
134
+ class Gids < Attribute
135
+ TYPE = 3
136
+ NAME = :"gids"
137
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U32, check: nil)
138
+ end
139
+ class Negative < Attribute
140
+ TYPE = 4
141
+ NAME = :"negative"
142
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Flag.new
143
+ end
144
+ class Expiry < Attribute
145
+ TYPE = 5
146
+ NAME = :"expiry"
147
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U64, check: nil)
148
+ end
149
+ # :nodoc:
150
+ BY_NAME = Ractor.make_shareable({:"seqno" => Seqno, :"uid" => Uid, :"gids" => Gids, :"negative" => Negative, :"expiry" => Expiry}) #: Hash[::Symbol, Attribute]
151
+ # :nodoc:
152
+ BY_TYPE = Ractor.make_shareable({1 => Seqno, 2 => Uid, 3 => Gids, 4 => Negative, 5 => Expiry}) #: Hash[::Integer, Attribute]
153
+ class << self
154
+ # Looks up Attribute class by name.
155
+ #--
156
+ # @rbs name: Symbol
157
+ # @rbs return: Attribute
158
+ def by_name(name); BY_NAME.fetch(name); end
159
+ # Looks up Attribute class by type value.
160
+ #--
161
+ # @rbs type: Integer
162
+ # @rbs return: Attribute
163
+ def by_type(type); BY_TYPE.fetch(type); end
164
+ end
165
+ end
166
+ class UnixGidReqs < ::Nl::Protocols::Genl::AttributeSet
167
+ # Abstract class
168
+ class Attribute < ::Nl::Protocols::Genl::AttributeSet::Attribute
169
+ end
170
+ class Requests < Attribute
171
+ TYPE = 1
172
+ NAME = :"requests"
173
+ end
174
+ # :nodoc:
175
+ BY_NAME = Ractor.make_shareable({:"requests" => Requests}) #: Hash[::Symbol, Attribute]
176
+ # :nodoc:
177
+ BY_TYPE = Ractor.make_shareable({1 => Requests}) #: Hash[::Integer, Attribute]
178
+ class << self
179
+ # Looks up Attribute class by name.
180
+ #--
181
+ # @rbs name: Symbol
182
+ # @rbs return: Attribute
183
+ def by_name(name); BY_NAME.fetch(name); end
184
+ # Looks up Attribute class by type value.
185
+ #--
186
+ # @rbs type: Integer
187
+ # @rbs return: Attribute
188
+ def by_type(type); BY_TYPE.fetch(type); end
189
+ end
190
+ end
191
+ class CacheFlush < ::Nl::Protocols::Genl::AttributeSet
192
+ # Abstract class
193
+ class Attribute < ::Nl::Protocols::Genl::AttributeSet::Attribute
194
+ end
195
+ class Mask < Attribute
196
+ TYPE = 1
197
+ NAME = :"mask"
198
+ DATATYPE = ::Nl::Protocols::Genl::DataTypes::Scalar.new(::Nl::Endian::Host::U32, check: nil)
199
+ end
200
+ # :nodoc:
201
+ BY_NAME = Ractor.make_shareable({:"mask" => Mask}) #: Hash[::Symbol, Attribute]
202
+ # :nodoc:
203
+ BY_TYPE = Ractor.make_shareable({1 => Mask}) #: Hash[::Integer, Attribute]
204
+ class << self
205
+ # Looks up Attribute class by name.
206
+ #--
207
+ # @rbs name: Symbol
208
+ # @rbs return: Attribute
209
+ def by_name(name); BY_NAME.fetch(name); end
210
+ # Looks up Attribute class by type value.
211
+ #--
212
+ # @rbs type: Integer
213
+ # @rbs return: Attribute
214
+ def by_type(type); BY_TYPE.fetch(type); end
215
+ end
216
+ end
217
+ IpMapReqs::Requests::DATATYPE = ::Nl::Protocols::Genl::DataTypes::NestedAttributes.new(IpMap)
218
+ UnixGidReqs::Requests::DATATYPE = ::Nl::Protocols::Genl::DataTypes::NestedAttributes.new(UnixGid)
219
+ end
220
+ module Messages
221
+ # Dump all pending ip_map requests
222
+ #
223
+ # Requires CAP_NET_ADMIN in the initial user namespace.
224
+ class DumpIpMapGetReqsRequest < ::Nl::Protocols::Genl::Message
225
+ TYPE = 2
226
+ FIXED_HEADER = nil
227
+ ATTRIBUTE_SET = AttributeSets::IpMapReqs
228
+ ATTRIBUTES = Ractor.make_shareable(%i[])
229
+ end
230
+ # Dump all pending ip_map requests
231
+ #
232
+ # Requires CAP_NET_ADMIN in the initial user namespace.
233
+ class DumpIpMapGetReqsReply < ::Nl::Protocols::Genl::Message
234
+ TYPE = 2
235
+ FIXED_HEADER = nil
236
+ ATTRIBUTE_SET = AttributeSets::IpMapReqs
237
+ ATTRIBUTES = Ractor.make_shareable(%i[requests])
238
+ # Gets the value of `requests` attribute in the message.
239
+ #--
240
+ # @rbs return: AttributeSets::IpMap
241
+ def requests; attributes[:"requests"]&.value; end
242
+ end
243
+ # Respond to one or more ip_map requests
244
+ #
245
+ # Requires CAP_NET_ADMIN in the initial user namespace.
246
+ class DoIpMapSetReqsRequest < ::Nl::Protocols::Genl::Message
247
+ TYPE = 3
248
+ FIXED_HEADER = nil
249
+ ATTRIBUTE_SET = AttributeSets::IpMapReqs
250
+ ATTRIBUTES = Ractor.make_shareable(%i[requests])
251
+ # Gets the value of `requests` attribute in the message.
252
+ #--
253
+ # @rbs return: AttributeSets::IpMap
254
+ def requests; attributes[:"requests"]&.value; end
255
+ end
256
+ # Dump all pending unix_gid requests
257
+ #
258
+ # Requires CAP_NET_ADMIN in the initial user namespace.
259
+ class DumpUnixGidGetReqsRequest < ::Nl::Protocols::Genl::Message
260
+ TYPE = 4
261
+ FIXED_HEADER = nil
262
+ ATTRIBUTE_SET = AttributeSets::UnixGidReqs
263
+ ATTRIBUTES = Ractor.make_shareable(%i[])
264
+ end
265
+ # Dump all pending unix_gid requests
266
+ #
267
+ # Requires CAP_NET_ADMIN in the initial user namespace.
268
+ class DumpUnixGidGetReqsReply < ::Nl::Protocols::Genl::Message
269
+ TYPE = 4
270
+ FIXED_HEADER = nil
271
+ ATTRIBUTE_SET = AttributeSets::UnixGidReqs
272
+ ATTRIBUTES = Ractor.make_shareable(%i[requests])
273
+ # Gets the value of `requests` attribute in the message.
274
+ #--
275
+ # @rbs return: AttributeSets::UnixGid
276
+ def requests; attributes[:"requests"]&.value; end
277
+ end
278
+ # Respond to one or more unix_gid requests
279
+ #
280
+ # Requires CAP_NET_ADMIN in the initial user namespace.
281
+ class DoUnixGidSetReqsRequest < ::Nl::Protocols::Genl::Message
282
+ TYPE = 5
283
+ FIXED_HEADER = nil
284
+ ATTRIBUTE_SET = AttributeSets::UnixGidReqs
285
+ ATTRIBUTES = Ractor.make_shareable(%i[requests])
286
+ # Gets the value of `requests` attribute in the message.
287
+ #--
288
+ # @rbs return: AttributeSets::UnixGid
289
+ def requests; attributes[:"requests"]&.value; end
290
+ end
291
+ # Flush sunrpc caches (ip_map and/or unix_gid)
292
+ #
293
+ # Requires CAP_NET_ADMIN in the initial user namespace.
294
+ class DoCacheFlushRequest < ::Nl::Protocols::Genl::Message
295
+ TYPE = 6
296
+ FIXED_HEADER = nil
297
+ ATTRIBUTE_SET = AttributeSets::CacheFlush
298
+ ATTRIBUTES = Ractor.make_shareable(%i[mask])
299
+ # Gets the value of `mask` attribute in the message.
300
+ #--
301
+ # @rbs return: ::Integer
302
+ def mask; attributes[:"mask"]&.value; end
303
+ end
304
+ end
305
+ module Notifications
306
+ # Notification that there are cache requests that need servicing
307
+ #
308
+ # Multicast group: `exportd`.
309
+ class CacheNotify < ::Nl::Protocols::Genl::Message
310
+ TYPE = 1
311
+ FIXED_HEADER = nil
312
+ ATTRIBUTE_SET = AttributeSets::CacheNotify
313
+ ATTRIBUTES = Ractor.make_shareable(%i[cache_type])
314
+ # Gets the value of `cache-type` attribute in the message.
315
+ #--
316
+ # @rbs return: ::Integer
317
+ def cache_type; attributes[:"cache_type"]&.value; end
318
+ end
319
+ end
320
+ NOTIFICATIONS = Ractor.make_shareable({1 => Notifications::CacheNotify}) #: Hash[::Integer, ::Class]
321
+ # Dump all pending ip_map requests
322
+ #
323
+ # Requires CAP_NET_ADMIN in the initial user namespace.
324
+ #--
325
+ # @rbs () -> Enumerable[Messages::DumpIpMapGetReqsReply]
326
+ # | () { (Messages::DumpIpMapGetReqsReply) -> void } -> void
327
+ def dump_ip_map_get_reqs(**args, &block)
328
+ exchange_message(:"dump", Messages::DumpIpMapGetReqsRequest, Messages::DumpIpMapGetReqsReply, args, &block)
329
+ end
330
+ # Respond to one or more ip_map requests
331
+ #
332
+ # Requires CAP_NET_ADMIN in the initial user namespace.
333
+ #--
334
+ # @rbs (?requests: AttributeSets::IpMap) -> void
335
+ def do_ip_map_set_reqs(**args)
336
+ exchange_message(:"do", Messages::DoIpMapSetReqsRequest, nil, args)
337
+ end
338
+ # Dump all pending unix_gid requests
339
+ #
340
+ # Requires CAP_NET_ADMIN in the initial user namespace.
341
+ #--
342
+ # @rbs () -> Enumerable[Messages::DumpUnixGidGetReqsReply]
343
+ # | () { (Messages::DumpUnixGidGetReqsReply) -> void } -> void
344
+ def dump_unix_gid_get_reqs(**args, &block)
345
+ exchange_message(:"dump", Messages::DumpUnixGidGetReqsRequest, Messages::DumpUnixGidGetReqsReply, args, &block)
346
+ end
347
+ # Respond to one or more unix_gid requests
348
+ #
349
+ # Requires CAP_NET_ADMIN in the initial user namespace.
350
+ #--
351
+ # @rbs (?requests: AttributeSets::UnixGid) -> void
352
+ def do_unix_gid_set_reqs(**args)
353
+ exchange_message(:"do", Messages::DoUnixGidSetReqsRequest, nil, args)
354
+ end
355
+ # Flush sunrpc caches (ip_map and/or unix_gid)
356
+ #
357
+ # Requires CAP_NET_ADMIN in the initial user namespace.
358
+ #--
359
+ # @rbs (?mask: ::Integer) -> void
360
+ def do_cache_flush(**args)
361
+ exchange_message(:"do", Messages::DoCacheFlushRequest, nil, args)
362
+ end
363
+ class AsyncOperations
364
+ # :nodoc:
365
+ def initialize(&exchange)
366
+ @exchange = exchange
367
+ end
368
+ # Dump all pending ip_map requests
369
+ #
370
+ # Requires CAP_NET_ADMIN in the initial user namespace.
371
+ #--
372
+ # @rbs () -> ::Nl::Async::Stream[Messages::DumpIpMapGetReqsReply]
373
+ def dump_ip_map_get_reqs(**args)
374
+ @exchange.call(:"dump", Messages::DumpIpMapGetReqsRequest, Messages::DumpIpMapGetReqsReply, args)
375
+ end
376
+ # Respond to one or more ip_map requests
377
+ #
378
+ # Requires CAP_NET_ADMIN in the initial user namespace.
379
+ #--
380
+ # @rbs (?requests: AttributeSets::IpMap) -> ::Nl::Async::Future[void]
381
+ def do_ip_map_set_reqs(**args)
382
+ @exchange.call(:"do", Messages::DoIpMapSetReqsRequest, nil, args)
383
+ end
384
+ # Dump all pending unix_gid requests
385
+ #
386
+ # Requires CAP_NET_ADMIN in the initial user namespace.
387
+ #--
388
+ # @rbs () -> ::Nl::Async::Stream[Messages::DumpUnixGidGetReqsReply]
389
+ def dump_unix_gid_get_reqs(**args)
390
+ @exchange.call(:"dump", Messages::DumpUnixGidGetReqsRequest, Messages::DumpUnixGidGetReqsReply, args)
391
+ end
392
+ # Respond to one or more unix_gid requests
393
+ #
394
+ # Requires CAP_NET_ADMIN in the initial user namespace.
395
+ #--
396
+ # @rbs (?requests: AttributeSets::UnixGid) -> ::Nl::Async::Future[void]
397
+ def do_unix_gid_set_reqs(**args)
398
+ @exchange.call(:"do", Messages::DoUnixGidSetReqsRequest, nil, args)
399
+ end
400
+ # Flush sunrpc caches (ip_map and/or unix_gid)
401
+ #
402
+ # Requires CAP_NET_ADMIN in the initial user namespace.
403
+ #--
404
+ # @rbs (?mask: ::Integer) -> ::Nl::Async::Future[void]
405
+ def do_cache_flush(**args)
406
+ @exchange.call(:"do", Messages::DoCacheFlushRequest, nil, args)
407
+ end
408
+ end
409
+ # Returns the asynchronous operation facade for this family.
410
+ #--
411
+ # @rbs (?stream_capacity: ::Integer?) -> AsyncOperations
412
+ def async(stream_capacity: nil)
413
+ return @async_operations ||= build_async_facade(AsyncOperations) if stream_capacity.nil?
414
+ build_async_facade(AsyncOperations, stream_capacity:)
415
+ end
416
+ #--
417
+ # @rbs (*(:none | :exportd) groups) -> self
418
+ def subscribe(*groups) = super
419
+ #--
420
+ # @rbs (*(:none | :exportd) groups) -> self
421
+ def unsubscribe(*groups) = super
422
+ end
423
+ end; end