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