Closed mweinelt closed 5 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)
Hey, thanks for chiming in! I'm looking into this in a bit.
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
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
}
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.
Fixed in 62de3676931ef5579fae48a3dfa3d6814f613923, which will soon be released in 0.4.0.
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?