dnsmanager/src/requests/admin.cr
2024-12-15 18:38:41 +01:00

113 lines
3.1 KiB
Crystal

class DNSManager::Request
# Periodic actions to perform as an administrator.
IPC::JSON.message GetOrphanDomains, 6 do
def initialize()
end
def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
user = dnsmanagerd.get_logged_user event
return Response::ErrorUserNotLogged.new unless user
dnsmanagerd.storage.get_orphan_domains user.uid
end
end
DNSManager.requests << GetOrphanDomains
# Periodic actions to perform as an administrator.
IPC::JSON.message Maintenance, 7 do
enum Subject
Verbosity # Change the verbosity of dnsmanagerd.
SanityCheck # Perform various verifications, including:
# - TODO: debug print and removal of domains not linked to existing users
# - TODO: check that at least an admin exists
end
property subject : Subject
property int : Int32? = nil
property string : String? = nil
def initialize(@subject)
end
def to_s(io : IO)
super io
io << " (subject: #{@subject}, int: #{@int}, string: #{@string})"
end
def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
user = dnsmanagerd.get_logged_user event
return Response::ErrorUserNotLogged.new unless user
return Response::InsufficientRights.new unless user.admin
case @subject
when Subject::Verbosity
if verbosity = @int
Baguette::Context.verbosity = verbosity
end
Response::Success.new
when Subject::SanityCheck
Baguette::Log.info "TODO: sanity check"
Response::Error.new "not implemented"
else
Response::Error.new "not implemented"
end
end
end
DNSManager.requests << Maintenance
# Generate all zone files.
# TODO: should conveniently skip already generated zones.
IPC::JSON.message GenerateAllZoneFiles, 100 do
def initialize()
end
def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
user = dnsmanagerd.get_logged_user event
return Response::ErrorUserNotLogged.new unless user
dnsmanagerd.storage.user_must_be_admin! user.uid
dnsmanagerd.storage.generate_all_zonefiles
end
end
DNSManager.requests << GenerateAllZoneFiles
# Force the generation of a zone file.
IPC::JSON.message GenerateZoneFile, 101 do
property domain : String
def initialize(@domain)
end
def to_s(io : IO)
super io
io << " (domain: #{@domain})"
end
def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
user = dnsmanagerd.get_logged_user event
return Response::ErrorUserNotLogged.new unless user
dnsmanagerd.storage.user_must_be_admin! user.uid
dnsmanagerd.storage.generate_zonefile @domain
end
end
DNSManager.requests << GenerateZoneFile
IPC::JSON.message Exit, 248 do
def initialize
end
def to_s(io : IO)
super io
end
def handle(dnsmanagerd : DNSManager::Service, event : IPC::Event) : IPC::JSON
user = dnsmanagerd.get_logged_user event
return Response::ErrorUserNotLogged.new unless user
dnsmanagerd.storage.user_must_be_admin! user.uid
Baguette::Log.warning "exit requested, bye"
exit 0
end
end
DNSManager.requests << Exit
end