at 23.05-pre 2.1 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.services.epmd; 7in 8{ 9 ###### interface 10 options.services.epmd = { 11 enable = mkOption { 12 type = types.bool; 13 default = false; 14 description = lib.mdDoc '' 15 Whether to enable socket activation for Erlang Port Mapper Daemon (epmd), 16 which acts as a name server on all hosts involved in distributed 17 Erlang computations. 18 ''; 19 }; 20 package = mkOption { 21 type = types.package; 22 default = pkgs.erlang; 23 defaultText = literalExpression "pkgs.erlang"; 24 description = lib.mdDoc '' 25 The Erlang package to use to get epmd binary. That way you can re-use 26 an Erlang runtime that is already installed for other purposes. 27 ''; 28 }; 29 listenStream = mkOption 30 { 31 type = types.str; 32 default = "[::]:4369"; 33 description = lib.mdDoc '' 34 the listenStream used by the systemd socket. 35 see https://www.freedesktop.org/software/systemd/man/systemd.socket.html#ListenStream= for more informations. 36 use this to change the port epmd will run on. 37 if not defined, epmd will use "[::]:4369" 38 ''; 39 }; 40 }; 41 42 ###### implementation 43 config = mkIf cfg.enable { 44 assertions = [{ 45 assertion = cfg.listenStream == "[::]:4369" -> config.networking.enableIPv6; 46 message = "epmd listens by default on ipv6, enable ipv6 or change config.services.epmd.listenStream"; 47 }]; 48 systemd.sockets.epmd = rec { 49 description = "Erlang Port Mapper Daemon Activation Socket"; 50 wantedBy = [ "sockets.target" ]; 51 before = wantedBy; 52 socketConfig = { 53 ListenStream = cfg.listenStream; 54 Accept = "false"; 55 }; 56 }; 57 58 systemd.services.epmd = { 59 description = "Erlang Port Mapper Daemon"; 60 after = [ "network.target" ]; 61 requires = [ "epmd.socket" ]; 62 63 serviceConfig = { 64 DynamicUser = true; 65 ExecStart = "${cfg.package}/bin/epmd -systemd"; 66 Type = "notify"; 67 }; 68 }; 69 }; 70 71 meta.maintainers = teams.beam.members; 72}