dyndnsd 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -24,6 +24,9 @@ Create a configuration file in YAML format somewhere:
24
24
  # listen address and port
25
25
  host: "0.0.0.0"
26
26
  port: "80"
27
+ # optional: drop priviliges in case you want to but you may need sudo for external commands
28
+ user: "nobody"
29
+ group: "nogroup"
27
30
  # logfile is optional, logs to STDOUT else
28
31
  logfile: "dyndnsd.log"
29
32
  # interal database file
data/dyndnsd.gemspec CHANGED
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
  s.add_runtime_dependency 'rack'
24
24
  s.add_runtime_dependency 'json'
25
+ s.add_runtime_dependency 'metriks'
25
26
 
26
27
  s.add_development_dependency 'bundler', '~> 1.3'
27
28
  s.add_development_dependency 'rake'
@@ -15,6 +15,8 @@ module Dyndnsd
15
15
  pid = fork do
16
16
  exec @command
17
17
  end
18
+ # detach so children don't become zombies
19
+ Process.detach(pid)
18
20
  end
19
21
  end
20
22
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Dyndnsd
3
- VERSION = "1.0.0"
3
+ VERSION = "1.1.0"
4
4
  end
data/lib/dyndnsd.rb CHANGED
@@ -1,10 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'etc'
3
4
  require 'logger'
4
5
  require 'ipaddr'
5
6
  require 'json'
6
7
  require 'yaml'
7
8
  require 'rack'
9
+ require 'metriks'
8
10
 
9
11
  require 'dyndnsd/generator/bind'
10
12
  require 'dyndnsd/updater/command_with_bind_zone'
@@ -74,7 +76,7 @@ module Dyndnsd
74
76
  hostnames.each do |hostname|
75
77
  return @responder.response_for_error(:host_forbidden) if not @users[user]['hosts'].include? hostname
76
78
  end
77
-
79
+
78
80
  # no myip?
79
81
  if not params["myip"]
80
82
  params["myip"] = env["REMOTE_ADDR"]
@@ -89,6 +91,7 @@ module Dyndnsd
89
91
 
90
92
  myip = params["myip"]
91
93
 
94
+ Metriks.meter('requests.valid').mark
92
95
  Dyndnsd.logger.info "Request to update #{hostnames} to #{myip} for user #{user}"
93
96
 
94
97
  changes = []
@@ -96,8 +99,10 @@ module Dyndnsd
96
99
  if (not @db['hosts'].include? hostname) or (@db['hosts'][hostname] != myip)
97
100
  changes << :good
98
101
  @db['hosts'][hostname] = myip
102
+ Metriks.meter('requests.good').mark
99
103
  else
100
104
  changes << :nochg
105
+ Metriks.meter('requests.nochg').mark
101
106
  end
102
107
  end
103
108
 
@@ -106,6 +111,7 @@ module Dyndnsd
106
111
  Dyndnsd.logger.info "Committing update ##{@db['serial']}"
107
112
  @db.save
108
113
  update
114
+ Metriks.meter('updates.committed').mark
109
115
  end
110
116
 
111
117
  @responder.response_for_changes(changes, myip)
@@ -139,15 +145,34 @@ module Dyndnsd
139
145
  Dyndnsd.logger.formatter = LogFormatter.new
140
146
 
141
147
  Dyndnsd.logger.info "Starting..."
148
+
149
+ # drop privs (first change group than user)
150
+ Process::Sys.setgid(Etc.getgrnam(config['group']).gid) if config['group']
151
+ Process::Sys.setuid(Etc.getpwnam(config['user']).uid) if config['user']
142
152
 
153
+ # configure metriks
154
+ reporter = Metriks::Reporter::ProcTitle.new
155
+ reporter.add 'good', 'sec' do
156
+ Metriks.meter('requests.good').mean_rate
157
+ end
158
+ reporter.add 'nochg', 'sec' do
159
+ Metriks.meter('requests.nochg').mean_rate
160
+ end
161
+ reporter.start
162
+
163
+ # configure daemon
143
164
  db = Database.new(config['db'])
144
165
  updater = Updater::CommandWithBindZone.new(config['domain'], config['updater']['params']) if config['updater']['name'] == 'command_with_bind_zone'
145
166
  responder = Responder::DynDNSStyle.new
146
167
 
168
+ # configure rack
147
169
  app = Daemon.new(config, db, updater, responder)
148
170
  app = Rack::Auth::Basic.new(app, "DynDNS") do |user,pass|
149
171
  allow = (config['users'].has_key? user) and (config['users'][user]['password'] == pass)
150
- Dyndnsd.logger.warn "Login failed for #{user}" if not allow
172
+ if not allow
173
+ Dyndnsd.logger.warn "Login failed for #{user}"
174
+ Metriks.meter('requests.auth_failed').mark
175
+ end
151
176
  allow
152
177
  end
153
178
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dyndnsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-28 00:00:00.000000000Z
12
+ date: 2013-04-30 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
16
- requirement: &75210720 !ruby/object:Gem::Requirement
16
+ requirement: &76957690 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *75210720
24
+ version_requirements: *76957690
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &75210510 !ruby/object:Gem::Requirement
27
+ requirement: &76957480 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,21 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *75210510
35
+ version_requirements: *76957480
36
+ - !ruby/object:Gem::Dependency
37
+ name: metriks
38
+ requirement: &76957270 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *76957270
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: bundler
38
- requirement: &75210260 !ruby/object:Gem::Requirement
49
+ requirement: &76957020 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ~>
@@ -43,10 +54,10 @@ dependencies:
43
54
  version: '1.3'
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *75210260
57
+ version_requirements: *76957020
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: rake
49
- requirement: &75210050 !ruby/object:Gem::Requirement
60
+ requirement: &76956810 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *75210050
68
+ version_requirements: *76956810
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: rspec
60
- requirement: &75209820 !ruby/object:Gem::Requirement
71
+ requirement: &76956580 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,10 +76,10 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *75209820
79
+ version_requirements: *76956580
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: rack-test
71
- requirement: &75209610 !ruby/object:Gem::Requirement
82
+ requirement: &76956370 !ruby/object:Gem::Requirement
72
83
  none: false
73
84
  requirements:
74
85
  - - ! '>='
@@ -76,7 +87,7 @@ dependencies:
76
87
  version: '0'
77
88
  type: :development
78
89
  prerelease: false
79
- version_requirements: *75209610
90
+ version_requirements: *76956370
80
91
  description: A small, lightweight and extensible DynDNS server written with Ruby and
81
92
  Rack.
82
93
  email: chrnicolai@gmail.com