From 83fffec29d08a07438fc3c96e910f2d1d085bef1 Mon Sep 17 00:00:00 2001 From: David Acevedo Date: Mon, 17 Feb 2025 17:52:19 -0500 Subject: [PATCH] Added support for mprocs process manager --- src/modules/process-managers/mprocs.nix | 64 +++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/modules/process-managers/mprocs.nix diff --git a/src/modules/process-managers/mprocs.nix b/src/modules/process-managers/mprocs.nix new file mode 100644 index 000000000..ecd37d7ca --- /dev/null +++ b/src/modules/process-managers/mprocs.nix @@ -0,0 +1,64 @@ +{ pkgs, config, lib, ... }: +let + cfg = config.process.managers.mprocs; + settingsFormat = pkgs.formats.yaml { }; + makeImpurePackage = impurePath: + pkgs.runCommandLocal + "${lib.strings.sanitizeDerivationName impurePath}-impure" + { + __impureHostDeps = [ impurePath ]; + } "mkdir -p $out/bin && ln -s ${impurePath} $out/bin"; +in +{ + options.process.managers.mprocs = { + enable = lib.mkEnableOption "mprocs as the process manager" // { + internal = true; + }; + + package = lib.mkOption { + type = lib.types.package; + default = pkgs.mprocs; + defaultText = lib.literalExpression "pkgs.mprocs"; + description = "The mprocs package to use."; + }; + + configFile = lib.mkOption { + type = lib.types.path; + internal = true; + }; + + settings = lib.mkOption { + type = settingsFormat.type; + description = '' + Top-level mprocs.yaml options + + https://github.com/pvolok/mprocs?tab=readme-ov-file#config + ''; + default = { }; + }; + }; + + config = lib.mkIf cfg.enable { + process.manager.args = { "config" = cfg.configFile; }; + + process.manager.command = lib.mkDefault '' + ${cfg.package}/bin/mprocs \ + ${lib.cli.toGNUCommandLineShell { } config.process.manager.args} + ''; + + packages = [ cfg.package ] ++ lib.optionals pkgs.stdenv.isDarwin + [ (makeImpurePackage "/usr/bin/pbcopy") ]; + + process.managers.mprocs = { + configFile = + lib.mkDefault (settingsFormat.generate "mprocs.yaml" cfg.settings); + settings = { + procs = lib.mapAttrs + (name: value: + let scriptPath = pkgs.writeShellScript name value.exec; + in { cmd = [ "${scriptPath}" ]; }) + config.processes; + }; + }; + }; +}