portfolio: 0.71.2 -> 0.72.2 (#360387)
[NixPkgs.git] / nixos / modules / services / misc / transfer-sh.nix
blobb0d1b724d72719d95e0209001c07416a5b407d0a
1 { config, lib, pkgs, ... }:
3 let
4   cfg = config.services.transfer-sh;
5   inherit (lib)
6     mkDefault mkEnableOption mkPackageOption mkIf mkOption
7     types mapAttrs isBool getExe boolToString optionalAttrs;
8 in
10   options.services.transfer-sh = {
11     enable = mkEnableOption "Easy and fast file sharing from the command-line";
13     package = mkPackageOption pkgs "transfer-sh" { };
15     settings = mkOption {
16       type = types.submodule { freeformType = with types; attrsOf (oneOf [ bool int str ]); };
17       default = { };
18       example = {
19         LISTENER = ":8080";
20         BASEDIR = "/var/lib/transfer.sh";
21         TLS_LISTENER_ONLY = false;
22       };
23       description = ''
24         Additional configuration for transfer-sh, see
25         <https://github.com/dutchcoders/transfer.sh#usage-1>
26         for supported values.
28         For secrets use secretFile option instead.
29       '';
30     };
32     provider = mkOption {
33       type = types.enum [ "local" "s3" "storj" "gdrive" ];
34       default = "local";
35       description = "Storage providers to use";
36     };
38     secretFile = mkOption {
39       type = types.nullOr types.path;
40       default = null;
41       example = "/run/secrets/transfer-sh.env";
42       description = ''
43         Path to file containing environment variables.
44         Useful for passing down secrets.
45         Some variables that can be considered secrets are:
46          - AWS_ACCESS_KEY
47          - AWS_ACCESS_KEY
48          - TLS_PRIVATE_KEY
49          - HTTP_AUTH_HTPASSWD
50       '';
51     };
52   };
54   config =
55     let
56       localProvider = (cfg.provider == "local");
57       stateDirectory = "/var/lib/transfer.sh";
58     in
59     mkIf cfg.enable
60       {
61         services.transfer-sh.settings = {
62           LISTENER = mkDefault ":8080";
63         } // optionalAttrs localProvider {
64           BASEDIR = mkDefault stateDirectory;
65         };
67         systemd.services.transfer-sh = {
68           after = [ "network.target" ];
69           wantedBy = [ "multi-user.target" ];
70           environment = mapAttrs (_: v: if isBool v then boolToString v else toString v) cfg.settings;
71           serviceConfig = {
72             DevicePolicy = "closed";
73             DynamicUser = true;
74             ExecStart = "${getExe cfg.package} --provider ${cfg.provider}";
75             LockPersonality = true;
76             MemoryDenyWriteExecute = true;
77             PrivateDevices = true;
78             PrivateUsers = true;
79             ProtectClock = true;
80             ProtectControlGroups = true;
81             ProtectHostname = true;
82             ProtectKernelLogs = true;
83             ProtectKernelModules = true;
84             ProtectKernelTunables = true;
85             ProtectProc = "invisible";
86             RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
87             RestrictNamespaces = true;
88             RestrictRealtime = true;
89             SystemCallArchitectures = [ "native" ];
90             SystemCallFilter = [ "@system-service" ];
91             StateDirectory = baseNameOf stateDirectory;
92           } // optionalAttrs (cfg.secretFile != null) {
93             EnvironmentFile = cfg.secretFile;
94           } // optionalAttrs localProvider {
95             ReadWritePaths = cfg.settings.BASEDIR;
96           };
97         };
98       };
100   meta.maintainers = with lib.maintainers; [ ocfox ];