master
Karchnu 2020-12-03 17:13:40 +01:00
parent 2b9360acb4
commit 7e211cead1
3 changed files with 135 additions and 31 deletions

View File

@ -1,14 +1,20 @@
require "http/server" # require "http/server"
require "option_parser"
require "ipc" require "ipc"
require "ipc/json" require "ipc/json"
require "authd" require "authd"
require "baguette-crystal-base" require "baguette-crystal-base"
class Context class Baguette::Configuration
class_property service_name = "dnsmanager" class DNSManager < IPC
class_property recreate_indexes = false property service_name : String = "dnsmanager"
class_property print_timer = false property recreate_indexes : Bool = false
property storage_directory : String = "storage"
def initialize
end
end
end end
module DNSManager module DNSManager
@ -23,26 +29,23 @@ module DNSManager
end end
require "./cli-parser"
require "./storage.cr" require "./storage.cr"
require "./network.cr" require "./network.cr"
class DNSManager::Service < IPC::Server class DNSManager::Service < IPC::Server
getter storage_directory : String property configuration : Baguette::Configuration::DNSManager
getter storage : DNSManager::Storage getter storage : DNSManager::Storage
getter logged_users : Hash(Int32, AuthD::User::Public) getter logged_users : Hash(Int32, AuthD::User::Public)
# getter logged_connections : Hash(Int32, IPC::Connection)
@authd : AuthD::Client @authd : AuthD::Client
def initialize(service_name, @storage_directory : String, @authd : AuthD::Client) def initialize(@configuration, @authd : AuthD::Client)
@storage = DNSManager::Storage.new @storage_directory @storage = DNSManager::Storage.new @configuration.storage_directory
@logged_users = Hash(Int32, AuthD::User::Public).new @logged_users = Hash(Int32, AuthD::User::Public).new
# @logged_connections = Hash(Int32, IPC::Connection).new
super service_name super @configuration.service_name
end end
def get_logged_user(event : IPC::Event::Events) def get_logged_user(event : IPC::Event::Events)
@ -118,13 +121,13 @@ class DNSManager::Service < IPC::Server
end end
def run def run
Baguette::Log.title "Starting #{Context.service_name}" Baguette::Log.title "Starting #{@configuration.service_name}"
self.loop do |event| self.loop do |event|
begin begin
case event case event
when IPC::Event::Timer when IPC::Event::Timer
Baguette::Log.debug "Timer" if Context.print_timer Baguette::Log.debug "Timer" if @configuration.print_ipc_timer
when IPC::Event::Connection when IPC::Event::Connection
Baguette::Log.debug "connection from #{event.fd}" Baguette::Log.debug "connection from #{event.fd}"
@ -133,7 +136,6 @@ class DNSManager::Service < IPC::Server
Baguette::Log.debug "disconnection from #{event.fd}" Baguette::Log.debug "disconnection from #{event.fd}"
fd = event.fd fd = event.fd
# @logged_connections.delete fd
@logged_users.delete fd @logged_users.delete fd
when IPC::Event::MessageSent when IPC::Event::MessageSent
@ -153,24 +155,79 @@ class DNSManager::Service < IPC::Server
end end
end end
def dnsmanager_webserver_init
server = HTTP::Server.new do |context| def main
context.response.content_type = "text/plain"
pp! context.request # First option parsing, same with all Baguette (service) applications.
context.response.print "Hello. New version of dnsmanager, soon." simulation, no_configuration, configuration_file = Baguette::Configuration.option_parser
# Authd configuration.
authd_configuration = if no_configuration
Baguette::Log.info "do not load a configuration file."
Baguette::Configuration::Auth.new
else
# Configuration file is for dnsmanagerd.
Baguette::Configuration::Auth.get || Baguette::Configuration::Auth.new
end
if key_file = authd_configuration.shared_key_file
authd_configuration.shared_key = File.read(key_file).chomp
end end
address = server.bind_tcp Context.webserver_domain, Context.webserver_port # DNSManagerd configuration.
puts "Listening on http://#{address}" configuration = if no_configuration
Baguette::Log.info "do not load a configuration file."
Baguette::Configuration::DNSManager.new
else
# In case there is a configuration file helping with the parameters.
Baguette::Configuration::DNSManager.get(configuration_file) ||
Baguette::Configuration::DNSManager.new
end
server
OptionParser.parse do |parser|
parser.on "-v verbosity-level", "--verbosity level", "Verbosity." do |opt|
Baguette::Log.info "Verbosity level: #{opt}"
configuration.verbosity = opt.to_i
end
parser.on "-k key-file", "--key-file file", "Key file." do |opt|
authd_configuration.shared_key = File.read(opt).chomp
Baguette::Log.debug "Authd key: #{authd_configuration.shared_key.not_nil!}"
end
# IPC Service options
parser.on "-s service_name", "--service_name service_name", "Service name (IPC)." do |service_name|
Baguette::Log.info "Service name: #{service_name}"
configuration.service_name = service_name
end
parser.on "-r storage_directory", "--root storage_directory", "Storage directory." do |storage_directory|
Baguette::Log.info "Storage directory: #{storage_directory}"
configuration.storage_directory = storage_directory
end
parser.on "-h", "--help", "Show this help" do
puts parser
exit 0
end
end
if authd_configuration.shared_key.nil?
Baguette::Log.error "No authd key file: cannot continue"
exit 1
end
if simulation
pp! authd_configuration, configuration
exit 0
end
authd = AuthD::Client.new
authd.key = authd_configuration.shared_key.not_nil!
service = DNSManager::Service.new configuration, authd
service.run
end end
authd = AuthD::Client.new main
authd.key = Context.authd_key.not_nil!
server = dnsmanager_webserver_init
spawn server.listen
service = DNSManager::Service.new Context.service_name, Context.storage_directory, authd
service.run

35
src/network.cr Normal file
View File

@ -0,0 +1,35 @@
require "ipc"
require "json"
class IPC::JSON
def handle(service : IPC::Server, event : IPC::Event::Events)
raise "unimplemented"
end
end
module DNSManager
class_getter requests = [] of IPC::JSON.class
class_getter responses = [] of IPC::JSON.class
end
class DNSManager::Response
IPC::JSON.message Error, 0 do
property reason : String | Array(String)
def initialize(@reason)
end
end
IPC::JSON.message Success, 1 do
def initialize
end
end
end
class DNSManager::Request
IPC::JSON.message Login, 0 do
end
IPC::JSON.message Logout, 1 do
end
DNSManager.requests << Logout
end
# require "./requests/*"

12
src/storage.cr Normal file
View File

@ -0,0 +1,12 @@
require "json"
require "uuid"
require "uuid/json"
require "dodb"
# require "./storage/*"
class DNSManager::Storage
def initialize(@root : String)
end
end