Delegation WIP.
This commit is contained in:
parent
09a97386a9
commit
c5433bb95a
2 changed files with 69 additions and 14 deletions
|
@ -15,6 +15,7 @@ class DNSManager::Storage
|
||||||
|
|
||||||
getter zones : DODB::Storage::Common(Zone)
|
getter zones : DODB::Storage::Common(Zone)
|
||||||
getter zones_by_domain : DODB::Trigger::IndexCached(Zone)
|
getter zones_by_domain : DODB::Trigger::IndexCached(Zone)
|
||||||
|
getter zones_by_delegation : DODB::Trigger::Tags(Zone)
|
||||||
|
|
||||||
getter tokens : DODB::Storage::Common(Token)
|
getter tokens : DODB::Storage::Common(Token)
|
||||||
getter tokens_by_uuid : DODB::Trigger::IndexCached(Token)
|
getter tokens_by_uuid : DODB::Trigger::IndexCached(Token)
|
||||||
|
@ -48,12 +49,19 @@ class DNSManager::Storage
|
||||||
DODB.no_index
|
DODB.no_index
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@domains_by_owners = @domains.new_tags "owners", &.owners.map &.to_s
|
@domains_by_owners = @domains.new_tags "owners", &.owners.map &.to_s
|
||||||
@zones = DODB::Storage::Common(Zone).new "#{@root}/zones", 5_000
|
@zones = DODB::Storage::Common(Zone).new "#{@root}/zones", 5_000
|
||||||
@zones_by_domain = @zones.new_index "domain", &.domain
|
@zones_by_domain = @zones.new_index "domain", &.domain
|
||||||
@tokens = DODB::Storage::Common(Token).new "#{@root}/tokens", 5_000
|
@zones_by_delegation = @zones.new_tags "delegation", do |z|
|
||||||
@tokens_by_uuid = @tokens.new_index "uuid", &.uuid
|
if delegation = z.delegation
|
||||||
@tokens_by_domain = @tokens.new_partition "domain", &.domain
|
[ delegation.nameserver1, delegation.nameserver2 ]
|
||||||
|
else
|
||||||
|
DODB.no_index
|
||||||
|
end
|
||||||
|
end
|
||||||
|
@tokens = DODB::Storage::Common(Token).new "#{@root}/tokens", 5_000
|
||||||
|
@tokens_by_uuid = @tokens.new_index "uuid", &.uuid
|
||||||
|
@tokens_by_domain = @tokens.new_partition "domain", &.domain
|
||||||
|
|
||||||
@zonefiledir = "#{@root}/bind9-zones"
|
@zonefiledir = "#{@root}/bind9-zones"
|
||||||
Dir.mkdir_p @zonefiledir
|
Dir.mkdir_p @zonefiledir
|
||||||
|
@ -77,6 +85,11 @@ class DNSManager::Storage
|
||||||
def generate_bind9_zonefile(domain : String) : Nil
|
def generate_bind9_zonefile(domain : String) : Nil
|
||||||
zone = zone_must_exist! domain
|
zone = zone_must_exist! domain
|
||||||
|
|
||||||
|
if delegation = zone.delegation
|
||||||
|
Baguette::Log.info "zone #{domain} is delegated"
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
# Safe write.
|
# Safe write.
|
||||||
filename_final = "#{@zonefiledir}/#{zone.domain}"
|
filename_final = "#{@zonefiledir}/#{zone.domain}"
|
||||||
filename_wip = "#{filename_final}.wip"
|
filename_wip = "#{filename_final}.wip"
|
||||||
|
@ -433,12 +446,29 @@ class DNSManager::Storage
|
||||||
Response::Zone.new zone
|
Response::Zone.new zone
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO, FIXME: verifications + actually delegate the domain.
|
# Deletes the zone and its tokens to wipe the zone data then delegates the domain.
|
||||||
def delegate_domain(user_id : UserDataID, domain : String, nameserver1 : String, nameserver2 : String) : IPC::JSON
|
def delegate_domain(user_id : UserDataID, domain_name : String,
|
||||||
zone = zone_must_exist! domain
|
nameserver1 : String, nameserver2 : String) : IPC::JSON
|
||||||
user_should_own! user_id, domain
|
_ = zone_must_exist! domain_name
|
||||||
|
user_should_own! user_id, domain_name
|
||||||
|
|
||||||
Response::DomainDelegated.new domain, nameserver1, nameserver2
|
# Name server domains verification.
|
||||||
|
return Response::InvalidDomainName.new unless Zone.is_domain_valid? nameserver1
|
||||||
|
return Response::InvalidDomainName.new unless Zone.is_domain_valid? nameserver2
|
||||||
|
|
||||||
|
# Remove the related zone and their registered tokens.
|
||||||
|
zones_by_domain.delete domain_name
|
||||||
|
|
||||||
|
# The domain may not have tokens.
|
||||||
|
tokens_by_domain.delete? domain_name
|
||||||
|
|
||||||
|
# TODO, FIXME: actually delegate the domain.
|
||||||
|
|
||||||
|
zone = Zone.new domain_name
|
||||||
|
zone.delegation = Zone::Delegation.new nameserver1, nameserver2
|
||||||
|
zones_by_domain.update_or_create zone.domain, zone
|
||||||
|
|
||||||
|
Response::DomainDelegated.new domain_name, nameserver1, nameserver2
|
||||||
end
|
end
|
||||||
|
|
||||||
# Removes user data.
|
# Removes user data.
|
||||||
|
|
|
@ -29,6 +29,8 @@ class DNSManager::Storage::Zone
|
||||||
property resources = [] of DNSManager::Storage::Zone::ResourceRecord
|
property resources = [] of DNSManager::Storage::Zone::ResourceRecord
|
||||||
property current_rrid : UInt32 = 0
|
property current_rrid : UInt32 = 0
|
||||||
|
|
||||||
|
property delegation : Delegation? = nil
|
||||||
|
|
||||||
# We don't want to accept less than 30 seconds TTL.
|
# We don't want to accept less than 30 seconds TTL.
|
||||||
class_property ttl_limit_min = 30
|
class_property ttl_limit_min = 30
|
||||||
|
|
||||||
|
@ -37,6 +39,22 @@ class DNSManager::Storage::Zone
|
||||||
|
|
||||||
def_clone
|
def_clone
|
||||||
|
|
||||||
|
class Delegation
|
||||||
|
include JSON::Serializable
|
||||||
|
|
||||||
|
property nameserver1 : String
|
||||||
|
property nameserver2 : String
|
||||||
|
|
||||||
|
def initialize(@nameserver1, @nameserver2)
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s(io : IO)
|
||||||
|
io << "#{@nameserver1} #{@nameserver2}\n"
|
||||||
|
end
|
||||||
|
|
||||||
|
def_clone
|
||||||
|
end
|
||||||
|
|
||||||
alias Error = String
|
alias Error = String
|
||||||
|
|
||||||
# Store a Resource Record: A, AAAA, TXT, PTR, CNAME…
|
# Store a Resource Record: A, AAAA, TXT, PTR, CNAME…
|
||||||
|
@ -918,12 +936,19 @@ class DNSManager::Storage::Zone
|
||||||
|
|
||||||
def to_s(io : IO)
|
def to_s(io : IO)
|
||||||
io << "ZONE #{@domain} (#{@resources.size} rr)"
|
io << "ZONE #{@domain} (#{@resources.size} rr)"
|
||||||
|
if delegation = @delegation
|
||||||
|
io << " delegated"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def pretty_print(io : IO)
|
def pretty_print(io : IO)
|
||||||
io << "DOMAIN #{@domain}.\n"
|
if delegation = @delegation
|
||||||
@resources.each do |rr|
|
io << "ZONE #{@domain} delegated (to '#{delegation.nameserver1}' and '#{delegation.nameserver2}')\n"
|
||||||
io << rr
|
else
|
||||||
|
io << "ZONE #{@domain}.\n"
|
||||||
|
@resources.each do |rr|
|
||||||
|
io << rr
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue