nixos/README.md: relax the requirement of providing option defaults (#334509)
[NixPkgs.git] / nixos / modules / services / networking / tinyproxy.nix
blobbcf8fbbca726b9dc2dd812f747e0e9fdd7db09d0
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.services.tinyproxy;
7   mkValueStringTinyproxy = with lib; v:
8         if true  ==         v then "yes"
9         else if false ==    v then "no"
10         else if types.path.check v then ''"${v}"''
11         else generators.mkValueStringDefault {} v;
12   mkKeyValueTinyproxy = {
13     mkValueString ? mkValueStringDefault {}
14   }: sep: k: v:
15     if null     ==  v then ""
16     else "${lib.strings.escape [sep] k}${sep}${mkValueString v}";
18   settingsFormat = (pkgs.formats.keyValue {
19       mkKeyValue = mkKeyValueTinyproxy {
20         mkValueString = mkValueStringTinyproxy;
21       } " ";
22       listsAsDuplicateKeys= true;
23   });
24   configFile = settingsFormat.generate "tinyproxy.conf" cfg.settings;
29   options = {
30     services.tinyproxy = {
31       enable = mkEnableOption "Tinyproxy daemon";
32       package = mkPackageOption pkgs "tinyproxy" {};
33       settings = mkOption {
34         description = "Configuration for [tinyproxy](https://tinyproxy.github.io/).";
35         default = { };
36         example = literalExpression ''
37         {
38           Port 8888;
39           Listen 127.0.0.1;
40           Timeout 600;
41           Allow 127.0.0.1;
42           Anonymous = ['"Host"' '"Authorization"'];
43           ReversePath = '"/example/" "http://www.example.com/"';
44         }
45         '';
46         type = types.submodule ({name, ...}: {
47           freeformType = settingsFormat.type;
48           options = {
49             Listen = mkOption {
50               type = types.str;
51               default = "127.0.0.1";
52               description = ''
53               Specify which address to listen to.
54               '';
55             };
56             Port = mkOption {
57               type = types.int;
58               default = 8888;
59               description = ''
60               Specify which port to listen to.
61               '';
62             };
63             Anonymous = mkOption {
64               type = types.listOf types.str;
65               default = [];
66               description = ''
67               If an `Anonymous` keyword is present, then anonymous proxying is enabled. The headers listed with `Anonymous` are allowed through, while all others are denied. If no Anonymous keyword is present, then all headers are allowed through. You must include quotes around the headers.
68               '';
69             };
70             Filter = mkOption {
71               type = types.nullOr types.path;
72               default = null;
73               description = ''
74               Tinyproxy supports filtering of web sites based on URLs or domains. This option specifies the location of the file containing the filter rules, one rule per line.
75               '';
76             };
77           };
78         });
79       };
80     };
81   };
82   config = mkIf cfg.enable {
83     systemd.services.tinyproxy = {
84       description = "TinyProxy daemon";
85       after = [ "network.target" ];
86       wantedBy = [ "multi-user.target" ];
87       serviceConfig = {
88         User = "tinyproxy";
89         Group = "tinyproxy";
90         Type = "simple";
91         ExecStart = "${getExe cfg.package} -d -c ${configFile}";
92         ExecReload = "${pkgs.coreutils}/bin/kill -SIGHUP $MAINPID";
93         KillSignal = "SIGINT";
94         TimeoutStopSec = "30s";
95         Restart = "on-failure";
96       };
97     };
99     users.users.tinyproxy = {
100         group = "tinyproxy";
101         isSystemUser = true;
102     };
103     users.groups.tinyproxy = {};
104   };
105   meta.maintainers = with maintainers; [ tcheronneau ];