vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / networking / autossh.nix
blobf8934845c28e22d9076eaf74c8e317887a441d82
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.services.autossh;
6 in
10   ###### interface
12   options = {
14     services.autossh = {
16       sessions = lib.mkOption {
17         type = lib.types.listOf (lib.types.submodule {
18           options = {
19             name = lib.mkOption {
20               type = lib.types.str;
21               example = "socks-peer";
22               description = "Name of the local AutoSSH session";
23             };
24             user = lib.mkOption {
25               type = lib.types.str;
26               example = "bill";
27               description = "Name of the user the AutoSSH session should run as";
28             };
29             monitoringPort = lib.mkOption {
30               type = lib.types.int;
31               default = 0;
32               example = 20000;
33               description = ''
34                 Port to be used by AutoSSH for peer monitoring. Note, that
35                 AutoSSH also uses mport+1. Value of 0 disables the keep-alive
36                 style monitoring
37               '';
38             };
39             extraArguments = lib.mkOption {
40               type = lib.types.separatedString " ";
41               example = "-N -D4343 bill@socks.example.net";
42               description = ''
43                 Arguments to be passed to AutoSSH and retransmitted to SSH
44                 process. Some meaningful options include -N (don't run remote
45                 command), -D (open SOCKS proxy on local port), -R (forward
46                 remote port), -L (forward local port), -v (Enable debug). Check
47                 ssh manual for the complete list.
48               '';
49             };
50           };
51         });
53         default = [];
54         description = ''
55           List of AutoSSH sessions to start as systemd services. Each service is
56           named 'autossh-{session.name}'.
57         '';
59         example = [
60           {
61             name="socks-peer";
62             user="bill";
63             monitoringPort = 20000;
64             extraArguments="-N -D4343 billremote@socks.host.net";
65           }
66         ];
68       };
69     };
71   };
73   ###### implementation
75   config = lib.mkIf (cfg.sessions != []) {
77     systemd.services =
79       lib.foldr ( s : acc : acc //
80         {
81           "autossh-${s.name}" =
82             let
83               mport = if s ? monitoringPort then s.monitoringPort else 0;
84             in
85             {
86               description = "AutoSSH session (" + s.name + ")";
88               after = [ "network.target" ];
89               wantedBy = [ "multi-user.target" ];
91               # To be able to start the service with no network connection
92               environment.AUTOSSH_GATETIME="0";
94               # How often AutoSSH checks the network, in seconds
95               environment.AUTOSSH_POLL="30";
97               serviceConfig = {
98                   User = "${s.user}";
99                   # AutoSSH may exit with 0 code if the SSH session was
100                   # gracefully terminated by either local or remote side.
101                   Restart = "on-success";
102                   ExecStart = "${pkgs.autossh}/bin/autossh -M ${toString mport} ${s.extraArguments}";
103               };
104             };
105         }) {} cfg.sessions;
107     environment.systemPackages = [ pkgs.autossh ];
109   };