Description

This article shows my take on DHCP server lease script, which creates and deletes static DNS records automatically, based on creation and deletion of DHCP leases. Although, bunch of such scripts is already available, I wanted to have the features I liked merged into one universal script.

Features

  • Creates static DNS records according to assigned DHCP lease.
  • Deletes static DNS records according to unassigned DHCP lease.
  • Deletes all related static DNS records, when new DNS record is being created to prevent duplicates. This can be done by IP and by hostname.
  • DNS records hostname can use additional domain name or use short hostname – or both.
  • Hostname for DNS record can be set from:
    • Variable set from the lease ( $”lease-hostname” ) – quick solution, which uses hostname passed from client
    • Hostname from the lease ( “host-name” attribute ) – a bit more CPU intensive solution, which searches leases for related hostname, but is also more compatible, if previous option is not available
    • Comment of the static lease ( “comment” attribute ) – secure solution, which uses hostname from comment of related static DHCP lease
  • Supports separated deployment on multiple instances of DHCP server within one MikroTik device.

Script

To use the script, just copy-paste it into DHCP Server lease script field ( IP -> DHCP Server -> DHCP (tab) -> DHCP server instance -> Script (tab) -> Lease Script ) or into console editor using “/ip dhcp-server edit default lease-script” or by other means:

# When "1" all DNS entries with IP address of DHCP lease are removed
:local dnsRemoveAllByIp "1"
# When "1" all DNS entries with hostname of DHCP lease are removed
:local dnsRemoveAllByName "1"
# When "1" addition and removal of DNS entries is always done also for non-FQDN hostname
:local dnsAlwaysNonfqdn "1"
# DNS domain to add after DHCP client hostname
:local dnsDomain "dynamic.example.local"
# DNS TTL to set for DNS entries
:local dnsTtl "00:15:00"
# Source of DHCP client hostname, can be "lease-hostname" or any other lease attribute, like "host-name" or "comment"
:local leaseClientHostnameSource "lease-hostname"

:local leaseComment "dhcp-lease-script_$leaseServerName_$leaseClientHostnameSource"
:local leaseClientHostname
:if ($leaseClientHostnameSource = "lease-hostname") do={
  :set leaseClientHostname $"lease-hostname"
} else={
  :set leaseClientHostname ([:pick \
    [/ip dhcp-server lease print as-value where server="$leaseServerName" address="$leaseActIP" mac-address="$leaseActMAC"] \
    0]->"$leaseClientHostnameSource")
}
:local leaseClientHostnameShort "$leaseClientHostname"
:local leaseClientHostnames "$leaseClientHostname"
:if ([:len [$dnsDomain]] > 0) do={
  :set leaseClientHostname "$leaseClientHostname.$dnsDomain"
  :if ($dnsAlwaysNonfqdn = "1") do={
    :set leaseClientHostnames "$leaseClientHostname,$leaseClientHostnameShort"
  }
}
:if ($dnsRemoveAllByIp = "1") do={
  /ip dns static remove [/ip dns static find comment="$leaseComment" and address="$leaseActIP"]
}
:foreach h in=[:toarray value="$leaseClientHostnames"] do={
  :if ($dnsRemoveAllByName = "1") do={
    /ip dns static remove [/ip dns static find comment="$leaseComment" and name="$h"]
  }
  /ip dns static remove [/ip dns static find comment="$leaseComment" and address="$leaseActIP" and name="$h"]
  :if ($leaseBound = "1") do={
    :delay 1
    /ip dns static add comment="$leaseComment" address="$leaseActIP" name="$h" ttl="$dnsTtl"
  }
}

Other Scripts

As mentioned, there are also other scripts with similar functionality – each with a bit different implementation. Maybe some other script will fit your needs better if this one did not, so here are some that I stumbled upon:


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *