# # RIPv2 based AMPR Tunnel setup script for RouterOS v2.0 # # by YO2LOJ, Marius # # ------------------------------------------------------------- # Setup parameters (change as needed) # ------------------------------------------------------------- # your gateway IP :local myip "192.168.1.1" ; # router local AMPR IP :local myampr "44.128.1.1" ; # routing distance for AMPR routes :local mydistance 50 ; # global delay between steps : local delay "10ms" ; # ------------------------------------------------------------- :global AmprPhase ; :local date [/system clock get date] ; :local months [:toarray "jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec"] ; :local day [:pick $date 4 6] :local txtmonth [:pick $date 0 3] ; :local month ([:find $months $txtmonth -1] + 1); :if ($month < 10) do={ :set month ("0" . $month)}; :local year [:pick $date 7 11] :local time [/system clock get time] ; :local runtime ($year . "/" . $month . "/" . $day . " " . $time) ; :local ripnets "" ; :local ripgws "" ; :local amprnets "" ; :local amprgws "" ; :local amprtuns ""; # routes to be added :local addnets "" ; :local addgws "" ; # routes to be updated :local updatenets "" ; :local updategws "" ; # tunnels to be added :local addtuns ""; # routes to be deleted :local delnets "" ; :local delgws "" ; # tunnels to be deleted :local deltuns ""; # ------------------------------------------------------ # read the current configuration # ------------------------------------------------------ :set $AmprPhase "Logic: Getting routes and tunnels" ; :foreach riproute in=[/routing rip route find from=44.0.0.1] do={ :local subnet [/routing rip route get $riproute dst-address] ; :local gw [/routing rip route get $riproute gateway] ; :set $ripnets ($ripnets, $subnet) ; :set $ripgws ($ripgws, "ampr-" . $gw) ; :delay $delay ; } :foreach myroute in=[/ip route find pref-src=$myampr] do={ :local subnet ([/ip route get $myroute dst-address]) ; :local gw [:pick [/ip route get $myroute gateway] 0] ; :if ([:find $gw "ampr-" -1 ] = 0) do={ :set $amprnets ($amprnets, $subnet) ; :set $amprgws ($amprgws, $gw) ; } :delay $delay ; } :foreach mytunnel in=[/interface ipip find] do={ :local gw [/interface ipip get $mytunnel name] ; :if ([:find $gw "ampr-" -1 ] = 0) do={ :set $amprtuns ($amprtuns, $gw) ; } :delay $delay ; } # ------------------------------------------------------ # Process configuration against RIP # ------------------------------------------------------ :local riplen [:len $ripnets ] ; :local amprlen [:len $amprnets ] ; # check routes and tunnels to add/update # ------------------------------------------------------ :set $AmprPhase "Logic: Processing new/updated" ; :for i from 1 to ($riplen - 1) do={ :local subnet [:pick $ripnets $i] ; :local gw [:pick $ripgws $i] ; # check if route for subnet exists :local f [:find $amprnets $subnet -1] ; :if ($f > 0) do={ # route exists, update if gateway has changed :if ([:pick $amprgws $f] != $gw) do={ :set $updatenets ($updatenets, $subnet) ; :set $updategws ($updategws, $gw) ; } } else={ # route is new, add :set $addnets ($addnets, $subnet) ; :set $addgws ($addgws, $gw) ; } # check if gateway exists, add if new :if ([:find $amprtuns $gw -1] < 0) do={ :if ([:find $addtuns $gw -1] < 0) do={ :set $addtuns ($addtuns, $gw) ; } } } # check obsolete routes # ------------------------------------------------------ :set $AmprPhase "Logic: Processing obsolete" ; :for i from 1 to ($amprlen - 1) do={ :local subnet [:pick $amprnets $i] ; :local gw [:pick $amprgws $i] ; # check if route is in rip data or in new :if ([:find $ripnets $subnet -1] < 0) do={ :set $delnets ($delnets, $subnet) ; :set $delgws ($delgws, $gw) ; } # check obsolete tunnels # ------------------------------------------------------ # check if gateway is in rip data, delete if not :if ([:find $ripgws $gw -1] < 0) do={ :set $deltuns ($deltuns, $gw) ; } } # check orphan tunnels # ------------------------------------------------------ # check for orphan tunnels : foreach gw in=$amprtuns do={ :if ([:find $ripgws $gw -1] < 0) do={ :if ([:find $deltuns $gw -1] < 0) do={ :set $deltuns ($deltuns, $gw) ; } } } # ------------------------------------------------------ # Configure the router # ------------------------------------------------------ # add new tunnels # ------------------------------------------------------ :if ([:len $addtuns] > 1) do={ :set $AmprPhase "Router: Add tunnels" ; :for i from 1 to ([:len $addtuns] - 1) do={ :local gw [:pick $addtuns $i] ; :local ip [:pick $gw ([:find $gw "-"] + 1) [:len $gw] ]; :log info "AMPR: Add tunnel $gw to $ip" /interface ipip add !keepalive clamp-tcp-mss=yes local-address=$myip remote-address=$ip name=$gw comment=("Added on ". $runtime) /ip neighbor discovery set $gw discover=no } } # delete routes # ------------------------------------------------------ :if ([:len $delnets] > 1) do={ :set $AmprPhase "Router: Delete routes" ; :for i from 1 to ([:len $delnets] - 1) do={ :local subnet [:pick $delnets $i] ; :local gw [:pick $delgws $i] ; :log info "AMPR: Delete route $subnet via $gw" :foreach myroute in=[/ip route find dst-address=$subnet !routing-mark] do={ :local intf [:pick [/ip route get $myroute gateway] 0] ; :if ($intf = $gw) do={ /ip route remove $myroute } } } } # add new routes # ------------------------------------------------------ :if ([:len $addnets] > 1) do={ :set $AmprPhase "Router: Add routes" ; :for i from 1 to ([:len $addnets] - 1) do={ :local subnet [:pick $addnets $i] ; :local gw [:pick $addgws $i] ; :log info "AMPR: Add route $subnet via $gw" /ip route add dst-address=$subnet gateway=$gw distance=$mydistance pref-src=$myampr comment=("Added on ". $runtime) } } # update routes # ------------------------------------------------------ :if ([:len $updatenets] > 1) do={ :set $AmprPhase "Router: Update routes" ; :for i from 1 to ([:len $updatenets] - 1) do={ :local subnet [:pick $updatenets $i] ; :local gw [:pick $updategws $i] ; :log info "AMPR: Update route $subnet via $gw" :foreach myroute in=[/ip route find dst-address=$subnet !routing-mark] do={ :local intf [:pick [/ip route get $myroute gateway] 0] ; :if ([:find $intf "ampr-" -1 ] = 0) do={ /ip route set $myroute gateway=$gw comment=("Updated on ". $runtime) } } } } # delete tunnels # ------------------------------------------------------ :if ([:len $deltuns] > 1) do={ :set $AmprPhase "Router: Delete tunnels" ; :for i from 1 to ([:len $deltuns] - 1) do={ :local gw [:pick $deltuns $i] ; :log info "AMPR: Delete tunnel $gw" /interface ipip remove $gw } } :set $AmprPhase "Idle" ;