at 23.11-pre 1.3 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.merecat; 7 format = pkgs.formats.keyValue { 8 mkKeyValue = generators.mkKeyValueDefault { 9 mkValueString = v: 10 # In merecat.conf, booleans are "true" and "false" 11 if builtins.isBool v 12 then if v then "true" else "false" 13 else generators.mkValueStringDefault {} v; 14 } "="; 15 }; 16 configFile = format.generate "merecat.conf" cfg.settings; 17 18in { 19 20 options.services.merecat = { 21 22 enable = mkEnableOption (lib.mdDoc "Merecat HTTP server"); 23 24 settings = mkOption { 25 inherit (format) type; 26 default = { }; 27 description = lib.mdDoc '' 28 Merecat configuration. Refer to merecat(8) for details on supported values. 29 ''; 30 example = { 31 hostname = "localhost"; 32 port = 8080; 33 virtual-host = true; 34 directory = "/srv/www"; 35 }; 36 }; 37 38 }; 39 40 config = mkIf cfg.enable { 41 42 systemd.services.merecat = { 43 description = "Merecat HTTP server"; 44 after = [ "network.target" ]; 45 wantedBy = [ "multi-user.target" ]; 46 serviceConfig = { 47 DynamicUser = true; 48 ExecStart = "${pkgs.merecat}/bin/merecat -n -f ${configFile}"; 49 AmbientCapabilities = lib.mkIf ((cfg.settings.port or 80) < 1024) [ "CAP_NET_BIND_SERVICE" ]; 50 }; 51 }; 52 53 }; 54 55}