|
Auto TR-069 (CWMP) przez Mikrotika z DHCP
06-01-2026 19:00:00 Odwiedziny: 260
Mikrotik w ustawieniach domyślnych ma wyłączony TR-069, ale dzięki netinstall lub ACS i przygotowanemu przeze mnie skryptowi można to naprawić.
Skrypt automatycznie włącza i konfiguruje TR-069 po tym, jak urządzenie otrzyma adres IP i pakiet z danymi TR. Aby skrypt ponownie ustawił nowe dane TR, należy najpierw wyłączyć TR-069 w Mikrotiku.
Dodaj option:
/ip dhcp-client option
add code=55 name=req_opts value=0x01798A03212A2B33353606
Dodaj clienta DHCP lub do istniejącego doda dhcp-options req_opts:
/ip dhcp-client
add dhcp-options=hostname,clientid,req_opts disabled=no interface=ether1
W Client DHCP dodaj skrypt który będzie się wykonywal po uzyskaniu adresu IP:
:if ($bound=1) do={
:local debug "no"
:local explode do={
:local chrSplit $1
:local string $2
:local reEncoded
:local char
:if (([:typeof $string] != "str") or ($string = "")) do={
:return []
} else={
:for i from=0 to=([:len $string] -1) do={
:set char [:pick $string $i]
:if ($char = $chrSplit) do={:set $char ","}
:set reEncoded ($reEncoded . $char)
}
:return [:toarray $reEncoded]
}
}
:local urlACS ""
:local usernameACS ""
:local passwordACS ""
#:local vendorSpecific ($"lease-options"->"43")
:local vendorSpecific $"vendor-specific"
## FORMAT HEX
:if ($vendorSpecific ~ "\01" or $vendorSpecific ~ "\02") do={
:if ($debug = "yes") do={ :log warning "[$interface] HEX Lease Option 43 (Vendor-Specific) is $vendorSpecific"; }
# Szukamy początku właściwego URL (przesuwamy aż do 'http')
:local trimStart [:find $vendorSpecific "http"]
:if ($trimStart != nil) do={
:set vendorSpecific [:pick $vendorSpecific $trimStart [:len $vendorSpecific]]
}
:local currentPart 1
:local waitCurrentPart 0
:for i from=0 to=([:len $vendorSpecific]-1) do={
:local char [:pick $vendorSpecific $i ($i+1)]
# rozdzielamy po separatorach (\03, \04, \07)
:if ($char = "\00" or $char = "\01" or $char = "\02" or $char = "\03" or $char = "\04" or $char = "\05" or $char = "\06" or $char = "\07" or $char = "\08" or $char = "\09" or $char = "\10") do={
:set waitCurrentPart 1
} else={
:if ($waitCurrentPart) do={
:set currentPart ($currentPart + 1)
:if ($currentPart = 1) do={ :set urlACS ($urlACS . $char) }
:if ($currentPart = 2) do={ :set usernameACS ($usernameACS . $char) }
:if ($currentPart = 3) do={ :set passwordACS ($passwordACS . $char) }
:set waitCurrentPart 0
} else={
:if ($currentPart = 1) do={ :set urlACS ($urlACS . $char) }
:if ($currentPart = 2) do={ :set usernameACS ($usernameACS . $char) }
:if ($currentPart = 3) do={ :set passwordACS ($passwordACS . $char) }
}
}
}
# HALNY
:if ([:find $urlACS ";"] > 0) do={
:local vsArr [$explode ";" $urlACS]
:set urlACS ($vsArr->0)
:set usernameACS ($vsArr->1)
:set passwordACS ($vsArr->2)
# SPACJA
} else={
:if ([:find $urlACS " "] > 0) do={
:local vsArr [$explode " " $urlACS]
:set urlACS ($vsArr->0)
:set usernameACS ($vsArr->1)
:set passwordACS ($vsArr->2)
}
}
## FORMAT DEC
} else={
:if ($debug = "yes") do={ :log warning "[$interface] DEC Lease Option 43 (Vendor-Specific) is $vendorSpecific"; }
# HALNY
:if ([:find $vendorSpecific ";"] > 0) do={
:local vsArr [$explode ";" $vendorSpecific]
:set urlACS ($vsArr->0)
:set usernameACS ($vsArr->1)
:set passwordACS ($vsArr->2)
# SPACJA
} else={
:if ([:find $vendorSpecific " "] > 0) do={
:local vsArr [$explode " " $vendorSpecific]
:set urlACS ($vsArr->0)
:set usernameACS ($vsArr->1)
:set passwordACS ($vsArr->2)
} else={
:set urlACS $vendorSpecific
}
}
}
:if ($debug = "yes") do={ :log warning "[$interface] URL ACS: $urlACS"; }
:if ($debug = "yes") do={ :log warning "[$interface] Username ACS: $usernameACS"; }
:if ($debug = "yes") do={ :log warning "[$interface] Password ACS: $passwordACS"; }
:do {
:local enabledStatus [/tr069-client get enabled]
:if (!$enabledStatus and $urlACS ~ "http") do={
/tr069-client set enabled=yes acs-url=$urlACS username=$usernameACS password=$passwordACS
}
} on-error={ }
}
|
|
|