construct: Split homeserver into unit; move smoketest handler; fix -nomatrix.
This commit is contained in:
parent
c799f378d1
commit
4b156cae2f
|
@ -64,6 +64,7 @@ construct_LDADD = \
|
||||||
|
|
||||||
construct_SOURCES = \
|
construct_SOURCES = \
|
||||||
construct.cc \
|
construct.cc \
|
||||||
|
homeserver.cc \
|
||||||
signals.cc \
|
signals.cc \
|
||||||
console.cc \
|
console.cc \
|
||||||
lgetopt.cc \
|
lgetopt.cc \
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <ircd/asio.h>
|
#include <ircd/asio.h>
|
||||||
#include "lgetopt.h"
|
#include "lgetopt.h"
|
||||||
#include "construct.h"
|
#include "construct.h"
|
||||||
|
#include "homeserver.h"
|
||||||
#include "signals.h"
|
#include "signals.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
|
||||||
|
@ -36,6 +37,7 @@ bool noiou;
|
||||||
bool no6;
|
bool no6;
|
||||||
bool yes6;
|
bool yes6;
|
||||||
bool norun;
|
bool norun;
|
||||||
|
bool nomain;
|
||||||
bool read_only;
|
bool read_only;
|
||||||
bool write_avoid;
|
bool write_avoid;
|
||||||
bool slave;
|
bool slave;
|
||||||
|
@ -70,7 +72,8 @@ lgetopt opts[]
|
||||||
{ "noiou", &noiou, lgetopt::BOOL, "Disable the io_uring interface and fallback to AIO or system calls. " },
|
{ "noiou", &noiou, lgetopt::BOOL, "Disable the io_uring interface and fallback to AIO or system calls. " },
|
||||||
{ "no6", &no6, lgetopt::BOOL, "Disable IPv6 operations (default)" },
|
{ "no6", &no6, lgetopt::BOOL, "Disable IPv6 operations (default)" },
|
||||||
{ "6", &yes6, lgetopt::BOOL, "Enable IPv6 operations" },
|
{ "6", &yes6, lgetopt::BOOL, "Enable IPv6 operations" },
|
||||||
{ "norun", &norun, lgetopt::BOOL, "[debug & testing only] Initialize but never run the event loop" },
|
{ "norun", &norun, lgetopt::BOOL, "[debug] Initialize but never run the event loop" },
|
||||||
|
{ "nomain", &nomain, lgetopt::BOOL, "[debug] Initialize and run without entering ircd::main()" },
|
||||||
{ "ro", &read_only, lgetopt::BOOL, "Read-only mode. No writes to database allowed" },
|
{ "ro", &read_only, lgetopt::BOOL, "Read-only mode. No writes to database allowed" },
|
||||||
{ "wa", &write_avoid, lgetopt::BOOL, "Like read-only mode, but writes permitted if triggered" },
|
{ "wa", &write_avoid, lgetopt::BOOL, "Like read-only mode, but writes permitted if triggered" },
|
||||||
{ "slave", &slave, lgetopt::BOOL, "Like read-only mode; allows multiple instances of server" },
|
{ "slave", &slave, lgetopt::BOOL, "Like read-only mode; allows multiple instances of server" },
|
||||||
|
@ -109,6 +112,7 @@ const char *const usererrstr
|
||||||
)"};
|
)"};
|
||||||
|
|
||||||
[[noreturn]] static void do_restart(char *const *const &argv, char *const *const &envp);
|
[[noreturn]] static void do_restart(char *const *const &argv, char *const *const &envp);
|
||||||
|
static void smoketest_handler(const enum ircd::run::level &);
|
||||||
static bool startup_checks();
|
static bool startup_checks();
|
||||||
static void applyargs();
|
static void applyargs();
|
||||||
static void enable_coredumps();
|
static void enable_coredumps();
|
||||||
|
@ -177,83 +181,46 @@ noexcept try
|
||||||
"usage :%s <origin> [servername]", progname
|
"usage :%s <origin> [servername]", progname
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Setup the matrix homeserver application. This will be executed on an
|
||||||
|
// ircd::context (dedicated stack). We construct several objects on the
|
||||||
|
// stack which are the basis for our matrix homeserver. When the stack
|
||||||
|
// unwinds, the homeserver will go out of service.
|
||||||
|
struct ircd::m::homeserver::opts opts;
|
||||||
|
opts.origin = origin;
|
||||||
|
opts.server_name = server_name;
|
||||||
|
opts.bootstrap_vector_path = bootstrap;
|
||||||
|
opts.backfill = !nobackfill;
|
||||||
|
opts.autoapps = !noautoapps;
|
||||||
|
const std::function<void (ircd::main_continuation)> homeserver
|
||||||
|
{
|
||||||
|
[&opts](const ircd::main_continuation &main)
|
||||||
|
{
|
||||||
|
// Load the matrix module
|
||||||
|
ircd::matrix matrix;
|
||||||
|
|
||||||
|
// Construct the homeserver.
|
||||||
|
construct::homeserver homeserver
|
||||||
|
{
|
||||||
|
matrix, opts
|
||||||
|
};
|
||||||
|
|
||||||
|
// Bail for debug/testing purposes.
|
||||||
|
if(nomain)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Call main()'s continuation.
|
||||||
|
main();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// The smoketest uses this ircd::run::level callback to set a flag when
|
// The smoketest uses this ircd::run::level callback to set a flag when
|
||||||
// each ircd::run::level is reached. All flags must be set to pass. The
|
// each ircd::run::level is reached. All flags must be set to pass. The
|
||||||
// smoketest is inert unless the -smoketest program option is used.
|
// smoketest is inert unless the -smoketest program option is used.
|
||||||
const ircd::run::changed smoketester
|
const ircd::run::changed smoketester
|
||||||
{
|
{
|
||||||
[](const auto &level)
|
smoketest_handler
|
||||||
{
|
|
||||||
smoketest.at(size_t(level) + 1) = true;
|
|
||||||
if(!smoketest[0])
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(level != ircd::run::level::RUN)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(construct::console::active())
|
|
||||||
{
|
|
||||||
construct::console::quit_when_done = true;
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
static ircd::ios::descriptor descriptor
|
|
||||||
{
|
|
||||||
"construct.smoketest"
|
|
||||||
};
|
|
||||||
|
|
||||||
ircd::dispatch
|
|
||||||
{
|
|
||||||
descriptor, ircd::ios::defer, ircd::quit
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Setup the matrix homeserver application. This will be executed on an
|
|
||||||
// ircd::context (dedicated stack). We construct several objects on the
|
|
||||||
// stack which are the basis for our matrix homeserver. When the stack
|
|
||||||
// unwinds, the homeserver will go out of service.
|
|
||||||
const auto homeserver{[&origin, &server_name]
|
|
||||||
(const ircd::main_continuation &run)
|
|
||||||
{
|
|
||||||
assert(ircd::run::level == ircd::run::level::START);
|
|
||||||
|
|
||||||
// Load the matrix library dynamic shared object
|
|
||||||
ircd::matrix matrix; try
|
|
||||||
{
|
|
||||||
// Setup a primary homeserver based on the program options given.
|
|
||||||
struct ircd::m::homeserver::opts opts;
|
|
||||||
opts.origin = origin;
|
|
||||||
opts.server_name = server_name;
|
|
||||||
opts.bootstrap_vector_path = bootstrap;
|
|
||||||
opts.backfill = !nobackfill;
|
|
||||||
opts.autoapps = !noautoapps;
|
|
||||||
const ircd::custom_ptr<ircd::m::homeserver> homeserver
|
|
||||||
{
|
|
||||||
matrix.init(&opts), [&matrix]
|
|
||||||
(ircd::m::homeserver *const homeserver)
|
|
||||||
{
|
|
||||||
matrix.fini(homeserver);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Run the homeserver (call main()'s continuation). This function
|
|
||||||
// returns (or potentially throws) to unload/quit.
|
|
||||||
run();
|
|
||||||
}
|
|
||||||
catch(const std::exception &e)
|
|
||||||
{
|
|
||||||
// Rethrow as ircd::error because we're about to unload the module
|
|
||||||
// and all m:: type exceptions won't exist anymore...
|
|
||||||
throw ircd::error
|
|
||||||
{
|
|
||||||
"%s", e.what()
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(ircd::run::level == ircd::run::level::QUIT);
|
|
||||||
}};
|
|
||||||
|
|
||||||
// This is the sole io_context for Construct, and the ios.run() below is the
|
// This is the sole io_context for Construct, and the ios.run() below is the
|
||||||
// the only place where the program actually blocks.
|
// the only place where the program actually blocks.
|
||||||
boost::asio::io_context ios;
|
boost::asio::io_context ios;
|
||||||
|
@ -269,7 +236,7 @@ noexcept try
|
||||||
|
|
||||||
// Associates libircd with our io_context and posts the initial routines
|
// Associates libircd with our io_context and posts the initial routines
|
||||||
// to that io_context. Execution of IRCd will then occur during ios::run()
|
// to that io_context. Execution of IRCd will then occur during ios::run()
|
||||||
ircd::init(ios.get_executor(), homeserver);
|
ircd::init(ios.get_executor(), matrix? homeserver: nullptr);
|
||||||
|
|
||||||
// If the user wants to immediately drop to an interactive command line
|
// If the user wants to immediately drop to an interactive command line
|
||||||
// without having to send a ctrl-c for it, that is provided here. This does
|
// without having to send a ctrl-c for it, that is provided here. This does
|
||||||
|
@ -465,6 +432,33 @@ do_restart(char *const *const &_argv,
|
||||||
__builtin_unreachable();
|
__builtin_unreachable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
smoketest_handler(const enum ircd::run::level &level)
|
||||||
|
{
|
||||||
|
smoketest.at(size_t(level) + 1) = true;
|
||||||
|
if(!smoketest[0])
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(level != ircd::run::level::RUN)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(construct::console::active())
|
||||||
|
{
|
||||||
|
construct::console::quit_when_done = true;
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
static ircd::ios::descriptor descriptor
|
||||||
|
{
|
||||||
|
"construct.smoketest"
|
||||||
|
};
|
||||||
|
|
||||||
|
ircd::dispatch
|
||||||
|
{
|
||||||
|
descriptor, ircd::ios::defer, ircd::quit
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/// These operations are safe to call before ircd::init() and anytime after
|
/// These operations are safe to call before ircd::init() and anytime after
|
||||||
/// static initialization.
|
/// static initialization.
|
||||||
void
|
void
|
||||||
|
|
|
@ -12,6 +12,7 @@ namespace construct
|
||||||
{
|
{
|
||||||
struct signals;
|
struct signals;
|
||||||
struct console;
|
struct console;
|
||||||
|
struct homeserver;
|
||||||
|
|
||||||
extern struct console *console;
|
extern struct console *console;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
// The Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) The Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2021 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
#include <ircd/matrix.h>
|
||||||
|
#include "construct.h"
|
||||||
|
#include "homeserver.h"
|
||||||
|
|
||||||
|
construct::homeserver::homeserver(ircd::matrix &matrix,
|
||||||
|
struct ircd::m::homeserver::opts opts)
|
||||||
|
try
|
||||||
|
:matrix
|
||||||
|
{
|
||||||
|
matrix
|
||||||
|
}
|
||||||
|
,opts
|
||||||
|
{
|
||||||
|
std::move(opts)
|
||||||
|
}
|
||||||
|
,hs
|
||||||
|
{
|
||||||
|
matrix.init(&this->opts),
|
||||||
|
[&matrix](ircd::m::homeserver *const hs)
|
||||||
|
{
|
||||||
|
matrix.fini(hs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
}
|
||||||
|
catch(const std::exception &e)
|
||||||
|
{
|
||||||
|
// Rethrow as ircd::error because we're about to unload the module
|
||||||
|
// and all m:: type exceptions won't exist anymore...
|
||||||
|
throw ircd::error
|
||||||
|
{
|
||||||
|
"%s", e.what()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
construct::homeserver::~homeserver()
|
||||||
|
noexcept
|
||||||
|
{
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
// The Construct
|
||||||
|
//
|
||||||
|
// Copyright (C) The Construct Developers, Authors & Contributors
|
||||||
|
// Copyright (C) 2016-2021 Jason Volk <jason@zemos.net>
|
||||||
|
//
|
||||||
|
// Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
// purpose with or without fee is hereby granted, provided that the above
|
||||||
|
// copyright notice and this permission notice is present in all copies. The
|
||||||
|
// full license for this software is available in the LICENSE file.
|
||||||
|
|
||||||
|
struct construct::homeserver
|
||||||
|
{
|
||||||
|
ircd::matrix &matrix;
|
||||||
|
struct ircd::m::homeserver::opts opts;
|
||||||
|
ircd::custom_ptr<ircd::m::homeserver> hs;
|
||||||
|
|
||||||
|
public:
|
||||||
|
homeserver(ircd::matrix &, struct ircd::m::homeserver::opts);
|
||||||
|
~homeserver() noexcept;
|
||||||
|
};
|
Loading…
Reference in New Issue