mirror of
https://github.com/cmur2/dyndnsd.git
synced 2025-08-08 08:33:56 +02:00
Compare commits
47 Commits
v2.0.0.rc2
...
try-s2
Author | SHA1 | Date | |
---|---|---|---|
fad04a8a2e | |||
e96a918a81 | |||
591c0fe89a | |||
ac9bdfb6db | |||
6d0457d70c | |||
9ab080072f | |||
fdcd6e8da4 | |||
31be09c1c2 | |||
3406e22588 | |||
![]() |
a42a864f56 | ||
![]() |
07fd8681e4 | ||
![]() |
6831744e7b | ||
![]() |
7d49b861fc | ||
![]() |
2ad816b866 | ||
![]() |
f4f10c94c4 | ||
![]() |
bb7302407a | ||
![]() |
9f132b4a7d | ||
![]() |
32d6d01d9d | ||
![]() |
9d80220d24 | ||
![]() |
b00aa0e464 | ||
![]() |
a55d882d4d | ||
![]() |
aa5de52f4d | ||
![]() |
ee56fe8d07 | ||
![]() |
051d561700 | ||
![]() |
ccaa39e871 | ||
![]() |
b69aa6dc5b | ||
7a03415dd9 | |||
77914c42e1 | |||
![]() |
a9d1cc644a | ||
![]() |
902e5868b3 | ||
ffe01467c5 | |||
79db1b1911 | |||
![]() |
f37a77094f | ||
![]() |
2e233422d3 | ||
![]() |
6f044ec5f2 | ||
![]() |
988e30dac9 | ||
![]() |
31233df5ee | ||
1f35f60c55 | |||
![]() |
6310343e45 | ||
![]() |
1dd0eb7d1a | ||
280bfbeb82 | |||
![]() |
bd7c786c9c | ||
![]() |
4f3e591f13 | ||
![]() |
c1b5e14862 | ||
![]() |
d1dc91ed8d | ||
![]() |
14fe8ebedf | ||
![]() |
5264b3e6f1 |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,3 +1,6 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
*.lock
|
*.lock
|
||||||
|
doc/*
|
||||||
pkg/*
|
pkg/*
|
||||||
|
.yardoc
|
||||||
|
sorbet/rbi/hidden-definitions/errors.txt
|
||||||
|
28
.rubocop.yml
28
.rubocop.yml
@@ -1,15 +1,25 @@
|
|||||||
inherit_from: .rubocop_todo.yml
|
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: '2.3'
|
TargetRubyVersion: '2.3'
|
||||||
|
|
||||||
Gemspec/OrderedDependencies:
|
Gemspec/OrderedDependencies:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/EmptyLineAfterGuardClause:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
# allows nicer usage of private_class_method
|
# allows nicer usage of private_class_method
|
||||||
Layout/EmptyLinesAroundArguments:
|
Layout/EmptyLinesAroundArguments:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/HashAlignment:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/LeadingEmptyLines:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
Layout/LineLength:
|
||||||
|
Max: 200
|
||||||
|
|
||||||
Layout/SpaceInsideHashLiteralBraces:
|
Layout/SpaceInsideHashLiteralBraces:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
@@ -25,16 +35,13 @@ Metrics/ClassLength:
|
|||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Metrics/LineLength:
|
|
||||||
Max: 200
|
|
||||||
|
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Metrics/PerceivedComplexity:
|
Metrics/PerceivedComplexity:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Naming/UncommunicativeMethodParamName:
|
Naming/MethodParameterName:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
Naming/MemoizedInstanceVariableName:
|
Naming/MemoizedInstanceVariableName:
|
||||||
@@ -55,6 +62,15 @@ Style/FrozenStringLiteralComment:
|
|||||||
Style/GuardClause:
|
Style/GuardClause:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
Style/HashEachMethods:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
Style/HashTransformKeys:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
|
Style/HashTransformValues:
|
||||||
|
Enabled: true
|
||||||
|
|
||||||
Style/IdenticalConditionalBranches:
|
Style/IdenticalConditionalBranches:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
@@ -1,7 +0,0 @@
|
|||||||
# This configuration was generated by
|
|
||||||
# `rubocop --auto-gen-config`
|
|
||||||
# on 2018-02-23 12:54:10 +0100 using RuboCop version 0.52.1.
|
|
||||||
# The point is for the user to remove these configuration records
|
|
||||||
# one by one as the offenses are removed from the code base.
|
|
||||||
# Note that changes in the inspected code, or installation of new
|
|
||||||
# versions of RuboCop, may require this file to be generated again.
|
|
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
|
@@ -1,7 +1,9 @@
|
|||||||
---
|
---
|
||||||
sudo: false
|
os: linux
|
||||||
language: ruby
|
language: ruby
|
||||||
rvm:
|
rvm:
|
||||||
|
- 2.7
|
||||||
|
- 2.6
|
||||||
- 2.5
|
- 2.5
|
||||||
- 2.4
|
- 2.4
|
||||||
- 2.3
|
- 2.3
|
||||||
|
11
CHANGELOG.md
11
CHANGELOG.md
@@ -1,6 +1,13 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## 2.0.0
|
## 2.1.0
|
||||||
|
|
||||||
|
IMPROVEMENTS:
|
||||||
|
|
||||||
|
- Add Ruby 2.7 support
|
||||||
|
- Add experimental [Sorbet](https://sorbet.org) support to development tools, fix surfaced problems
|
||||||
|
|
||||||
|
## 2.0.0 (January 25, 2019)
|
||||||
|
|
||||||
IMPROVEMENTS:
|
IMPROVEMENTS:
|
||||||
|
|
||||||
@@ -8,7 +15,7 @@ IMPROVEMENTS:
|
|||||||
- Better protocol compliance by returning `badauth` in response body on HTTP 401 errors
|
- Better protocol compliance by returning `badauth` in response body on HTTP 401 errors
|
||||||
- Better code maintainability by refactorings
|
- Better code maintainability by refactorings
|
||||||
- Update dependencies, mainly `rack` to new major version 2
|
- Update dependencies, mainly `rack` to new major version 2
|
||||||
- Add Ruby 2.5 support
|
- Add Ruby 2.5 and Ruby 2.6 support
|
||||||
- Add experimental [OpenTracing](http://opentracing.io/) support with [CNCF Jaeger](https://github.com/jaegertracing/jaeger)
|
- Add experimental [OpenTracing](http://opentracing.io/) support with [CNCF Jaeger](https://github.com/jaegertracing/jaeger)
|
||||||
- Support host offlining by deleting the associated DNS records
|
- Support host offlining by deleting the associated DNS records
|
||||||
- Add textfile reporter to write Graphite-style metrics (also compatible with [Prometheus](https://prometheus.io/)) into a file
|
- Add textfile reporter to write Graphite-style metrics (also compatible with [Prometheus](https://prometheus.io/)) into a file
|
||||||
|
12
Rakefile
12
Rakefile
@@ -1,8 +1,18 @@
|
|||||||
require 'bundler/gem_tasks'
|
require 'bundler/gem_tasks'
|
||||||
require 'rspec/core/rake_task'
|
require 'rspec/core/rake_task'
|
||||||
require 'rubocop/rake_task'
|
require 'rubocop/rake_task'
|
||||||
|
require 'bundler/audit/task'
|
||||||
|
|
||||||
RSpec::Core::RakeTask.new(:spec)
|
RSpec::Core::RakeTask.new(:spec)
|
||||||
RuboCop::RakeTask.new
|
RuboCop::RakeTask.new
|
||||||
|
Bundler::Audit::Task.new
|
||||||
|
|
||||||
task default: [:rubocop, :spec]
|
task :solargraph do
|
||||||
|
sh 'solargraph typecheck'
|
||||||
|
end
|
||||||
|
|
||||||
|
task :sorbet do
|
||||||
|
sh 'srb typecheck'
|
||||||
|
end
|
||||||
|
|
||||||
|
task default: [:rubocop, :sorbet, :spec, 'bundle:audit']
|
||||||
|
@@ -23,14 +23,18 @@ Gem::Specification.new do |s|
|
|||||||
s.add_runtime_dependency 'rack', '~> 2.0'
|
s.add_runtime_dependency 'rack', '~> 2.0'
|
||||||
s.add_runtime_dependency 'json'
|
s.add_runtime_dependency 'json'
|
||||||
s.add_runtime_dependency 'metriks'
|
s.add_runtime_dependency 'metriks'
|
||||||
s.add_runtime_dependency 'opentracing', '~> 0.4.0'
|
s.add_runtime_dependency 'opentracing', '~> 0.5.0'
|
||||||
s.add_runtime_dependency 'rack-tracer', '~> 0.5.0'
|
s.add_runtime_dependency 'rack-tracer', '~> 0.9.0'
|
||||||
s.add_runtime_dependency 'spanmanager', '~> 0.3.0'
|
s.add_runtime_dependency 'jaeger-client', '~> 0.10.0'
|
||||||
s.add_runtime_dependency 'jaeger-client', '~> 0.4.0'
|
s.add_runtime_dependency 'sorbet-runtime', '~> 0.5.0'
|
||||||
|
|
||||||
s.add_development_dependency 'bundler'
|
s.add_development_dependency 'bundler'
|
||||||
s.add_development_dependency 'rake'
|
s.add_development_dependency 'rake'
|
||||||
s.add_development_dependency 'rspec'
|
s.add_development_dependency 'rspec'
|
||||||
s.add_development_dependency 'rack-test'
|
s.add_development_dependency 'rack-test'
|
||||||
s.add_development_dependency 'rubocop', '~> 0.55.0'
|
s.add_development_dependency 'rubocop', '~> 0.80.0'
|
||||||
|
s.add_development_dependency 'bundler-audit', '~> 0.6.0'
|
||||||
|
s.add_development_dependency 'solargraph'
|
||||||
|
s.add_development_dependency 'sorbet', '~> 0.5.0'
|
||||||
|
s.add_development_dependency 'sord'
|
||||||
end
|
end
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
|
# typed: true
|
||||||
|
|
||||||
require 'etc'
|
require 'etc'
|
||||||
require 'logger'
|
require 'logger'
|
||||||
@@ -10,7 +11,6 @@ require 'metriks'
|
|||||||
require 'metriks/reporter/graphite'
|
require 'metriks/reporter/graphite'
|
||||||
require 'opentracing'
|
require 'opentracing'
|
||||||
require 'rack/tracer'
|
require 'rack/tracer'
|
||||||
require 'spanmanager'
|
|
||||||
|
|
||||||
require 'dyndnsd/generator/bind'
|
require 'dyndnsd/generator/bind'
|
||||||
require 'dyndnsd/updater/command_with_bind_zone'
|
require 'dyndnsd/updater/command_with_bind_zone'
|
||||||
@@ -22,21 +22,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']
|
||||||
@@ -52,6 +63,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)
|
||||||
@@ -65,6 +79,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'
|
||||||
@@ -72,6 +88,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'
|
||||||
@@ -96,8 +113,14 @@ module Dyndnsd
|
|||||||
|
|
||||||
# drop priviliges as soon as possible
|
# drop priviliges as soon as possible
|
||||||
# NOTE: first change group than user
|
# NOTE: first change group than user
|
||||||
Process::Sys.setgid(Etc.getgrnam(config['group']).gid) if config['group']
|
if config['group']
|
||||||
Process::Sys.setuid(Etc.getpwnam(config['user']).uid) if config['user']
|
group = Etc.getgrnam(config['group'])
|
||||||
|
Process::Sys.setgid(group.gid) if group
|
||||||
|
end
|
||||||
|
if config['user']
|
||||||
|
user = Etc.getpwnam(config['user'])
|
||||||
|
Process::Sys.setuid(user.uid) if user
|
||||||
|
end
|
||||||
|
|
||||||
setup_traps
|
setup_traps
|
||||||
|
|
||||||
@@ -110,6 +133,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
|
||||||
@@ -121,6 +146,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')
|
||||||
@@ -135,6 +163,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|
|
||||||
@@ -159,6 +190,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']}"
|
||||||
@@ -167,6 +199,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'])
|
||||||
|
|
||||||
@@ -205,6 +239,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'])
|
||||||
@@ -216,6 +252,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...'
|
||||||
@@ -227,6 +264,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']
|
||||||
@@ -254,6 +293,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')
|
||||||
@@ -266,14 +307,14 @@ module Dyndnsd
|
|||||||
host: host, port: port, service_name: service_name, flush_interval: 1
|
host: host, port: port, service_name: service_name, flush_interval: 1
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
# always use SpanManager
|
|
||||||
OpenTracing.global_tracer = SpanManager::Tracer.new(OpenTracing.global_tracer)
|
|
||||||
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
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
require 'forwardable'
|
require 'forwardable'
|
||||||
|
|
||||||
@@ -7,19 +8,22 @@ 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.read(@db_file, mode: 'r'))
|
||||||
else
|
else
|
||||||
@db = {}
|
@db = {}
|
||||||
end
|
end
|
||||||
@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 +31,7 @@ module Dyndnsd
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @return [Boolean]
|
||||||
def changed?
|
def changed?
|
||||||
@db_hash != @db.hash
|
@db_hash != @db.hash
|
||||||
end
|
end
|
||||||
|
@@ -1,7 +1,10 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
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 +13,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}"
|
||||||
|
@@ -1,8 +1,12 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
require 'ipaddr'
|
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 +15,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,23 +24,45 @@ 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)
|
||||||
span = OpenTracing.start_span(operation)
|
scope = OpenTracing.start_active_span(operation)
|
||||||
|
span = scope.span
|
||||||
span.set_tag('component', 'dyndnsd')
|
span.set_tag('component', 'dyndnsd')
|
||||||
span.set_tag('span.kind', 'server')
|
span.set_tag('span.kind', 'server')
|
||||||
begin
|
begin
|
||||||
block.call(span)
|
block.call(span)
|
||||||
|
rescue StandardError => e
|
||||||
|
span.set_tag('error', true)
|
||||||
|
span.log_kv(
|
||||||
|
event: 'error',
|
||||||
|
'error.kind': e.class.to_s,
|
||||||
|
'error.object': e,
|
||||||
|
message: e.message,
|
||||||
|
stack: e.backtrace&.join("\n") || ''
|
||||||
|
)
|
||||||
|
raise
|
||||||
ensure
|
ensure
|
||||||
span.finish
|
scope.close
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@@ -1,11 +1,15 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
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 +22,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 +34,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 +46,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
|
||||||
|
@@ -1,11 +1,15 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
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 +22,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 +34,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 +46,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
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
# Adapted from https://github.com/eric/metriks-graphite/blob/master/lib/metriks/reporter/graphite.rb
|
# Adapted from https://github.com/eric/metriks-graphite/blob/master/lib/metriks/reporter/graphite.rb
|
||||||
|
|
||||||
@@ -5,8 +6,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 +21,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 +38,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 +93,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
|
||||||
|
|
||||||
|
@@ -1,26 +1,31 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
def update(zone)
|
# @param db [Dyndnsd::Database]
|
||||||
|
# @return [void]
|
||||||
|
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 || 'None')
|
||||||
|
|
||||||
# write zone file in bind syntax
|
# write zone file in bind syntax
|
||||||
File.open(@zone_file, 'w') { |f| f.write(@generator.generate(zone)) }
|
File.open(@zone_file, 'w') { |f| f.write(@generator.generate(db)) }
|
||||||
# call user-defined command
|
# call user-defined command
|
||||||
pid = fork do
|
pid = fork do
|
||||||
exec @command
|
exec @command
|
||||||
end
|
end
|
||||||
|
|
||||||
# detach so children don't become zombies
|
# detach so children don't become zombies
|
||||||
Process.detach(pid)
|
Process.detach(pid) if pid
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
VERSION = '2.0.0.rc2'.freeze
|
VERSION = '2.0.0'.freeze
|
||||||
end
|
end
|
||||||
|
2
sorbet/config
Normal file
2
sorbet/config
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
--dir
|
||||||
|
.
|
36571
sorbet/rbi/hidden-definitions/hidden.rbi
Normal file
36571
sorbet/rbi/hidden-definitions/hidden.rbi
Normal file
File diff suppressed because it is too large
Load Diff
5
sorbet/rbi/jaeger-client.rbi
Normal file
5
sorbet/rbi/jaeger-client.rbi
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# typed: strong
|
||||||
|
|
||||||
|
module Jaeger::Client
|
||||||
|
def self.build(*args); end
|
||||||
|
end
|
5
sorbet/rbi/rack.rbi
Normal file
5
sorbet/rbi/rack.rbi
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# typed: strong
|
||||||
|
|
||||||
|
class Rack::Auth::Basic
|
||||||
|
def initialize(app, *args); end
|
||||||
|
end
|
8684
sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi
Normal file
8684
sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi
Normal file
File diff suppressed because it is too large
Load Diff
276
sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi
Normal file
276
sorbet/rbi/sorbet-typed/lib/rainbow/all/rainbow.rbi
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
||||||
|
# srb rbi sorbet-typed
|
||||||
|
#
|
||||||
|
# If you would like to make changes to this file, great! Please upstream any changes you make here:
|
||||||
|
#
|
||||||
|
# https://github.com/sorbet/sorbet-typed/edit/master/lib/rainbow/all/rainbow.rbi
|
||||||
|
#
|
||||||
|
# typed: strong
|
||||||
|
|
||||||
|
module Rainbow
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
|
attr_accessor :enabled
|
||||||
|
|
||||||
|
class Color
|
||||||
|
sig { returns(Symbol) }
|
||||||
|
attr_reader :ground
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
ground: Symbol,
|
||||||
|
values: T.any([Integer], [Integer, Integer, Integer])
|
||||||
|
).returns(Color)
|
||||||
|
end
|
||||||
|
def self.build(ground, values); end
|
||||||
|
|
||||||
|
sig { params(hex: String).returns([Integer, Integer, Integer]) }
|
||||||
|
def self.parse_hex_color(hex); end
|
||||||
|
|
||||||
|
class Indexed < Color
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :num
|
||||||
|
|
||||||
|
sig { params(ground: Symbol, num: Integer).returns(Indexed) }
|
||||||
|
def initialize(ground, num); end
|
||||||
|
|
||||||
|
sig { returns(T::Array[Integer]) }
|
||||||
|
def codes; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Named < Indexed
|
||||||
|
NAMES = T.let(nil, T::Hash[Symbol, Integer])
|
||||||
|
|
||||||
|
sig { returns(T::Array[Symbol]) }
|
||||||
|
def self.color_names; end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
def self.valid_names; end
|
||||||
|
|
||||||
|
sig { params(ground: Symbol, name: Symbol).returns(Named) }
|
||||||
|
def initialize(ground, name); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class RGB < Indexed
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_accessor :r, :g, :b
|
||||||
|
|
||||||
|
sig { params(value: Numeric).returns(Integer) }
|
||||||
|
def to_ansi_domain(value); end
|
||||||
|
|
||||||
|
sig { params(ground: Symbol, values: Integer).returns(RGB) }
|
||||||
|
def initialize(ground, *values); end
|
||||||
|
|
||||||
|
sig { returns(T::Array[Integer]) }
|
||||||
|
def codes; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class X11Named < RGB
|
||||||
|
include X11ColorNames
|
||||||
|
|
||||||
|
sig { returns(T::Array[Symbol]) }
|
||||||
|
def self.color_names; end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
def self.valid_names; end
|
||||||
|
|
||||||
|
sig { params(ground: Symbol, name: Symbol).returns(X11Named) }
|
||||||
|
def initialize(ground, name); end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(Wrapper) }
|
||||||
|
def self.global; end
|
||||||
|
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
|
def self.enabled; end
|
||||||
|
|
||||||
|
sig { params(value: T::Boolean).returns(T::Boolean) }
|
||||||
|
def self.enabled=(value); end
|
||||||
|
|
||||||
|
sig { params(string: String).returns(String) }
|
||||||
|
def self.uncolor(string); end
|
||||||
|
|
||||||
|
class NullPresenter < String
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
|
||||||
|
def color(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
|
||||||
|
def foreground(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
|
||||||
|
def fg(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
|
||||||
|
def background(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(NullPresenter) }
|
||||||
|
def bg(*values); end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def reset; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def bright; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def faint; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def italic; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def underline; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def blink; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def inverse; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def hide; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def cross_out; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def black; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def red; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def green; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def yellow; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def blue; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def magenta; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def cyan; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def white; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def bold; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def dark; end
|
||||||
|
|
||||||
|
sig { returns(NullPresenter) }
|
||||||
|
def strike; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Presenter < String
|
||||||
|
TERM_EFFECTS = T.let(nil, T::Hash[Symbol, Integer])
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
|
||||||
|
def color(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
|
||||||
|
def foreground(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
|
||||||
|
def fg(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
|
||||||
|
def background(*values); end
|
||||||
|
|
||||||
|
sig { params(values: T.any([Integer], [Integer, Integer, Integer])).returns(Presenter) }
|
||||||
|
def bg(*values); end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def reset; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def bright; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def faint; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def italic; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def underline; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def blink; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def inverse; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def hide; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def cross_out; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def black; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def red; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def green; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def yellow; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def blue; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def magenta; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def cyan; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def white; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def bold; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def dark; end
|
||||||
|
|
||||||
|
sig { returns(Presenter) }
|
||||||
|
def strike; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class StringUtils
|
||||||
|
sig { params(string: String, codes: T::Array[Integer]).returns(String) }
|
||||||
|
def self.wrap_with_sgr(string, codes); end
|
||||||
|
|
||||||
|
sig { params(string: String).returns(String) }
|
||||||
|
def uncolor(string); end
|
||||||
|
end
|
||||||
|
|
||||||
|
VERSION = T.let(nil, String)
|
||||||
|
|
||||||
|
class Wrapper
|
||||||
|
sig { returns(T::Boolean) }
|
||||||
|
attr_accessor :enabled
|
||||||
|
|
||||||
|
sig { params(enabled: T::Boolean).returns(Wrapper) }
|
||||||
|
def initialize(enabled = true); end
|
||||||
|
|
||||||
|
sig { params(string: String).returns(T.any(Rainbow::Presenter, Rainbow::NullPresenter)) }
|
||||||
|
def wrap(string); end
|
||||||
|
end
|
||||||
|
|
||||||
|
module X11ColorNames
|
||||||
|
NAMES = T.let(nil, T::Hash[Symbol, [Integer, Integer, Integer]])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { params(string: String).returns(Rainbow::Presenter) }
|
||||||
|
def Rainbow(string); end
|
4222
sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi
Normal file
4222
sorbet/rbi/sorbet-typed/lib/ruby/all/gem.rbi
Normal file
File diff suppressed because it is too large
Load Diff
111
sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi
Normal file
111
sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
||||||
|
# srb rbi sorbet-typed
|
||||||
|
#
|
||||||
|
# If you would like to make changes to this file, great! Please upstream any changes you make here:
|
||||||
|
#
|
||||||
|
# https://github.com/sorbet/sorbet-typed/edit/master/lib/ruby/all/open3.rbi
|
||||||
|
#
|
||||||
|
# typed: strong
|
||||||
|
|
||||||
|
module Open3
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmd: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(stdin: IO, stdout: IO, stderr: IO, wait_thr: Process::Waiter).void)
|
||||||
|
).returns([IO, IO, IO, Process::Waiter])
|
||||||
|
end
|
||||||
|
def self.popen3(*cmd, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmd: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(stdin: IO, stdout: IO, wait_thr: Process::Waiter).void)
|
||||||
|
).returns([IO, IO, Process::Waiter])
|
||||||
|
end
|
||||||
|
def self.popen2(*cmd, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmd: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(stdin: IO, stdout_and_stderr: IO, wait_thr: Process::Waiter).void)
|
||||||
|
).returns([IO, IO, Process::Waiter])
|
||||||
|
end
|
||||||
|
def self.popen2e(*cmd, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmd: T.any(String, T::Array[String]),
|
||||||
|
stdin_data: T.nilable(String),
|
||||||
|
binmode: T.any(FalseClass, TrueClass),
|
||||||
|
opts: T::Hash[Symbol, T.untyped]
|
||||||
|
).returns([String, String, Process::Status])
|
||||||
|
end
|
||||||
|
def self.capture3(*cmd, stdin_data: '', binmode: false, **opts); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmd: T.any(String, T::Array[String]),
|
||||||
|
stdin_data: T.nilable(String),
|
||||||
|
binmode: T.any(FalseClass, TrueClass),
|
||||||
|
opts: T::Hash[Symbol, T.untyped]
|
||||||
|
).returns([String, Process::Status])
|
||||||
|
end
|
||||||
|
def self.capture2(*cmd, stdin_data: nil, binmode: false, **opts); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmd: T.any(String, T::Array[String]),
|
||||||
|
stdin_data: T.nilable(String),
|
||||||
|
binmode: T.any(FalseClass, TrueClass),
|
||||||
|
opts: T::Hash[Symbol, T.untyped]
|
||||||
|
).returns([String, Process::Status])
|
||||||
|
end
|
||||||
|
def self.capture2e(*cmd, stdin_data: nil, binmode: false, **opts); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmds: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(first_stdin: IO, last_stdout: IO, wait_threads: T::Array[Process::Waiter]).void)
|
||||||
|
).returns([IO, IO, T::Array[Process::Waiter]])
|
||||||
|
end
|
||||||
|
def self.pipeline_rw(*cmds, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmds: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(last_stdout: IO, wait_threads: T::Array[Process::Waiter]).void)
|
||||||
|
).returns([IO, T::Array[Process::Waiter]])
|
||||||
|
end
|
||||||
|
def self.pipeline_r(*cmds, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmds: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(first_stdin: IO, wait_threads: T::Array[Process::Waiter]).void)
|
||||||
|
).returns([IO, T::Array[Process::Waiter]])
|
||||||
|
end
|
||||||
|
def self.pipeline_w(*cmds, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmds: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped,
|
||||||
|
block: T.nilable(T.proc.params(wait_threads: T::Array[Process::Waiter]).void)
|
||||||
|
).returns(T::Array[Process::Waiter])
|
||||||
|
end
|
||||||
|
def self.pipeline_start(*cmds, **opts, &block); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
cmds: T.any(String, T::Array[String]),
|
||||||
|
opts: T.untyped
|
||||||
|
).returns(T::Array[Process::Status])
|
||||||
|
end
|
||||||
|
def self.pipeline(*cmds, **opts); end
|
||||||
|
end
|
543
sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi
Normal file
543
sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi
Normal file
@@ -0,0 +1,543 @@
|
|||||||
|
# This file is autogenerated. Do not edit it by hand. Regenerate it with:
|
||||||
|
# srb rbi sorbet-typed
|
||||||
|
#
|
||||||
|
# If you would like to make changes to this file, great! Please upstream any changes you make here:
|
||||||
|
#
|
||||||
|
# https://github.com/sorbet/sorbet-typed/edit/master/lib/ruby/all/resolv.rbi
|
||||||
|
#
|
||||||
|
# typed: strong
|
||||||
|
|
||||||
|
class Resolv
|
||||||
|
sig { params(name: String).returns(String) }
|
||||||
|
def self.getaddress(name); end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(T::Array[String]) }
|
||||||
|
def self.getaddresses(name); end
|
||||||
|
|
||||||
|
sig { params(name: String, block: T.proc.params(address: String).void).void }
|
||||||
|
def self.each_address(name, &block); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(String) }
|
||||||
|
def self.getname(address); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(T::Array[String]) }
|
||||||
|
def self.getnames(address); end
|
||||||
|
|
||||||
|
sig { params(address: String, proc: T.proc.params(name: String).void).void }
|
||||||
|
def self.each_name(address, &proc); end
|
||||||
|
|
||||||
|
sig { params(resolvers: [Hosts, DNS]).void }
|
||||||
|
def initialize(resolvers=[Hosts.new, DNS.new]); end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(String) }
|
||||||
|
def getaddress(name); end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(T::Array[String]) }
|
||||||
|
def getaddresses(name); end
|
||||||
|
|
||||||
|
sig { params(name: String, block: T.proc.params(address: String).void).void }
|
||||||
|
def each_address(name, &block); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(String) }
|
||||||
|
def getname(address); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(T::Array[String]) }
|
||||||
|
def getnames(address); end
|
||||||
|
|
||||||
|
sig { params(address: String, proc: T.proc.params(name: String).void).void }
|
||||||
|
def each_name(address, &proc); end
|
||||||
|
|
||||||
|
class ResolvError < StandardError; end
|
||||||
|
class ResolvTimeout < Timeout::Error; end
|
||||||
|
|
||||||
|
class Hosts
|
||||||
|
DefaultFileName = T.let(T.unsafe(nil), String)
|
||||||
|
|
||||||
|
sig { params(filename: String).void }
|
||||||
|
def initialize(filename = DefaultFileName); end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(String) }
|
||||||
|
def getaddress(name); end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(T::Array[String]) }
|
||||||
|
def getaddresses(name); end
|
||||||
|
|
||||||
|
sig { params(name: String, block: T.proc.params(address: String).void).void }
|
||||||
|
def each_address(name, &block); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(String) }
|
||||||
|
def getname(address); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(T::Array[String]) }
|
||||||
|
def getnames(address); end
|
||||||
|
|
||||||
|
sig { params(address: String, proc: T.proc.params(name: String).void).void }
|
||||||
|
def each_name(address, &proc); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class DNS
|
||||||
|
Port = T.let(T.unsafe(nil), Integer)
|
||||||
|
|
||||||
|
UDPSize = T.let(T.unsafe(nil), Integer)
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
config_info: T.any(
|
||||||
|
NilClass,
|
||||||
|
String,
|
||||||
|
{ nameserver: T.any(String, T::Array[String]), search: T::Array[String], ndots: Integer },
|
||||||
|
{ nameserver_port: T::Array[[String, Integer]], search: T::Array[String], ndots: Integer }
|
||||||
|
)
|
||||||
|
).returns(Resolv::DNS)
|
||||||
|
end
|
||||||
|
def self.open(config_info = nil); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
config_info: T.any(
|
||||||
|
NilClass,
|
||||||
|
String,
|
||||||
|
{ nameserver: T.any(String, T::Array[String]), search: T::Array[String], ndots: Integer },
|
||||||
|
{ nameserver_port: T::Array[[String, Integer]], search: T::Array[String], ndots: Integer }
|
||||||
|
)
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def initialize(config_info = nil); end
|
||||||
|
|
||||||
|
sig { params(values: T.any(NilClass, Integer, T::Array[Integer])).void }
|
||||||
|
def timeouts=(values); end
|
||||||
|
|
||||||
|
sig { void }
|
||||||
|
def close; end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(String) }
|
||||||
|
def getaddress(name); end
|
||||||
|
|
||||||
|
sig { params(name: String).returns(T::Array[String]) }
|
||||||
|
def getaddresses(name); end
|
||||||
|
|
||||||
|
sig { params(name: String, block: T.proc.params(address: String).void).void }
|
||||||
|
def each_address(name, &block); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(String) }
|
||||||
|
def getname(address); end
|
||||||
|
|
||||||
|
sig { params(address: String).returns(T::Array[String]) }
|
||||||
|
def getnames(address); end
|
||||||
|
|
||||||
|
sig { params(address: String, proc: T.proc.params(name: String).void).void }
|
||||||
|
def each_name(address, &proc); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
name: T.any(String, Resolv::DNS::Name),
|
||||||
|
typeclass: T.class_of(Resolv::DNS::Resource)
|
||||||
|
).returns(Resolv::DNS::Resource)
|
||||||
|
end
|
||||||
|
def getresource(name, typeclass); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
name: T.any(String, Resolv::DNS::Name),
|
||||||
|
typeclass: T.class_of(Resolv::DNS::Resource)
|
||||||
|
).returns(T::Array[Resolv::DNS::Resource])
|
||||||
|
end
|
||||||
|
def getresources(name, typeclass); end
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
name: T.any(String, Resolv::DNS::Name),
|
||||||
|
typeclass: T.class_of(Resolv::DNS::Resource),
|
||||||
|
proc: T.proc.params(resource: Resolv::DNS::Resource).void
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def each_resource(name, typeclass, &proc); end
|
||||||
|
|
||||||
|
class DecodeError < StandardError; end
|
||||||
|
class EncodeError < StandardError; end
|
||||||
|
|
||||||
|
class Name
|
||||||
|
sig { params(arg: T.any(String, Resolv::DNS::Name)).returns(Resolv::DNS::Name) }
|
||||||
|
def self.create(arg); end
|
||||||
|
|
||||||
|
sig { params(labels: T::Array[String], absolute: T.any(FalseClass, TrueClass)).void }
|
||||||
|
def initialize(labels, absolute=true); end
|
||||||
|
|
||||||
|
sig { returns(T.any(FalseClass, TrueClass)) }
|
||||||
|
def absolute?; end
|
||||||
|
|
||||||
|
sig { params(other: Resolv::DNS::Name).returns(T.any(FalseClass, TrueClass)) }
|
||||||
|
def subdomain_of?(other); end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Query; end
|
||||||
|
|
||||||
|
class Resource < Query
|
||||||
|
sig { returns(T.nilable(Integer)) }
|
||||||
|
attr_reader :ttl
|
||||||
|
|
||||||
|
sig { void }
|
||||||
|
def initialize
|
||||||
|
@ttl = T.let(T.unsafe(nil), T.nilable(Integer))
|
||||||
|
end
|
||||||
|
|
||||||
|
class Generic < Resource
|
||||||
|
sig { params(data: T.untyped).void }
|
||||||
|
def initialize(data)
|
||||||
|
@data = T.let(T.unsafe(nil), T.untyped)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(T.untyped) }
|
||||||
|
attr_reader :data
|
||||||
|
end
|
||||||
|
|
||||||
|
class DomainName < Resource
|
||||||
|
sig { params(name: String).void }
|
||||||
|
def initialize(name)
|
||||||
|
@name = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :name
|
||||||
|
end
|
||||||
|
|
||||||
|
class NS < DomainName; end
|
||||||
|
|
||||||
|
class CNAME < DomainName; end
|
||||||
|
|
||||||
|
class SOA < Resource
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
mname: String,
|
||||||
|
rname: String,
|
||||||
|
serial: Integer,
|
||||||
|
refresh: Integer,
|
||||||
|
retry_: Integer,
|
||||||
|
expire: Integer,
|
||||||
|
minimum: Integer
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def initialize(mname, rname, serial, refresh, retry_, expire, minimum)
|
||||||
|
@mname = T.let(T.unsafe(nil), String)
|
||||||
|
@rname = T.let(T.unsafe(nil), String)
|
||||||
|
@serial = T.let(T.unsafe(nil), Integer)
|
||||||
|
@refresh = T.let(T.unsafe(nil), Integer)
|
||||||
|
@retry = T.let(T.unsafe(nil), Integer)
|
||||||
|
@expire = T.let(T.unsafe(nil), Integer)
|
||||||
|
@minimum = T.let(T.unsafe(nil), Integer)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :mname
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :rname
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :serial
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :refresh
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :retry
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :expire
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :minimum
|
||||||
|
end
|
||||||
|
|
||||||
|
class PTR < DomainName; end
|
||||||
|
|
||||||
|
class HINFO < Resource
|
||||||
|
sig { params(cpu: String, os: String).void }
|
||||||
|
def initialize(cpu, os)
|
||||||
|
@cpu = T.let(T.unsafe(nil), String)
|
||||||
|
@os = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :cpu
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :os
|
||||||
|
end
|
||||||
|
|
||||||
|
class MINFO < Resource
|
||||||
|
sig { params(rmailbx: String, emailbx: String).void }
|
||||||
|
def initialize(rmailbx, emailbx)
|
||||||
|
@rmailbx = T.let(T.unsafe(nil), String)
|
||||||
|
@emailbx = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :rmailbx
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :emailbx
|
||||||
|
end
|
||||||
|
|
||||||
|
class MX < Resource
|
||||||
|
sig { params(preference: Integer, exchange: String).void }
|
||||||
|
def initialize(preference, exchange)
|
||||||
|
@preference = T.let(T.unsafe(nil), Integer)
|
||||||
|
@exchange = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :preference
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :exchange
|
||||||
|
end
|
||||||
|
|
||||||
|
class TXT < Resource
|
||||||
|
sig { params(first_string: String, rest_strings: String).void }
|
||||||
|
def initialize(first_string, *rest_strings)
|
||||||
|
@strings = T.let(T.unsafe(nil), T::Array[String])
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(T::Array[String]) }
|
||||||
|
attr_reader :strings
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
def data; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class LOC < Resource
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
version: String,
|
||||||
|
ssize: T.any(String, Resolv::LOC::Size),
|
||||||
|
hprecision: T.any(String, Resolv::LOC::Size),
|
||||||
|
vprecision: T.any(String, Resolv::LOC::Size),
|
||||||
|
latitude: T.any(String, Resolv::LOC::Coord),
|
||||||
|
longitude: T.any(String, Resolv::LOC::Coord),
|
||||||
|
altitude: T.any(String, Resolv::LOC::Alt)
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def initialize(version, ssize, hprecision, vprecision, latitude, longitude, altitude)
|
||||||
|
@version = T.let(T.unsafe(nil), String)
|
||||||
|
@ssize = T.let(T.unsafe(nil), Resolv::LOC::Size)
|
||||||
|
@hprecision = T.let(T.unsafe(nil), Resolv::LOC::Size)
|
||||||
|
@vprecision = T.let(T.unsafe(nil), Resolv::LOC::Size)
|
||||||
|
@latitude = T.let(T.unsafe(nil), Resolv::LOC::Coord)
|
||||||
|
@longitude = T.let(T.unsafe(nil), Resolv::LOC::Coord)
|
||||||
|
@altitude = T.let(T.unsafe(nil), Resolv::LOC::Alt)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :version
|
||||||
|
|
||||||
|
sig { returns(Resolv::LOC::Size) }
|
||||||
|
attr_reader :ssize
|
||||||
|
|
||||||
|
sig { returns(Resolv::LOC::Size) }
|
||||||
|
attr_reader :hprecision
|
||||||
|
|
||||||
|
sig { returns(Resolv::LOC::Size) }
|
||||||
|
attr_reader :vprecision
|
||||||
|
|
||||||
|
sig { returns(Resolv::LOC::Coord) }
|
||||||
|
attr_reader :latitude
|
||||||
|
|
||||||
|
sig { returns(Resolv::LOC::Coord) }
|
||||||
|
attr_reader :longitude
|
||||||
|
|
||||||
|
sig { returns(Resolv::LOC::Alt) }
|
||||||
|
attr_reader :altitude
|
||||||
|
end
|
||||||
|
|
||||||
|
class ANY < Query; end
|
||||||
|
|
||||||
|
module IN
|
||||||
|
class A < Resource
|
||||||
|
sig { params(address: String).void }
|
||||||
|
def initialize(address)
|
||||||
|
@address = T.let(T.unsafe(nil), Resolv::IPv4)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(Resolv::IPv4) }
|
||||||
|
attr_reader :address
|
||||||
|
end
|
||||||
|
|
||||||
|
class WKS < Resource
|
||||||
|
sig { params(address: String, protocol: Integer, bitmap: String).void }
|
||||||
|
def initialize(address, protocol, bitmap)
|
||||||
|
@address = T.let(T.unsafe(nil), Resolv::IPv4)
|
||||||
|
@protocol = T.let(T.unsafe(nil), Integer)
|
||||||
|
@bitmap = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(Resolv::IPv4) }
|
||||||
|
attr_reader :address
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :protocol
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :bitmap
|
||||||
|
end
|
||||||
|
|
||||||
|
class AAAA < Resource
|
||||||
|
sig { params(address: String).void }
|
||||||
|
def initialize(address)
|
||||||
|
@address = T.let(T.unsafe(nil), Resolv::IPv6)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(Resolv::IPv6) }
|
||||||
|
attr_reader :address
|
||||||
|
end
|
||||||
|
|
||||||
|
class SRV < Resource
|
||||||
|
# Create a SRV resource record.
|
||||||
|
#
|
||||||
|
# See the documentation for #priority, #weight, #port and #target
|
||||||
|
# for +priority+, +weight+, +port and +target+ respectively.
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
priority: T.any(Integer, String),
|
||||||
|
weight: T.any(Integer, String),
|
||||||
|
port: T.any(Integer, String),
|
||||||
|
target: T.any(String, Resolv::DNS::Name)
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def initialize(priority, weight, port, target)
|
||||||
|
@priority = T.let(T.unsafe(nil), Integer)
|
||||||
|
@weight = T.let(T.unsafe(nil), Integer)
|
||||||
|
@port = T.let(T.unsafe(nil), Integer)
|
||||||
|
@target = T.let(T.unsafe(nil), Resolv::DNS::Name)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :priority
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :weight
|
||||||
|
|
||||||
|
sig { returns(Integer) }
|
||||||
|
attr_reader :port
|
||||||
|
|
||||||
|
sig { returns(Resolv::DNS::Name) }
|
||||||
|
attr_reader :target
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class IPv4
|
||||||
|
Regex256 = T.let(T.unsafe(nil), Regexp)
|
||||||
|
Regex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
sig { params(arg: T.any(String, Resolv::IPv4)).returns(Resolv::IPv4) }
|
||||||
|
def self.create(arg); end
|
||||||
|
|
||||||
|
sig { params(address: String).void }
|
||||||
|
def initialize(address)
|
||||||
|
@address = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :address
|
||||||
|
|
||||||
|
sig { returns(DNS::Name) }
|
||||||
|
def to_name; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class IPv6
|
||||||
|
Regex_8Hex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
Regex_CompressedHex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
Regex_6Hex4Dec = T.let(T.unsafe(nil), Regexp)
|
||||||
|
Regex_CompressedHex4Dec = T.let(T.unsafe(nil), Regexp)
|
||||||
|
Regex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
sig { params(arg: T.any(String, Resolv::IPv6)).returns(Resolv::IPv6) }
|
||||||
|
def self.create(arg); end
|
||||||
|
|
||||||
|
sig { params(address: String).void }
|
||||||
|
def initialize(address)
|
||||||
|
@address = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :address
|
||||||
|
|
||||||
|
sig { returns(DNS::Name) }
|
||||||
|
def to_name; end
|
||||||
|
end
|
||||||
|
|
||||||
|
class MDNS < DNS
|
||||||
|
Port = T.let(T.unsafe(nil), Integer)
|
||||||
|
AddressV4 = T.let(T.unsafe(nil), String)
|
||||||
|
AddressV6 = T.let(T.unsafe(nil), String)
|
||||||
|
Addresses = T.let(T.unsafe(nil), [[String, Integer], [String, Integer]])
|
||||||
|
|
||||||
|
sig do
|
||||||
|
params(
|
||||||
|
config_info: T.any(
|
||||||
|
NilClass,
|
||||||
|
{ nameserver: T.any(String, T::Array[String]), search: T::Array[String], ndots: Integer },
|
||||||
|
{ nameserver_port: T::Array[[String, Integer]], search: T::Array[String], ndots: Integer }
|
||||||
|
)
|
||||||
|
).void
|
||||||
|
end
|
||||||
|
def initialize(config_info = nil); end
|
||||||
|
end
|
||||||
|
|
||||||
|
module LOC
|
||||||
|
class Size
|
||||||
|
Regex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
sig { params(arg: T.any(String, Resolv::LOC::Size)).returns(Resolv::LOC::Size) }
|
||||||
|
def self.create(arg); end
|
||||||
|
|
||||||
|
sig { params(scalar: String).void }
|
||||||
|
def initialize(scalar)
|
||||||
|
@scalar = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :scalar
|
||||||
|
end
|
||||||
|
|
||||||
|
class Coord
|
||||||
|
Regex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
sig { params(arg: T.any(String, Resolv::LOC::Coord)).returns(Resolv::LOC::Coord) }
|
||||||
|
def self.create(arg); end
|
||||||
|
|
||||||
|
sig { params(coordinates: String, orientation: T.enum(%w[lat lon])).void }
|
||||||
|
def initialize(coordinates, orientation)
|
||||||
|
@coordinates = T.let(T.unsafe(nil), String)
|
||||||
|
@orientation = T.let(T.unsafe(nil), T.enum(%w[lat lon]))
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :coordinates
|
||||||
|
|
||||||
|
sig { returns(T.enum(%w[lat lon])) }
|
||||||
|
attr_reader :orientation
|
||||||
|
end
|
||||||
|
|
||||||
|
class Alt
|
||||||
|
Regex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
|
||||||
|
sig { params(arg: T.any(String, Resolv::LOC::Alt)).returns(Resolv::LOC::Alt) }
|
||||||
|
def self.create(arg); end
|
||||||
|
|
||||||
|
sig { params(altitude: String).void }
|
||||||
|
def initialize(altitude)
|
||||||
|
@altitude = T.let(T.unsafe(nil), String)
|
||||||
|
end
|
||||||
|
|
||||||
|
sig { returns(String) }
|
||||||
|
attr_reader :altitude
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
DefaultResolver = T.let(T.unsafe(nil), Resolv)
|
||||||
|
AddressRegex = T.let(T.unsafe(nil), Regexp)
|
||||||
|
end
|
@@ -1,3 +1,4 @@
|
|||||||
|
# typed: false
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Dyndnsd::Daemon do
|
describe Dyndnsd::Daemon do
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
# typed: strong
|
||||||
|
|
||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
require 'bundler/setup'
|
require 'bundler/setup'
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
require 'forwardable'
|
require 'forwardable'
|
||||||
|
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
# typed: true
|
||||||
|
|
||||||
module Dyndnsd
|
module Dyndnsd
|
||||||
module Updater
|
module Updater
|
||||||
|
Reference in New Issue
Block a user