vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / iperf3.nix
blob2b1ee71f1421212fa974550d3390a6282fe9103d
1 { config, lib, pkgs, ... }: with lib;
2 let
3   cfg = config.services.iperf3;
5   api = {
6     enable = mkEnableOption "iperf3 network throughput testing server";
7     package = mkPackageOption pkgs "iperf3" { };
8     port = mkOption {
9       type        = types.ints.u16;
10       default     = 5201;
11       description = "Server port to listen on for iperf3 client requests.";
12     };
13     affinity = mkOption {
14       type        = types.nullOr types.ints.unsigned;
15       default     = null;
16       description = "CPU affinity for the process.";
17     };
18     bind = mkOption {
19       type        = types.nullOr types.str;
20       default     = null;
21       description = "Bind to the specific interface associated with the given address.";
22     };
23     openFirewall = mkOption {
24       type = types.bool;
25       default = false;
26       description = "Open ports in the firewall for iperf3.";
27     };
28     verbose = mkOption {
29       type        = types.bool;
30       default     = false;
31       description = "Give more detailed output.";
32     };
33     forceFlush = mkOption {
34       type        = types.bool;
35       default     = false;
36       description = "Force flushing output at every interval.";
37     };
38     debug = mkOption {
39       type        = types.bool;
40       default     = false;
41       description = "Emit debugging output.";
42     };
43     rsaPrivateKey = mkOption {
44       type        = types.nullOr types.path;
45       default     = null;
46       description = "Path to the RSA private key (not password-protected) used to decrypt authentication credentials from the client.";
47     };
48     authorizedUsersFile = mkOption {
49       type        = types.nullOr types.path;
50       default     = null;
51       description = "Path to the configuration file containing authorized users credentials to run iperf tests.";
52     };
53     extraFlags = mkOption {
54       type        = types.listOf types.str;
55       default     = [ ];
56       description = "Extra flags to pass to iperf3(1).";
57     };
58   };
60   imp = {
62     networking.firewall = mkIf cfg.openFirewall {
63       allowedTCPPorts = [ cfg.port ];
64     };
66     systemd.services.iperf3 = {
67       description = "iperf3 daemon";
68       unitConfig.Documentation = "man:iperf3(1) https://iperf.fr/iperf-doc.php";
69       wantedBy = [ "multi-user.target" ];
70       after = [ "network.target" ];
72       serviceConfig = {
73         Restart = "on-failure";
74         RestartSec = 2;
75         DynamicUser = true;
76         PrivateDevices = true;
77         CapabilityBoundingSet = "";
78         NoNewPrivileges = true;
79         ExecStart = ''
80           ${lib.getExe cfg.package} \
81             --server \
82             --port ${toString cfg.port} \
83             ${optionalString (cfg.affinity != null) "--affinity ${toString cfg.affinity}"} \
84             ${optionalString (cfg.bind != null) "--bind ${cfg.bind}"} \
85             ${optionalString (cfg.rsaPrivateKey != null) "--rsa-private-key-path ${cfg.rsaPrivateKey}"} \
86             ${optionalString (cfg.authorizedUsersFile != null) "--authorized-users-path ${cfg.authorizedUsersFile}"} \
87             ${optionalString cfg.verbose "--verbose"} \
88             ${optionalString cfg.debug "--debug"} \
89             ${optionalString cfg.forceFlush "--forceflush"} \
90             ${escapeShellArgs cfg.extraFlags}
91         '';
92       };
93     };
94   };
95 in {
96   options.services.iperf3 = api;
97   config = mkIf cfg.enable imp;