# MikroTik (RouterOS) script for automatically setting DNS records # for clients when they obtain a DHCP lease. # # author SmartFinn # based on https://github.com/karrots/ROS-DDNS :local domain; :local fqdn; :local hostname; :local safeHostname; :local token "$leaseServerName-$leaseActMAC"; :local ttl [/ip dhcp-server get $leaseServerName lease-time]; # Getting the domain name from DHCP server. If a domain name is not # specified will use hostname only /ip dhcp-server network { :do { :set domain [get [find where ($leaseActIP in address)] domain]; # Add a dot before domain name :set domain ("." . $domain); } on-error={ :set domain ""; }; }; :if ($leaseBound = 1) do={ :log debug "$leaseServerName: Processing bound lease $leaseActMAC ($leaseActIP)"; /ip dhcp-server lease { :set hostname [get [find active-mac-address=$leaseActMAC] host-name]; }; # Delete unallowed chars from the hostname :for i from=0 to=([:len $hostname]-1) do={ :local char [:pick $hostname $i]; :if ($char~"[a-zA-Z0-9-]") do={ :set safeHostname ($safeHostname . $char); }; }; :if ([:len $safeHostname] > 0) do={ :set fqdn ($safeHostname . $domain); /ip dns static { :local itemId [find name=$fqdn]; :if ($itemId != "") do={ # This DNS entry already exists :if ([get $itemId comment] = $token) do={ :if ([get $itemId address] != $leaseActIP) do={ set $itemId address=$leaseActIP ttl=$ttl; :log info "Update DNS entry: $fqdn -> $leaseActIP ($leaseActMAC)"; }; } else={ :log warning "Cannot to add DNS entry. $fqdn already exists"; }; } else={ # Add DNS entry if it does not exist add name=$fqdn address=$leaseActIP ttl=$ttl comment=$token; :log info "Add DNS entry: $fqdn -> $leaseActIP ($leaseActMAC)"; }; }; }; } else={ # Remove entry when lease expires ($leaseBound=0) :log debug "$leaseServerName: Processing deassigned lease $leaseActMAC ($leaseActIP)"; /ip dns static { :local itemId [find comment=$token]; :if ($itemId != "") do={ :set fqdn ([get $itemId name]); remove $itemId; :log info "Remove DNS entry: $fqdn -> $leaseActIP ($leaseActMAC)"; }; }; };