UPDATE: (I'm using ICH DHCP 4.1)
When using the "on commit" hook, it removes the existing dynamic update so you need to copy that into your "on commit" section, mine now looks like this:
on commit {
if (not static) {
# Setup IPv6 Address
set new-ddns-fwd-name = pick-first-value(ddns-hostname, host-decl-name);
if (exists host-name and option host-name ~~ "^[a-z0-9.-]+$") {
set new-ddns-fwd-name = option host-name;
} elsif (exists dhcp-client-identifier and option dhcp-client-identifier ~~ "^[a-z0-9.-]+$") {
set new-ddns-fwd-name = substring(option dhcp-client-identifier, 1, 50);
} elsif (new-ddns-fwd-name = "") {
set new-ddns-fwd-name = binary-to-ascii (16, 8, "-",
substring (hardware, 1, 6));
}
set ddns-fwd-name = new-ddns-fwd-name;
execute ("/opt/bin/ddns-ipv6", ddns-fwd-name, ucase(
binary-to-ascii(16, 8, ":", substring(hardware, 1, 6))),
binary-to-ascii(10, 8, ".", leased-address));
unset new-ddns-fwd-name;
switch (ns-update (not exists (IN, A, ddns-fwd-name, null),
add (IN, A, ddns-fwd-name, leased-address,
lease-time / 2))) {
default:
unset ddns-fwd-name;
break;
case NOERROR:
set ddns-rev-name =
concat (binary-to-ascii (10, 8, ".", reverse (1, leased-address)), ".",
pick (config-option server.ddns-rev-domainname,
"in-addr.arpa."));
switch (ns-update (delete (IN, PTR, ddns-rev-name, null),
add (IN, PTR, ddns-rev-name, ddns-fwd-name, lease-time / 2)))
{
default:
unset ddns-rev-name;
on release or expiry {
execute ("/opt/bin/ddns-ipv6", "-d", pick-first-value(ddns-hostname, host-decl-name));
switch (ns-update (delete (IN, A, ddns-fwd-name,
leased-address))) {
case NOERROR:
unset ddns-fwd-name;
break;
}
on release or expiry;
}
break;
case NOERROR:
on release or expiry {
execute ("/opt/bin/ddns-ipv6", "-d", pick-first-value(ddns-hostname, host-decl-name));
switch (ns-update (delete (IN, PTR, ddns-rev-name, null))) {
case NOERROR:
unset ddns-rev-name;
break;
}
switch (ns-update (delete (IN, A, ddns-fwd-name,
leased-address))) {
case NOERROR:
unset ddns-fwd-name;
break;
}
on release or expiry;
}
}
break;
}
}
}