1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.epmd;
7
8in
9
10{
11 ###### interface
12 options.services.epmd = {
13 enable = mkOption {
14 type = types.bool;
15 default = false;
16 description = ''
17 Whether to enable socket activation for Erlang Port Mapper Daemon (epmd),
18 which acts as a name server on all hosts involved in distributed
19 Erlang computations.
20 '';
21 };
22 package = mkOption {
23 type = types.package;
24 default = pkgs.erlang;
25 description = ''
26 The Erlang package to use to get epmd binary. That way you can re-use
27 an Erlang runtime that is already installed for other purposes.
28 '';
29 };
30 };
31
32 ###### implementation
33 config = mkIf cfg.enable {
34 systemd.sockets.epmd = rec {
35 description = "Erlang Port Mapper Daemon Activation Socket";
36 wantedBy = [ "sockets.target" ];
37 before = wantedBy;
38 socketConfig = {
39 ListenStream = "4369";
40 Accept = "false";
41 };
42 };
43
44 systemd.services.epmd = {
45 description = "Erlang Port Mapper Daemon";
46 after = [ "network.target" ];
47 requires = [ "epmd.socket" ];
48
49 serviceConfig = {
50 DynamicUser = true;
51 ExecStart = "${cfg.package}/bin/epmd -systemd";
52 Type = "notify";
53 };
54 };
55 };
56
57 meta.maintainers = teams.beam.members;
58}