dtype.org
Log in

Difference between revisions of "Mikrotik configs"

From dtype.org
(DHCP to DNS by cron)
(DHCP to DNS by cron)
Line 47: Line 47:
 
}</nowiki>
 
}</nowiki>
  
== DHCP to DNS by cron ==
+
:local domains [:toarray "m"]
 
 
Thanks to Daniel Aleksandersen for the article at https://www.ctrl.blog/entry/routeros-dhcp-lease-script.html for the start to this.
 
 
 
<nowiki>:local domains [:toarray "m"]
 
 
:local dnsttl "10m"
 
:local dnsttl "10m"
  
Line 85: Line 81:
 
     /ip dns static remove $dnsentry
 
     /ip dns static remove $dnsentry
 
   }
 
   }
}</nowiki>
+
}

Revision as of 02:23, 6 October 2021

DHCP to DNS 1

From: https://blog.pessoft.com/2019/09/06/mikrotik-script-automatic-dns-records-from-dhcp-leases/

# 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 leaseClientHostnames "$leaseClientHostname"
:if ([:len [$dnsDomain]] > 0) do={
  :if ($dnsAlwaysNonfqdn = "1") do={
    :set leaseClientHostnames "$leaseClientHostname.$dnsDomain,$leaseClientHostname"
  } else={
    :set leaseClientHostnames "$leaseClientHostname.$dnsDomain"
  }
}
: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"
  }
}
local domains [:toarray "m"]
local dnsttl "10m"
local magiccomment "automatic-from-dhcp (magic comment)"
local activehosts [:toarray ""]
foreach lease in [/ip dhcp-server lease find] do={
 :local hostname [/ip dhcp-server lease get value-name=comment $lease]
 :if ([:len $hostname] < 1) do={
   :set hostname [/ip dhcp-server lease get value-name=host-name $lease]
 }
 :local hostaddr [/ip dhcp-server lease get value-name=active-address $lease]
 :if (([:len $hostname] > 0) && ([:len $hostaddr] > 0)) do={
   :foreach domain in $domains do={
     :local regdomain "$hostname.$domain"
     :set activehosts ($activehosts, $regdomain)
     :if ([:len [/ip dns static find where name=$regdomain]] = 0) do={
       /ip dns static add name=$regdomain address=$hostaddr comment=$magiccomment ttl=$dnsttl
     } else={
       :if ([:len [/ip dns static find where name=$regdomain comment=$magiccomment]] = 1) do={
         /ip dns static set address=$hostaddr [/ip dns static find name=$regdomain comment=$magiccomment]
       }
     }
   }
 }

}

foreach dnsentry in [/ip dns static find where comment=$magiccomment] do={
 :local hostname [/ip dns static get value-name=name $dnsentry]
 :if ([:type [:find $activehosts $hostname]] = "nil") do={
   /ip dns static remove $dnsentry
 }

}