diff --git a/TODO.txt b/TODO.txt index 04bc7c4..f3c1232 100644 --- a/TODO.txt +++ b/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 diff --git a/contrib/production.conf b/contrib/production.conf index bf07f88..0589d52 100644 --- a/contrib/production.conf +++ b/contrib/production.conf @@ -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"; diff --git a/man/man5/telodendria.conf.5 b/man/man5/telodendria.conf.5 index 23722a3..f9a19c9 100644 --- a/man/man5/telodendria.conf.5 +++ b/man/man5/telodendria.conf.5 @@ -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 diff --git a/src/Telodendria.c b/src/Telodendria.c index d667481..3259728 100644 --- a/src/Telodendria.c +++ b/src/Telodendria.c @@ -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); diff --git a/src/TelodendriaConfig.c b/src/TelodendriaConfig.c index a53dc93..79e0d0c 100644 --- a/src/TelodendriaConfig.c +++ b/src/TelodendriaConfig.c @@ -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; diff --git a/src/include/TelodendriaConfig.h b/src/include/TelodendriaConfig.h index b03798e..5d2a0c1 100644 --- a/src/include/TelodendriaConfig.h +++ b/src/include/TelodendriaConfig.h @@ -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;