Upgrade Network Devices        syncLMS-Multi-MikroTik-SimpleQueues        getLMS-Multi-MikroTik-LastOnline        syncLMS-Multi-MikroTik-Nat       

sieć

 

ACS / TR-069 / CWMP

 

mikrotik

 

ubiquiti

 

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={ }
}






Copyright seszu © 30.10.2010-2026.