From f8eac009eed839d2d71f991f9c0df2e28da95a3d Mon Sep 17 00:00:00 2001 From: Morgan Jones Date: Mon, 21 Oct 2024 23:05:06 -0700 Subject: [PATCH] nixos/mattermost: modernize, support MySQL and mmctl Based on #198040. Prioritizes backwards compatibility, including database and plugin compatibility, while adding more sensible defaults like database peer authentication. Expand the scope of tests to include plugins (including building from source) and testing that a piece of media uploads and downloads to make sure the storage directory doesn't vanish. --- .../modules/services/web-apps/mattermost.nix | 863 ++++++++++++++---- nixos/tests/all-tests.nix | 2 +- nixos/tests/mattermost.nix | 169 ---- nixos/tests/mattermost/default.nix | 537 +++++++++++ nixos/tests/mattermost/test.jpg | Bin 0 -> 121879 bytes 5 files changed, 1248 insertions(+), 323 deletions(-) delete mode 100644 nixos/tests/mattermost.nix create mode 100644 nixos/tests/mattermost/default.nix create mode 100644 nixos/tests/mattermost/test.jpg diff --git a/nixos/modules/services/web-apps/mattermost.nix b/nixos/modules/services/web-apps/mattermost.nix index 4f12774327f2..9b420f8a51fc 100644 --- a/nixos/modules/services/web-apps/mattermost.nix +++ b/nixos/modules/services/web-apps/mattermost.nix @@ -5,35 +5,147 @@ ... }: -with lib; - let + inherit (lib.strings) + hasInfix + hasSuffix + escapeURL + concatStringsSep + escapeShellArg + escapeShellArgs + versionAtLeast + optionalString + ; + + inherit (lib.meta) getExe; + + inherit (lib.lists) singleton; + + inherit (lib.attrsets) mapAttrsToList recursiveUpdate optionalAttrs; + + inherit (lib.options) mkOption mkPackageOption mkEnableOption; + + inherit (lib.modules) + mkRenamedOptionModule + mkMerge + mkIf + mkDefault + ; + + inherit (lib.trivial) warnIf throwIf; + + inherit (lib) types; cfg = config.services.mattermost; - database = "postgres://${cfg.localDatabaseUser}:${cfg.localDatabasePassword}@localhost:5432/${cfg.localDatabaseName}?sslmode=disable&connect_timeout=10"; + # The directory to store mutable data within dataDir. + mutableDataDir = "${cfg.dataDir}/data"; - postgresPackage = config.services.postgresql.package; + # The plugin directory. Note that this is the *post-unpack* plugin directory, + # since Mattermost unpacks plugins to put them there. (Hence, mutable data.) + pluginDir = "${mutableDataDir}/plugins"; - createDb = + # Mattermost uses this as a staging directory to unpack plugins, among possibly other things. + # Ensure that it's inside mutableDataDir since it can get rather large. + tempDir = "${mutableDataDir}/tmp"; + + # Creates a database URI. + mkDatabaseUri = { - statePath ? cfg.statePath, - localDatabaseUser ? cfg.localDatabaseUser, - localDatabasePassword ? cfg.localDatabasePassword, - localDatabaseName ? cfg.localDatabaseName, - useSudo ? true, + scheme, + user ? null, + password ? null, + escapeUserAndPassword ? true, + host ? null, + escapeHost ? true, + port ? null, + path ? null, + query ? { }, }: - '' - if ! test -e ${escapeShellArg "${statePath}/.db-created"}; then - ${lib.optionalString useSudo "${pkgs.sudo}/bin/sudo -u ${escapeShellArg config.services.postgresql.superUser} \\"} - ${postgresPackage}/bin/psql postgres -c \ - "CREATE ROLE ${localDatabaseUser} WITH LOGIN NOCREATEDB NOCREATEROLE ENCRYPTED PASSWORD '${localDatabasePassword}'" - ${lib.optionalString useSudo "${pkgs.sudo}/bin/sudo -u ${escapeShellArg config.services.postgresql.superUser} \\"} - ${postgresPackage}/bin/createdb \ - --owner ${escapeShellArg localDatabaseUser} ${escapeShellArg localDatabaseName} - touch ${escapeShellArg "${statePath}/.db-created"} - fi - ''; + let + nullToEmpty = val: if val == null then "" else toString val; + + # Converts a list of URI attrs to a query string. + toQuery = mapAttrsToList ( + name: value: if value == null then null else (escapeURL name) + "=" + (escapeURL (toString value)) + ); + + schemePart = if scheme == null then "" else "${escapeURL scheme}://"; + userPart = + let + realUser = if escapeUserAndPassword then escapeURL user else user; + realPassword = if escapeUserAndPassword then escapeURL password else password; + in + if user == null && password == null then + "" + else if user != null && password != null then + "${realUser}:${realPassword}" + else if user != null then + realUser + else + throw "Either user or username and password must be provided"; + hostPart = + let + realHost = if escapeHost then escapeURL (nullToEmpty host) else nullToEmpty host; + in + if userPart == "" then realHost else "@" + realHost; + portPart = if port == null then "" else ":" + (toString port); + pathPart = if path == null then "" else "/" + path; + queryPart = if query == { } then "" else "?" + concatStringsSep "&" (toQuery query); + in + schemePart + userPart + hostPart + portPart + pathPart + queryPart; + + database = + let + hostIsPath = hasInfix "/" cfg.database.host; + in + if cfg.database.driver == "postgres" then + if cfg.database.peerAuth then + mkDatabaseUri { + scheme = cfg.database.driver; + inherit (cfg.database) user; + path = escapeURL cfg.database.name; + query = { + host = cfg.database.socketPath; + } // cfg.database.extraConnectionOptions; + } + else + mkDatabaseUri { + scheme = cfg.database.driver; + inherit (cfg.database) user password; + host = if hostIsPath then null else cfg.database.host; + port = if hostIsPath then null else cfg.database.port; + path = escapeURL cfg.database.name; + query = + optionalAttrs hostIsPath { host = cfg.database.host; } // cfg.database.extraConnectionOptions; + } + else if cfg.database.driver == "mysql" then + if cfg.database.peerAuth then + mkDatabaseUri { + scheme = null; + inherit (cfg.database) user; + escapeUserAndPassword = false; + host = "unix(${cfg.database.socketPath})"; + escapeHost = false; + path = escapeURL cfg.database.name; + query = cfg.database.extraConnectionOptions; + } + else + mkDatabaseUri { + scheme = null; + inherit (cfg.database) user password; + escapeUserAndPassword = false; + host = + if hostIsPath then + "unix(${cfg.database.host})" + else + "tcp(${cfg.database.host}:${toString cfg.database.port})"; + escapeHost = false; + path = escapeURL cfg.database.name; + query = cfg.database.extraConnectionOptions; + } + else + throw "Invalid database driver: ${cfg.database.driver}"; mattermostPluginDerivations = with pkgs; @@ -60,23 +172,19 @@ let else stdenv.mkDerivation { name = "${cfg.package.name}-plugins"; - nativeBuildInputs = [ - autoPatchelfHook - ] ++ mattermostPluginDerivations; - buildInputs = [ - cfg.package - ]; + nativeBuildInputs = [ autoPatchelfHook ] ++ mattermostPluginDerivations; + buildInputs = [ cfg.package ]; installPhase = '' - mkdir -p $out/data/plugins + mkdir -p $out plugins=(${ escapeShellArgs (map (plugin: "${plugin}/share/plugin.tar.gz") mattermostPluginDerivations) }) for plugin in "''${plugins[@]}"; do - hash="$(sha256sum "$plugin" | cut -d' ' -f1)" + hash="$(sha256sum "$plugin" | awk '{print $1}')" mkdir -p "$hash" tar -C "$hash" -xzf "$plugin" autoPatchelf "$hash" - GZIP_OPT=-9 tar -C "$hash" -cvzf "$out/data/plugins/$hash.tar.gz" . + GZIP_OPT=-9 tar -C "$hash" -cvzf "$out/$hash.tar.gz" . rm -rf "$hash" done ''; @@ -89,40 +197,157 @@ let }; mattermostConfWithoutPlugins = recursiveUpdate { - ServiceSettings.SiteURL = cfg.siteUrl; - ServiceSettings.ListenAddress = cfg.listenAddress; + ServiceSettings = { + SiteURL = cfg.siteUrl; + ListenAddress = "${cfg.host}:${toString cfg.port}"; + LocalModeSocketLocation = cfg.socket.path; + EnableLocalMode = cfg.socket.enable; + }; TeamSettings.SiteName = cfg.siteName; - SqlSettings.DriverName = "postgres"; - SqlSettings.DataSource = database; - PluginSettings.Directory = "${cfg.statePath}/plugins/server"; - PluginSettings.ClientDirectory = "${cfg.statePath}/plugins/client"; - } cfg.extraConfig; + SqlSettings.DriverName = cfg.database.driver; + SqlSettings.DataSource = + if cfg.database.fromEnvironment then + null + else + warnIf (!cfg.database.peerAuth && cfg.database.password != null) '' + Database password is set in Mattermost config! This password will end up in the Nix store. + + You may be able to simply set the following, if the database is on the same host + and peer authentication is enabled: + + services.mattermost.database.peerAuth = true; + + Note that this is the default if you set system.stateVersion to 25.05 or later + and the database host is localhost. + + Alternatively, you can write the following to ${ + if cfg.environmentFile == null then "your environment file" else cfg.environmentFile + }: + + MM_SQLSETTINGS_DATASOURCE=${database} + + Then set the following options: + services.mattermost.environmentFile = ""; + services.mattermost.database.fromEnvironment = true; + '' database; + FileSettings.Directory = cfg.dataDir; + PluginSettings.Directory = "${pluginDir}/server"; + PluginSettings.ClientDirectory = "${pluginDir}/client"; + LogSettings.FileLocation = cfg.logDir; + } cfg.settings; mattermostConf = recursiveUpdate mattermostConfWithoutPlugins ( - lib.optionalAttrs (mattermostPlugins != null) { - PluginSettings = { - Enable = true; - }; - } + if mattermostPlugins == null then + { } + else + { + PluginSettings = { + Enable = true; + }; + } ); mattermostConfJSON = pkgs.writeText "mattermost-config.json" (builtins.toJSON mattermostConf); in - { + imports = [ + (mkRenamedOptionModule + [ + "services" + "mattermost" + "listenAddress" + ] + [ + "services" + "mattermost" + "host" + ] + ) + (mkRenamedOptionModule + [ + "services" + "mattermost" + "localDatabaseCreate" + ] + [ + "services" + "mattermost" + "database" + "create" + ] + ) + (mkRenamedOptionModule + [ + "services" + "mattermost" + "localDatabasePassword" + ] + [ + "services" + "mattermost" + "database" + "password" + ] + ) + (mkRenamedOptionModule + [ + "services" + "mattermost" + "localDatabaseUser" + ] + [ + "services" + "mattermost" + "database" + "user" + ] + ) + (mkRenamedOptionModule + [ + "services" + "mattermost" + "localDatabaseName" + ] + [ + "services" + "mattermost" + "database" + "name" + ] + ) + (mkRenamedOptionModule + [ + "services" + "mattermost" + "extraConfig" + ] + [ + "services" + "mattermost" + "settings" + ] + ) + (mkRenamedOptionModule + [ + "services" + "mattermost" + "statePath" + ] + [ + "services" + "mattermost" + "dataDir" + ] + ) + ]; + options = { services.mattermost = { enable = mkEnableOption "Mattermost chat server"; package = mkPackageOption pkgs "mattermost" { }; - statePath = mkOption { - type = types.str; - default = "/var/lib/mattermost"; - description = "Mattermost working directory"; - }; - siteUrl = mkOption { type = types.str; example = "https://chat.example.com"; @@ -137,12 +362,77 @@ in description = "Name of this Mattermost site."; }; - listenAddress = mkOption { + host = mkOption { type = types.str; - default = ":8065"; - example = "[::1]:8065"; + default = "127.0.0.1"; + example = "0.0.0.0"; description = '' - Address and port this Mattermost instance listens to. + Host or address that this Mattermost instance listens on. + ''; + }; + + port = mkOption { + type = types.port; + default = 8065; + description = '' + Port for Mattermost server to listen on. + ''; + }; + + dataDir = mkOption { + type = types.path; + default = "/var/lib/mattermost"; + description = '' + Mattermost working directory. + ''; + }; + + socket = { + enable = mkEnableOption "Mattermost control socket"; + + path = mkOption { + type = types.path; + default = "${cfg.dataDir}/mattermost.sock"; + defaultText = ''''${config.mattermost.dataDir}/mattermost.sock''; + description = '' + Default location for the Mattermost control socket used by `mmctl`. + ''; + }; + + export = mkEnableOption "Export socket control to system environment variables"; + }; + + logDir = mkOption { + type = types.path; + default = + if versionAtLeast config.system.stateVersion "25.05" then + "/var/log/mattermost" + else + "${cfg.dataDir}/logs"; + defaultText = '' + if versionAtLeast config.system.stateVersion "25.05" then "/var/log/mattermost" + else "''${config.services.mattermost.dataDir}/logs"; + ''; + description = '' + Mattermost log directory. + ''; + }; + + configDir = mkOption { + type = types.path; + default = + if versionAtLeast config.system.stateVersion "25.05" then + "/etc/mattermost" + else + "${cfg.dataDir}/config"; + defaultText = '' + if versionAtLeast config.system.stateVersion "25.05" then + "/etc/mattermost" + else + "''${config.services.mattermost.dataDir}/config"; + ''; + description = '' + Mattermost config directory. ''; }; @@ -173,21 +463,8 @@ in ''; }; - extraConfig = mkOption { - type = types.attrs; - default = { }; - description = '' - Additional configuration options as Nix attribute set in config.json schema. - ''; - }; - plugins = mkOption { - type = types.listOf ( - types.oneOf [ - types.path - types.package - ] - ); + type = with types; listOf (either path package); default = [ ]; example = "[ ./com.github.moussetc.mattermost.plugin.giphy-2.0.0.tar.gz ]"; description = '' @@ -196,13 +473,25 @@ in .tar.gz files. ''; }; + + environment = mkOption { + type = with types; attrsOf (either int str); + default = { }; + description = '' + Extra environment variables to export to the Mattermost process, in the systemd unit. + ''; + example = { + MM_SERVICESETTINGS_SITEURL = "http://example.com"; + }; + }; + environmentFile = mkOption { - type = types.nullOr types.path; + type = with types; nullOr path; default = null; description = '' Environment file (see {manpage}`systemd.exec(5)` "EnvironmentFile=" section for the syntax) which sets config options - for mattermost (see [the mattermost documentation](https://docs.mattermost.com/configure/configuration-settings.html#environment-variables)). + for mattermost (see [the Mattermost documentation](https://docs.mattermost.com/configure/configuration-settings.html#environment-variables)). Settings defined in the environment file will overwrite settings set via nix or via the {option}`services.mattermost.extraConfig` @@ -213,36 +502,142 @@ in ''; }; - localDatabaseCreate = mkOption { - type = types.bool; - default = true; - description = '' - Create a local PostgreSQL database for Mattermost automatically. - ''; - }; + database = { + driver = mkOption { + type = types.enum [ + "postgres" + "mysql" + ]; + default = "postgres"; + description = '' + The database driver to use (Postgres or MySQL). + ''; + }; - localDatabaseName = mkOption { - type = types.str; - default = "mattermost"; - description = '' - Local Mattermost database name. - ''; - }; + create = mkOption { + type = types.bool; + default = true; + description = '' + Create a local PostgreSQL or MySQL database for Mattermost automatically. + ''; + }; - localDatabaseUser = mkOption { - type = types.str; - default = "mattermost"; - description = '' - Local Mattermost database username. - ''; - }; + peerAuth = mkOption { + type = types.bool; + default = versionAtLeast config.system.stateVersion "25.05" && cfg.database.host == "localhost"; + defaultText = '' + versionAtLeast config.system.stateVersion "25.05" && config.services.mattermost.database.host == "localhost" + ''; + description = '' + If set, will use peer auth instead of connecting to a Postgres server. + Use services.mattermost.database.socketPath to configure the socket path. + ''; + }; - localDatabasePassword = mkOption { - type = types.str; - default = "mmpgsecret"; - description = '' - Password for local Mattermost database user. - ''; + socketPath = mkOption { + type = types.path; + default = + if cfg.database.driver == "postgres" then "/run/postgresql" else "/run/mysqld/mysqld.sock"; + defaultText = '' + if config.services.mattermost.database.driver == "postgres" then "/run/postgresql" else "/run/mysqld/mysqld.sock"; + ''; + description = '' + The database (Postgres or MySQL) socket path. + ''; + }; + + fromEnvironment = mkOption { + type = types.bool; + default = false; + description = '' + Use services.mattermost.environmentFile to configure the database instead of writing the database URI + to the Nix store. Useful if you use password authentication with peerAuth set to false. + ''; + }; + + name = mkOption { + type = types.str; + default = "mattermost"; + description = '' + Local Mattermost database name. + ''; + }; + + host = mkOption { + type = types.str; + default = "localhost"; + example = "127.0.0.1"; + description = '' + Host to use for the database. Can also be set to a path if you'd like to connect + to a socket using a username and password. + ''; + }; + + port = mkOption { + type = types.port; + default = if cfg.database.driver == "postgres" then 5432 else 3306; + defaultText = '' + if config.services.mattermost.database.type == "postgres" then 5432 else 3306 + ''; + example = 3306; + description = '' + Port to use for the database. + ''; + }; + + user = mkOption { + type = types.str; + default = "mattermost"; + description = '' + Local Mattermost database username. + ''; + }; + + password = mkOption { + type = types.str; + default = "mmpgsecret"; + description = '' + Password for local Mattermost database user. If set and peerAuth is not true, + will cause a warning nagging you to use environmentFile instead since it will + end up in the Nix store. + ''; + }; + + extraConnectionOptions = mkOption { + type = with types; attrsOf (either int str); + default = + if cfg.database.driver == "postgres" then + { + sslmode = "disable"; + connect_timeout = 30; + } + else if cfg.database.driver == "mysql" then + { + charset = "utf8mb4,utf8"; + writeTimeout = "30s"; + readTimeout = "30s"; + } + else + throw "Invalid database driver ${cfg.database.driver}"; + defaultText = '' + if config.mattermost.database.driver == "postgres" then + { + sslmode = "disable"; + connect_timeout = 30; + } + else if config.mattermost.database.driver == "mysql" then + { + charset = "utf8mb4,utf8"; + writeTimeout = "30s"; + readTimeout = "30s"; + } + else + throw "Invalid database driver"; + ''; + description = '' + Extra options that are placed in the connection URI's query parameters. + ''; + }; }; user = mkOption { @@ -261,6 +656,14 @@ in ''; }; + settings = mkOption { + type = types.attrs; + default = { }; + description = '' + Additional configuration options as Nix attribute set in config.json schema. + ''; + }; + matterircd = { enable = mkEnableOption "Mattermost IRC bridge"; package = mkPackageOption pkgs "matterircd" { }; @@ -282,83 +685,235 @@ in config = mkMerge [ (mkIf cfg.enable { - users.users = optionalAttrs (cfg.user == "mattermost") { - mattermost = { + users.users = { + ${cfg.user} = { group = cfg.group; - uid = config.ids.uids.mattermost; - home = cfg.statePath; + uid = mkIf (cfg.user == "mattermost") config.ids.uids.mattermost; + home = cfg.dataDir; + isSystemUser = true; + packages = [ cfg.package ]; }; }; - users.groups = optionalAttrs (cfg.group == "mattermost") { - mattermost.gid = config.ids.gids.mattermost; + users.groups = { + ${cfg.group} = { + gid = mkIf (cfg.group == "mattermost") config.ids.gids.mattermost; + }; }; - services.postgresql.enable = cfg.localDatabaseCreate; + services.postgresql = mkIf (cfg.database.driver == "postgres" && cfg.database.create) { + enable = true; + ensureDatabases = singleton cfg.database.name; + ensureUsers = singleton { + name = + throwIf + (cfg.database.peerAuth && (cfg.database.user != cfg.user || cfg.database.name != cfg.database.user)) + '' + Mattermost database peer auth is enabled and the user, database user, or database name mismatch. + Peer authentication will not work. + '' + cfg.database.user; + ensureDBOwnership = true; + }; + }; - # The systemd service will fail to execute the preStart hook - # if the WorkingDirectory does not exist - systemd.tmpfiles.settings."10-mattermost".${cfg.statePath}.d = { }; + services.mysql = mkIf (cfg.database.driver == "mysql" && cfg.database.create) { + enable = true; + package = mkDefault pkgs.mariadb; + ensureDatabases = singleton cfg.database.name; + ensureUsers = singleton { + name = cfg.database.user; + ensurePermissions = { + "${cfg.database.name}.*" = "ALL PRIVILEGES"; + }; + }; + settings = rec { + mysqld = { + collation-server = mkDefault "utf8mb4_general_ci"; + init-connect = mkDefault "SET NAMES utf8mb4"; + character-set-server = mkDefault "utf8mb4"; + }; + mysqld_safe = mysqld; + }; + }; - systemd.services.mattermost = { + environment = { + variables = mkIf cfg.socket.export { + MMCTL_LOCAL = "true"; + MMCTL_LOCAL_SOCKET_PATH = cfg.socket.path; + }; + }; + + systemd.tmpfiles.rules = + [ + "d ${cfg.dataDir} 0750 ${cfg.user} ${cfg.group} - -" + "d ${cfg.logDir} 0750 ${cfg.user} ${cfg.group} - -" + "d ${cfg.configDir} 0750 ${cfg.user} ${cfg.group} - -" + "d ${mutableDataDir} 0750 ${cfg.user} ${cfg.group} - -" + + # Make sure tempDir exists and is not a symlink. + "R- ${tempDir} - - - - -" + "d= ${tempDir} 0750 ${cfg.user} ${cfg.group} - -" + + # Ensure that pluginDir is a directory, as it could be a symlink on prior versions. + "r- ${pluginDir} - - - - -" + "d= ${pluginDir} 0750 ${cfg.user} ${cfg.group} - -" + + # Ensure that the plugin directories exist. + "d= ${mattermostConf.PluginSettings.Directory} 0750 ${cfg.user} ${cfg.group} - -" + "d= ${mattermostConf.PluginSettings.ClientDirectory} 0750 ${cfg.user} ${cfg.group} - -" + + # Link in some of the immutable data directories. + "L+ ${cfg.dataDir}/bin - - - - ${cfg.package}/bin" + "L+ ${cfg.dataDir}/fonts - - - - ${cfg.package}/fonts" + "L+ ${cfg.dataDir}/i18n - - - - ${cfg.package}/i18n" + "L+ ${cfg.dataDir}/templates - - - - ${cfg.package}/templates" + "L+ ${cfg.dataDir}/client - - - - ${cfg.package}/client" + ] + ++ ( + if mattermostPlugins == null then + # Create the plugin tarball directory if it's a symlink. + [ + "r- ${cfg.dataDir}/plugins - - - - -" + "d= ${cfg.dataDir}/plugins 0750 ${cfg.user} ${cfg.group} - -" + ] + else + # Symlink the plugin tarball directory, removing anything existing. + [ "L+ ${cfg.dataDir}/plugins - - - - ${mattermostPlugins}" ] + ); + + systemd.services.mattermost = rec { description = "Mattermost chat service"; wantedBy = [ "multi-user.target" ]; - after = [ - "network.target" - "postgresql.service" + after = mkMerge [ + [ "network.target" ] + (mkIf (cfg.database.driver == "postgres" && cfg.database.create) [ "postgresql.service" ]) + (mkIf (cfg.database.driver == "mysql" && cfg.database.create) [ "mysql.service" ]) + ]; + requires = after; + + environment = mkMerge [ + { + # Use tempDir as this can get rather large, especially if Mattermost unpacks a large number of plugins. + TMPDIR = tempDir; + } + cfg.environment ]; preStart = '' - mkdir -p "${cfg.statePath}"/{data,config,logs,plugins} - mkdir -p "${cfg.statePath}/plugins"/{client,server} - ln -sf ${cfg.package}/{bin,fonts,i18n,templates,client} "${cfg.statePath}" + dataDir=${escapeShellArg cfg.dataDir} + configDir=${escapeShellArg cfg.configDir} + logDir=${escapeShellArg cfg.logDir} + package=${escapeShellArg cfg.package} + nixConfig=${escapeShellArg mattermostConfJSON} '' - + lib.optionalString (mattermostPlugins != null) '' - rm -rf "${cfg.statePath}/data/plugins" - ln -sf ${mattermostPlugins}/data/plugins "${cfg.statePath}/data" - '' - + lib.optionalString (!cfg.mutableConfig) '' - rm -f "${cfg.statePath}/config/config.json" - ${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${cfg.package}/config/config.json ${mattermostConfJSON} > "${cfg.statePath}/config/config.json" - '' - + lib.optionalString cfg.mutableConfig '' - if ! test -e "${cfg.statePath}/config/.initial-created"; then - rm -f ${cfg.statePath}/config/config.json - ${pkgs.jq}/bin/jq -s '.[0] * .[1]' ${cfg.package}/config/config.json ${mattermostConfJSON} > "${cfg.statePath}/config/config.json" - touch "${cfg.statePath}/config/.initial-created" + + optionalString (versionAtLeast config.system.stateVersion "25.05") '' + # Migrate configs in the pre-25.05 directory structure. + oldConfig="$dataDir/config/config.json" + newConfig="$configDir/config.json" + if [ "$oldConfig" != "$newConfig" ] && [ -f "$oldConfig" ] && [ ! -f "$newConfig" ]; then + # Migrate the legacy config location to the new config location + echo "Moving legacy config at $oldConfig to $newConfig" >&2 + mkdir -p "$configDir" + mv "$oldConfig" "$newConfig" + touch "$configDir/.initial-created" + fi + + # Logs too. + oldLogs="$dataDir/logs" + newLogs="$logDir" + if [ "$oldLogs" != "$newLogs" ] && [ -d "$oldLogs" ]; then + # Migrate the legacy log location to the new log location. + # Allow this to fail if there aren't any logs to move. + echo "Moving legacy logs at $oldLogs to $newLogs" >&2 + mkdir -p "$newLogs" + mv "$oldLogs"/* "$newLogs" || true fi '' - + lib.optionalString (cfg.mutableConfig && cfg.preferNixConfig) '' - new_config="$(${pkgs.jq}/bin/jq -s '.[0] * .[1]' "${cfg.statePath}/config/config.json" ${mattermostConfJSON})" - - rm -f "${cfg.statePath}/config/config.json" - echo "$new_config" > "${cfg.statePath}/config/config.json" + + optionalString (!cfg.mutableConfig) '' + ${getExe pkgs.jq} -s '.[0] * .[1]' "$package/config/config.json" "$nixConfig" > "$configDir/config.json" '' - + lib.optionalString cfg.localDatabaseCreate (createDb { }) - + '' - # Don't change permissions recursively on the data, current, and symlinked directories (see ln -sf command above). - # This dramatically decreases startup times for installations with a lot of files. - find . -maxdepth 1 -not -name data -not -name client -not -name templates -not -name i18n -not -name fonts -not -name bin -not -name . \ - -exec chown "${cfg.user}:${cfg.group}" -R {} \; -exec chmod u+rw,g+r,o-rwx -R {} \; - - chown "${cfg.user}:${cfg.group}" "${cfg.statePath}/data" . - chmod u+rw,g+r,o-rwx "${cfg.statePath}/data" . + + optionalString cfg.mutableConfig '' + if [ ! -e "$configDir/.initial-created" ]; then + ${getExe pkgs.jq} -s '.[0] * .[1]' "$package/config/config.json" "$nixConfig" > "$configDir/config.json" + touch "$configDir/.initial-created" + fi + '' + + optionalString (cfg.mutableConfig && cfg.preferNixConfig) '' + echo "$(${getExe pkgs.jq} -s '.[0] * .[1]' "$configDir/config.json" "$nixConfig")" > "$configDir/config.json" ''; - serviceConfig = { - PermissionsStartOnly = true; - User = cfg.user; - Group = cfg.group; - ExecStart = "${cfg.package}/bin/mattermost"; - WorkingDirectory = "${cfg.statePath}"; - Restart = "always"; - RestartSec = "10"; - LimitNOFILE = "49152"; - EnvironmentFile = cfg.environmentFile; - }; - unitConfig.JoinsNamespaceOf = mkIf cfg.localDatabaseCreate "postgresql.service"; + serviceConfig = mkMerge [ + { + User = cfg.user; + Group = cfg.group; + ExecStart = "${getExe cfg.package} --config ${cfg.configDir}/config.json"; + ReadWritePaths = [ + cfg.dataDir + cfg.logDir + cfg.configDir + ]; + UMask = "0027"; + Restart = "always"; + RestartSec = 10; + LimitNOFILE = 49152; + LockPersonality = true; + NoNewPrivileges = true; + PrivateDevices = true; + PrivateTmp = true; + PrivateUsers = true; + ProtectClock = true; + ProtectControlGroups = true; + ProtectHome = true; + ProtectHostname = true; + ProtectKernelLogs = true; + ProtectKernelModules = true; + ProtectKernelTunables = true; + ProtectProc = "invisible"; + ProtectSystem = "strict"; + RestrictNamespaces = true; + RestrictSUIDSGID = true; + EnvironmentFile = cfg.environmentFile; + WorkingDirectory = cfg.dataDir; + } + (mkIf (cfg.dataDir == "/var/lib/mattermost") { + StateDirectory = baseNameOf cfg.dataDir; + StateDirectoryMode = "0750"; + }) + (mkIf (cfg.logDir == "/var/log/mattermost") { + LogsDirectory = baseNameOf cfg.logDir; + LogsDirectoryMode = "0750"; + }) + (mkIf (cfg.configDir == "/etc/mattermost") { + ConfigurationDirectory = baseNameOf cfg.configDir; + ConfigurationDirectoryMode = "0750"; + }) + ]; + + unitConfig.JoinsNamespaceOf = mkMerge [ + (mkIf (cfg.database.driver == "postgres" && cfg.database.create) [ "postgresql.service" ]) + (mkIf (cfg.database.driver == "mysql" && cfg.database.create) [ "mysql.service" ]) + ]; }; + + assertions = [ + { + # Make sure the URL doesn't have a trailing slash + assertion = !(hasSuffix "/" cfg.siteUrl); + message = '' + services.mattermost.siteUrl should not have a trailing "/". + ''; + } + { + # Make sure this isn't a host/port pair + assertion = !(hasInfix ":" cfg.host && !(hasInfix "[" cfg.host) && !(hasInfix "]" cfg.host)); + message = '' + services.mattermost.host should not include a port. Use services.mattermost.host for the address + or hostname, and services.mattermost.port to specify the port separately. + ''; + } + ]; }) (mkIf cfg.matterircd.enable { systemd.services.matterircd = { @@ -367,7 +922,7 @@ in serviceConfig = { User = "nobody"; Group = "nogroup"; - ExecStart = "${cfg.matterircd.package}/bin/matterircd ${escapeShellArgs cfg.matterircd.parameters}"; + ExecStart = "${getExe cfg.matterircd.package} ${escapeShellArgs cfg.matterircd.parameters}"; WorkingDirectory = "/tmp"; PrivateTmp = true; Restart = "always"; @@ -376,4 +931,6 @@ in }; }) ]; + + meta.maintainers = with lib.maintainers; [ numinit ]; } diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index 622d43d4080b..83c9c52b81ad 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -593,7 +593,7 @@ in { matrix-synapse-workers = handleTest ./matrix/synapse-workers.nix {}; mautrix-meta-postgres = handleTest ./matrix/mautrix-meta-postgres.nix {}; mautrix-meta-sqlite = handleTest ./matrix/mautrix-meta-sqlite.nix {}; - mattermost = handleTest ./mattermost.nix {}; + mattermost = handleTest ./mattermost {}; mealie = handleTest ./mealie.nix {}; mediamtx = handleTest ./mediamtx.nix {}; mediatomb = handleTest ./mediatomb.nix {}; diff --git a/nixos/tests/mattermost.nix b/nixos/tests/mattermost.nix deleted file mode 100644 index a39033ced31d..000000000000 --- a/nixos/tests/mattermost.nix +++ /dev/null @@ -1,169 +0,0 @@ -import ./make-test-python.nix ( - { pkgs, lib, ... }: - let - host = "smoke.test"; - port = "8065"; - url = "http://${host}:${port}"; - siteName = "NixOS Smoke Tests, Inc."; - - makeMattermost = - mattermostConfig: - { config, ... }: - { - environment.systemPackages = [ - pkgs.mattermost - pkgs.curl - pkgs.jq - ]; - networking.hosts = { - "127.0.0.1" = [ host ]; - }; - services.mattermost = lib.recursiveUpdate { - enable = true; - inherit siteName; - listenAddress = "0.0.0.0:${port}"; - siteUrl = url; - extraConfig = { - SupportSettings.AboutLink = "https://nixos.org"; - }; - } mattermostConfig; - }; - in - { - name = "mattermost"; - - nodes = { - mutable = makeMattermost { - mutableConfig = true; - extraConfig.SupportSettings.HelpLink = "https://search.nixos.org"; - }; - mostlyMutable = makeMattermost { - mutableConfig = true; - preferNixConfig = true; - plugins = - let - mattermostDemoPlugin = pkgs.fetchurl { - url = "https://github.com/mattermost/mattermost-plugin-demo/releases/download/v0.9.0/com.mattermost.demo-plugin-0.9.0.tar.gz"; - sha256 = "1h4qi34gcxcx63z8wiqcf2aaywmvv8lys5g8gvsk13kkqhlmag25"; - }; - in - [ - mattermostDemoPlugin - ]; - }; - immutable = makeMattermost { - package = pkgs.mattermost.overrideAttrs (prev: { - webapp = prev.webapp.overrideAttrs (prevWebapp: { - # Ensure that users can add patches. - postPatch = - prevWebapp.postPatch or "" - + '' - substituteInPlace channels/src/root.html --replace-fail "Mattermost" "Patched Mattermost" - ''; - }); - }); - mutableConfig = false; - extraConfig.SupportSettings.HelpLink = "https://search.nixos.org"; - }; - environmentFile = makeMattermost { - mutableConfig = false; - extraConfig.SupportSettings.AboutLink = "https://example.org"; - environmentFile = pkgs.writeText "mattermost-env" '' - MM_SUPPORTSETTINGS_ABOUTLINK=https://nixos.org - ''; - }; - }; - - testScript = - let - expectConfig = - jqExpression: - pkgs.writeShellScript "expect-config" '' - set -euo pipefail - echo "Expecting config to match: "${lib.escapeShellArg jqExpression} >&2 - curl ${lib.escapeShellArg url} >/dev/null - config="$(curl ${lib.escapeShellArg "${url}/api/v4/config/client?format=old"})" - echo "Config: $(echo "$config" | ${pkgs.jq}/bin/jq)" >&2 - [[ "$(echo "$config" | ${pkgs.jq}/bin/jq -r ${lib.escapeShellArg ".SiteName == $siteName and .Version == ($mattermostName / $sep)[-1] and (${jqExpression})"} --arg siteName ${lib.escapeShellArg siteName} --arg mattermostName ${lib.escapeShellArg pkgs.mattermost.name} --arg sep '-')" = "true" ]] - ''; - - setConfig = - jqExpression: - pkgs.writeShellScript "set-config" '' - set -euo pipefail - mattermostConfig=/var/lib/mattermost/config/config.json - newConfig="$(${pkgs.jq}/bin/jq -r ${lib.escapeShellArg jqExpression} $mattermostConfig)" - rm -f $mattermostConfig - echo "$newConfig" > "$mattermostConfig" - ''; - - in - '' - start_all() - - ## Mutable node tests ## - mutable.wait_for_unit("mattermost.service") - mutable.wait_for_open_port(8065) - mutable.succeed("curl -L http://localhost:8065/index.html | grep '${siteName}'") - mutable.succeed("curl -L http://localhost:8065/index.html | grep 'Mattermost'") - - # Get the initial config - mutable.succeed("${expectConfig ''.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"''}") - - # Edit the config - mutable.succeed("${setConfig ''.SupportSettings.AboutLink = "https://mattermost.com"''}") - mutable.succeed("${setConfig ''.SupportSettings.HelpLink = "https://nixos.org/nixos/manual"''}") - mutable.systemctl("restart mattermost.service") - mutable.wait_for_open_port(8065) - - # AboutLink and HelpLink should be changed - mutable.succeed("${expectConfig ''.AboutLink == "https://mattermost.com" and .HelpLink == "https://nixos.org/nixos/manual"''}") - - ## Mostly mutable node tests ## - mostlyMutable.wait_for_unit("mattermost.service") - mostlyMutable.wait_for_open_port(8065) - mostlyMutable.succeed("curl -L http://localhost:8065/index.html | grep '${siteName}'") - mostlyMutable.succeed("curl -L http://localhost:8065/index.html | grep 'Mattermost'") - - # Get the initial config - mostlyMutable.succeed("${expectConfig ''.AboutLink == "https://nixos.org"''}") - - # Edit the config - mostlyMutable.succeed("${setConfig ''.SupportSettings.AboutLink = "https://mattermost.com"''}") - mostlyMutable.succeed("${setConfig ''.SupportSettings.HelpLink = "https://nixos.org/nixos/manual"''}") - mostlyMutable.systemctl("restart mattermost.service") - mostlyMutable.wait_for_open_port(8065) - - # AboutLink should be overridden by NixOS configuration; HelpLink should be what we set above - mostlyMutable.succeed("${expectConfig ''.AboutLink == "https://nixos.org" and .HelpLink == "https://nixos.org/nixos/manual"''}") - - ## Immutable node tests ## - immutable.wait_for_unit("mattermost.service") - immutable.wait_for_open_port(8065) - # Since we patched it, it doesn't replace the site name at runtime anymore - immutable.succeed("curl -L http://localhost:8065/index.html | grep 'Patched Mattermost'") - - # Get the initial config - immutable.succeed("${expectConfig ''.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"''}") - - # Edit the config - immutable.succeed("${setConfig ''.SupportSettings.AboutLink = "https://mattermost.com"''}") - immutable.succeed("${setConfig ''.SupportSettings.HelpLink = "https://nixos.org/nixos/manual"''}") - immutable.systemctl("restart mattermost.service") - immutable.wait_for_open_port(8065) - - # Our edits should be ignored on restart - immutable.succeed("${expectConfig ''.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"''}") - - - ## Environment File node tests ## - environmentFile.wait_for_unit("mattermost.service") - environmentFile.wait_for_open_port(8065) - environmentFile.succeed("curl -L http://localhost:8065/index.html | grep '${siteName}'") - environmentFile.succeed("curl -L http://localhost:8065/index.html | grep 'Mattermost'") - - # Settings in the environment file should override settings set otherwise - environmentFile.succeed("${expectConfig ''.AboutLink == "https://nixos.org"''}") - ''; - } -) diff --git a/nixos/tests/mattermost/default.nix b/nixos/tests/mattermost/default.nix new file mode 100644 index 000000000000..99ad4b110118 --- /dev/null +++ b/nixos/tests/mattermost/default.nix @@ -0,0 +1,537 @@ +import ../make-test-python.nix ( + { pkgs, lib, ... }: + let + host = "smoke.test"; + port = 8065; + url = "http://${host}:${toString port}"; + siteName = "NixOS Smoke Tests, Inc."; + + makeMattermost = + mattermostConfig: extraConfig: + lib.mkMerge [ + ( + { config, ... }: + { + environment = { + systemPackages = [ + pkgs.mattermost + pkgs.curl + pkgs.jq + ]; + }; + networking.hosts = { + "127.0.0.1" = [ host ]; + }; + + # Assume that Postgres won't update across stateVersion. + services.postgresql = { + package = lib.mkForce pkgs.postgresql; + initialScript = lib.mkIf (!config.services.mattermost.database.peerAuth) ( + pkgs.writeText "init.sql" '' + create role ${config.services.mattermost.database.user} with login nocreatedb nocreaterole encrypted password '${config.services.mattermost.database.password}'; + '' + ); + }; + + system.stateVersion = lib.mkDefault "25.05"; + + services.mattermost = lib.recursiveUpdate { + enable = true; + inherit siteName; + host = "0.0.0.0"; + inherit port; + siteUrl = url; + socket = { + enable = true; + export = true; + }; + database = { + peerAuth = lib.mkDefault true; + }; + settings = { + SupportSettings.AboutLink = "https://nixos.org"; + PluginSettings.AutomaticPrepackagedPlugins = false; + AnnouncementSettings = { + # Disable this since it doesn't work in the sandbox and causes a timeout. + AdminNoticesEnabled = false; + UserNoticesEnabled = false; + }; + }; + } mattermostConfig; + + # Upgrade to the latest Mattermost. + specialisation.latest.configuration = { + services.mattermost.package = lib.mkForce pkgs.mattermostLatest; + system.stateVersion = lib.mkVMOverride "25.05"; + }; + } + ) + extraConfig + ]; + + makeMysql = + mattermostConfig: extraConfig: + lib.mkMerge [ + mattermostConfig + ( + { pkgs, config, ... }: + { + services.mattermost.database = { + driver = lib.mkForce "mysql"; + peerAuth = lib.mkForce true; + }; + } + ) + extraConfig + ]; + in + { + name = "mattermost"; + + nodes = rec { + postgresMutable = + makeMattermost + { + mutableConfig = true; + settings.SupportSettings.HelpLink = "https://search.nixos.org"; + } + { + # Last version to support the "old" config layout. + system.stateVersion = lib.mkForce "24.11"; + + # First version to support the "new" config layout. + specialisation.upgrade.configuration.system.stateVersion = lib.mkVMOverride "25.05"; + }; + postgresMostlyMutable = makeMattermost { + mutableConfig = true; + preferNixConfig = true; + plugins = with pkgs; [ + # Build the demo plugin. + (mattermost.buildPlugin { + pname = "mattermost-plugin-starter-template"; + version = "0.1.0"; + src = fetchFromGitHub { + owner = "mattermost"; + repo = "mattermost-plugin-starter-template"; + # Newer versions have issues with their dependency lockfile. + rev = "7c98e89ac1a268ce8614bc665571b7bbc9a70df2"; + hash = "sha256-uyfxB0GZ45qL9ssWUord0eKQC6S0TlCTtjTOXWtK4H0="; + }; + vendorHash = "sha256-Jl4F9YkHNqiFP9/yeyi4vTntqxMk/J1zhEP6QLSvJQA="; + npmDepsHash = "sha256-z08nc4XwT+uQjQlZiUydJyh8mqeJoYdPFWuZpw9k99s="; + }) + + # Build the todos plugin. + (mattermost.buildPlugin { + pname = "mattermost-plugin-todo"; + version = "0.8-pre"; + src = fetchFromGitHub { + owner = "mattermost-community"; + repo = "mattermost-plugin-todo"; + # 0.7.1 didn't work, seems to use an older set of node dependencies. + rev = "f25dc91ea401c9f0dcd4abcebaff10eb8b9836e5"; + hash = "sha256-OM+m4rTqVtolvL5tUE8RKfclqzoe0Y38jLU60Pz7+HI="; + }; + vendorHash = "sha256-5KpechSp3z/Nq713PXYruyNxveo6CwrCSKf2JaErbgg="; + npmDepsHash = "sha256-o2UOEkwb8Vx2lDWayNYgng0GXvmS6lp/ExfOq3peyMY="; + extraGoModuleAttrs = { + npmFlags = [ "--legacy-peer-deps" ]; + }; + }) + ]; + } { }; + postgresImmutable = makeMattermost { + package = pkgs.mattermost.overrideAttrs (prev: { + webapp = prev.webapp.overrideAttrs (prevWebapp: { + # Ensure that users can add patches. + postPatch = + prevWebapp.postPatch or "" + + '' + substituteInPlace channels/src/root.html --replace-fail "Mattermost" "Patched Mattermost" + ''; + }); + }); + mutableConfig = false; + + # Make sure something other than the default works. + user = "mmuser"; + group = "mmgroup"; + + database = { + # Ensure that this gets tested on Postgres. + peerAuth = false; + }; + settings.SupportSettings.HelpLink = "https://search.nixos.org"; + } { }; + postgresEnvironmentFile = makeMattermost { + mutableConfig = false; + database.fromEnvironment = true; + settings.SupportSettings.AboutLink = "https://example.org"; + environmentFile = pkgs.writeText "mattermost-env" '' + MM_SQLSETTINGS_DATASOURCE=postgres:///mattermost?host=/run/postgresql + MM_SUPPORTSETTINGS_ABOUTLINK=https://nixos.org + ''; + } { }; + + mysqlMutable = makeMysql postgresMutable { }; + mysqlMostlyMutable = makeMysql postgresMostlyMutable { }; + mysqlImmutable = makeMysql postgresImmutable { + # Let's try to use this on MySQL. + services.mattermost.database = { + peerAuth = lib.mkForce true; + user = lib.mkForce "mmuser"; + name = lib.mkForce "mmuser"; + }; + }; + mysqlEnvironmentFile = makeMysql postgresEnvironmentFile { + services.mattermost.environmentFile = lib.mkForce ( + pkgs.writeText "mattermost-env" '' + MM_SQLSETTINGS_DATASOURCE=mattermost@unix(/run/mysqld/mysqld.sock)/mattermost?charset=utf8mb4,utf8&writeTimeout=30s + MM_SUPPORTSETTINGS_ABOUTLINK=https://nixos.org + '' + ); + }; + }; + + testScript = + { nodes, ... }: + let + expectConfig = pkgs.writeShellScript "expect-config" '' + set -euo pipefail + config="$(curl ${lib.escapeShellArg "${url}/api/v4/config/client?format=old"})" + echo "Config: $(echo "$config" | ${pkgs.jq}/bin/jq)" >&2 + [[ "$(echo "$config" | ${pkgs.jq}/bin/jq -r ${lib.escapeShellArg ".SiteName == $siteName and .Version == $mattermostVersion and "}"($1)" --arg siteName ${lib.escapeShellArg siteName} --arg mattermostVersion "$2" --arg sep '-')" = "true" ]] + ''; + + setConfig = pkgs.writeShellScript "set-config" '' + set -eo pipefail + mattermostConfig=/etc/mattermost/config.json + nixosVersion="$2" + if [ -z "$nixosVersion" ]; then + nixosVersion="$(nixos-version)" + fi + nixosVersion="$(echo "$nixosVersion" | sed -nr 's/^([0-9]{2})\.([0-9]{2}).*/\1\2/p')" + echo "NixOS version: $nixosVersion" >&2 + if [ "$nixosVersion" -lt 2505 ]; then + mattermostConfig=/var/lib/mattermost/config/config.json + fi + newConfig="$(${pkgs.jq}/bin/jq -r "$1" "$mattermostConfig")" + echo "New config @ $mattermostConfig: $(echo "$newConfig" | ${pkgs.jq}/bin/jq)" >&2 + truncate -s 0 "$mattermostConfig" + echo "$newConfig" >> "$mattermostConfig" + ''; + + expectPlugins = pkgs.writeShellScript "expect-plugins" '' + set -euo pipefail + case "$1" in + ""|*[!0-9]*) + plugins="$(curl ${lib.escapeShellArg "${url}/api/v4/plugins/webapp"})" + echo "Plugins: $(echo "$plugins" | ${pkgs.jq}/bin/jq)" >&2 + [[ "$(echo "$plugins" | ${pkgs.jq}/bin/jq -r "$1")" == "true" ]] + ;; + *) + code="$(curl -s -o /dev/null -w "%{http_code}" ${lib.escapeShellArg "${url}/api/v4/plugins/webapp"})" + [[ "$code" == "$1" ]] + ;; + esac + ''; + + ensurePost = pkgs.writeShellScript "ensure-post" '' + set -euo pipefail + + url="$1" + failIfNotFound="$2" + + # Make sure the user exists + thingExists='(type == "array" and length > 0)' + userExists="($thingExists and ("'.[0].username == "nixos"))' + if mmctl user list --json | jq | tee /dev/stderr | jq -e "$userExists | not"; then + if [ "$failIfNotFound" -ne 0 ]; then + echo "User didn't exist!" >&2 + exit 1 + else + mmctl user create \ + --email tests@nixos.org \ + --username nixos --password nixosrules --system-admin --email-verified >&2 + + # Make sure the user exists. + while mmctl user list --json | jq | tee /dev/stderr | jq -e "$userExists | not"; do + sleep 1 + done + fi + fi + + # Auth. + mmctl auth login "$url" --name nixos --username nixos --password nixosrules + + # Make sure the team exists + teamExists="($thingExists and ("'.[0].display_name == "NixOS Smoke Tests, Inc."))' + if mmctl team list --json | jq | tee /dev/stderr | jq -e "$teamExists | not"; then + if [ "$failIfNotFound" -ne 0 ]; then + echo "Team didn't exist!" >&2 + exit 1 + else + mmctl team create \ + --name nixos \ + --display-name "NixOS Smoke Tests, Inc." + + # Teams take a second to create. + while mmctl team list --json | jq | tee /dev/stderr | jq -e "$teamExists | not"; do + sleep 1 + done + + # Add the user. + mmctl team users add nixos tests@nixos.org + fi + fi + + authToken="$(cat ~/.config/mmctl/config | jq -r '.nixos.authToken')" + authHeader="Authorization: Bearer $authToken" + acceptHeader="Accept: application/json; charset=UTF-8" + + # Make sure the test post exists. + postContents="pls enjoy this NixOS meme I made" + postAttachment=${./test.jpg} + postAttachmentSize="$(stat -c%s $postAttachment)" + postAttachmentHash="$(sha256sum $postAttachment | awk '{print $1}')" + postAttachmentId="" + postPredicate='select(.message == $message and (.file_ids | length) > 0 and (.metadata.files[0].size | tonumber) == ($size | tonumber))' + postExists="($thingExists and ("'(.[] | '"$postPredicate"' | length) > 0))' + if mmctl post list nixos:off-topic --json | jq | tee /dev/stderr | jq --arg message "$postContents" --arg size "$postAttachmentSize" -e "$postExists | not"; then + if [ "$failIfNotFound" -ne 0 ]; then + echo "Post didn't exist!" >&2 + exit 1 + else + # Can't use mmcli for this seemingly. + channelId="$(mmctl channel list nixos --json | jq | tee /dev/stderr | jq -r '.[] | select(.name == "off-topic") | .id')" + echo "Channel ID: $channelId" >&2 + + # Upload the file. + echo "Uploading file at $postAttachment (size: $postAttachmentSize)..." >&2 + postAttachmentId="$(curl "$url/api/v4/files" -X POST -H "$acceptHeader" -H "$authHeader" \ + -F "files=@$postAttachment" -F "channel_id=$channelId" -F "client_ids=test" | jq | tee /dev/stderr | jq -r '.file_infos[0].id')" + + # Create the post with it attached. + postJson="$(echo '{}' | jq -c --arg channelId "$channelId" --arg message "$postContents" --arg fileId "$postAttachmentId" \ + '{channel_id: $channelId, message: $message, file_ids: [$fileId]}')" + echo "Creating post with contents $postJson..." >&2 + curl "$url/api/v4/posts" -X POST -H "$acceptHeader" -H "$authHeader" --json "$postJson" | jq >&2 + fi + fi + + if mmctl post list nixos:off-topic --json | jq | tee /dev/stderr | jq --arg message "$postContents" --arg size "$postAttachmentSize" -e "$postExists"; then + # Get the attachment ID. + getPostAttachmentId=".[] | $postPredicate | .file_ids[0]" + postAttachmentId="$(mmctl post list nixos:off-topic --json | jq | tee /dev/stderr | \ + jq --arg message "$postContents" --arg size "$postAttachmentSize" -r "$getPostAttachmentId")" + + echo "Expected post attachment hash: $postAttachmentHash" >&2 + actualPostAttachmentHash="$(curl "$url/api/v4/files/$postAttachmentId?download=1" -H "$authHeader" | sha256sum | awk '{print $1}')" + echo "Actual post attachment hash: $postAttachmentHash" >&2 + if [ "$actualPostAttachmentHash" != "$postAttachmentHash" ]; then + echo "Post attachment hash mismatched!" >&2 + exit 1 + else + echo "Post attachment hash was OK!" >&2 + exit 0 + fi + else + echo "Post didn't exist when it should have!" >&2 + exit 1 + fi + ''; + in + '' + import shlex + + def wait_mattermost_up(node, site_name="${siteName}"): + node.systemctl("start mattermost.service") + node.wait_for_unit("mattermost.service") + node.wait_for_open_port(8065) + node.succeed(f"curl {shlex.quote('${url}')} >/dev/null") + node.succeed(f"curl {shlex.quote('${url}')}/index.html | grep {shlex.quote(site_name)}") + + def restart_mattermost(node, site_name="${siteName}"): + node.systemctl("restart mattermost.service") + wait_mattermost_up(node, site_name) + + def expect_config(node, mattermost_version, *configs): + for config in configs: + node.succeed(f"${expectConfig} {shlex.quote(config)} {shlex.quote(mattermost_version)}") + + def expect_plugins(node, jq_or_code): + node.succeed(f"${expectPlugins} {shlex.quote(str(jq_or_code))}") + + def ensure_post(node, fail_if_not_found=False): + node.succeed(f"${ensurePost} {shlex.quote('${url}')} {1 if fail_if_not_found else 0}") + + def set_config(node, *configs, nixos_version='25.05'): + for config in configs: + args = [shlex.quote("${setConfig}")] + args.append(shlex.quote(config)) + if nixos_version: + args.append(shlex.quote(str(nixos_version))) + node.succeed(' '.join(args)) + + def run_mattermost_tests(mutableToplevel: str, mutable, + mostlyMutableToplevel: str, mostlyMutable, + immutableToplevel: str, immutable, + environmentFileToplevel: str, environmentFile): + esr, latest = '${pkgs.mattermost.version}', '${pkgs.mattermostLatest.version}' + + ## Mutable node tests ## + mutable.start() + wait_mattermost_up(mutable) + + # Get the initial config + expect_config(mutable, esr, '.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"') + + # Edit the config and make a post + set_config( + mutable, + '.SupportSettings.AboutLink = "https://mattermost.com"', + '.SupportSettings.HelpLink = "https://nixos.org/nixos/manual"', + nixos_version='24.11' # Default 'mutable' config is an old version + ) + ensure_post(mutable) + restart_mattermost(mutable) + + # AboutLink and HelpLink should be changed, and the post should exist + expect_config(mutable, esr, '.AboutLink == "https://mattermost.com" and .HelpLink == "https://nixos.org/nixos/manual"') + ensure_post(mutable, fail_if_not_found=True) + + # Switch to the newer config + mutable.succeed(f"{mutableToplevel}/specialisation/upgrade/bin/switch-to-configuration switch") + wait_mattermost_up(mutable) + + # AboutLink and HelpLink should be changed, still, and the post should still exist + expect_config(mutable, esr, '.AboutLink == "https://mattermost.com" and .HelpLink == "https://nixos.org/nixos/manual"') + ensure_post(mutable, fail_if_not_found=True) + + # Switch to the latest Mattermost version + mutable.succeed(f"{mutableToplevel}/specialisation/latest/bin/switch-to-configuration switch") + wait_mattermost_up(mutable) + + # AboutLink and HelpLink should be changed, still, and the post should still exist + expect_config(mutable, latest, '.AboutLink == "https://mattermost.com" and .HelpLink == "https://nixos.org/nixos/manual"') + ensure_post(mutable, fail_if_not_found=True) + + mutable.shutdown() + + ## Mostly mutable node tests ## + mostlyMutable.start() + wait_mattermost_up(mostlyMutable) + + # Get the initial config + expect_config(mostlyMutable, esr, '.AboutLink == "https://nixos.org"') + + # No plugins. + expect_plugins(mostlyMutable, 'length == 0') + + # Edit the config and make a post + set_config( + mostlyMutable, + '.SupportSettings.AboutLink = "https://mattermost.com"', + '.SupportSettings.HelpLink = "https://nixos.org/nixos/manual"', + '.PluginSettings.PluginStates."com.mattermost.plugin-todo".Enable = true' + ) + ensure_post(mostlyMutable) + restart_mattermost(mostlyMutable) + + # AboutLink should be overridden by NixOS configuration; HelpLink should be what we set above + expect_config(mostlyMutable, esr, '.AboutLink == "https://nixos.org" and .HelpLink == "https://nixos.org/nixos/manual"') + + # Single plugin that's now enabled. + expect_plugins(mostlyMutable, 'length == 1') + + # Post should exist. + ensure_post(mostlyMutable, fail_if_not_found=True) + + # Switch to the latest Mattermost version + mostlyMutable.succeed(f"{mostlyMutableToplevel}/specialisation/latest/bin/switch-to-configuration switch") + wait_mattermost_up(mostlyMutable) + + # AboutLink should be overridden and the post should still exist + expect_config(mostlyMutable, latest, '.AboutLink == "https://nixos.org" and .HelpLink == "https://nixos.org/nixos/manual"') + ensure_post(mostlyMutable, fail_if_not_found=True) + + mostlyMutable.shutdown() + + ## Immutable node tests ## + immutable.start() + wait_mattermost_up(immutable, "Patched Mattermost") + + # Get the initial config + expect_config(immutable, esr, '.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"') + + # Edit the config and make a post + set_config( + immutable, + '.SupportSettings.AboutLink = "https://mattermost.com"', + '.SupportSettings.HelpLink = "https://nixos.org/nixos/manual"' + ) + ensure_post(immutable) + restart_mattermost(immutable, "Patched Mattermost") + + # Our edits should be ignored on restart + expect_config(immutable, esr, '.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"') + + # No plugins. + expect_plugins(immutable, 'length == 0') + + # Post should exist. + ensure_post(immutable, fail_if_not_found=True) + + # Switch to the latest Mattermost version + immutable.succeed(f"{immutableToplevel}/specialisation/latest/bin/switch-to-configuration switch") + wait_mattermost_up(immutable) + + # AboutLink and HelpLink should be changed, still, and the post should still exist + expect_config(immutable, latest, '.AboutLink == "https://nixos.org" and .HelpLink == "https://search.nixos.org"') + ensure_post(immutable, fail_if_not_found=True) + + immutable.shutdown() + + ## Environment File node tests ## + environmentFile.start() + wait_mattermost_up(environmentFile) + ensure_post(environmentFile) + + # Settings in the environment file should override settings set otherwise, and the post should exist + expect_config(environmentFile, esr, '.AboutLink == "https://nixos.org"') + ensure_post(environmentFile, fail_if_not_found=True) + + # Switch to the latest Mattermost version + environmentFile.succeed(f"{environmentFileToplevel}/specialisation/latest/bin/switch-to-configuration switch") + wait_mattermost_up(environmentFile) + + # AboutLink should be changed still, and the post should still exist + expect_config(environmentFile, latest, '.AboutLink == "https://nixos.org"') + ensure_post(environmentFile, fail_if_not_found=True) + + environmentFile.shutdown() + + run_mattermost_tests( + "${nodes.mysqlMutable.system.build.toplevel}", + mysqlMutable, + "${nodes.mysqlMostlyMutable.system.build.toplevel}", + mysqlMostlyMutable, + "${nodes.mysqlImmutable.system.build.toplevel}", + mysqlImmutable, + "${nodes.mysqlEnvironmentFile.system.build.toplevel}", + mysqlEnvironmentFile + ) + + run_mattermost_tests( + "${nodes.postgresMutable.system.build.toplevel}", + postgresMutable, + "${nodes.postgresMostlyMutable.system.build.toplevel}", + postgresMostlyMutable, + "${nodes.postgresImmutable.system.build.toplevel}", + postgresImmutable, + "${nodes.postgresEnvironmentFile.system.build.toplevel}", + postgresEnvironmentFile + ) + ''; + } +) diff --git a/nixos/tests/mattermost/test.jpg b/nixos/tests/mattermost/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b1e8e1b4fab90b32630d70a2a39e3100cf23e57 GIT binary patch literal 121879 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
P$yFgnU(9F}Ywto<#vwfpD{XmvHkOsqR@K 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 u