1
0
mirror of https://github.com/cmur2/dyndnsd.git synced 2026-04-01 10:18:29 +02:00

Compare commits

...

18 Commits

Author SHA1 Message Date
dependabot[bot]
88759f9ce5 gems: update async requirement from ~> 1.31.0 to >= 1.31, < 2.39
Updates the requirements on [async](https://github.com/socketry/async) to permit the latest version.
- [Release notes](https://github.com/socketry/async/releases)
- [Changelog](https://github.com/socketry/async/blob/main/releases.md)
- [Commits](https://github.com/socketry/async/compare/v1.31.0...v2.38.0)

---
updated-dependencies:
- dependency-name: async
  dependency-version: 2.38.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-09 12:20:38 +00:00
renovate[bot]
52f4870756 ci: update docker/login-action action to v4 2026-03-05 10:12:02 +01:00
dependabot[bot]
ad82694f4f gems: update rubocop requirement from ~> 1.84.0 to ~> 1.85.0
Updates the requirements on [rubocop](https://github.com/rubocop/rubocop) to permit the latest version.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.84.0...v1.85.0)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.85.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-02 14:57:01 +01:00
cn
c12000cffa gems: ignore irrelevant vulns in dev dependency solargraph 2026-02-26 22:17:58 +01:00
dependabot[bot]
f34a27b06d gems: update rubocop requirement from ~> 1.82.0 to ~> 1.84.0
Updates the requirements on [rubocop](https://github.com/rubocop/rubocop) to permit the latest version.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.82.0...v1.84.0)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.84.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 14:36:14 +01:00
cn
8738b8bda5 gem: support Ruby 4.0 2026-01-17 16:22:47 +01:00
dependabot[bot]
4096a4ee08 gems: update solargraph requirement from ~> 0.55.0 to ~> 0.58.1
Updates the requirements on [solargraph](https://github.com/castwide/solargraph) to permit the latest version.
- [Changelog](https://github.com/castwide/solargraph/blob/master/CHANGELOG.md)
- [Commits](https://github.com/castwide/solargraph/commits)

---
updated-dependencies:
- dependency-name: solargraph
  dependency-version: 0.58.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-17 16:20:42 +01:00
dependabot[bot]
13064ff988 gems: update rubocop-rspec requirement from ~> 3.8.0 to ~> 3.9.0
Updates the requirements on [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) to permit the latest version.
- [Release notes](https://github.com/rubocop/rubocop-rspec/releases)
- [Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rspec/compare/v3.8.0...v3.9.0)

---
updated-dependencies:
- dependency-name: rubocop-rspec
  dependency-version: 3.9.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-12 15:57:57 +01:00
renovate[bot]
477c9452a6 project: update aquasecurity/trivy to v0.68.2 2026-01-01 13:39:58 +01:00
dependabot[bot]
4a29e9770d gems: update rubocop requirement from ~> 1.81.1 to ~> 1.82.0
Updates the requirements on [rubocop](https://github.com/rubocop/rubocop) to permit the latest version.
- [Release notes](https://github.com/rubocop/rubocop/releases)
- [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop/compare/v1.81.1...v1.82.0)

---
updated-dependencies:
- dependency-name: rubocop
  dependency-version: 1.82.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 22:05:19 +01:00
cn
627b1c4dc5 release: 3.12.0 2025-12-04 01:05:11 +01:00
cn
da79ef902d dyndnsd: add tests for regular expressions 2025-12-04 01:03:16 +01:00
cn
8589cf801f project: update changelog 2025-12-04 00:28:32 +01:00
Jesús Daniel Colmenares Oviedo
c743c778bc dyndnsd: add support for regular expressions 2025-12-04 00:26:34 +01:00
renovate[bot]
415635f373 ci: update actions/checkout action to v6 2025-11-27 09:57:52 +01:00
dependabot[bot]
694a3e4c21 gems: update rubocop-rspec requirement from ~> 3.7.0 to ~> 3.8.0
Updates the requirements on [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) to permit the latest version.
- [Release notes](https://github.com/rubocop/rubocop-rspec/releases)
- [Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rspec/compare/v3.7.0...v3.8.0)

---
updated-dependencies:
- dependency-name: rubocop-rspec
  dependency-version: 3.8.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-24 12:51:52 +01:00
renovate[bot]
74aec5f873 docker: update alpine Docker tag to v3.22.2 2025-10-09 16:37:24 +02:00
cn
34f2c01543 ci: run vulnscan less often 2025-10-02 20:37:01 +02:00
12 changed files with 99 additions and 20 deletions

View File

@@ -11,7 +11,7 @@ jobs:
release-dockerimage: release-dockerimage:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Extract dyndnsd version from tag name - name: Extract dyndnsd version from tag name
run: | run: |
@@ -36,7 +36,7 @@ jobs:
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub - name: Login to Docker Hub
uses: docker/login-action@v3 uses: docker/login-action@v4
with: with:
username: cmur2 username: cmur2
password: ${{ secrets.DOCKER_TOKEN }} password: ${{ secrets.DOCKER_TOKEN }}

View File

@@ -19,11 +19,11 @@ jobs:
matrix: matrix:
ruby-version: ruby-version:
- '3.1' - '3.1'
- '3.2'
- '3.3' - '3.3'
- '3.4' - '3.4'
- '4.0'
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Set up Ruby ${{ matrix.ruby-version }} - name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@v1 uses: ruby/setup-ruby@v1
with: with:
@@ -37,7 +37,7 @@ jobs:
actionlint: actionlint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Check workflow files - name: Check workflow files
run: | run: |
echo "::add-matcher::.github/actionlint-matcher.json" echo "::add-matcher::.github/actionlint-matcher.json"
@@ -50,6 +50,6 @@ jobs:
image: ghcr.io/renovatebot/renovate image: ghcr.io/renovatebot/renovate
options: --user root options: --user root
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v6
- name: Check Renovate config - name: Check Renovate config
run: renovate-config-validator --strict run: renovate-config-validator --strict

View File

@@ -1,10 +1,9 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
--- ---
name: vulnscan name: vulnscan
on: on:
schedule: schedule:
- cron: '7 4 * * 4' # weekly on thursday morning - cron: '7 4 1 * *' # monthly on first day's morning
workflow_dispatch: workflow_dispatch:
jobs: jobs:

View File

@@ -1,5 +1,17 @@
# Changelog # Changelog
## 3.13.0
IMPROVEMENTS:
- add Ruby 4.0 support
## 3.12.0 (December 4th, 2025)
IMPROVEMENTS:
- regex instead of hosts list can be used for hostname ownership
## 3.11.0 (October 2nd, 2025) ## 3.11.0 (October 2nd, 2025)
IMPROVEMENTS: IMPROVEMENTS:

View File

@@ -307,6 +307,37 @@ users:
``` ```
### Matching with a regular expression
Instead of relying on `hosts`, you can use `regex` to employ a regular expression, which is very useful for avoiding having to repeatedly edit the configuration file to register a new host name.
```yaml
host: "0.0.0.0"
port: 5354
username: "dyndnsd"
group: "dyndnsd"
db: "/dyndnsd/db.json"
debug: false
domain: "dyn.dc-air.home.arpa"
updater:
name: "command_with_bind_zone"
params:
zone_file: "/nsd/zones/static/dyn.dc-air.home.arpa.zone"
command: "doas service nsd reload"
ttl: "5m"
dns: "ns.dc-air.home.arpa."
email_addr: "admin.example.org"
users:
myuser:
password: "superhypermegas3kurepassword1234"
regex: '^[a-z][0-9]\.dyn\.dc\-air\.home\.arpa$'
```
However, when using `regex`, `hosts` is simply ignored if defined, so you must choose one or the other. Recommendation: use `regex` for scripts or programs and `hosts` for regular users.
**Note**: Please note that when dyndnsd evaluates the regular expression, the `Regexp::EXTENDED` and `Regexp::IGNORECASE` options are used.
## License ## License
dyndnsd.rb is licensed under the Apache License, Version 2.0. See LICENSE for more information. dyndnsd.rb is licensed under the Apache License, Version 2.0. See LICENSE for more information.

View File

@@ -16,7 +16,7 @@ end
hadolint_version = 'v2.14.0' hadolint_version = 'v2.14.0'
# renovate: datasource=github-tags depName=aquasecurity/trivy # renovate: datasource=github-tags depName=aquasecurity/trivy
trivy_version = 'v0.67.0' trivy_version = 'v0.68.2'
namespace :docker do namespace :docker do
ci_image = 'cmur2/dyndnsd:ci' ci_image = 'cmur2/dyndnsd:ci'
@@ -69,7 +69,7 @@ end
namespace :bundle do namespace :bundle do
desc 'Check for vulnerabilities with bundler-audit' desc 'Check for vulnerabilities with bundler-audit'
task :audit do task :audit do
sh 'bundler-audit check --ignore GHSA-vvfq-8hwr-qm4m' if !RUBY_VERSION.start_with?('3.0') sh 'bundler-audit check --ignore GHSA-vvfq-8hwr-qm4m --ignore GHSA-wx95-c6cv-8532' if !RUBY_VERSION.start_with?('3.0')
end end
end end

View File

@@ -1,4 +1,4 @@
FROM alpine:3.22.1 FROM alpine:3.22.2
EXPOSE 5353 8080 EXPOSE 5353 8080

View File

@@ -1,4 +1,4 @@
FROM alpine:3.22.1 FROM alpine:3.22.2
EXPOSE 5353 8080 EXPOSE 5353 8080

View File

@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
s.required_ruby_version = '>= 3.0' s.required_ruby_version = '>= 3.0'
s.add_dependency 'async', '~> 1.31.0' s.add_dependency 'async', '>= 1.31', '< 2.39'
s.add_dependency 'async-dns', '~> 1.3.0' s.add_dependency 'async-dns', '~> 1.3.0'
s.add_dependency 'base64', '~> 0.2.0' # needed for async s.add_dependency 'base64', '~> 0.2.0' # needed for async
s.add_dependency 'logger', '>= 1.6', '< 1.8' s.add_dependency 'logger', '>= 1.6', '< 1.8'
@@ -44,8 +44,8 @@ Gem::Specification.new do |s|
s.add_development_dependency 'rack-test' s.add_development_dependency 'rack-test'
s.add_development_dependency 'rake' s.add_development_dependency 'rake'
s.add_development_dependency 'rspec' s.add_development_dependency 'rspec'
s.add_development_dependency 'rubocop', '~> 1.81.1' s.add_development_dependency 'rubocop', '~> 1.85.0'
s.add_development_dependency 'rubocop-rake', '~> 0.7.1' s.add_development_dependency 'rubocop-rake', '~> 0.7.1'
s.add_development_dependency 'rubocop-rspec', '~> 3.7.0' s.add_development_dependency 'rubocop-rspec', '~> 3.9.0'
s.add_development_dependency 'solargraph', '~> 0.55.0' s.add_development_dependency 'solargraph', '~> 0.58.1'
end end

View File

@@ -218,9 +218,22 @@ module Dyndnsd
# we can trust this information since user was authorized by middleware # we can trust this information since user was authorized by middleware
user = env['REMOTE_USER'] user = env['REMOTE_USER']
# check for hostnames that the user does not own if @users[user].key?('regex')
forbidden_hostnames = hostnames - @users[user].fetch('hosts', []) pattern = @users[user].fetch('regex')
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if forbidden_hostnames.any? begin
regex = Regexp.new(pattern, Regexp::IGNORECASE | Regexp::EXTENDED)
rescue RegexpError => e
Dyndnsd.logger.warn "Invalid regex pattern '#{pattern}': #{e.message}"
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []]
end
# check for hostnames that match the regex
matches = hostnames.any? { |str| regex.match?(str) }
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if !matches
else
# check for hostnames that the user does not own
forbidden_hostnames = hostnames - @users[user].fetch('hosts', [])
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if forbidden_hostnames.any?
end
if params['offline'] == 'YES' if params['offline'] == 'YES'
myips = [] myips = []

View File

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

View File

@@ -18,6 +18,10 @@ describe Dyndnsd::Daemon do
}, },
'test2' => { 'test2' => {
'password' => 'ihavenohosts' 'password' => 'ihavenohosts'
},
'test3' => {
'password' => 'superhypermegas3kurepassword1234',
'regex' => '^[a-z0-9]+-test3\.example\.org$'
} }
} }
} }
@@ -74,6 +78,22 @@ describe Dyndnsd::Daemon do
expect(last_response.body).to eq("good 2001:db8::1\ngood 2001:db8::1") expect(last_response.body).to eq("good 2001:db8::1\ngood 2001:db8::1")
end end
it 'supports regex matches for hostnames' do
authorize 'test3', 'superhypermegas3kurepassword1234'
get '/nic/update?hostname=abc123-test3.example.org&myip=1.2.3.4'
expect(last_response).to be_ok
expect(last_response.body).to eq('good 1.2.3.4')
get '/nic/update?hostname=foo-test3.example.org,bar-test3.example.org&myip=2001:db8::1'
expect(last_response).to be_ok
expect(last_response.body).to eq("good 2001:db8::1\ngood 2001:db8::1")
get '/nic/update?hostname=abc123.example.org'
expect(last_response).to be_ok
expect(last_response.body).to eq('nohost')
end
it 'rejects request if one hostname is invalid' do it 'rejects request if one hostname is invalid' do
authorize 'test', 'secret' authorize 'test', 'secret'
@@ -120,6 +140,10 @@ describe Dyndnsd::Daemon do
get '/nic/update?hostname=foo.example.org,notmyhost.example.org' get '/nic/update?hostname=foo.example.org,notmyhost.example.org'
expect(last_response).to be_ok expect(last_response).to be_ok
expect(last_response.body).to eq('nohost') expect(last_response.body).to eq('nohost')
get '/nic/update?hostname=abc123-test3.example.org'
expect(last_response).to be_ok
expect(last_response.body).to eq('nohost')
end end
it 'updates a host on IP change' do it 'updates a host on IP change' do