Remove chroot option; log into the data directory automatically.
This commit is contained in:
parent
5d9b0df0bf
commit
1353fa6429
6 changed files with 79 additions and 48 deletions
1
TODO.txt
1
TODO.txt
|
@ -56,6 +56,7 @@ Phase 2: Building a foundation
|
|||
[ ] Remove "chroot" option, just chroot into the data dir, and make the log
|
||||
file live there as well.
|
||||
[ ] Allow logging to the syslog
|
||||
[ ] Fix bug where the socket stays open after quit.
|
||||
|
||||
Phase 3: Welcome to Matrix
|
||||
|
||||
|
|
|
@ -23,9 +23,8 @@ data-dir "/var/telodendria";
|
|||
federation "true";
|
||||
registration "false";
|
||||
log "file" {
|
||||
level "message";
|
||||
level "warning";
|
||||
timestampFormat "default";
|
||||
color "true";
|
||||
};
|
||||
threads "4";
|
||||
max-connections "32";
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.Dd $Mdocdate: September 30 2022 $
|
||||
.Dd $Mdocdate: October 11 2022 $
|
||||
.Dt TELODENDRIA.CONF 5
|
||||
.Os Telodendria Project
|
||||
.Sh NAME
|
||||
|
@ -78,18 +78,6 @@ follows the same rules as
|
|||
.Pp
|
||||
This directive is optional. If it is not specified, it is automatically
|
||||
set to be the same as the base URL.
|
||||
.It Ic chroot Ar directory
|
||||
Change the root directory to the specified directory as soon as possible.
|
||||
Note that all other paths and files specified in
|
||||
.Nm
|
||||
must be accessible relative from this directory. This directive only
|
||||
takes effect if Telodendria is running as root. If it isn't, then a
|
||||
warning is printed to the log, and no
|
||||
.Xr chroot 2
|
||||
call is made. In that case, Telodendria will still change into the
|
||||
specified directory, so that the other paths referenced can be made
|
||||
relative to this one. This directive is required. It is expected that
|
||||
the homeserver data and logs will be stored in a subdirectory of this one.
|
||||
.It Ic id Ar uid Ar gid
|
||||
The effective UNIX user and group to drop to after binding to the socket
|
||||
and changing the filesystem root. This only works if Telodendria is
|
||||
|
@ -104,13 +92,15 @@ The data directory into which Telodendria will write all user and event
|
|||
information. Telodendria doesn't use a database like other Matrix homeserver
|
||||
implementations; it uses a flat-file directory structure, similar to how an
|
||||
SMTP server uses Maildirs to deliver email. This directive is required.
|
||||
.Pp
|
||||
Telodendria will
|
||||
.Xr chroot 2
|
||||
into this directory as soon as possible for security reasons. If the
|
||||
.Ic log
|
||||
directive is configured to write to a file, the log file will be written
|
||||
in the data directory.
|
||||
.Ar directory
|
||||
should be a path relative to the
|
||||
.Ic chroot
|
||||
directory. Don't depend on the
|
||||
.Ic chroot
|
||||
option working, because there may be legitimate cases when Telodendria will
|
||||
not be started as root, thus causing the chroot to fail.
|
||||
should be an absolute path, under which all Telodendria data will live.
|
||||
.It Ic federation Ar true|false
|
||||
Whether to enable federation with other Matrix homeservers or not. Matrix is
|
||||
by its very nature a federated protocol, but if you just want to run your
|
||||
|
@ -133,10 +123,10 @@ to run their own homeserver, you can aset this to
|
|||
which will allow anyone to create an account. Telodendria should be capable of handling
|
||||
a large amount of users without difficulty or security issues. This directive is
|
||||
required.
|
||||
.It Ic log Ar file|stdout
|
||||
The log configuration. Telodendria uses its own logging facility, which can output to
|
||||
either standard output or a file. A number of child directives can be added to this
|
||||
directive to customize the log output:
|
||||
.It Ic log Ar stdout|file
|
||||
The log configuration. Telodendria uses its own logging facility, which can output
|
||||
logs to standard output or a file. A number of child directives can
|
||||
be added to this directive to customize the log output:
|
||||
.Bl -tag -width Ds
|
||||
.It Ic level Ar error|warning|task|message|debug
|
||||
The level of messages to log at. Each level shows all the levels above it. For
|
||||
|
@ -156,11 +146,19 @@ altogether, you can do so via this option. Acceptable values are
|
|||
.Ar default ,
|
||||
or a formatter string as described by your system's
|
||||
.Xr strftime 3 .
|
||||
In the future, logging to the syslog may also be an option. In that case, this
|
||||
option only applies if
|
||||
.Ic log
|
||||
is "stdout" or "file".
|
||||
.It Ic color Ar true|false
|
||||
Whether or not to enable colored output on TTYs. Note that ANSI color sequences
|
||||
will not be written to a log file, only a real terminal, so this option only
|
||||
applies if the log is being written to a standard output which is connected to
|
||||
a terminal.
|
||||
.Pp
|
||||
This option only applies if
|
||||
.Ic log
|
||||
is "stdout".
|
||||
.El
|
||||
.It Ic threads Ar count
|
||||
How many worker threads to spin up to handle requests. This should generally be
|
||||
|
@ -176,7 +174,7 @@ The default
|
|||
.Xr telodendria 8
|
||||
configuration file.
|
||||
.It Pa /var/telodendria
|
||||
The recommended chroot directory.
|
||||
The recommended data directory.
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
Please consult the default
|
||||
|
|
|
@ -223,28 +223,60 @@ main(int argc, char **argv)
|
|||
|
||||
LogConfigTimeStampFormatSet(lc, tConfig->logTimestamp);
|
||||
|
||||
/* Color is enabled by default in the logger. */
|
||||
if (!(tConfig->flags & TELODENDRIA_LOG_COLOR))
|
||||
if (tConfig->flags & TELODENDRIA_LOG_COLOR)
|
||||
{
|
||||
LogConfigFlagSet(lc, LOG_FLAG_COLOR);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogConfigFlagClear(lc, LOG_FLAG_COLOR);
|
||||
}
|
||||
|
||||
LogConfigLevelSet(lc, flags & ARG_VERBOSE ? LOG_DEBUG : tConfig->logLevel);
|
||||
|
||||
if (tConfig->logOut)
|
||||
if (chdir(tConfig->dataDir) != 0)
|
||||
{
|
||||
FILE *logFile = fopen(tConfig->logOut, "w");
|
||||
Log(lc, LOG_ERROR, "Unable to change into data directory: %s.", strerror(errno));
|
||||
exit = EXIT_FAILURE;
|
||||
goto finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(lc, LOG_DEBUG, "Changed working directory to: %s", tConfig->dataDir);
|
||||
}
|
||||
|
||||
|
||||
if (tConfig->flags & TELODENDRIA_LOG_FILE)
|
||||
{
|
||||
FILE *logFile = fopen("telodendria.log", "a");
|
||||
|
||||
if (!logFile)
|
||||
{
|
||||
Log(lc, LOG_ERROR, "Unable to open log file '%s' for writing.", tConfig->logOut);
|
||||
Log(lc, LOG_ERROR, "Unable to open log file for appending.");
|
||||
exit = EXIT_FAILURE;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
Log(lc, LOG_MESSAGE, "Logging to '%s'. Check there for all future messages.", tConfig->logOut);
|
||||
Log(lc, LOG_MESSAGE, "Logging to the log file. Check there for all future messages.");
|
||||
LogConfigOutputSet(lc, logFile);
|
||||
}
|
||||
else if (tConfig->flags & TELODENDRIA_LOG_STDOUT)
|
||||
{
|
||||
Log(lc, LOG_DEBUG, "Already logging to standard output.");
|
||||
}
|
||||
else if (tConfig->flags & TELODENDRIA_LOG_SYSLOG)
|
||||
{
|
||||
Log(lc, LOG_ERROR, "Logging to the syslog is not yet supported.");
|
||||
exit = EXIT_FAILURE;
|
||||
goto finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(lc, LOG_ERROR, "Unknown logging method in flags: '%d'", tConfig->flags);
|
||||
Log(lc, LOG_ERROR, "This is a programmer error; please report it.");
|
||||
exit = EXIT_FAILURE;
|
||||
goto finish;
|
||||
}
|
||||
|
||||
Log(lc, LOG_DEBUG, "Configuration:");
|
||||
LogConfigIndent(lc);
|
||||
|
@ -258,17 +290,6 @@ main(int argc, char **argv)
|
|||
Log(lc, LOG_DEBUG, "Flags: %x", tConfig->flags);
|
||||
LogConfigUnindent(lc);
|
||||
|
||||
if (chdir(tConfig->dataDir) != 0)
|
||||
{
|
||||
Log(lc, LOG_ERROR, "Unable to change into data directory: %s.", strerror(errno));
|
||||
exit = EXIT_FAILURE;
|
||||
goto finish;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(lc, LOG_DEBUG, "Changed working directory to: %s", tConfig->dataDir);
|
||||
}
|
||||
|
||||
Log(lc, LOG_DEBUG, "Running as uid:gid: %d:%d.", getuid(), getgid());
|
||||
|
||||
userInfo = getpwnam(tConfig->uid);
|
||||
|
|
|
@ -354,13 +354,23 @@ TelodendriaConfigParse(HashMap * config, LogConfig * lc)
|
|||
}
|
||||
|
||||
/* Set the actual log output file last */
|
||||
if (strcmp(ArrayGet(value, 0), "stdout") != 0)
|
||||
if (strcmp(ArrayGet(value, 0), "stdout") == 0)
|
||||
{
|
||||
tConfig->logOut = UtilStringDuplicate(ArrayGet(value, 0));
|
||||
tConfig->flags |= TELODENDRIA_LOG_STDOUT;
|
||||
}
|
||||
else if (strcmp(ArrayGet(value, 0), "file") == 0)
|
||||
{
|
||||
tConfig->flags |= TELODENDRIA_LOG_FILE;
|
||||
}
|
||||
else if (strcmp(ArrayGet(value, 0), "syslog") == 0)
|
||||
{
|
||||
tConfig->flags |= TELODENDRIA_LOG_SYSLOG;
|
||||
}
|
||||
else
|
||||
{
|
||||
tConfig->logOut = NULL;
|
||||
Log(lc, LOG_ERROR, "Unknown log value '%s', expected 'stdout', 'file', or 'syslog'.",
|
||||
ArrayGet(value, 0));
|
||||
goto error;
|
||||
}
|
||||
|
||||
return tConfig;
|
||||
|
|
|
@ -38,7 +38,10 @@ typedef enum TelodendriaConfigFlag
|
|||
{
|
||||
TELODENDRIA_FEDERATION = (1 << 0),
|
||||
TELODENDRIA_REGISTRATION = (1 << 1),
|
||||
TELODENDRIA_LOG_COLOR = (1 << 2)
|
||||
TELODENDRIA_LOG_COLOR = (1 << 2),
|
||||
TELODENDRIA_LOG_FILE = (1 << 3),
|
||||
TELODENDRIA_LOG_STDOUT = (1 << 4),
|
||||
TELODENDRIA_LOG_SYSLOG = (1 << 5)
|
||||
} TelodendriaConfigFlag;
|
||||
|
||||
/*
|
||||
|
@ -65,7 +68,6 @@ typedef struct TelodendriaConfig
|
|||
unsigned int threads;
|
||||
unsigned int maxConnections;
|
||||
|
||||
char *logOut;
|
||||
char *logTimestamp;
|
||||
LogLevel logLevel;
|
||||
} TelodendriaConfig;
|
||||
|
|
Loading…
Reference in a new issue