Этот скрипт предназначен для работы в качестве lease-скрипта DHCP-сервера и управляет (регистрирует или удаляет) статические DNS-записи в соответствии с выделением или истечением аренды DHCP. Скрипт регистрирует только полностью квалифицированные доменные имена (FQDN). Часть имени хоста в регистрируемом FQDN — это значение свойства «host-name» аренды или свойства «comment», если «host-name» пустое. Часть домена — это значение свойства «domain» соответствующей сети DHCP-сервера. Скрипт не регистрирует DNS-записи с некорректными FQDN, у которых пустая или неопределённая часть хоста или домена. Также скрипт не регистрирует DNS-запись, если запись с таким же IP-адресом или FQDN уже существует в статической DNS-базе маршрутизатора. Управляемые скриптом статические DNS-записи имеют тег #DHCP в комментарии, чтобы отличать их от созданных вручную. TTL регистрируемой DNS-записи совпадает с TTL соответствующей аренды DHCP. При истечении аренды DHCP скрипт удаляет соответствующую DNS-запись с таким же IP-адресом, помеченную комментарием #DHCP. Скрипт логирует различные ошибки и информационные сообщения с тегом DHCP2DNS. Логируемые сообщения понятны сами по себе. Скрипт должен быть создан как стандартный системный скрипт. Чтобы скрипт запускался для данного DHCP-сервера, его имя должно быть назначено свойству «lease-script» этого сервера. Исходный код далее:
:local DHCPtag
:set DHCPtag "#DHCP"
:if ( [ :len $leaseActIP ] <= 0 ) do={ :error "пустой адрес аренды" }
:if ( $leaseBound = 1 ) do=\
{
:local ttl
:local domain
:local hostname
:local fqdn
:local leaseId
:local comment
/ip dhcp-server
:set ttl [ get [ find name=$leaseServerName ] lease-time ]
network
:set domain [ get [ find $leaseActIP in address ] domain ]
.. lease
:set leaseId [ find address=$leaseActIP ]
# Проверка на множественные активные аренды для одного IP. Странно, но на всякий случай.
:if ( [ :len $leaseId ] != 1) do=\
{
:log info "DHCP2DNS: не регистрируем доменное имя для адреса $leaseActIP из-за множественных активных аренд для $leaseActIP"
:error "множественные активные аренды для $leaseActIP"
}
:set hostname [ get $leaseId host-name ]
:set comment [ get $leaseId comment ]
/
:if ( [ :len $hostname ] <= 0 ) do={ :set hostname $comment }
:if ( [ :len $hostname ] <= 0 ) do=\
{
:log error "DHCP2DNS: не регистрируем доменное имя для адреса $leaseActIP из-за пустого host-name или comment аренды"
:error "пустое host-name или comment аренды"
}
:if ( [ :len $domain ] <= 0 ) do=\
{
:log error "DHCP2DNS: не регистрируем доменное имя для адреса $leaseActIP из-за пустого доменного имени сети"
:error "пустое доменное имя сети"
}
:set fqdn "$hostname.$domain"
/ip dns static
:if ( [ :len [ find name=$fqdn and address=$leaseActIP and disabled=no ] ] = 0 ) do=\
{
:log info "DHCP2DNS: регистрируем статическое доменное имя $fqdn для адреса $leaseActIP с ttl $ttl"
add address=$leaseActIP name=$fqdn ttl=$ttl comment=$DHCPtag disabled=no
} else=\
{
:log error "DHCP2DNS: не регистрируем доменное имя $fqdn для адреса $leaseActIP, так как уже существует активная статическая DNS-запись с таким именем или адресом"
}
/
} \
else=\
{
/ip dns static
:local dnsDhcpId
:set dnsDhcpId [ find address=$leaseActIP and comment=$DHCPtag ]
:if ( [ :len $dnsDhcpId ] > 0 ) do=\
{
:log info "DHCP2DNS: удаляем статическое доменное имя(ена) для адреса $leaseActIP"
remove $dnsDhcpId
}
/
}
:local DHCPtag
:set DHCPtag "#DHCP"
:if ( [ :len $leaseActIP ] <= 0 ) do={ :error "пустой адрес аренды" }
:if ( $leaseBound = 1 ) do=\
{
:local ttl
:local domain
:local hostname
:local fqdn
:local leaseId
:local comment
/ip dhcp-server
:set ttl [ get [ find name=$leaseServerName ] lease-time ]
network
:set domain [ get [ find $leaseActIP in address ] domain ]
.. lease
:set leaseId [ find address=$leaseActIP ]
# Проверка на множественные активные аренды для одного IP. Странно, но на всякий случай.
:if ( [ :len $leaseId ] != 1) do=\
{
:log info "DHCP2DNS: не регистрируем доменное имя для адреса $leaseActIP из-за множественных активных аренд для $leaseActIP"
:error "множественные активные аренды для $leaseActIP"
}
:set hostname [ get $leaseId host-name ]
:set comment [ get $leaseId comment ]
/
:if ( [ :len $hostname ] <= 0 ) do={ :set hostname $comment }
:if ( [ :len $hostname ] <= 0 ) do=\
{
:log error "DHCP2DNS: не регистрируем доменное имя для адреса $leaseActIP из-за пустого host-name или comment аренды"
:error "пустое host-name или comment аренды"
}
:if ( [ :len $domain ] <= 0 ) do=\
{
:log error "DHCP2DNS: не регистрируем доменное имя для адреса $leaseActIP из-за пустого доменного имени сети"
:error "пустое доменное имя сети"
}
:set fqdn "$hostname.$domain"
/ip dns static
:if ( [ :len [ find name=$fqdn and address=$leaseActIP and disabled=no ] ] = 0 ) do=\
{
:log info "DHCP2DNS: регистрируем статическое доменное имя $fqdn для адреса $leaseActIP с ttl $ttl"
add address=$leaseActIP name=$fqdn ttl=$ttl comment=$DHCPtag disabled=no
} else=\
{
:log error "DHCP2DNS: не регистрируем доменное имя $fqdn для адреса $leaseActIP, так как уже существует активная статическая DNS-запись с таким именем или адресом"
}
/
} \
else=\
{
/ip dns static
:local dnsDhcpId
:set dnsDhcpId [ find address=$leaseActIP and comment=$DHCPtag ]
:if ( [ :len $dnsDhcpId ] > 0 ) do=\
{
:log info "DHCP2DNS: удаляем статическое доменное имя(ена) для адреса $leaseActIP"
remove $dnsDhcpId
}
/
}
