mirror of
https://github.com/cmur2/dyndnsd.git
synced 2024-12-22 10:54:23 +01:00
gem: add solargraph support
This commit is contained in:
parent
6d0457d70c
commit
ac9bdfb6db
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*.lock
|
*.lock
|
||||||
pkg/*
|
pkg/*
|
||||||
|
.yardoc
|
||||||
|
16
.solargraph.yml
Normal file
16
.solargraph.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
---
|
||||||
|
include:
|
||||||
|
- "**/*.rb"
|
||||||
|
- "bin/dyndnsd"
|
||||||
|
exclude:
|
||||||
|
- spec/**/*
|
||||||
|
- test/**/*
|
||||||
|
- vendor/**/*
|
||||||
|
- ".bundle/**/*"
|
||||||
|
require: []
|
||||||
|
domains: []
|
||||||
|
reporters:
|
||||||
|
- rubocop
|
||||||
|
- require_not_found
|
||||||
|
require_paths: []
|
||||||
|
max_files: 5000
|
4
Rakefile
4
Rakefile
@ -7,4 +7,8 @@ RSpec::Core::RakeTask.new(:spec)
|
|||||||
RuboCop::RakeTask.new
|
RuboCop::RakeTask.new
|
||||||
Bundler::Audit::Task.new
|
Bundler::Audit::Task.new
|
||||||
|
|
||||||
|
task :solargraph do
|
||||||
|
sh 'solargraph typecheck'
|
||||||
|
end
|
||||||
|
|
||||||
task default: [:rubocop, :spec, 'bundle:audit']
|
task default: [:rubocop, :spec, 'bundle:audit']
|
||||||
|
@ -33,4 +33,5 @@ Gem::Specification.new do |s|
|
|||||||
s.add_development_dependency 'rack-test'
|
s.add_development_dependency 'rack-test'
|
||||||
s.add_development_dependency 'rubocop', '~> 0.80.0'
|
s.add_development_dependency 'rubocop', '~> 0.80.0'
|
||||||
s.add_development_dependency 'bundler-audit', '~> 0.6.0'
|
s.add_development_dependency 'bundler-audit', '~> 0.6.0'
|
||||||
|
s.add_development_dependency 'solargraph'
|
||||||
end
|
end
|
||||||
|
@ -21,21 +21,32 @@ require 'dyndnsd/textfile_reporter'
|
|||||||
require 'dyndnsd/version'
|
require 'dyndnsd/version'
|
||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
|
# @return [Logger]
|
||||||
def self.logger
|
def self.logger
|
||||||
@logger
|
@logger
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param logger [Logger]
|
||||||
|
# @return [Logger]
|
||||||
def self.logger=(logger)
|
def self.logger=(logger)
|
||||||
@logger = logger
|
@logger = logger
|
||||||
end
|
end
|
||||||
|
|
||||||
class LogFormatter
|
class LogFormatter
|
||||||
|
# @param lvl [Object]
|
||||||
|
# @param _time [DateTime]
|
||||||
|
# @param _progname [String]
|
||||||
|
# @param msg [Object]
|
||||||
|
# @return [String]
|
||||||
def call(lvl, _time, _progname, msg)
|
def call(lvl, _time, _progname, msg)
|
||||||
format("[%s] %-5s %s\n", Time.now.strftime('%Y-%m-%d %H:%M:%S'), lvl, msg.to_s)
|
format("[%s] %-5s %s\n", Time.now.strftime('%Y-%m-%d %H:%M:%S'), lvl, msg.to_s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class Daemon
|
class Daemon
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
|
# @param db [Dyndnsd::Database]
|
||||||
|
# @param updater [#update]
|
||||||
def initialize(config, db, updater)
|
def initialize(config, db, updater)
|
||||||
@users = config['users']
|
@users = config['users']
|
||||||
@domain = config['domain']
|
@domain = config['domain']
|
||||||
@ -51,6 +62,9 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param username [String]
|
||||||
|
# @param password [String]
|
||||||
|
# @return [Boolean]
|
||||||
def authorized?(username, password)
|
def authorized?(username, password)
|
||||||
Helper.span('check_authorized') do |span|
|
Helper.span('check_authorized') do |span|
|
||||||
span.set_tag('dyndnsd.user', username)
|
span.set_tag('dyndnsd.user', username)
|
||||||
@ -64,6 +78,8 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param env [Hash{String => String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def call(env)
|
def call(env)
|
||||||
return [422, {'X-DynDNS-Response' => 'method_forbidden'}, []] if env['REQUEST_METHOD'] != 'GET'
|
return [422, {'X-DynDNS-Response' => 'method_forbidden'}, []] if env['REQUEST_METHOD'] != 'GET'
|
||||||
return [422, {'X-DynDNS-Response' => 'not_found'}, []] if env['PATH_INFO'] != '/nic/update'
|
return [422, {'X-DynDNS-Response' => 'not_found'}, []] if env['PATH_INFO'] != '/nic/update'
|
||||||
@ -71,6 +87,7 @@ module Dyndnsd
|
|||||||
handle_dyndns_request(env)
|
handle_dyndns_request(env)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def self.run!
|
def self.run!
|
||||||
if ARGV.length != 1
|
if ARGV.length != 1
|
||||||
puts 'Usage: dyndnsd config_file'
|
puts 'Usage: dyndnsd config_file'
|
||||||
@ -109,6 +126,8 @@ module Dyndnsd
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# @param params [Hash{String => String}]
|
||||||
|
# @return [Array{String}]
|
||||||
def extract_v4_and_v6_address(params)
|
def extract_v4_and_v6_address(params)
|
||||||
return [] if !(params['myip'])
|
return [] if !(params['myip'])
|
||||||
begin
|
begin
|
||||||
@ -120,6 +139,9 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param env [Hash{String => String}]
|
||||||
|
# @param params [Hash{String => String}]
|
||||||
|
# @return [Array{String}]
|
||||||
def extract_myips(env, params)
|
def extract_myips(env, params)
|
||||||
# require presence of myip parameter as valid IPAddr (v4) and valid myip6
|
# require presence of myip parameter as valid IPAddr (v4) and valid myip6
|
||||||
return extract_v4_and_v6_address(params) if params.key?('myip6')
|
return extract_v4_and_v6_address(params) if params.key?('myip6')
|
||||||
@ -134,6 +156,9 @@ module Dyndnsd
|
|||||||
[env['REMOTE_ADDR']]
|
[env['REMOTE_ADDR']]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param hostnames [String]
|
||||||
|
# @param myips [Array{String}]
|
||||||
|
# @return [Array{Symbol}]
|
||||||
def process_changes(hostnames, myips)
|
def process_changes(hostnames, myips)
|
||||||
changes = []
|
changes = []
|
||||||
Helper.span('process_changes') do |span|
|
Helper.span('process_changes') do |span|
|
||||||
@ -158,6 +183,7 @@ module Dyndnsd
|
|||||||
changes
|
changes
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def update_db
|
def update_db
|
||||||
@db['serial'] += 1
|
@db['serial'] += 1
|
||||||
Dyndnsd.logger.info "Committing update ##{@db['serial']}"
|
Dyndnsd.logger.info "Committing update ##{@db['serial']}"
|
||||||
@ -166,6 +192,8 @@ module Dyndnsd
|
|||||||
Metriks.meter('updates.committed').mark
|
Metriks.meter('updates.committed').mark
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param env [Hash{String => String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def handle_dyndns_request(env)
|
def handle_dyndns_request(env)
|
||||||
params = Rack::Utils.parse_query(env['QUERY_STRING'])
|
params = Rack::Utils.parse_query(env['QUERY_STRING'])
|
||||||
|
|
||||||
@ -204,6 +232,8 @@ module Dyndnsd
|
|||||||
|
|
||||||
# SETUP
|
# SETUP
|
||||||
|
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
|
# @return [void]
|
||||||
private_class_method def self.setup_logger(config)
|
private_class_method def self.setup_logger(config)
|
||||||
if config['logfile']
|
if config['logfile']
|
||||||
Dyndnsd.logger = Logger.new(config['logfile'])
|
Dyndnsd.logger = Logger.new(config['logfile'])
|
||||||
@ -215,6 +245,7 @@ module Dyndnsd
|
|||||||
Dyndnsd.logger.formatter = LogFormatter.new
|
Dyndnsd.logger.formatter = LogFormatter.new
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
private_class_method def self.setup_traps
|
private_class_method def self.setup_traps
|
||||||
Signal.trap('INT') do
|
Signal.trap('INT') do
|
||||||
Dyndnsd.logger.info 'Quitting...'
|
Dyndnsd.logger.info 'Quitting...'
|
||||||
@ -226,6 +257,8 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
|
# @return [void]
|
||||||
private_class_method def self.setup_monitoring(config)
|
private_class_method def self.setup_monitoring(config)
|
||||||
# configure metriks
|
# configure metriks
|
||||||
if config['graphite']
|
if config['graphite']
|
||||||
@ -253,6 +286,8 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
|
# @return [void]
|
||||||
private_class_method def self.setup_tracing(config)
|
private_class_method def self.setup_tracing(config)
|
||||||
# configure OpenTracing
|
# configure OpenTracing
|
||||||
if config.dig('tracing', 'jaeger')
|
if config.dig('tracing', 'jaeger')
|
||||||
@ -267,10 +302,12 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
|
# @return [void]
|
||||||
private_class_method def self.setup_rack(config)
|
private_class_method def self.setup_rack(config)
|
||||||
# configure daemon
|
# 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.dig('updater', 'params')) if config.dig('updater', 'name') == 'command_with_bind_zone'
|
||||||
daemon = Daemon.new(config, db, updater)
|
daemon = Daemon.new(config, db, updater)
|
||||||
|
|
||||||
# configure rack
|
# configure rack
|
||||||
|
@ -7,10 +7,12 @@ module Dyndnsd
|
|||||||
|
|
||||||
def_delegators :@db, :[], :[]=, :each, :has_key?
|
def_delegators :@db, :[], :[]=, :each, :has_key?
|
||||||
|
|
||||||
|
# @param db_file [String]
|
||||||
def initialize(db_file)
|
def initialize(db_file)
|
||||||
@db_file = db_file
|
@db_file = db_file
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def load
|
def load
|
||||||
if File.file?(@db_file)
|
if File.file?(@db_file)
|
||||||
@db = JSON.parse(File.open(@db_file, 'r', &:read))
|
@db = JSON.parse(File.open(@db_file, 'r', &:read))
|
||||||
@ -20,6 +22,7 @@ module Dyndnsd
|
|||||||
@db_hash = @db.hash
|
@db_hash = @db.hash
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def save
|
def save
|
||||||
Helper.span('database_save') do |_span|
|
Helper.span('database_save') do |_span|
|
||||||
File.open(@db_file, 'w') { |f| JSON.dump(@db, f) }
|
File.open(@db_file, 'w') { |f| JSON.dump(@db, f) }
|
||||||
@ -27,6 +30,7 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [Boolean]
|
||||||
def changed?
|
def changed?
|
||||||
@db_hash != @db.hash
|
@db_hash != @db.hash
|
||||||
end
|
end
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
module Generator
|
module Generator
|
||||||
class Bind
|
class Bind
|
||||||
|
# @param domain [String]
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
def initialize(domain, config)
|
def initialize(domain, config)
|
||||||
@domain = domain
|
@domain = domain
|
||||||
@ttl = config['ttl']
|
@ttl = config['ttl']
|
||||||
@ -10,6 +12,8 @@ module Dyndnsd
|
|||||||
@additional_zone_content = config['additional_zone_content']
|
@additional_zone_content = config['additional_zone_content']
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param db [Dyndnsd::Database]
|
||||||
|
# @return [String]
|
||||||
def generate(db)
|
def generate(db)
|
||||||
out = []
|
out = []
|
||||||
out << "$TTL #{@ttl}"
|
out << "$TTL #{@ttl}"
|
||||||
|
@ -3,6 +3,9 @@ require 'ipaddr'
|
|||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
class Helper
|
class Helper
|
||||||
|
# @param hostname [String]
|
||||||
|
# @param domain [String]
|
||||||
|
# @return [Boolean]
|
||||||
def self.fqdn_valid?(hostname, domain)
|
def self.fqdn_valid?(hostname, domain)
|
||||||
return false if hostname.length < domain.length + 2
|
return false if hostname.length < domain.length + 2
|
||||||
return false if !hostname.end_with?(domain)
|
return false if !hostname.end_with?(domain)
|
||||||
@ -11,6 +14,8 @@ module Dyndnsd
|
|||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param ip [String]
|
||||||
|
# @return [Boolean]
|
||||||
def self.ip_valid?(ip)
|
def self.ip_valid?(ip)
|
||||||
IPAddr.new(ip)
|
IPAddr.new(ip)
|
||||||
true
|
true
|
||||||
@ -18,15 +23,26 @@ module Dyndnsd
|
|||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param username [String]
|
||||||
|
# @param password [String]
|
||||||
|
# @param users [Hash]
|
||||||
|
# @return [Boolean]
|
||||||
def self.user_allowed?(username, password, users)
|
def self.user_allowed?(username, password, users)
|
||||||
(users.key? username) && (users[username]['password'] == password)
|
(users.key? username) && (users[username]['password'] == password)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param hostname [String]
|
||||||
|
# @param myips [Array]
|
||||||
|
# @param hosts [Hash]
|
||||||
|
# @return [Boolean]
|
||||||
def self.changed?(hostname, myips, hosts)
|
def self.changed?(hostname, myips, hosts)
|
||||||
# myips order is always deterministic
|
# myips order is always deterministic
|
||||||
((!hosts.include? hostname) || (hosts[hostname] != myips)) && !myips.empty?
|
((!hosts.include? hostname) || (hosts[hostname] != myips)) && !myips.empty?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param operation [String]
|
||||||
|
# @param block [Proc]
|
||||||
|
# @return [void]
|
||||||
def self.span(operation, &block)
|
def self.span(operation, &block)
|
||||||
scope = OpenTracing.start_active_span(operation)
|
scope = OpenTracing.start_active_span(operation)
|
||||||
span = scope.span
|
span = scope.span
|
||||||
|
@ -2,10 +2,13 @@
|
|||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
module Responder
|
module Responder
|
||||||
class DynDNSStyle
|
class DynDNSStyle
|
||||||
|
# @param app [#call]
|
||||||
def initialize(app)
|
def initialize(app)
|
||||||
@app = app
|
@app = app
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param env [Hash{String => String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def call(env)
|
def call(env)
|
||||||
@app.call(env).tap do |status_code, headers, body|
|
@app.call(env).tap do |status_code, headers, body|
|
||||||
if headers.key?('X-DynDNS-Response')
|
if headers.key?('X-DynDNS-Response')
|
||||||
@ -18,6 +21,10 @@ module Dyndnsd
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# @param status_code [Integer]
|
||||||
|
# @param headers [Hash{String => String}]
|
||||||
|
# @param body [Array{String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def decorate_dyndnsd_response(status_code, headers, body)
|
def decorate_dyndnsd_response(status_code, headers, body)
|
||||||
if status_code == 200
|
if status_code == 200
|
||||||
[200, {'Content-Type' => 'text/plain'}, [get_success_body(body[0], body[1])]]
|
[200, {'Content-Type' => 'text/plain'}, [get_success_body(body[0], body[1])]]
|
||||||
@ -26,6 +33,10 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param status_code [Integer]
|
||||||
|
# @param headers [Hash{String => String}]
|
||||||
|
# @param _body [Array{String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def decorate_other_response(status_code, headers, _body)
|
def decorate_other_response(status_code, headers, _body)
|
||||||
if status_code == 400
|
if status_code == 400
|
||||||
[status_code, headers, ['Bad Request']]
|
[status_code, headers, ['Bad Request']]
|
||||||
@ -34,10 +45,14 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param changes [Array{Symbol}]
|
||||||
|
# @param myips [Array{String}]
|
||||||
|
# @return [String]
|
||||||
def get_success_body(changes, myips)
|
def get_success_body(changes, myips)
|
||||||
changes.map { |change| "#{change} #{myips.join(' ')}" }.join("\n")
|
changes.map { |change| "#{change} #{myips.join(' ')}" }.join("\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [Hash{String => Object}]
|
||||||
def error_response_map
|
def error_response_map
|
||||||
{
|
{
|
||||||
# general http errors
|
# general http errors
|
||||||
|
@ -2,10 +2,13 @@
|
|||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
module Responder
|
module Responder
|
||||||
class RestStyle
|
class RestStyle
|
||||||
|
# @param app [#call]
|
||||||
def initialize(app)
|
def initialize(app)
|
||||||
@app = app
|
@app = app
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param env [Hash{String => String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def call(env)
|
def call(env)
|
||||||
@app.call(env).tap do |status_code, headers, body|
|
@app.call(env).tap do |status_code, headers, body|
|
||||||
if headers.key?('X-DynDNS-Response')
|
if headers.key?('X-DynDNS-Response')
|
||||||
@ -18,6 +21,10 @@ module Dyndnsd
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
# @param status_code [Integer]
|
||||||
|
# @param headers [Hash{String => String}]
|
||||||
|
# @param body [Array{String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def decorate_dyndnsd_response(status_code, headers, body)
|
def decorate_dyndnsd_response(status_code, headers, body)
|
||||||
if status_code == 200
|
if status_code == 200
|
||||||
[200, {'Content-Type' => 'text/plain'}, [get_success_body(body[0], body[1])]]
|
[200, {'Content-Type' => 'text/plain'}, [get_success_body(body[0], body[1])]]
|
||||||
@ -26,6 +33,10 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param status_code [Integer]
|
||||||
|
# @param headers [Hash{String => String}]
|
||||||
|
# @param _body [Array{String}]
|
||||||
|
# @return [Array{Integer,Hash{String => String},Array{String}}]
|
||||||
def decorate_other_response(status_code, headers, _body)
|
def decorate_other_response(status_code, headers, _body)
|
||||||
if status_code == 400
|
if status_code == 400
|
||||||
[status_code, headers, ['Bad Request']]
|
[status_code, headers, ['Bad Request']]
|
||||||
@ -34,10 +45,14 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param changes [Array{Symbol}]
|
||||||
|
# @param myips [Array{String}]
|
||||||
|
# @return [String]
|
||||||
def get_success_body(changes, myips)
|
def get_success_body(changes, myips)
|
||||||
changes.map { |change| change == :good ? "Changed to #{myips.join(' ')}" : "No change needed for #{myips.join(' ')}" }.join("\n")
|
changes.map { |change| change == :good ? "Changed to #{myips.join(' ')}" : "No change needed for #{myips.join(' ')}" }.join("\n")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [Hash{String => Object}]
|
||||||
def error_response_map
|
def error_response_map
|
||||||
{
|
{
|
||||||
# general http errors
|
# general http errors
|
||||||
|
@ -5,8 +5,11 @@ require 'metriks'
|
|||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
class TextfileReporter
|
class TextfileReporter
|
||||||
|
# @return [String]
|
||||||
attr_reader :file
|
attr_reader :file
|
||||||
|
|
||||||
|
# @param file [String]
|
||||||
|
# @param options [Hash{Symbol => Object}]
|
||||||
def initialize(file, options = {})
|
def initialize(file, options = {})
|
||||||
@file = file
|
@file = file
|
||||||
|
|
||||||
@ -17,6 +20,7 @@ module Dyndnsd
|
|||||||
@on_error = options[:on_error] || proc { |ex| }
|
@on_error = options[:on_error] || proc { |ex| }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def start
|
def start
|
||||||
@thread ||= Thread.new do
|
@thread ||= Thread.new do
|
||||||
loop do
|
loop do
|
||||||
@ -33,16 +37,19 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def stop
|
def stop
|
||||||
@thread&.kill
|
@thread&.kill
|
||||||
@thread = nil
|
@thread = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def restart
|
def restart
|
||||||
stop
|
stop
|
||||||
start
|
start
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [void]
|
||||||
def write
|
def write
|
||||||
File.open(@file, 'w') do |f|
|
File.open(@file, 'w') do |f|
|
||||||
@registry.each do |name, metric|
|
@registry.each do |name, metric|
|
||||||
@ -85,6 +92,12 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param file [String]
|
||||||
|
# @param base_name [String]
|
||||||
|
# @param metric [Object]
|
||||||
|
# @param keys [Array{Symbol}]
|
||||||
|
# @param snapshot_keys [Array{Symbol}]
|
||||||
|
# @return [void]
|
||||||
def write_metric(file, base_name, metric, keys, snapshot_keys = [])
|
def write_metric(file, base_name, metric, keys, snapshot_keys = [])
|
||||||
time = Time.now.to_i
|
time = Time.now.to_i
|
||||||
|
|
||||||
|
@ -2,12 +2,16 @@
|
|||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
module Updater
|
module Updater
|
||||||
class CommandWithBindZone
|
class CommandWithBindZone
|
||||||
|
# @param domain [String]
|
||||||
|
# @param config [Hash{String => Object}]
|
||||||
def initialize(domain, config)
|
def initialize(domain, config)
|
||||||
@zone_file = config['zone_file']
|
@zone_file = config['zone_file']
|
||||||
@command = config['command']
|
@command = config['command']
|
||||||
@generator = Generator::Bind.new(domain, config)
|
@generator = Generator::Bind.new(domain, config)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @param db [Dyndnsd::Database]
|
||||||
|
# @return [void]
|
||||||
def update(db)
|
def update(db)
|
||||||
Helper.span('updater_update') do |span|
|
Helper.span('updater_update') do |span|
|
||||||
span.set_tag('dyndnsd.updater.name', self.class.name.split('::').last)
|
span.set_tag('dyndnsd.updater.name', self.class.name.split('::').last)
|
||||||
|
Loading…
Reference in New Issue
Block a user