Browse Source

daemon: add host offlining by deleting the associated DNS records

tags/v2.0.0.rc1
cn 1 year ago
parent
commit
147071da9e
5 changed files with 48 additions and 6 deletions
  1. 6
    0
      .rubocop.yml
  2. 1
    0
      CHANGELOG.md
  3. 12
    5
      lib/dyndnsd.rb
  4. 1
    1
      lib/dyndnsd/helper.rb
  5. 28
    0
      spec/daemon_spec.rb

+ 6
- 0
.rubocop.yml View File

@@ -22,12 +22,18 @@ Metrics/BlockLength:
Metrics/ClassLength:
Enabled: false

Metrics/CyclomaticComplexity:
Enabled: false

Metrics/LineLength:
Max: 200

Metrics/MethodLength:
Enabled: false

Metrics/PerceivedComplexity:
Enabled: false

Style/ConditionalAssignment:
Enabled: false


+ 1
- 0
CHANGELOG.md View File

@@ -10,6 +10,7 @@ IMPROVEMENTS:
- Update dependencies, mainly `rack` to new major version 2
- Add Ruby 2.5 support
- Add experimental [OpenTracing](http://opentracing.io/) support with [CNCF Jaeger](https://github.com/jaegertracing/jaeger)
- Support host offlining by deleting the associated DNS records

## 1.6.1 (October 31, 2017)


+ 12
- 5
lib/dyndnsd.rb View File

@@ -141,7 +141,11 @@ module Dyndnsd

hostnames.each do |hostname|
# myips order is always deterministic
if Helper.changed?(hostname, myips, @db['hosts'])
if myips.empty? && @db['hosts'].include?(hostname)
@db['hosts'].delete(hostname)
changes << :good
Metriks.meter('requests.good').mark
elsif Helper.changed?(hostname, myips, @db['hosts'])
@db['hosts'][hostname] = myips
changes << :good
Metriks.meter('requests.good').mark
@@ -180,10 +184,13 @@ module Dyndnsd
forbidden_hostnames = hostnames - @users[user]['hosts']
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if forbidden_hostnames.any?

myips = extract_myips(env, params)

# require at least one IP to update
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if myips.empty?
if params['offline'] == 'YES'
myips = []
else
myips = extract_myips(env, params)
# require at least one IP to update
return [422, {'X-DynDNS-Response' => 'host_forbidden'}, []] if myips.empty?
end

Metriks.meter('requests.valid').mark
Dyndnsd.logger.info "Request to update #{hostnames} to #{myips} for user #{user}"

+ 1
- 1
lib/dyndnsd/helper.rb View File

@@ -24,7 +24,7 @@ module Dyndnsd

def self.changed?(hostname, myips, hosts)
# myips order is always deterministic
(!hosts.include? hostname) || (hosts[hostname] != myips)
((!hosts.include? hostname) || (hosts[hostname] != myips)) && !myips.empty?
end

def self.span(operation, &block)

+ 28
- 0
spec/daemon_spec.rb View File

@@ -167,6 +167,34 @@ describe Dyndnsd::Daemon do
expect(last_response.body).to eq("nochg 2001:db8::1\ngood 2001:db8::1")
end

it 'offlines a host' do
authorize 'test', 'secret'

get '/nic/update?hostname=foo.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.example.org&offline=YES'
expect(last_response).to be_ok
expect(last_response.body).to eq('good ')

get '/nic/update?hostname=foo.example.org&offline=YES'
expect(last_response).to be_ok
expect(last_response.body).to eq('nochg ')

get '/nic/update?hostname=foo.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.example.org&myip=1.2.3.4&offline=YES'
expect(last_response).to be_ok
expect(last_response.body).to eq('good ')

get '/nic/update?hostname=foo.example.org&myip=1.2.3.4&offline=YES'
expect(last_response).to be_ok
expect(last_response.body).to eq('nochg ')
end

it 'uses clients remote IP address if myip not specified' do
authorize 'test', 'secret'
get '/nic/update?hostname=foo.example.org'

Loading…
Cancel
Save