about summary refs log tree commit diff
path: root/nixpkgs/nixos/modules/services/networking/gobgpd.nix
blob: f1e2095708f97663a662965daf23bec84c6b18a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
{ config, pkgs, lib, ... }:

with lib;

let
  cfg = config.services.gobgpd;
  format = pkgs.formats.toml { };
  confFile = format.generate "gobgpd.conf" cfg.settings;
in {
  options.services.gobgpd = {
    enable = mkEnableOption "GoBGP Routing Daemon";

    settings = mkOption {
      type = format.type;
      default = { };
      description = lib.mdDoc ''
        GoBGP configuration. Refer to
        <https://github.com/osrg/gobgp#documentation>
        for details on supported values.
      '';
      example = literalExpression ''
        {
          global = {
            config = {
              as = 64512;
              router-id = "192.168.255.1";
            };
          };
          neighbors = [
            {
              config = {
                neighbor-address = "10.0.255.1";
                peer-as = 65001;
              };
            }
            {
              config = {
                neighbor-address = "10.0.255.2";
                peer-as = 65002;
              };
            }
          ];
        }
      '';
    };
  };

  config = mkIf cfg.enable {
    environment.systemPackages = [ pkgs.gobgpd ];
    systemd.services.gobgpd = {
      wantedBy = [ "multi-user.target" ];
      after = [ "network.target" ];
      description = "GoBGP Routing Daemon";
      serviceConfig = {
        Type = "notify";
        ExecStartPre = "${pkgs.gobgpd}/bin/gobgpd -f ${confFile} -d";
        ExecStart = "${pkgs.gobgpd}/bin/gobgpd -f ${confFile} --sdnotify";
        ExecReload = "${pkgs.gobgpd}/bin/gobgpd -r";
        DynamicUser = true;
        AmbientCapabilities = "cap_net_bind_service";
      };
    };
  };
}