mailman: init package for Mailman CLI

We already had python3Packages.mailman, but that's only really usable
as a library.  The only other option was to create a whole Python
environment, which was undesirable to install as a system-wide
package.
This commit is contained in:
Alyssa Ross 2020-01-09 21:12:59 +00:00
parent 8d9636e092
commit a8538a73a7
4 changed files with 29 additions and 23 deletions

View file

@ -6,19 +6,6 @@ let
cfg = config.services.mailman;
mailmanPyEnv = pkgs.python3.withPackages (ps: with ps; [mailman mailman-hyperkitty]);
mailmanExe = with pkgs; stdenv.mkDerivation {
name = "mailman-" + python3Packages.mailman.version;
buildInputs = [makeWrapper];
unpackPhase = ":";
installPhase = ''
mkdir -p $out/bin
makeWrapper ${mailmanPyEnv}/bin/mailman $out/bin/mailman \
--set MAILMAN_CONFIG_FILE /etc/mailman.cfg
'';
};
mailmanWeb = pkgs.python3Packages.mailman-web.override {
serverEMail = cfg.siteOwner;
archiverKey = cfg.hyperkittyApiKey;
@ -189,7 +176,7 @@ in {
users.users.mailman = { description = "GNU Mailman"; isSystemUser = true; };
environment = {
systemPackages = [ mailmanExe mailmanWebExe pkgs.sassc ];
systemPackages = [ pkgs.mailman mailmanWebExe pkgs.sassc ];
etc."mailman.cfg".text = mailmanCfg;
};
@ -205,8 +192,8 @@ in {
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
ExecStart = "${mailmanExe}/bin/mailman start";
ExecStop = "${mailmanExe}/bin/mailman stop";
ExecStart = "${pkgs.mailman}/bin/mailman start";
ExecStop = "${pkgs.mailman}/bin/mailman stop";
User = "mailman";
Type = "forking";
RuntimeDirectory = "mailman";
@ -271,7 +258,7 @@ in {
description = "Trigger daily Mailman events";
startAt = "daily";
serviceConfig = {
ExecStart = "${mailmanExe}/bin/mailman digests --send";
ExecStart = "${pkgs.mailman}/bin/mailman digests --send";
User = "mailman";
};
};

View file

@ -28,15 +28,12 @@ buildPythonPackage rec {
'';
# Mailman assumes that those scripts in $out/bin are Python scripts. Wrapping
# them in shell code breaks this assumption. The proper way to use mailman is
# to create a specialized python interpreter:
#
# python37.withPackages (ps: [ps.mailman])
# them in shell code breaks this assumption. Use the wrapped version (see
# wrapped.nix) if you need the CLI (rather than the Python library).
#
# This gives a properly wrapped 'mailman' command plus an interpreter that
# has all the necessary search paths to execute unwrapped 'master' and
# 'runner' scripts. The setup is a little tricky, but fortunately NixOS is
# about to get a OS module that takes care of those details.
# 'runner' scripts.
dontWrapPythonPrograms = true;
meta = {

View file

@ -0,0 +1,20 @@
{ runCommand, lib, makeWrapper, python3
, archivers ? [ python3.pkgs.mailman-hyperkitty ]
}:
let
inherit (python3.pkgs) makePythonPath mailman;
in
runCommand "${mailman.name}-wrapped" {
inherit (mailman) meta;
buildInputs = [ makeWrapper ];
passthru = mailman.passthru // { unwrapped = mailman; };
} ''
mkdir -p "$out/bin"
cd "${mailman}/bin"
for exe in *; do
makeWrapper "${mailman}/bin/$exe" "$out/bin/$exe" \
--set PYTHONPATH ${makePythonPath ([ mailman ] ++ archivers)}
done
''

View file

@ -15321,6 +15321,8 @@ in
labelImg = callPackage ../applications/science/machine-learning/labelimg { };
mailman = callPackage ../servers/mail/mailman/wrapped.nix { };
mailman-rss = callPackage ../development/python-modules/mailman-rss { };
mattermost = callPackage ../servers/mattermost { };