diff options
| author | Gregor Kleen <gkleen@yggdrasil.li> | 2018-04-06 13:14:59 +0200 |
|---|---|---|
| committer | Gregor Kleen <gkleen@yggdrasil.li> | 2018-04-06 13:14:59 +0200 |
| commit | e1b0869fde7c084961fb11c80afc8e6fbe7c7afa (patch) | |
| tree | 2d7f5ac4f6af66312ff5ee10b926eb59b318656b /custom/uucp.nix | |
| parent | 3c0f7675064548b9f1c95f1034cb31d517f5dc9c (diff) | |
| download | nixos-e1b0869fde7c084961fb11c80afc8e6fbe7c7afa.tar nixos-e1b0869fde7c084961fb11c80afc8e6fbe7c7afa.tar.gz nixos-e1b0869fde7c084961fb11c80afc8e6fbe7c7afa.tar.bz2 nixos-e1b0869fde7c084961fb11c80afc8e6fbe7c7afa.tar.xz nixos-e1b0869fde7c084961fb11c80afc8e6fbe7c7afa.zip | |
Overhaul uucp
Diffstat (limited to 'custom/uucp.nix')
| -rw-r--r-- | custom/uucp.nix | 114 |
1 files changed, 87 insertions, 27 deletions
diff --git a/custom/uucp.nix b/custom/uucp.nix index f5b89bfe..61e42119 100644 --- a/custom/uucp.nix +++ b/custom/uucp.nix | |||
| @@ -3,23 +3,72 @@ | |||
| 3 | with lib; | 3 | with lib; |
| 4 | 4 | ||
| 5 | let | 5 | let |
| 6 | portSpec = name: '' | 6 | portSpec = name: node: concatStringsSep "\n" (mapAttrsToList (portName: port: '' |
| 7 | port ${name} | 7 | port ${name}.${portName} |
| 8 | type pipe | 8 | type pipe |
| 9 | protocol ${if builtins.hasAttr name cfg.protocols then cfg.protocols."${name}" else cfg.defaultProtocol} | 9 | protocol ${node.protocols} |
| 10 | reliable true | 10 | reliable true |
| 11 | command ${pkgs.openssh}/bin/ssh -x -o batchmode=yes ${name} | 11 | command ${pkgs.openssh}/bin/ssh -x -o batchmode=yes ${name}.${portName} |
| 12 | ''; | 12 | '') node.hostnames); |
| 13 | sysSpec = name: '' | 13 | sysSpec = name: '' |
| 14 | system ${name} | 14 | system ${name} |
| 15 | time Any | 15 | time Any |
| 16 | port ${name} | ||
| 17 | chat "" | 16 | chat "" |
| 18 | protocol ${if builtins.hasAttr name cfg.protocols then cfg.protocols."${name}" else cfg.defaultProtocol} | ||
| 19 | command-path ${concatStringsSep " " cfg.commandPath} | 17 | command-path ${concatStringsSep " " cfg.commandPath} |
| 20 | commands ${concatStringsSep " " (if builtins.hasAttr name cfg.commands then unique (cfg.defaultCommands ++ cfg.commands."${name}") else cfg.defaultCommands)} | 18 | commands ${concatStringsSep " " node.commands} |
| 19 | ${concatStringsSep "\nalternate\n" (mapAttrsToList (portName: port: '' | ||
| 20 | port ${name}.${portName} | ||
| 21 | '') node.hostnames)} | ||
| 22 | ''; | ||
| 23 | sshConfig = name: node: concatStringsSep "\n" (mapAttrsToList (portName: port: '' | ||
| 24 | Host ${name}.${portName} | ||
| 25 | Hostname ${port} | ||
| 26 | IdentitiesOnly Yes | ||
| 27 | IdentityFile ${cfg.sshKeyDir}/${name}.pub | ||
| 28 | '') node.hostnames); | ||
| 29 | sshKeyGen = name: node: '' | ||
| 30 | if [[ ! -e ${cfg.sshKeyDir}/${name} ]]; then | ||
| 31 | ssh-keygen ${escapeShellArgs node.generateKey} -f ${cfg.sshKeyDir}/${name} | ||
| 32 | fi | ||
| 33 | ''; | ||
| 34 | restrictKey = key: '' | ||
| 35 | restrict,command="${config.security.wrapperDir}/uucico" ${key} | ||
| 21 | ''; | 36 | ''; |
| 22 | 37 | ||
| 38 | nodeCfg = { | ||
| 39 | options = { | ||
| 40 | commands = mkOption { | ||
| 41 | type = types.listOf types.string; | ||
| 42 | default = cfg.defaultCommands; | ||
| 43 | description = "Commands to allow for this remote"; | ||
| 44 | }; | ||
| 45 | |||
| 46 | protocols = mkOption { | ||
| 47 | type = types.string; | ||
| 48 | default = cfg.defaultProtocols; | ||
| 49 | description = "UUCP protocols to use for this remote"; | ||
| 50 | }; | ||
| 51 | |||
| 52 | publicKeys = mkOption { | ||
| 53 | type = types.listOf types.string; | ||
| 54 | default = []; | ||
| 55 | description = "SSH public keys for this node"; | ||
| 56 | }; | ||
| 57 | |||
| 58 | generateKey = mkOption { | ||
| 59 | type = types.listOf types.string; | ||
| 60 | default = [ "-t ed25519" ]; | ||
| 61 | description = "Arguments to pass to `ssh-keygen` to generate a keypair for communication with this host"; | ||
| 62 | }; | ||
| 63 | |||
| 64 | hostnames = mkOption { | ||
| 65 | type = types.attrsOf types.string; | ||
| 66 | default = {}; | ||
| 67 | description = ""; | ||
| 68 | }; | ||
| 69 | }; | ||
| 70 | }; | ||
| 71 | |||
| 23 | cfg = config.services.uucp; | 72 | cfg = config.services.uucp; |
| 24 | in { | 73 | in { |
| 25 | options = { | 74 | options = { |
| @@ -44,14 +93,14 @@ in { | |||
| 44 | description = "Overrides for the local uucp linux-user"; | 93 | description = "Overrides for the local uucp linux-user"; |
| 45 | }; | 94 | }; |
| 46 | 95 | ||
| 47 | sshConfig = mkOption { | 96 | extraSSHConfig = mkOption { |
| 48 | type = types.str; | 97 | type = types.str; |
| 49 | default = ""; | 98 | default = ""; |
| 50 | description = "~uucp/.ssh/config"; | 99 | description = "Extra SSH config"; |
| 51 | }; | 100 | }; |
| 52 | 101 | ||
| 53 | remoteNodes = mkOption { | 102 | remoteNodes = mkOption { |
| 54 | type = types.listOf types.str; | 103 | type = types.attrsOf (types.submodule nodeCfg); |
| 55 | default = {}; | 104 | default = {}; |
| 56 | description = '' | 105 | description = '' |
| 57 | Ports to set up | 106 | Ports to set up |
| @@ -73,22 +122,22 @@ in { | |||
| 73 | description = "Commands allowed for remotes without explicit override"; | 122 | description = "Commands allowed for remotes without explicit override"; |
| 74 | }; | 123 | }; |
| 75 | 124 | ||
| 76 | commands = mkOption { | 125 | defaultProtocols = mkOption { |
| 77 | type = types.attrsOf (types.listOf types.string); | ||
| 78 | default = {}; | ||
| 79 | description = "Override commands for specific remotes"; | ||
| 80 | }; | ||
| 81 | |||
| 82 | defaultProtocol = mkOption { | ||
| 83 | type = types.string; | 126 | type = types.string; |
| 84 | default = "e"; | 127 | default = "e"; |
| 85 | description = "UUCP protocol to use within ssh unless overriden"; | 128 | description = "UUCP protocol to use within ssh unless overriden"; |
| 86 | }; | 129 | }; |
| 87 | 130 | ||
| 88 | protocols = mkOption { | 131 | homeDir = mkOption { |
| 89 | type = types.attrsOf types.string; | 132 | type = types.path; |
| 90 | default = {}; | 133 | default = "/var/uucp"; |
| 91 | description = "UUCP protocols to use for specific remotes"; | 134 | description = "Home of the uucp user"; |
| 135 | }; | ||
| 136 | |||
| 137 | sshKeyDir = mkOption { | ||
| 138 | type = types.path; | ||
| 139 | default = "${cfg.homeDir}/.ssh/"; | ||
| 140 | description = "Directory to store ssh keypairs"; | ||
| 92 | }; | 141 | }; |
| 93 | 142 | ||
| 94 | spoolDir = mkOption { | 143 | spoolDir = mkOption { |
| @@ -184,16 +233,27 @@ in { | |||
| 184 | isSystemUser = true; | 233 | isSystemUser = true; |
| 185 | isNormalUser = false; | 234 | isNormalUser = false; |
| 186 | createHome = true; | 235 | createHome = true; |
| 187 | home = cfg.spoolDir; | 236 | home = cfg.homeDir; |
| 188 | description = "User for uucp over ssh"; | 237 | description = "User for uucp over ssh"; |
| 189 | useDefaultShell = true; | 238 | useDefaultShell = true; |
| 239 | openssh.authorizedKeys.keys = map restrictKey (concat (mapAttrsToList (name: node: node.publicKeys) cfg.remoteNodes)); | ||
| 190 | } // cfg.sshUser; | 240 | } // cfg.sshUser; |
| 191 | 241 | ||
| 192 | system.activationScripts."uucp-sshconfig" = '' | 242 | system.activationScripts."uucp-sshconfig" = '' |
| 193 | mkdir -p ${config.users.users."uucp".home}/.ssh | 243 | mkdir -p ${config.users.users."uucp".home}/.ssh |
| 194 | chown ${config.users.users."uucp".name}:${config.users.users."uucp".group} ${config.users.users."uucp".home}/.ssh | 244 | chown ${config.users.users."uucp".name}:${config.users.users."uucp".group} ${config.users.users."uucp".home}/.ssh |
| 195 | chmod 700 ${config.users.users."uucp".home}/.ssh | 245 | chmod 700 ${config.users.users."uucp".home}/.ssh |
| 196 | ln -fs ${builtins.toFile "ssh-config" cfg.sshConfig} ${config.users.users."uucp".home}/.ssh/config | 246 | ln -fs ${builtins.toFile "ssh-config" '' |
| 247 | ${concatStringsSpec "\n" (mapAttrsToList sshConfig cfg.remoteNodes)} | ||
| 248 | |||
| 249 | ${cfg.extraSSHConfig} | ||
| 250 | ''} ${config.users.users."uucp".home}/.ssh/config | ||
| 251 | |||
| 252 | mkdir -p ${cfg.sshKeyDir} | ||
| 253 | chown ${config.users.users."uucp".name}:${config.users.users."uucp".group} ${cfg.sshKeyDir} | ||
| 254 | chmod 700 ${config.sshKeyDir} | ||
| 255 | |||
| 256 | ${concatStringsSep "\n" (mapAttrsToList sshKeyGen cfg.remoteNodes)} | ||
| 197 | ''; | 257 | ''; |
| 198 | 258 | ||
| 199 | system.activationScripts."uucp-logs" = '' | 259 | system.activationScripts."uucp-logs" = '' |
| @@ -213,10 +273,10 @@ in { | |||
| 213 | port ssh | 273 | port ssh |
| 214 | type stdin | 274 | type stdin |
| 215 | protocol e | 275 | protocol e |
| 216 | '' + concatStringsSep "\n" (map portSpec cfg.remoteNodes); | 276 | '' + concatStringsSep "\n" (mapAttrsToList portSpec cfg.remoteNodes); |
| 217 | }; | 277 | }; |
| 218 | environment.etc."uucp/sys" = { | 278 | environment.etc."uucp/sys" = { |
| 219 | text = cfg.extraSys + "\n" + concatStringsSep "\n" (map sysSpec cfg.remoteNodes); | 279 | text = cfg.extraSys + "\n" + concatStringsSep "\n" (mapAttrsToList sysSpec cfg.remoteNodes); |
| 220 | }; | 280 | }; |
| 221 | 281 | ||
| 222 | security.wrappers = let | 282 | security.wrappers = let |
| @@ -301,7 +361,7 @@ in { | |||
| 301 | 361 | ||
| 302 | case "''${2}" in | 362 | case "''${2}" in |
| 303 | (?(vpn-)up) | 363 | (?(vpn-)up) |
| 304 | ${concatMapStringsSep "\n " (name: "${pkgs.systemd}/bin/systemctl start uucico@${name}.service") cfg.remoteNodes} | 364 | ${concatStringsSep "\n " (mapAttrsToList (name: node: "${pkgs.systemd}/bin/systemctl start uucico@${name}.service") cfg.remoteNodes)} |
| 305 | ;; | 365 | ;; |
| 306 | esac | 366 | esac |
| 307 | ''; | 367 | ''; |
