mirror of
https://github.com/cmur2/dyndnsd.git
synced 2025-08-08 08:33:56 +02:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
5ed1129e6c | |||
1073312110 | |||
![]() |
f0bd538728 | ||
![]() |
a4b6a63383 |
@@ -24,6 +24,9 @@ Create a configuration file in YAML format somewhere:
|
||||
# listen address and port
|
||||
host: "0.0.0.0"
|
||||
port: "80"
|
||||
# optional: drop priviliges in case you want to but you may need sudo for external commands
|
||||
user: "nobody"
|
||||
group: "nogroup"
|
||||
# logfile is optional, logs to STDOUT else
|
||||
logfile: "dyndnsd.log"
|
||||
# interal database file
|
||||
|
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
|
||||
|
||||
s.add_runtime_dependency 'rack'
|
||||
s.add_runtime_dependency 'json'
|
||||
s.add_runtime_dependency 'metriks'
|
||||
|
||||
s.add_development_dependency 'bundler', '~> 1.3'
|
||||
s.add_development_dependency 'rake'
|
||||
|
@@ -1,10 +1,12 @@
|
||||
#!/usr/bin/env ruby
|
||||
|
||||
require 'etc'
|
||||
require 'logger'
|
||||
require 'ipaddr'
|
||||
require 'json'
|
||||
require 'yaml'
|
||||
require 'rack'
|
||||
require 'metriks'
|
||||
|
||||
require 'dyndnsd/generator/bind'
|
||||
require 'dyndnsd/updater/command_with_bind_zone'
|
||||
@@ -74,7 +76,7 @@ module Dyndnsd
|
||||
hostnames.each do |hostname|
|
||||
return @responder.response_for_error(:host_forbidden) if not @users[user]['hosts'].include? hostname
|
||||
end
|
||||
|
||||
|
||||
# no myip?
|
||||
if not params["myip"]
|
||||
params["myip"] = env["REMOTE_ADDR"]
|
||||
@@ -89,6 +91,7 @@ module Dyndnsd
|
||||
|
||||
myip = params["myip"]
|
||||
|
||||
Metriks.meter('requests.valid').mark
|
||||
Dyndnsd.logger.info "Request to update #{hostnames} to #{myip} for user #{user}"
|
||||
|
||||
changes = []
|
||||
@@ -96,8 +99,10 @@ module Dyndnsd
|
||||
if (not @db['hosts'].include? hostname) or (@db['hosts'][hostname] != myip)
|
||||
changes << :good
|
||||
@db['hosts'][hostname] = myip
|
||||
Metriks.meter('requests.good').mark
|
||||
else
|
||||
changes << :nochg
|
||||
Metriks.meter('requests.nochg').mark
|
||||
end
|
||||
end
|
||||
|
||||
@@ -106,6 +111,7 @@ module Dyndnsd
|
||||
Dyndnsd.logger.info "Committing update ##{@db['serial']}"
|
||||
@db.save
|
||||
update
|
||||
Metriks.meter('updates.committed').mark
|
||||
end
|
||||
|
||||
@responder.response_for_changes(changes, myip)
|
||||
@@ -139,15 +145,34 @@ module Dyndnsd
|
||||
Dyndnsd.logger.formatter = LogFormatter.new
|
||||
|
||||
Dyndnsd.logger.info "Starting..."
|
||||
|
||||
# drop privs (first change group than user)
|
||||
Process::Sys.setgid(Etc.getgrnam(config['group']).gid) if config['group']
|
||||
Process::Sys.setuid(Etc.getpwnam(config['user']).uid) if config['user']
|
||||
|
||||
# configure metriks
|
||||
reporter = Metriks::Reporter::ProcTitle.new
|
||||
reporter.add 'good', 'sec' do
|
||||
Metriks.meter('requests.good').mean_rate
|
||||
end
|
||||
reporter.add 'nochg', 'sec' do
|
||||
Metriks.meter('requests.nochg').mean_rate
|
||||
end
|
||||
reporter.start
|
||||
|
||||
# configure daemon
|
||||
db = Database.new(config['db'])
|
||||
updater = Updater::CommandWithBindZone.new(config['domain'], config['updater']['params']) if config['updater']['name'] == 'command_with_bind_zone'
|
||||
responder = Responder::DynDNSStyle.new
|
||||
|
||||
# configure rack
|
||||
app = Daemon.new(config, db, updater, responder)
|
||||
app = Rack::Auth::Basic.new(app, "DynDNS") do |user,pass|
|
||||
allow = (config['users'].has_key? user) and (config['users'][user]['password'] == pass)
|
||||
Dyndnsd.logger.warn "Login failed for #{user}" if not allow
|
||||
if not allow
|
||||
Dyndnsd.logger.warn "Login failed for #{user}"
|
||||
Metriks.meter('requests.auth_failed').mark
|
||||
end
|
||||
allow
|
||||
end
|
||||
|
||||
|
@@ -15,6 +15,8 @@ module Dyndnsd
|
||||
pid = fork do
|
||||
exec @command
|
||||
end
|
||||
# detach so children don't become zombies
|
||||
Process.detach(pid)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@@ -1,4 +1,4 @@
|
||||
|
||||
module Dyndnsd
|
||||
VERSION = "1.0.0"
|
||||
VERSION = "1.1.0"
|
||||
end
|
||||
|
Reference in New Issue
Block a user