WIP
parent
2b9360acb4
commit
7e211cead1
119
src/main.cr
119
src/main.cr
|
@ -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
|
|
||||||
|
|
|
@ -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/*"
|
|
@ -0,0 +1,12 @@
|
||||||
|
require "json"
|
||||||
|
require "uuid"
|
||||||
|
require "uuid/json"
|
||||||
|
|
||||||
|
require "dodb"
|
||||||
|
|
||||||
|
# require "./storage/*"
|
||||||
|
|
||||||
|
class DNSManager::Storage
|
||||||
|
def initialize(@root : String)
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue