mirror of
https://github.com/eworm-de/routeros-scripts.git
synced 2024-05-11 05:55:19 +00:00
91776d3388
* several leases for one mac address (changed client id, different net): -> take address from last lease Most likely this is the same devices which booted different OS or changed to different network. * several leases for one host name: -> take address from first lease We see either different devices with same name or one device with several network interfaces. Keep the first name to mitigate stealing dns name.
68 lines
2.7 KiB
Plaintext
68 lines
2.7 KiB
Plaintext
#!rsc
|
|
# RouterOS script: dhcp-to-dns
|
|
# Copyright (c) 2013-2019 Christian Hesse <mail@eworm.de>
|
|
#
|
|
# check DHCP leases and add/remove/update DNS entries
|
|
|
|
:global CharacterReplace;
|
|
|
|
:global Identity;
|
|
:global Domain;
|
|
:global HostNameInZone;
|
|
|
|
:local Zone;
|
|
:if ($HostNameInZone = true) do={
|
|
:set Zone ("dhcp." . $Identity . "." . $Domain);
|
|
} else={
|
|
:set Zone ("dhcp." . $Domain);
|
|
}
|
|
:local Ttl 5m;
|
|
:local CommentPrefix "managed by dhcp-to-dns for ";
|
|
|
|
:foreach DnsRecord in=[ / ip dns static find where comment ~ $CommentPrefix ] do={
|
|
:local DnsRecordVal [ / ip dns static get $DnsRecord ];
|
|
:local MacAddress [ $CharacterReplace ($DnsRecordVal->"comment") $CommentPrefix "" ];
|
|
:if ([ / ip dhcp-server lease print count-only where mac-address=$MacAddress address=($DnsRecordVal->"address") dynamic=yes ] > 0) do={
|
|
:log debug ("Lease for " . $MacAddress . " (" . $DnsRecordVal->"host-name" . ") still exists. Not deleting DNS entry.");
|
|
} else={
|
|
:local Found false;
|
|
:log info ("Lease expired for " . $MacAddress . " (" . $DnsRecordVal->"name" . "), deleting DNS entry.");
|
|
/ ip dns static remove $DnsRecord;
|
|
}
|
|
}
|
|
|
|
:foreach Lease in=[ / ip dhcp-server lease find where dynamic=yes ] do={
|
|
:local LeaseVal [ / ip dhcp-server lease get $Lease ];
|
|
:local Comment ($CommentPrefix . $LeaseVal->"mac-address");
|
|
:local HostName [ $CharacterReplace ($LeaseVal->"host-name") " " "" ];
|
|
:if ($HostName = "") do={
|
|
:set HostName [ $CharacterReplace ($LeaseVal->"mac-address") ":" "-" ];
|
|
}
|
|
|
|
:local Fqdn ($HostName . "." . $Zone);
|
|
:local DnsRecord [ / ip dns static find where name=$Fqdn ];
|
|
:if ([ :len $DnsRecord ] > 0) do={
|
|
:local DnsIp [ / ip dns static get $DnsRecord address ];
|
|
|
|
:local DupMacLeases [ / ip dhcp-server lease find where mac-address=($LeaseVal->"mac-address") dynamic=yes ];
|
|
:if ([ :len $DupMacLeases ] > 1) do={
|
|
:set ($LeaseVal->"address") [ / ip dhcp-server lease get ($DupMacLeases->([ :len $DupMacLeases ] - 1)) address ];
|
|
}
|
|
|
|
:local DupHostLeases [ / ip dhcp-server lease find where host-name=($LeaseVal->"host-name") dynamic=yes ];
|
|
:if ([ :len $DupHostLeases ] > 1) do={
|
|
:set ($LeaseVal->"address") [ / ip dhcp-server lease get ($DupHostLeases->0) address ];
|
|
}
|
|
|
|
:if ($DnsIp = $LeaseVal->"address") do={
|
|
:log debug ("DNS entry for " . $Fqdn . " does not need updating.");
|
|
} else={
|
|
:log info ("Replacing DNS entry for " . $Fqdn . ", new address is " . $LeaseVal->"address" . ".");
|
|
/ ip dns static set name=$Fqdn address=($LeaseVal->"address") ttl=$Ttl comment=$Comment $DnsRecord;
|
|
}
|
|
} else={
|
|
:log info ("Adding new DNS entry for " . $Fqdn . ", address is " . $LeaseVal->"address" . ".");
|
|
/ ip dns static add name=$Fqdn address=($LeaseVal->"address") ttl=$Ttl comment=$Comment;
|
|
}
|
|
}
|