mirror of
https://github.com/cmur2/dyndnsd.git
synced 2025-08-09 04:48:39 +02:00
Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
5ed1129e6c | |||
1073312110 | |||
![]() |
f0bd538728 | ||
![]() |
a4b6a63383 | ||
00255ebed9 | |||
e50430b177 | |||
8ab3abd4bd | |||
7f593227f2 | |||
0cc1567ade | |||
fab95058bf |
@@ -16,12 +16,17 @@ Install the gem:
|
|||||||
|
|
||||||
gem install dyndnsd
|
gem install dyndnsd
|
||||||
|
|
||||||
|
(Optionally install the `json` gem too if you're on Ruby 1.8.)
|
||||||
|
|
||||||
Create a configuration file in YAML format somewhere:
|
Create a configuration file in YAML format somewhere:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# listen address and port
|
# listen address and port
|
||||||
host: "0.0.0.0"
|
host: "0.0.0.0"
|
||||||
port: "80"
|
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 is optional, logs to STDOUT else
|
||||||
logfile: "dyndnsd.log"
|
logfile: "dyndnsd.log"
|
||||||
# interal database file
|
# interal database file
|
||||||
@@ -113,7 +118,7 @@ Use a webserver as a proxy to handle SSL and/or multiple listen addresses and po
|
|||||||
|
|
||||||
### Init scripts
|
### Init scripts
|
||||||
|
|
||||||
Coming soon for Debian 6.
|
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.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
@@ -21,7 +21,8 @@ Gem::Specification.new do |s|
|
|||||||
s.executables = ['dyndnsd']
|
s.executables = ['dyndnsd']
|
||||||
|
|
||||||
s.add_runtime_dependency 'rack'
|
s.add_runtime_dependency 'rack'
|
||||||
s.add_runtime_dependency('json') if RUBY_VERSION < '1.9'
|
s.add_runtime_dependency 'json'
|
||||||
|
s.add_runtime_dependency 'metriks'
|
||||||
|
|
||||||
s.add_development_dependency 'bundler', '~> 1.3'
|
s.add_development_dependency 'bundler', '~> 1.3'
|
||||||
s.add_development_dependency 'rake'
|
s.add_development_dependency 'rake'
|
||||||
|
40
init.d/debian-6-dyndnsd
Normal file
40
init.d/debian-6-dyndnsd
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: dyndnsd
|
||||||
|
# Required-Start: $remote_fs $syslog
|
||||||
|
# Required-Stop: $remote_fs $syslog
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Handle dyndnsd.rb gem
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# using the system ruby's gem binaries directory
|
||||||
|
DAEMON="/var/lib/gems/1.8/bin/dyndnsd"
|
||||||
|
|
||||||
|
CONFIG_FILE="/opt/dyndnsd/config.yaml"
|
||||||
|
|
||||||
|
DAEMON_OPTS="$CONFIG_FILE"
|
||||||
|
|
||||||
|
test -x $DAEMON || exit 0
|
||||||
|
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
log_daemon_msg "Starting dyndnsd.rb" "dyndnsd"
|
||||||
|
start-stop-daemon --start --quiet --oknodo --make-pidfile --pidfile "/var/run/dyndnsd.pid" --background --exec $DAEMON -- $DAEMON_OPTS
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
log_daemon_msg "Stopping dyndnsd.rb" "dyndnsd"
|
||||||
|
start-stop-daemon --stop --quiet --oknodo --pidfile "/var/run/dyndnsd.pid"
|
||||||
|
;;
|
||||||
|
restart|force-reload)
|
||||||
|
log_daemon_msg "Restarting dyndnsd.rb" "dyndnsd"
|
||||||
|
start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile "/var/run/dyndsd.pid"
|
||||||
|
start-stop-daemon --start --quiet --oknodo --make-pidfile --pidfile "/var/run/dyndnsd.pid" --background --exec $DAEMON -- $DAEMON_OPTS
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {start|stop|restart|force-reload}" >&2
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
@@ -1,10 +1,12 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require 'etc'
|
||||||
require 'logger'
|
require 'logger'
|
||||||
require 'ipaddr'
|
require 'ipaddr'
|
||||||
require 'json'
|
require 'json'
|
||||||
require 'yaml'
|
require 'yaml'
|
||||||
require 'rack'
|
require 'rack'
|
||||||
|
require 'metriks'
|
||||||
|
|
||||||
require 'dyndnsd/generator/bind'
|
require 'dyndnsd/generator/bind'
|
||||||
require 'dyndnsd/updater/command_with_bind_zone'
|
require 'dyndnsd/updater/command_with_bind_zone'
|
||||||
@@ -24,7 +26,7 @@ module Dyndnsd
|
|||||||
|
|
||||||
class LogFormatter
|
class LogFormatter
|
||||||
def call(lvl, time, progname, msg)
|
def call(lvl, time, progname, msg)
|
||||||
"%s: %s\n" % [lvl, msg.to_s]
|
"[%s] %-5s %s\n" % [Time.now.strftime('%Y-%m-%d %H:%M:%S'), lvl, msg.to_s]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -89,6 +91,7 @@ module Dyndnsd
|
|||||||
|
|
||||||
myip = params["myip"]
|
myip = params["myip"]
|
||||||
|
|
||||||
|
Metriks.meter('requests.valid').mark
|
||||||
Dyndnsd.logger.info "Request to update #{hostnames} to #{myip} for user #{user}"
|
Dyndnsd.logger.info "Request to update #{hostnames} to #{myip} for user #{user}"
|
||||||
|
|
||||||
changes = []
|
changes = []
|
||||||
@@ -96,8 +99,10 @@ module Dyndnsd
|
|||||||
if (not @db['hosts'].include? hostname) or (@db['hosts'][hostname] != myip)
|
if (not @db['hosts'].include? hostname) or (@db['hosts'][hostname] != myip)
|
||||||
changes << :good
|
changes << :good
|
||||||
@db['hosts'][hostname] = myip
|
@db['hosts'][hostname] = myip
|
||||||
|
Metriks.meter('requests.good').mark
|
||||||
else
|
else
|
||||||
changes << :nochg
|
changes << :nochg
|
||||||
|
Metriks.meter('requests.nochg').mark
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -106,6 +111,7 @@ module Dyndnsd
|
|||||||
Dyndnsd.logger.info "Committing update ##{@db['serial']}"
|
Dyndnsd.logger.info "Committing update ##{@db['serial']}"
|
||||||
@db.save
|
@db.save
|
||||||
update
|
update
|
||||||
|
Metriks.meter('updates.committed').mark
|
||||||
end
|
end
|
||||||
|
|
||||||
@responder.response_for_changes(changes, myip)
|
@responder.response_for_changes(changes, myip)
|
||||||
@@ -140,14 +146,33 @@ module Dyndnsd
|
|||||||
|
|
||||||
Dyndnsd.logger.info "Starting..."
|
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'])
|
db = Database.new(config['db'])
|
||||||
updater = Updater::CommandWithBindZone.new(config['domain'], config['updater']['params']) if config['updater']['name'] == 'command_with_bind_zone'
|
updater = Updater::CommandWithBindZone.new(config['domain'], config['updater']['params']) if config['updater']['name'] == 'command_with_bind_zone'
|
||||||
responder = Responder::DynDNSStyle.new
|
responder = Responder::DynDNSStyle.new
|
||||||
|
|
||||||
|
# configure rack
|
||||||
app = Daemon.new(config, db, updater, responder)
|
app = Daemon.new(config, db, updater, responder)
|
||||||
app = Rack::Auth::Basic.new(app, "DynDNS") do |user,pass|
|
app = Rack::Auth::Basic.new(app, "DynDNS") do |user,pass|
|
||||||
allow = (config['users'].has_key? user) and (config['users'][user]['password'] == 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
|
allow
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -15,6 +15,8 @@ module Dyndnsd
|
|||||||
pid = fork do
|
pid = fork do
|
||||||
exec @command
|
exec @command
|
||||||
end
|
end
|
||||||
|
# detach so children don't become zombies
|
||||||
|
Process.detach(pid)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
VERSION = "0.0.4"
|
VERSION = "1.1.0"
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user