dyndnsd 3.3.2 → 3.4.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 63fbab256de2326bb34f3df754c9aea6729bc73e0f8f203b761b0d23b4de7b11
4
- data.tar.gz: a7dd2761c5a4789f755c85cbbcd8ab0d2e18d6ecdc206cc68cb02ccceff9c80f
3
+ metadata.gz: 9eb3566b683e5a63a61b3f9627faee372f137498652e1d6760f0b4baa4edc986
4
+ data.tar.gz: 8a412e370ccf739826c79450a6464de68d06e20ae681726c78a3ca97d691b704
5
5
  SHA512:
6
- metadata.gz: f5aee257b314d8d9ab0451d747302c141bb9f1dafe8c61b8875de21864164426ede50af13a453ab22bc3eac22946e6106fe5f18911cc5e29e674e1594df92f23
7
- data.tar.gz: a5b58e8dce042beeb32aa09d56a754c42929be3e6952a7cedc0bc9e9cca774027c33f769d003340e1abdb86fa5d750636e74a8ccfd6361bc3fc2ac860158161b
6
+ metadata.gz: bb50e6aa85ca663cea2d504c4aa3d42c6f12b17dca08839886e59ad6b0f0b78f50d7ba97757aa1953555fe61dae02a3d1d83aeb88c27ca9d08d6b9ca95049d76
7
+ data.tar.gz: 8e6e1395d2e52ea14fae024560d8587457562084ec6767ac817bd7837f686069e33eac7885ba63e633e89adbd0b494200aebd344c4c76b95e0474b68ef1b982a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.4.2 (July 30, 2021)
4
+
5
+ IMPROVEMENTS:
6
+
7
+ - move from OpenTracing to OpenTelemetry for experimental tracing feature
8
+
9
+ OTHER:
10
+
11
+ - re-release 3.4.1 to rebuild Docker image with security vulnerabilities fixes
12
+ - adopt Renovate for dependency updates
13
+
14
+ ## 3.4.1 (April 15, 2021)
15
+
16
+ OTHER:
17
+
18
+ - update base of Docker image to Alpine 3.13.5 to fix security vulnerabilities
19
+
20
+ ## 3.4.0 (April 2, 2021)
21
+
22
+ IMPROVEMENTS:
23
+
24
+ - **change** Docker image to run as non-root user `65534` by default, limits attack surface for security and gives OpenShift compatibility
25
+
26
+ ## 3.3.3 (April 1, 2021)
27
+
28
+ OTHER:
29
+
30
+ - update base of Docker image to Alpine 3.13.4 to fix security vulnerabilities
31
+
3
32
  ## 3.3.2 (February 20, 2021)
4
33
 
5
34
  OTHER:
@@ -157,7 +186,7 @@ IMPROVEMENTS:
157
186
 
158
187
  IMPROVEMENTS:
159
188
 
160
- - Support dropping priviliges on startup, also affects external commands run
189
+ - Support dropping privileges on startup, also affects external commands run
161
190
  - Add [metriks](https://github.com/eric/metriks) support for basic metrics in the process title
162
191
  - Detach from child processes running external commands to avoid zombie processes
163
192
 
data/README.md CHANGED
@@ -75,7 +75,7 @@ There is an officially maintained [Docker image for dyndnsd](https://hub.docker.
75
75
 
76
76
  Users can make extensions by deriving from the official Docker image or building their own.
77
77
 
78
- The Docker image consumes the same configuration file in YAML format as the gem, inside the container it needs to be mounted/available as `/etc/dyndnsd/config.yml`. the following YAML should be used as a base and extended with user's settings:
78
+ The Docker image consumes the same configuration file in YAML format as the gem, inside the container it needs to be mounted/available as `/etc/dyndnsd/config.yml`. The following YAML should be used as a base and extended with user's settings:
79
79
 
80
80
  ```yaml
81
81
  host: "0.0.0.0"
@@ -98,7 +98,7 @@ docker run -d --name dyndnsd \
98
98
  cmur2/dyndnsd:vX.Y.Z
99
99
  ```
100
100
 
101
- *Note*: You may need to expose more then just port 8080 e.g. if you use the `zone_transfer_server` which can be done by appending additional `-p 5353:5353` flags to the `docker run` command.
101
+ *Note*: You may need to expose more than just port 8080 e.g. if you use the `zone_transfer_server` which can be done by appending additional `-p 5353:5353` flags to the `docker run` command.
102
102
 
103
103
 
104
104
 
@@ -106,7 +106,7 @@ docker run -d --name dyndnsd \
106
106
 
107
107
  By using [DNS zone transfers via AXFR (RFC5936)](https://tools.ietf.org/html/rfc5936) any secondary nameserver can retrieve the DNS zone contents from dyndnsd.rb and serve them to clients.
108
108
  To speedup propagation after changes dyndnsd.rb can issue a [DNS NOTIFY (RFC1996)](https://tools.ietf.org/html/rfc1996) to inform the nameserver that the DNS zone contents changed and should be fetched even before the time indicated in the SOA record is up.
109
- Currently dyndnsd.rb does not support any authentication for incoming DNS zone transfer requests so it should be isolated from the internet on these ports.
109
+ Currently, dyndnsd.rb does not support any authentication for incoming DNS zone transfer request, so it should be isolated from the internet on these ports.
110
110
 
111
111
  This approach has several advantages:
112
112
  - dyndnsd.rb can be used in *hidden primary* fashion isolated from client's DNS traffic and does not need to implement full nameserver features
@@ -151,7 +151,7 @@ users:
151
151
 
152
152
  NSD is a nice, open source, authoritative-only, low-memory DNS server that reads BIND-style zone files (and converts them into its own database) and has a simple configuration file.
153
153
 
154
- A feature NSD is lacking is the [Dynamic DNS update (RFC2136)](https://tools.ietf.org/html/rfc2136) functionality BIND offers but one can fake it using the following dyndnsd.rb configuration:
154
+ A feature NSD is lacking is the [Dynamic DNS update (RFC2136)](https://tools.ietf.org/html/rfc2136) functionality BIND offers, but one can fake it using the following dyndnsd.rb configuration:
155
155
 
156
156
  ```yaml
157
157
  host: "0.0.0.0"
@@ -197,29 +197,29 @@ The update URL you want to tell your clients (humans or scripts ^^) consists of
197
197
 
198
198
  where:
199
199
 
200
- * the protocol depends on your (webserver/proxy) settings
201
- * USER and PASSWORD are needed for HTTP Basic Auth and valid combinations are defined in your config.yaml
202
- * DOMAIN should match what you defined in your config.yaml as domain but may be anything else when using a webserver as proxy
203
- * PORT depends on your (webserver/proxy) settings
204
- * HOSTNAMES is a required list of comma-separated FQDNs (they all have to end with your config.yaml domain) the user wants to update
205
- * MYIP is optional and the HTTP client's IP address will be used if missing
206
- * MYIP6 is optional but if present also requires presence of MYIP
200
+ * the protocol depends on your (web server/proxy) settings
201
+ * `USER` and `PASSWORD` are needed for HTTP Basic Auth and valid combinations are defined in your config.yaml
202
+ * `DOMAIN` should match what you defined in your config.yaml as domain but may be anything else when using a web server as proxy
203
+ * `PORT` depends on your (web server/proxy) settings
204
+ * `HOSTNAMES` is a required list of comma-separated FQDNs (they all have to end with your config.yaml domain) the user wants to update
205
+ * `MYIP` is optional and the HTTP client's IP address will be used if missing
206
+ * `MYIP6` is optional but if present also requires presence of `MYIP`
207
207
 
208
208
 
209
209
  ### IP address determination
210
210
 
211
211
  The following rules apply:
212
212
 
213
- * use any IP address provided via the myip parameter when present, or
214
- * use any IP address provided via the X-Real-IP header e.g. when used behind HTTP reverse proxy such as nginx, or
213
+ * use any IP address provided via the `myip` parameter when present, or
214
+ * use any IP address provided via the `X-Real-IP` header e.g. when used behind HTTP reverse proxy such as nginx, or
215
215
  * use any IP address used by the connecting HTTP client
216
216
 
217
- If you want to provide an additional IPv6 address as myip6 parameter, the myip parameter containing an IPv4 address has to be present, too! No automatism is applied then.
217
+ If you want to provide an additional IPv6 address as myip6 parameter, the `myip` parameter containing an IPv4 address has to be present, too! No automatism is applied then.
218
218
 
219
219
 
220
220
  ### SSL, multiple listen ports
221
221
 
222
- Use a webserver as a proxy to handle SSL and/or multiple listen addresses and ports. DynDNS.com provides HTTP on port 80 and 8245 and HTTPS on port 443.
222
+ Use a web server as a proxy to handle SSL and/or multiple listen addresses and ports. DynDNS.com provides HTTP on port 80 and 8245 and HTTPS on port 443.
223
223
 
224
224
 
225
225
  ### Startup
@@ -231,7 +231,7 @@ The [Debian 6 init.d script](docs/debian-6-init-dyndnsd) assumes that dyndnsd.rb
231
231
 
232
232
  ### Monitoring
233
233
 
234
- For monitoring dyndnsd.rb uses the [metriks](https://github.com/eric/metriks) framework and exposes several metrics like the number of unauthenticated requests, requests that did (not) update a hostname, etc. By default the most important metrics are shown in the [proctitle](https://github.com/eric/metriks#proc-title-reporter) but you can also configure a [Graphite](https://graphiteapp.org/) backend for central monitoring or the [textfile_reporter](https://github.com/prometheus/node_exporter/#textfile-collector) which outputs Graphite-style metrics that are also compatible with Prometheus to a file.
234
+ For monitoring dyndnsd.rb uses the [metriks](https://github.com/eric/metriks) framework and exposes several metrics like the number of unauthenticated requests, requests that did (not) update a hostname, etc. By default, the most important metrics are shown in the [proctitle](https://github.com/eric/metriks#proc-title-reporter, butt you can also configure a [Graphite](https://graphiteapp.org/) backend for central monitoring or the [textfile_reporter](https://github.com/prometheus/node_exporter/#textfile-collector) which outputs Graphite-style metrics that are also compatible with Prometheus to a file.
235
235
 
236
236
  ```yaml
237
237
  host: "0.0.0.0"
@@ -271,9 +271,9 @@ users:
271
271
 
272
272
  ### Tracing (experimental)
273
273
 
274
- For tracing, dyndnsd.rb is instrumented using the [OpenTracing](http://opentracing.io/) framework and will emit span tracing data for the most important operations happening during the request/response cycle. Using a middleware for Rack allows handling incoming OpenTracing span information properly.
274
+ For tracing, dyndnsd.rb is instrumented using the [OpenTelemetry](https://opentelemetry.io/docs/ruby/) framework and will emit span tracing data for the most important operations happening during the request/response cycle. Using an [instrumentation for Rack](https://github.com/open-telemetry/opentelemetry-ruby/tree/main/instrumentation/rack) allows handling incoming OpenTelemetry parent span information properly (when desired, turned off by default to reduce attack surface).
275
275
 
276
- Currently only one OpenTracing-compatible tracer implementation named [CNCF Jaeger](https://github.com/jaegertracing/jaeger) can be configured to use with dyndnsd.rb.
276
+ Currently, the [OpenTelemetry trace exporter](https://github.com/open-telemetry/opentelemetry-ruby/tree/main/exporter/jaeger) for [CNCF Jaeger](https://github.com/jaegertracing/jaeger) can be enabled via dyndnsd.rb configuration. Alternatively, you can also enable other exporters via the environment variable `OTEL_TRACES_EXPORTER`, e.g. `OTEL_TRACES_EXPORTER=console`.
277
277
 
278
278
  ```yaml
279
279
  host: "0.0.0.0"
@@ -282,11 +282,9 @@ db: "/opt/dyndnsd/db.json"
282
282
  domain: "dyn.example.org"
283
283
  # enable and configure tracing using the (currently only) tracer jaeger
284
284
  tracing:
285
- trust_incoming_span: false # default value, change to accept incoming OpenTracing spans as parents
286
- jaeger:
287
- host: 127.0.0.1 # defaults for host and port of local jaeger-agent
288
- port: 6831
289
- service_name: "my.dyndnsd.identifier"
285
+ trust_incoming_span: false # default value, change to accept incoming OpenTelemetry spans as parents
286
+ service_name: "my.dyndnsd.identifier" # default unset, will be populated by OpenTelemetry
287
+ jaeger: true # enables the Jaeger AgentExporter
290
288
  # configure the updater, here we use command_with_bind_zone, params are updater-specific
291
289
  updater:
292
290
  name: "command_with_bind_zone"
data/lib/dyndnsd.rb CHANGED
@@ -8,9 +8,9 @@ require 'json'
8
8
  require 'yaml'
9
9
  require 'rack'
10
10
  require 'metriks'
11
+ require 'opentelemetry/instrumentation/rack'
12
+ require 'opentelemetry/sdk'
11
13
  require 'metriks/reporter/graphite'
12
- require 'opentracing'
13
- require 'rack/tracer'
14
14
 
15
15
  require 'dyndnsd/generator/bind'
16
16
  require 'dyndnsd/updater/command_with_bind_zone'
@@ -69,7 +69,7 @@ module Dyndnsd
69
69
  # @return [Boolean]
70
70
  def authorized?(username, password)
71
71
  Helper.span('check_authorized') do |span|
72
- span.set_tag('dyndnsd.user', username)
72
+ span.set_attribute('enduser.id', username)
73
73
 
74
74
  allow = Helper.user_allowed?(username, password, @users)
75
75
  if !allow
@@ -112,7 +112,7 @@ module Dyndnsd
112
112
 
113
113
  Dyndnsd.logger.info 'Starting...'
114
114
 
115
- # drop priviliges as soon as possible
115
+ # drop privileges as soon as possible
116
116
  # NOTE: first change group than user
117
117
  if config['group']
118
118
  group = Etc.getgrnam(config['group'])
@@ -170,7 +170,7 @@ module Dyndnsd
170
170
  def process_changes(hostnames, myips)
171
171
  changes = []
172
172
  Helper.span('process_changes') do |span|
173
- span.set_tag('dyndnsd.hostnames', hostnames.join(','))
173
+ span.set_attribute('dyndnsd.hostnames', hostnames.join(','))
174
174
 
175
175
  hostnames.each do |hostname|
176
176
  # myips order is always deterministic
@@ -252,6 +252,8 @@ module Dyndnsd
252
252
  Dyndnsd.logger.progname = 'dyndnsd'
253
253
  Dyndnsd.logger.formatter = LogFormatter.new
254
254
  Dyndnsd.logger.level = config['debug'] ? Logger::DEBUG : Logger::INFO
255
+
256
+ OpenTelemetry.logger = Dyndnsd.logger
255
257
  end
256
258
 
257
259
  # @return [void]
@@ -296,16 +298,31 @@ module Dyndnsd
296
298
  # @param config [Hash{String => Object}]
297
299
  # @return [void]
298
300
  private_class_method def self.setup_tracing(config)
299
- # configure OpenTracing
300
- if config.dig('tracing', 'jaeger')
301
- require 'jaeger/client'
302
-
303
- host = config['tracing']['jaeger']['host'] || '127.0.0.1'
304
- port = config['tracing']['jaeger']['port'] || 6831
305
- service_name = config['tracing']['jaeger']['service_name'] || 'dyndnsd'
306
- OpenTracing.global_tracer = Jaeger::Client.build(
307
- host: host, port: port, service_name: service_name, flush_interval: 1
308
- )
301
+ # by default do not try to emit any traces until the user opts in
302
+ ENV['OTEL_TRACES_EXPORTER'] ||= 'none'
303
+
304
+ # configure OpenTelemetry
305
+ OpenTelemetry::SDK.configure do |c|
306
+ if config.dig('tracing', 'jaeger')
307
+ require 'opentelemetry/exporter/jaeger'
308
+
309
+ c.add_span_processor(
310
+ OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
311
+ OpenTelemetry::Exporter::Jaeger::AgentExporter.new
312
+ )
313
+ )
314
+ end
315
+
316
+ if config.dig('tracing', 'service_name')
317
+ c.service_name = config['tracing']['service_name']
318
+ end
319
+
320
+ c.service_version = Dyndnsd::VERSION
321
+ c.use('OpenTelemetry::Instrumentation::Rack')
322
+ end
323
+
324
+ if !config.dig('tracing', 'trust_incoming_span')
325
+ OpenTelemetry.propagation = OpenTelemetry::Context::Propagation::NoopTextMapPropagator.new
309
326
  end
310
327
  end
311
328
 
@@ -331,8 +348,7 @@ module Dyndnsd
331
348
  app = Responder::DynDNSStyle.new(app)
332
349
  end
333
350
 
334
- trust_incoming_span = config.dig('tracing', 'trust_incoming_span') || false
335
- app = Rack::Tracer.new(app, trust_incoming_span: trust_incoming_span)
351
+ app = OpenTelemetry::Instrumentation::Rack::Middlewares::TracerMiddleware.new(app)
336
352
 
337
353
  Rack::Handler::WEBrick.run app, Host: config['host'], Port: config['port']
338
354
  end
@@ -45,24 +45,17 @@ module Dyndnsd
45
45
  # @param block [Proc]
46
46
  # @return [void]
47
47
  def self.span(operation, &block)
48
- scope = OpenTracing.start_active_span(operation)
49
- span = scope.span
50
- span.set_tag('component', 'dyndnsd')
51
- span.set_tag('span.kind', 'server')
52
- begin
48
+ tracer = OpenTelemetry.tracer_provider.tracer(Dyndnsd.name, Dyndnsd::VERSION)
49
+ tracer.in_span(
50
+ operation,
51
+ attributes: {'component' => 'dyndnsd'},
52
+ kind: :server
53
+ ) do |span|
54
+ Dyndnsd.logger.debug "Creating span ID #{span.context.hex_span_id} for trace ID #{span.context.hex_trace_id}"
53
55
  block.call(span)
54
56
  rescue StandardError => e
55
- span.set_tag('error', true)
56
- span.log_kv(
57
- event: 'error',
58
- 'error.kind': e.class.to_s,
59
- 'error.object': e,
60
- message: e.message,
61
- stack: e.backtrace&.join("\n") || ''
62
- )
57
+ span.record_exception(e)
63
58
  raise e
64
- ensure
65
- scope.close
66
59
  end
67
60
  end
68
61
  end
@@ -18,7 +18,7 @@ module Dyndnsd
18
18
  return if !db.changed?
19
19
 
20
20
  Helper.span('updater_update') do |span|
21
- span.set_tag('dyndnsd.updater.name', self.class.name&.split('::')&.last || 'None')
21
+ span.set_attribute('dyndnsd.updater.name', self.class.name&.split('::')&.last || 'None')
22
22
 
23
23
  # write zone file in bind syntax
24
24
  File.open(@zone_file, 'w') { |f| f.write(@generator.generate(db)) }
@@ -35,7 +35,7 @@ module Dyndnsd
35
35
  # @return [void]
36
36
  def update(db)
37
37
  Helper.span('updater_update') do |span|
38
- span.set_tag('dyndnsd.updater.name', self.class.name&.split('::')&.last || 'None')
38
+ span.set_attribute('dyndnsd.updater.name', self.class.name&.split('::')&.last || 'None')
39
39
 
40
40
  soa_rr = Resolv::DNS::Resource::IN::SOA.new(
41
41
  @zone_nameservers[0], @zone_email_address,
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dyndnsd
4
- VERSION = '3.3.2'
4
+ VERSION = '3.4.2'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dyndnsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.2
4
+ version: 3.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christian Nicolai
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-20 00:00:00.000000000 Z
11
+ date: 2021-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async-dns
@@ -25,75 +25,75 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: 1.2.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: jaeger-client
28
+ name: metriks
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.1.0
33
+ version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.1.0
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: metriks
42
+ name: opentelemetry-exporter-jaeger
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.19.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 0.19.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: opentracing
56
+ name: opentelemetry-instrumentation-rack
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.5.0
61
+ version: 0.19.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.5.0
68
+ version: 0.19.0
69
69
  - !ruby/object:Gem::Dependency
70
- name: rack
70
+ name: opentelemetry-sdk
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '2.0'
75
+ version: 1.0.0.rc2
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '2.0'
82
+ version: 1.0.0.rc2
83
83
  - !ruby/object:Gem::Dependency
84
- name: rack-tracer
84
+ name: rack
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.9.0
89
+ version: '2.0'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.9.0
96
+ version: '2.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: webrick
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.7.0
131
+ version: 0.8.0
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.7.0
138
+ version: 0.8.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rack-test
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -184,56 +184,56 @@ dependencies:
184
184
  requirements:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: 1.10.0
187
+ version: 1.18.1
188
188
  type: :development
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: 1.10.0
194
+ version: 1.18.1
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rubocop-rake
197
197
  requirement: !ruby/object:Gem::Requirement
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: 0.5.1
201
+ version: 0.6.0
202
202
  type: :development
203
203
  prerelease: false
204
204
  version_requirements: !ruby/object:Gem::Requirement
205
205
  requirements:
206
206
  - - "~>"
207
207
  - !ruby/object:Gem::Version
208
- version: 0.5.1
208
+ version: 0.6.0
209
209
  - !ruby/object:Gem::Dependency
210
210
  name: rubocop-rspec
211
211
  requirement: !ruby/object:Gem::Requirement
212
212
  requirements:
213
213
  - - "~>"
214
214
  - !ruby/object:Gem::Version
215
- version: 2.2.0
215
+ version: 2.4.0
216
216
  type: :development
217
217
  prerelease: false
218
218
  version_requirements: !ruby/object:Gem::Requirement
219
219
  requirements:
220
220
  - - "~>"
221
221
  - !ruby/object:Gem::Version
222
- version: 2.2.0
222
+ version: 2.4.0
223
223
  - !ruby/object:Gem::Dependency
224
224
  name: solargraph
225
225
  requirement: !ruby/object:Gem::Requirement
226
226
  requirements:
227
227
  - - "~>"
228
228
  - !ruby/object:Gem::Version
229
- version: 0.40.0
229
+ version: 0.43.0
230
230
  type: :development
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - "~>"
235
235
  - !ruby/object:Gem::Version
236
- version: 0.40.0
236
+ version: 0.43.0
237
237
  description: A small, lightweight and extensible DynDNS server written with Ruby and
238
238
  Rack.
239
239
  email: