1
0
mirror of https://github.com/cmur2/dyndnsd.git synced 2025-08-08 08:33:56 +02:00

Compare commits

..

50 Commits

Author SHA1 Message Date
cn
c335a96e12 release: 3.2.0 2021-01-14 11:04:50 +01:00
cn
c2ed69da6d ci: use bundler cache to save resources
- see https://github.com/ruby/setup-ruby#caching-bundle-install-automatically
2020-12-26 15:19:20 +01:00
depfu[bot]
b2d421154e gems: update rubocop to version 1.7.0 2020-12-26 14:25:30 +01:00
cn
5444782ead gems: include rubocop-rspec and fix linting 2020-12-25 18:05:41 +01:00
cn
1c1bcd253a gems: include rubocop-rake and fix linting 2020-12-25 18:04:59 +01:00
cn
23c09f722c gem: add Ruby 3.0 support 2020-12-25 16:45:51 +01:00
cn
e29b451de4 gems: revert back to upstream solargraph now with rubocop 1.0 compat
See https://github.com/castwide/solargraph/issues/380 and previous commit e063b6cb4c
2020-12-25 16:25:45 +01:00
cn
d89c1c6091 release: 3.1.3 2020-12-20 22:18:20 +01:00
cn
2a7ea2bb8f ci: use Github environment files (fix part 2)
- fixing vulnerability via https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#environment-files
2020-12-20 22:15:39 +01:00
cn
94823dc041 release: 3.1.2 2020-12-20 22:05:13 +01:00
depfu[bot]
4c25b9b66b gems: update rubocop to version 1.6.1 2020-12-11 11:47:05 +01:00
cn
fb42c57ff1 ci: drop Travis CI
- end of an era
2020-12-10 11:04:23 +01:00
Christian Nicolai
268e18f2e5 ci: allow manually triggering CI run on GHA 2020-12-04 09:07:09 +01:00
cn
e8e9e0cb71 ci: use GHA ruby/setup-ruby instead of broken actions/setup-ruby
- actions/setup-ruby does not work on new GHA runners Ubuntu 20.04 (missing bundler in 2.5) as per https://github.com/actions/setup-ruby/issues/70
- might be deprecated as per https://github.com/actions/setup-ruby/issues/80
- https://github.com/ruby/setup-ruby is recommended is superior
2020-12-04 09:04:23 +01:00
depfu[bot]
8819d6058a gems: update rubocop to version 1.5.1 2020-12-03 21:25:14 +01:00
cn
dc325d686e ci: use Github Actions in parallel to Travis CI
- this adds a new workflow for Github Actions that mirrors what the existing Travis CI workflow tests
- Travis CI might become unfriendly to opensource soonish so migration might be necessary
2020-11-25 09:39:55 +01:00
depfu[bot]
f0aeea96d4 gems: update rubocop to version 1.4.1 2020-11-24 20:55:22 +01:00
cn
ff136f7b16 ci: add periodic pulling of all Docker image tags to avoid staleness 2020-11-19 11:05:26 +01:00
depfu[bot]
377a6ac179 gems: update rubocop to version 1.3.0 2020-11-13 11:32:34 +01:00
depfu[bot]
2cc45e5c0f gems: update rubocop to version 1.2.0 2020-11-06 10:57:59 +01:00
cn
19683672d1 docs: use travis-ci.com links 2020-10-31 00:04:51 +01:00
cn
4c1fb5783d gem: fix new solargraph warning 2020-10-31 00:04:01 +01:00
cn
d8f5618006 gem: fix new rubocop warnings 2020-10-31 00:04:01 +01:00
cn
e063b6cb4c gems: use solargraph fork until gem metadata allows rubocop 1.0 compat
See https://github.com/castwide/solargraph/issues/380
2020-10-31 00:04:01 +01:00
depfu[bot]
f64bcc0780 gems: update rubocop to version 1.1.0 2020-10-31 00:04:01 +01:00
depfu[bot]
568ea08543 gems: update rubocop to version 1.0.0 2020-10-22 15:55:39 +02:00
depfu[bot]
5c16524788 gems: update rubocop to version 0.93.0 2020-10-10 16:45:54 +02:00
cn
d1c1a98e47 ci: use Github environment files
- fixing vulnerability via https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#environment-files
2020-10-08 12:32:44 +02:00
d62bf71820 ci: ignore false-positive 3rd party lockfiles for trivy 2020-10-08 12:29:35 +02:00
cn
156557c6d7 release: 3.1.1 2020-10-03 10:59:52 +02:00
cn
fd1d58abd6 gems: update webrick to version 1.6.1
- explicitly use webrick gem version with patch against CVE-2020-25613
- https://www.ruby-lang.org/en/news/2020/09/29/http-request-smuggling-cve-2020-25613/
- webrick versions bundled with ruby are vulnerable at this point
2020-10-02 00:50:23 +02:00
depfu[bot]
fc4d731434 gems: update rubocop to version 0.92.0 2020-09-26 12:39:42 +02:00
depfu[bot]
8b42a916d0 gems: update rubocop to version 0.91.0 2020-09-16 09:31:58 +02:00
depfu[bot]
e899488fa9 gems: update rubocop to version 0.90.0 2020-09-02 10:34:03 +02:00
6ed0799f49 ci: improve ignore of false-positives on 3rd party lockfiles
- amends 5b332d8f57
2020-08-30 11:41:23 +02:00
5b332d8f57 ci: ignore false-positive 3rd party lockfiles for trivy
- uses newly released `--skip-dirs` flag of Trivy 0.11.0
2020-08-30 11:34:26 +02:00
cn
0de5078d9d ci: add Dockerfile linting 2020-08-22 12:50:55 +02:00
depfu[bot]
72c8dda7dd gems: update jaeger-client to version 1.1.0
Update jaeger-client to version 1.1.0 (#62)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-08-22 11:27:57 +02:00
cn
e36b210f66 ci: update github actions versions 2020-08-21 16:39:11 +02:00
cn
fcc3f12284 ci: fix vulnscan behavior to scan most-recent semver 2020-08-19 14:33:26 +02:00
cn
bf68049260 release: 3.1.0 2020-08-19 14:13:07 +02:00
cn
35ced6468e ci: allow manual run of vulnscan action workflow 2020-08-18 22:53:33 +02:00
cn
4833328557 docs: improve docker run instructions 2020-08-18 22:40:30 +02:00
cn
25e70f484d release: 3.1.0.rc1 2020-08-18 22:26:56 +02:00
cn
617fbf538b docker: add image release on tag and periodic vulnerability scan 2020-08-18 22:22:41 +02:00
cn
5cce42f4c7 gem: fix solargraph warnings on CI 2020-08-17 12:10:35 +02:00
cn
093efc77ef gem: add editorconfig 2020-08-12 07:55:37 +02:00
depfu[bot]
2368099f7d gems: upgrade jaeger-client to version 1.0.0
Update jaeger-client to version 1.0.0 (#38)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-08-11 16:08:28 +02:00
depfu[bot]
708cd13237 gems: update rubocop to version 0.89.0
Update rubocop to version 0.89.0 (#59)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
2020-08-07 08:36:49 +02:00
cn
a89a263250 docs: add example Dockerfile 2020-07-30 19:52:01 +02:00
22 changed files with 283 additions and 56 deletions

9
.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

26
.github/workflows/cd.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
---
name: cd
on:
push:
tags:
- 'v*.*.*'
jobs:
release-dockerimage:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Extract dyndnsd version from tag name
run: |
echo "DYNDNSD_VERSION=${GITHUB_REF#refs/*/v}" >> $GITHUB_ENV
# https://github.com/marketplace/actions/build-and-push-docker-images
- name: Build and push Docker image for dyndnsd ${{ env.DYNDNSD_VERSION }}
uses: docker/build-push-action@v1
with:
username: cmur2
password: ${{ secrets.DOCKER_TOKEN }}
repository: cmur2/dyndnsd
path: docker
build_args: DYNDNSD_VERSION=${{ env.DYNDNSD_VERSION }}
tag_with_ref: true

32
.github/workflows/ci.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
---
name: ci
on:
push:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:
schedule:
- cron: '35 4 * * 4' # weekly on thursday morning
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
ruby-version:
- '2.5'
- '2.6'
- '2.7'
- '3.0'
steps:
- uses: actions/checkout@v2
- name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby-version }}
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
- name: Lint and Test
run: |
bundle exec rake ci

19
.github/workflows/dockerhub.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
---
name: dockerhub
on:
schedule:
- cron: '7 4 * * 4' # weekly on thursday morning
workflow_dispatch:
jobs:
pull-released-dockerimages:
runs-on: ubuntu-latest
steps:
- name: Avoid stale tags by pulling
run: |
ALL_IMAGES="$(curl -s https://hub.docker.com/v2/repositories/cmur2/dyndnsd/tags?page_size=1000 | jq -r '.results[].name | "cmur2/dyndnsd:" + .' | grep -e 'cmur2/dyndnsd:v')"
for image in $ALL_IMAGES; do
echo "Pulling $image to avoid staleness..."
docker pull "$image"
done

46
.github/workflows/vulnscan.yml vendored Normal file
View File

@@ -0,0 +1,46 @@
---
name: vulnscan
on:
schedule:
- cron: '7 4 * * 4' # weekly on thursday morning
workflow_dispatch:
jobs:
scan-released-dockerimages:
runs-on: ubuntu-latest
env:
TRIVY_LIGHT: 'true'
TRIVY_IGNORE_UNFIXED: 'true'
TRIVY_REMOVED_PKGS: 'true'
steps:
- name: Install Trivy
run: |
mkdir -p $GITHUB_WORKSPACE/bin
echo "$GITHUB_WORKSPACE/bin" >> "$GITHUB_PATH"
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b $GITHUB_WORKSPACE/bin
- name: Download Trivy DB
run: |
trivy image --download-db-only
- name: Scan vulnerabilities using Trivy
env:
TRIVY_SKIP_DIRS: 'usr/lib/ruby/gems/2.7.0/gems/jaeger-client-0.10.0/crossdock,usr/lib/ruby/gems/2.7.0/gems/jaeger-client-1.0.0/crossdock,usr/lib/ruby/gems/2.7.0/gems/jaeger-client-1.1.0/crossdock'
run: |
trivy --version
# semver sorting as per https://stackoverflow.com/a/40391207/2148786
ALL_IMAGES="$(curl -s https://hub.docker.com/v2/repositories/cmur2/dyndnsd/tags?page_size=1000 | jq -r '.results[].name | "cmur2/dyndnsd:" + .' | grep -e 'cmur2/dyndnsd:v' | sed '/-/!{s/$/_/}' | sort -r -V | sed 's/_$//')"
EXIT_CODE=0
set -e
for major_version in $(seq 1 10); do
for image in $ALL_IMAGES; do
if [[ "$image" = cmur2/dyndnsd:v$major_version.* ]]; then
echo -e "\nScanning newest patch release $image of major v$major_version...\n"
if ! trivy image --skip-update --exit-code 1 "$image"; then
EXIT_CODE=1
fi
break
fi
done
done
exit "$EXIT_CODE"

View File

@@ -1,3 +1,7 @@
require:
- rubocop-rake
- rubocop-rspec
AllCops:
TargetRubyVersion: '2.5'
NewCops: enable
@@ -86,3 +90,9 @@ Style/SymbolArray:
Style/TrailingCommaInArrayLiteral:
Enabled: false
RSpec/ExampleLength:
Max: 20
RSpec/MultipleExpectations:
Max: 20

View File

@@ -1,10 +0,0 @@
---
os: linux
language: ruby
rvm:
- 2.7
- 2.6
- 2.5
script:
- bundle exec rake travis

View File

@@ -1,5 +1,36 @@
# Changelog
## 3.2.0 (January 14, 2021)
IMPROVEMENTS:
- Add Ruby 3.0 support
## 3.1.3 (December 20, 2020)
OTHER:
- fix Docker image release process in Github Actions CI, 3.1.2 was not released as a Docker image
## 3.1.2 (December 20, 2020)
OTHER:
- fixes vulnerabilities in Docker image by using updated Alpine base image
- start using Github Actions CI for tests and drop Travis CI
## 3.1.1 (October 3, 2020)
IMPROVEMENTS:
- Use webrick gem which contains fixes against [CVE-2020-25613](https://www.ruby-lang.org/en/news/2020/09/29/http-request-smuggling-cve-2020-25613/)
## 3.1.0 (August 19, 2020)
IMPROVEMENTS:
- Add officially maintained [Docker image for dyndnsd](https://hub.docker.com/r/cmur2/dyndnsd)
## 3.0.0 (July 29, 2020)
IMPROVEMENTS:

View File

@@ -1,6 +1,6 @@
# dyndnsd.rb
[![Build Status](https://travis-ci.org/cmur2/dyndnsd.svg?branch=master)](https://travis-ci.org/cmur2/dyndnsd) [![Dependencies](https://badges.depfu.com/badges/4f25da8493f7a29f652ac892fbf9227b/overview.svg)](https://depfu.com/github/cmur2/dyndnsd)
![ci](https://github.com/cmur2/dyndnsd/workflows/ci/badge.svg) [![Dependencies](https://badges.depfu.com/badges/4f25da8493f7a29f652ac892fbf9227b/overview.svg)](https://depfu.com/github/cmur2/dyndnsd)
A small, lightweight and extensible DynDNS server written with Ruby and Rack.
@@ -64,7 +64,42 @@ users:
Run dyndnsd.rb by:
dyndnsd /path/to/config.yaml
```bash
dyndnsd /path/to/config.yml
```
### Docker image
There is an officially maintained [Docker image for dyndnsd](https://hub.docker.com/r/cmur2/dyndnsd) available at Dockerhub. The goal is to have a minimal secured image available (currently based on Alpine) that works well for the `zone_transfer_server` updater use case.
Users can make extensions by deriving from the official Docker image or building their own.
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:
```yaml
host: "0.0.0.0"
port: 8080
# omit the logfile: option so logging to STDOUT will happen automatically
db: "/var/lib/dyndnsd/db.json"
# User's settings for updater and permissions follow here!
```
more ports might be needed depending on if DNS zone transfer is needed
Run the Docker image exposing the DynDNS-API on host port 8080 via:
```bash
docker run -d --name dyndnsd \
-p 8080:8080 \
-v /host/path/to/dyndnsd/config.yml:/etc/dyndnsd/config.yml \
-v /host/ptherpath/to/dyndnsd/datadir:/var/lib/dyndnsd \
cmur2/dyndnsd:vX.Y.Z
```
*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.
## Using dyndnsd.rb with any nameserver via DNS zone transfers (AXFR)
@@ -187,9 +222,11 @@ If you want to provide an additional IPv6 address as myip6 parameter, the myip p
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.
### Init scripts
### Startup
The [Debian 6 init.d script](init.d/debian-6-dyndnsd) assumes that dyndnsd.rb is installed into the system ruby (no RVM support) and the config.yaml is at /opt/dyndnsd/config.yaml. Modify to your needs.
There is a [Dockerfile](docs/Dockerfile) that can be used to build a Docker image for running dyndnsd.rb.
The [Debian 6 init.d script](docs/debian-6-init-dyndnsd) assumes that dyndnsd.rb is installed into the system ruby (no RVM support) and the config.yaml is at /opt/dyndnsd/config.yaml. Modify to your needs.
### Monitoring

View File

@@ -9,16 +9,24 @@ RSpec::Core::RakeTask.new(:spec)
RuboCop::RakeTask.new
Bundler::Audit::Task.new
desc 'Should be run by developer once to prepare initial solargraph usage (fill caches etc.)'
task :'solargraph:init' do
sh 'solargraph download-core'
end
desc 'Run experimental solargraph type checker'
task :'solargraph:tc' do
task :solargraph do
sh 'solargraph typecheck'
end
task default: [:rubocop, :spec, 'bundle:audit']
namespace :solargraph do
desc 'Should be run by developer once to prepare initial solargraph usage (fill caches etc.)'
task :init do
sh 'solargraph download-core'
end
end
task travis: [:default, :'solargraph:tc']
desc 'Run hadolint for Dockerfile linting'
task :hadolint do
sh 'docker run --rm -i hadolint/hadolint:v1.18.0 hadolint --ignore DL3018 - < docker/Dockerfile'
end
task default: [:rubocop, :spec, 'bundle:audit', :solargraph]
desc 'Run all tasks desired for CI'
task ci: ['solargraph:init', :default, :hadolint]

15
docker/Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM alpine:3.12
EXPOSE 5353 8080
ARG DYNDNSD_VERSION=3.0.0
RUN apk --no-cache add openssl ca-certificates && \
apk --no-cache add ruby ruby-etc ruby-io-console ruby-json ruby-webrick && \
apk --no-cache add --virtual .build-deps ruby-dev build-base tzdata && \
gem install --no-document dyndnsd -v ${DYNDNSD_VERSION} && \
# set timezone to Berlin
cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime && \
apk del .build-deps
ENTRYPOINT ["dyndnsd", "/etc/dyndnsd/config.yml"]

0
init.d/debian-6-dyndnsd → docs/debian-6-init-dyndnsd Normal file → Executable file
View File

View File

@@ -28,17 +28,20 @@ Gem::Specification.new do |s|
s.required_ruby_version = '>= 2.5'
s.add_runtime_dependency 'async-dns', '~> 1.2.0'
s.add_runtime_dependency 'jaeger-client', '~> 0.10.0'
s.add_runtime_dependency 'jaeger-client', '~> 1.1.0'
s.add_runtime_dependency 'metriks'
s.add_runtime_dependency 'opentracing', '~> 0.5.0'
s.add_runtime_dependency 'rack', '~> 2.0'
s.add_runtime_dependency 'rack-tracer', '~> 0.9.0'
s.add_runtime_dependency 'webrick', '>= 1.6.1'
s.add_development_dependency 'bundler'
s.add_development_dependency 'bundler-audit', '~> 0.7.0'
s.add_development_dependency 'rack-test'
s.add_development_dependency 'rake'
s.add_development_dependency 'rspec'
s.add_development_dependency 'rubocop', '~> 0.88.0'
s.add_development_dependency 'solargraph'
s.add_development_dependency 'rubocop', '~> 1.7.0'
s.add_development_dependency 'rubocop-rake', '~> 0.5.1'
s.add_development_dependency 'rubocop-rspec', '~> 2.1.0'
s.add_development_dependency 'solargraph', '~> 0.40.0'
end

View File

@@ -1,5 +1,6 @@
# frozen_string_literal: true
require 'date'
require 'etc'
require 'logger'
require 'ipaddr'
@@ -80,7 +81,7 @@ module Dyndnsd
end
# @param env [Hash{String => String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def call(env)
return [422, {'X-DynDNS-Response' => 'method_forbidden'}, []] if env['REQUEST_METHOD'] != 'GET'
return [422, {'X-DynDNS-Response' => 'not_found'}, []] if env['PATH_INFO'] != '/nic/update'
@@ -134,7 +135,7 @@ module Dyndnsd
private
# @param params [Hash{String => String}]
# @return [Array{String}]
# @return [Array<String>]
def extract_v4_and_v6_address(params)
return [] if !(params['myip'])
begin
@@ -148,7 +149,7 @@ module Dyndnsd
# @param env [Hash{String => String}]
# @param params [Hash{String => String}]
# @return [Array{String}]
# @return [Array<String>]
def extract_myips(env, params)
# require presence of myip parameter as valid IPAddr (v4) and valid myip6
return extract_v4_and_v6_address(params) if params.key?('myip6')
@@ -164,8 +165,8 @@ module Dyndnsd
end
# @param hostnames [String]
# @param myips [Array{String}]
# @return [Array{Symbol}]
# @param myips [Array<String>]
# @return [Array<Symbol>]
def process_changes(hostnames, myips)
changes = []
Helper.span('process_changes') do |span|
@@ -200,7 +201,7 @@ module Dyndnsd
end
# @param env [Hash{String => String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def handle_dyndns_request(env)
params = Rack::Utils.parse_query(env['QUERY_STRING'])
@@ -245,7 +246,7 @@ module Dyndnsd
if config['logfile']
Dyndnsd.logger = Logger.new(config['logfile'])
else
Dyndnsd.logger = Logger.new(STDOUT)
Dyndnsd.logger = Logger.new($stdout)
end
Dyndnsd.logger.progname = 'dyndnsd'

View File

@@ -27,7 +27,7 @@ module Dyndnsd
ips.each do |ip|
ip = IPAddr.new(ip).native
type = ip.ipv6? ? 'AAAA' : 'A'
name = hostname.chomp('.' + @domain)
name = hostname.chomp(".#{@domain}")
out << "#{name} IN #{type} #{ip}"
end
end

View File

@@ -60,7 +60,7 @@ module Dyndnsd
message: e.message,
stack: e.backtrace&.join("\n") || ''
)
raise
raise e
ensure
scope.close
end

View File

@@ -9,7 +9,7 @@ module Dyndnsd
end
# @param env [Hash{String => String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def call(env)
@app.call(env).tap do |status_code, headers, body|
if headers.key?('X-DynDNS-Response')
@@ -24,8 +24,8 @@ module Dyndnsd
# @param status_code [Integer]
# @param headers [Hash{String => String}]
# @param body [Array{String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @param body [Array<String>]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def decorate_dyndnsd_response(status_code, headers, body)
case status_code
when 200
@@ -37,8 +37,8 @@ module Dyndnsd
# @param status_code [Integer]
# @param headers [Hash{String => String}]
# @param _body [Array{String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @param _body [Array<String>]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def decorate_other_response(status_code, headers, _body)
case status_code
when 400
@@ -48,8 +48,8 @@ module Dyndnsd
end
end
# @param changes [Array{Symbol}]
# @param myips [Array{String}]
# @param changes [Array<Symbol>]
# @param myips [Array<String>]
# @return [String]
def get_success_body(changes, myips)
changes.map { |change| "#{change} #{myips.join(' ')}" }.join("\n")

View File

@@ -9,7 +9,7 @@ module Dyndnsd
end
# @param env [Hash{String => String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def call(env)
@app.call(env).tap do |status_code, headers, body|
if headers.key?('X-DynDNS-Response')
@@ -24,8 +24,8 @@ module Dyndnsd
# @param status_code [Integer]
# @param headers [Hash{String => String}]
# @param body [Array{String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @param body [Array<String>]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def decorate_dyndnsd_response(status_code, headers, body)
case status_code
when 200
@@ -37,8 +37,8 @@ module Dyndnsd
# @param status_code [Integer]
# @param headers [Hash{String => String}]
# @param _body [Array{String}]
# @return [Array{Integer,Hash{String => String},Array{String}}]
# @param _body [Array<String>]
# @return [Array{Integer,Hash{String => String},Array<String>}]
def decorate_other_response(status_code, headers, _body)
case status_code
when 400
@@ -48,8 +48,8 @@ module Dyndnsd
end
end
# @param changes [Array{Symbol}]
# @param myips [Array{String}]
# @param changes [Array<Symbol>]
# @param myips [Array<String>]
# @return [String]
def get_success_body(changes, myips)
changes.map { |change| change == :good ? "Changed to #{myips.join(' ')}" : "No change needed for #{myips.join(' ')}" }.join("\n")

View File

@@ -18,7 +18,7 @@ module Dyndnsd
@registry = options[:registry] || Metriks::Registry.default
@interval = options[:interval] || 60
@on_error = options[:on_error] || proc { |ex| }
@on_error = options[:on_error] || proc { |ex| } # default: ignore errors
end
# @return [void]
@@ -94,8 +94,8 @@ module Dyndnsd
# @param file [String]
# @param base_name [String]
# @param metric [Object]
# @param keys [Array{Symbol}]
# @param snapshot_keys [Array{Symbol}]
# @param keys [Array<Symbol>]
# @param snapshot_keys [Array<Symbol>]
# @return [void]
def write_metric(file, base_name, metric, keys, snapshot_keys = [])
time = Time.now.to_i

View File

@@ -85,7 +85,7 @@ module Dyndnsd
# converts into suitable parameter form for Async::DNS::Resolver or Async::DNS::Server
#
# @param endpoint_list [Array{String}]
# @param endpoint_list [Array<String>]
# @return [Array{Array{Object}}]
def self.parse_endpoints(endpoint_list)
endpoint_list.map { |addr_string| addr_string.split('@') }
@@ -139,7 +139,7 @@ module Dyndnsd
# @param name [String]
# @param resource_class [Resolv::DNS::Resource]
# @param transaction [Async::DNS::Transaction]
# Since solargraph cannot parse this: param transaction [Async::DNS::Transaction]
# @return [void]
def process(name, resource_class, transaction)
if name != @domain || resource_class != Resolv::DNS::Resource::Generic::Type252_Class1

View File

@@ -1,5 +1,5 @@
# frozen_string_literal: true
module Dyndnsd
VERSION = '3.0.0'
VERSION = '3.2.0'
end

View File

@@ -1,12 +1,12 @@
# frozen_string_literal: true
require_relative 'spec_helper'
require_relative '../spec_helper'
describe Dyndnsd::Daemon do
include Rack::Test::Methods
def app
Dyndnsd.logger = Logger.new(STDOUT)
Dyndnsd.logger = Logger.new($stdout)
Dyndnsd.logger.level = Logger::UNKNOWN
config = {