mweinelt / kea-exporter

Export Kea Metrics in the Prometheus Exposition Format
MIT License
33 stars 17 forks source link

Support for multiple configuration files #2

Closed mweinelt closed 5 years ago

mweinelt commented 6 years ago

Users may want to split configuration into multiple files, usually one for DHCP4 and one for DHCP6. What should the CLI look like for that?

espro commented 6 years ago

I feel like the simpler method here would be to manually specify your socket paths for 4/6 and register the inotify on the socket files. The mtime will update on a reload which is necessary when a config file changes, and it means that in setups where the kea configuration is complicated and managed through a lot of includes (e.g., mine 😄), you catch all cases (e.g., a new configuration file is added). Instead of reading in the config files on start/inotify event, you use the built-in API query config-get on each service (i.e., dhcp4, dhcp6)

mweinelt commented 6 years ago

Hey, thanks for chiming in! I'm looking into this in a bit.

mweinelt commented 6 years ago

I currently only have a Kea 1.1.0 on Debian Stretch and it doesn't have config-get yet. Looking at Kea's release notes we see that the following features were added in 1.2.0:

new commands - a number of new commands have been implemented. In particular, it is now possible to update (config-set), retrieve (config-get) or write the current configuration to disk (config-write). It is possible to list supported command (list-commands), check version (version-get) information or compilation details that cover dependencies versions (build-report) and more. Commands previously available only over command channel API are now also available over REST API.

http://kea.isc.org/wiki/KeaReleaseNotes120

idea

We can use version-get to determine if the Kea version supports config-get. If it does not we'll receive:

{"command": "version-get"}
{ "result": 1, "text": "'version-get' command not supported." }

If it works, we'll receive:

{"command": "version-get"}
{ "arguments": { "extended": "1.3.0\ntarball\nlinked with:\nlog4cplus 1.2.1\nBotan 2.4.0 (release, dated 20180108, revision git:1e93b85fb5a4d628b80a9812b38b842b5c8b4363, distribution unspecified)\ndatabase:\nMySQL backend 5.1, library 10.1.31-MariaDB\nPostgreSQL backend 3.1, library 100003\nMemfile backend 2.0" }, "result": 0, "text": "1.3.0" }

If result==0 we should be able to use config-get and parse that instead of the config file.

The default configuration returned looks like this:

{"command": "config-get"}
{ "arguments": { "Dhcp6": { "control-socket": { "socket-name": "/tmp/kea-dhcp6-ctrl.sock", "socket-type": "unix" }, "decline-probation-period": 86400, "dhcp-ddns": { "always-include-fqdn": false, "enable-updates": false, "generated-prefix": "myhost", "max-queue-size": 1024, "ncr-format": "JSON", "ncr-protocol": "UDP", "override-client-update": false, "override-no-update": false, "qualifying-suffix": "", "replace-client-name": "never", "sender-ip": "0.0.0.0", "sender-port": 0, "server-ip": "127.0.0.1", "server-port": 53001 }, "dhcp4o6-port": 0, "expired-leases-processing": { "flush-reclaimed-timer-wait-time": 25, "hold-reclaimed-time": 3600, "max-reclaim-leases": 100, "max-reclaim-time": 250, "reclaim-timer-wait-time": 10, "unwarned-reclaim-cycles": 5 }, "hooks-libraries": [  ], "host-reservation-identifiers": [ "hw-address", "duid" ], "interfaces-config": { "interfaces": [  ], "re-detect": true }, "lease-database": { "lfc-interval": 3600, "type": "memfile" }, "mac-sources": [ "any" ], "option-data": [ { "always-send": false, "code": 23, "csv-format": true, "data": "2001:db8:2::45, 2001:db8:2::100", "name": "dns-servers", "space": "dhcp6" }, { "always-send": false, "code": 12, "csv-format": true, "data": "2001:db8::1", "name": "unicast", "space": "dhcp6" }, { "always-send": false, "code": 41, "csv-format": true, "data": "EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00", "name": "new-posix-timezone", "space": "dhcp6" }, { "always-send": false, "code": 7, "csv-format": true, "data": "0xf0", "name": "preference", "space": "dhcp6" }, { "always-send": false, "code": 60, "csv-format": true, "data": "root=/dev/sda2, quiet, splash", "name": "bootfile-param", "space": "dhcp6" } ], "option-def": [  ], "relay-supplied-options": [ "65" ], "server-id": { "enterprise-id": 0, "htype": 0, "identifier": "", "persist": true, "time": 0, "type": "LLT" }, "shared-networks": [  ], "subnet6": [ { "id": 1, "option-data": [ { "always-send": false, "code": 23, "csv-format": false, "data": "20010DB80002000000000000DEADBEEF20010DB80002000000000000CAFEBABE", "name": "dns-servers", "space": "dhcp6" } ], "pd-pools": [ { "delegated-len": 64, "option-data": [  ], "prefix": "2001:db8:8::", "prefix-len": 56 } ], "pools": [ { "option-data": [  ], "pool": "2001:db8:1::/80" } ], "preferred-lifetime": 3000, "rapid-commit": false, "rebind-timer": 2000, "relay": { "ip-address": "::" }, "renew-timer": 1000, "reservation-mode": "all", "reservations": [ { "client-classes": [ "office", "special_snowflake" ], "hostname": "", "hw-address": "00:01:02:03:04:05", "ip-addresses": [ "2001:db8:1::101" ], "option-data": [ { "always-send": false, "code": 23, "csv-format": true, "data": "3000:1::234", "name": "dns-servers", "space": "dhcp6" }, { "always-send": false, "code": 27, "csv-format": true, "data": "3000:1::234", "name": "nis-servers", "space": "dhcp6" } ], "prefixes": [  ] }, { "client-classes": [  ], "duid": "01:02:03:04:05:06:07:08:09:0a", "hostname": "foo.example.com", "ip-addresses": [ "2001:db8:1:cafe::1" ], "option-data": [ { "always-send": false, "code": 17, "csv-format": true, "data": "4491", "name": "vendor-opts", "space": "dhcp6" }, { "always-send": false, "code": 32, "csv-format": true, "data": "3000:1::234", "name": "tftp-servers", "space": "vendor-4491" } ], "prefixes": [ "2001:db8:2:abcd::/64" ] }, { "client-classes": [  ], "duid": "01:02:03:04:05:0a:0b:0c:0d:0e", "hostname": "", "ip-addresses": [ "2001:db8:1::100" ], "option-data": [  ], "prefixes": [  ] }, { "client-classes": [  ], "flex-id": "736F6D6576616C7565", "hostname": "", "ip-addresses": [ "2001:db8:1:cafe::2" ], "option-data": [  ], "prefixes": [  ] } ], "subnet": "2001:db8:1::/64", "valid-lifetime": 4000 } ] }, "Logging": { "loggers": [ { "debuglevel": 0, "name": "kea-dhcp6", "output_options": [ { "flush": true, "maxsize": 10240000, "maxver": 1, "output": "/var/log/kea-dhcp6.log" } ], "severity": "INFO" } ] } }, "result": 0 }

and prettified

{
  "arguments": {
    "Dhcp6": {
      "control-socket": {
        "socket-name": "/tmp/kea-dhcp6-ctrl.sock",
        "socket-type": "unix"
      },
      "decline-probation-period": 86400,
      "dhcp-ddns": {
        "always-include-fqdn": false,
        "enable-updates": false,
        "generated-prefix": "myhost",
        "max-queue-size": 1024,
        "ncr-format": "JSON",
        "ncr-protocol": "UDP",
        "override-client-update": false,
        "override-no-update": false,
        "qualifying-suffix": "",
        "replace-client-name": "never",
        "sender-ip": "0.0.0.0",
        "sender-port": 0,
        "server-ip": "127.0.0.1",
        "server-port": 53001
      },
      "dhcp4o6-port": 0,
      "expired-leases-processing": {
        "flush-reclaimed-timer-wait-time": 25,
        "hold-reclaimed-time": 3600,
        "max-reclaim-leases": 100,
        "max-reclaim-time": 250,
        "reclaim-timer-wait-time": 10,
        "unwarned-reclaim-cycles": 5
      },
      "hooks-libraries": [],
      "host-reservation-identifiers": [
        "hw-address",
        "duid"
      ],
      "interfaces-config": {
        "interfaces": [],
        "re-detect": true
      },
      "lease-database": {
        "lfc-interval": 3600,
        "type": "memfile"
      },
      "mac-sources": [
        "any"
      ],
      "option-data": [
        {
          "always-send": false,
          "code": 23,
          "csv-format": true,
          "data": "2001:db8:2::45, 2001:db8:2::100",
          "name": "dns-servers",
          "space": "dhcp6"
        },
        {
          "always-send": false,
          "code": 12,
          "csv-format": true,
          "data": "2001:db8::1",
          "name": "unicast",
          "space": "dhcp6"
        },
        {
          "always-send": false,
          "code": 41,
          "csv-format": true,
          "data": "EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00",
          "name": "new-posix-timezone",
          "space": "dhcp6"
        },
        {
          "always-send": false,
          "code": 7,
          "csv-format": true,
          "data": "0xf0",
          "name": "preference",
          "space": "dhcp6"
        },
        {
          "always-send": false,
          "code": 60,
          "csv-format": true,
          "data": "root=/dev/sda2, quiet, splash",
          "name": "bootfile-param",
          "space": "dhcp6"
        }
      ],
      "option-def": [],
      "relay-supplied-options": [
        "65"
      ],
      "server-id": {
        "enterprise-id": 0,
        "htype": 0,
        "identifier": "",
        "persist": true,
        "time": 0,
        "type": "LLT"
      },
      "shared-networks": [],
      "subnet6": [
        {
          "id": 1,
          "option-data": [
            {
              "always-send": false,
              "code": 23,
              "csv-format": false,
              "data": "20010DB80002000000000000DEADBEEF20010DB80002000000000000CAFEBABE",
              "name": "dns-servers",
              "space": "dhcp6"
            }
          ],
          "pd-pools": [
            {
              "delegated-len": 64,
              "option-data": [],
              "prefix": "2001:db8:8::",
              "prefix-len": 56
            }
          ],
          "pools": [
            {
              "option-data": [],
              "pool": "2001:db8:1::/80"
            }
          ],
          "preferred-lifetime": 3000,
          "rapid-commit": false,
          "rebind-timer": 2000,
          "relay": {
            "ip-address": "::"
          },
          "renew-timer": 1000,
          "reservation-mode": "all",
          "reservations": [
            {
              "client-classes": [
                "office",
                "special_snowflake"
              ],
              "hostname": "",
              "hw-address": "00:01:02:03:04:05",
              "ip-addresses": [
                "2001:db8:1::101"
              ],
              "option-data": [
                {
                  "always-send": false,
                  "code": 23,
                  "csv-format": true,
                  "data": "3000:1::234",
                  "name": "dns-servers",
                  "space": "dhcp6"
                },
                {
                  "always-send": false,
                  "code": 27,
                  "csv-format": true,
                  "data": "3000:1::234",
                  "name": "nis-servers",
                  "space": "dhcp6"
                }
              ],
              "prefixes": []
            },
            {
              "client-classes": [],
              "duid": "01:02:03:04:05:06:07:08:09:0a",
              "hostname": "foo.example.com",
              "ip-addresses": [
                "2001:db8:1:cafe::1"
              ],
              "option-data": [
                {
                  "always-send": false,
                  "code": 17,
                  "csv-format": true,
                  "data": "4491",
                  "name": "vendor-opts",
                  "space": "dhcp6"
                },
                {
                  "always-send": false,
                  "code": 32,
                  "csv-format": true,
                  "data": "3000:1::234",
                  "name": "tftp-servers",
                  "space": "vendor-4491"
                }
              ],
              "prefixes": [
                "2001:db8:2:abcd::/64"
              ]
            },
            {
              "client-classes": [],
              "duid": "01:02:03:04:05:0a:0b:0c:0d:0e",
              "hostname": "",
              "ip-addresses": [
                "2001:db8:1::100"
              ],
              "option-data": [],
              "prefixes": []
            },
            {
              "client-classes": [],
              "flex-id": "736F6D6576616C7565",
              "hostname": "",
              "ip-addresses": [
                "2001:db8:1:cafe::2"
              ],
              "option-data": [],
              "prefixes": []
            }
          ],
          "subnet": "2001:db8:1::/64",
          "valid-lifetime": 4000
        }
      ]
    },
    "Logging": {
      "loggers": [
        {
          "debuglevel": 0,
          "name": "kea-dhcp6",
          "output_options": [
            {
              "flush": true,
              "maxsize": 10240000,
              "maxver": 1,
              "output": "/var/log/kea-dhcp6.log"
            }
          ],
          "severity": "INFO"
        }
      ]
    }
  },
  "result": 0
}
mweinelt commented 5 years ago

The mtime will update on a reload

That does not seem to hold true, I can't register any changes to the socket file, after reloading a changed configuration.

mweinelt commented 5 years ago

Fixed in 62de3676931ef5579fae48a3dfa3d6814f613923, which will soon be released in 0.4.0.