# apr/15/2016 17:04:36 by RouterOS 6.34.4 # software id = DSCZ-MV3L # /system script add name=update_amprgw owner=admin policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive source="#\r\ \n# RIPv2 based AMPR Tunnel setup script for RouterOS v2.1\r\ \n#\r\ \n# by YO2LOJ, Marius \r\ \n#\r\ \n# This script is a wrapper for minimal error handling\r\ \n#\r\ \n\r\ \n:global AmprRunning ;\r\ \n:global AmprFailCount ;\r\ \n:global AmprPhase ;\r\ \n\r\ \n:local RipEntries [:len [/routing rip route find from=44.0.0.1]] ;\r\ \n\r\ \n:if ( \$RipEntries > 100 ) do={\r\ \n\r\ \n :if (\$AmprRunning = true) do={\r\ \n :set \$AmprFailCount (\$AmprFailCount + 1) ;\r\ \n :log error \"AMPR script already running - check your scheduler\ \" ;\r\ \n }\r\ \n\r\ \n if (\$AmprFailCount > 3) do={\r\ \n :set \$AmprFailCount 0 ;\r\ \n :set \$AmprRunning false ;\r\ \n }\r\ \n\r\ \n :if (\$AmprRunning != true) do={\r\ \n :set \$AmprRunning true ;\r\ \n /system script run ampr_gw\r\ \n\r\ \n :if (\$AmprPhase != \"Idle\") do={\r\ \n :log error \"AMPR ampr_gw script has crashed in \$AmprPhase\ \" ;\r\ \n }\r\ \n\r\ \n :set \$AmprRunning false ;\r\ \n :set \$AmprFailCount 0 ;\r\ \n }\r\ \n\r\ \n} else={\r\ \n :log error \"AMPR: To few RIP entries available\" ;\r\ \n}\r\ \n" add name=ampr_gw owner=admin policy=\ ftp,reboot,read,write,policy,test,password,sensitive source="#\r\ \n# RIPv2 based AMPR Tunnel setup script for RouterOS v2.1\r\ \n#\r\ \n# by YO2LOJ, Marius \r\ \n#\r\ \n# This script is the actual router update script\r\ \n#\r\ \n\r\ \n# --------------------------------------------------------------\r\ \n#\r\ \n# DO NOT EDIT!\r\ \n# Configuration parameters are in \r\ \n# the \"ampr_config\" script.\r\ \n#\r\ \n# --------------------------------------------------------------\r\ \n\r\ \n # Your gateway interface\r\ \n :global AmprPublicIp ;\r\ \n\r\ \n # router local AMPR IP\r\ \n :global AmprMyIp ;\r\ \n\r\ \n # routing distance for AMPR routes\r\ \n :global AmprRoutingDistance ;\r\ \n\r\ \n # global delay between steps\r\ \n :global AmprDelay ;\r\ \n\r\ \n # global state variable\r\ \n :global AmprPhase ;\r\ \n\r\ \n :set \$AmprPhase \"Global: Reading configuration and creating enviro\ nment\" ;\r\ \n\r\ \n # get the system parameters\r\ \n /system script run ampr_config\r\ \n\r\ \n :local date [/system clock get date] ;\r\ \n :local months [:toarray \"jan,feb,mar,apr,may,jun,jul,aug,sep,oct,no\ v,dec\"] ;\r\ \n\r\ \n :local day [:pick \$date 4 6]\r\ \n :local txtmonth [:pick \$date 0 3] ;\r\ \n :local month ([:find \$months \$txtmonth -1] + 1);\r\ \n :if (\$month < 10) do={ :set month (\"0\" . \$month)};\r\ \n :local year [:pick \$date 7 11]\r\ \n\r\ \n :local time [/system clock get time] ;\r\ \n :local runtime (\$year . \"/\" . \$month . \"/\" . \$day . \" \" . \ \$time) ;\r\ \n\r\ \n :local ripnets \"\" ;\r\ \n :local ripgws \"\" ;\r\ \n\r\ \n :local amprnets \"\" ;\r\ \n :local amprgws \"\" ;\r\ \n :local amprtuns \"\";\r\ \n\r\ \n # routes to be added\r\ \n :local addnets \"\" ;\r\ \n :local addgws \"\" ;\r\ \n\r\ \n # routes to be updated\r\ \n :local updatenets \"\" ;\r\ \n :local updategws \"\" ;\r\ \n\r\ \n # tunnels to be added\r\ \n :local addtuns \"\";\r\ \n\r\ \n # routes to be deleted\r\ \n :local delnets \"\" ;\r\ \n :local delgws \"\" ;\r\ \n\r\ \n # tunnels to be deleted\r\ \n :local deltuns \"\";\r\ \n\r\ \n# ------------------------------------------------------\r\ \n# read the current configuration\r\ \n# ------------------------------------------------------\r\ \n\r\ \n :set \$AmprPhase \"Logic: Loading routes and tunnels\" ;\r\ \n\r\ \n :foreach riproute in=[/routing rip route find from=44.0.0.1] do={\r\ \n :local subnet [/routing rip route get \$riproute dst-address] ;\ \r\ \n :local gw [/routing rip route get \$riproute gateway] ;\r\ \n :set \$ripnets (\$ripnets, \$subnet) ;\r\ \n :set \$ripgws (\$ripgws, \"ampr-\" . \$gw) ;\r\ \n :delay \$AmprDelay ;\r\ \n }\r\ \n\r\ \n :foreach myroute in=[/ip route find static pref-src=\$AmprMyIp] do={\ \r\ \n :local subnet ([/ip route get \$myroute dst-address]) ;\r\ \n :local gw [:pick [/ip route get \$myroute gateway] 0] ;\r\ \n :if ([:find \$gw \"ampr-\" -1 ] = 0) do={\r\ \n :set \$amprnets (\$amprnets, \$subnet) ;\r\ \n :set \$amprgws (\$amprgws, \$gw) ;\r\ \n }\r\ \n :delay \$AmprDelay ;\r\ \n }\r\ \n\r\ \n :foreach mytunnel in=[/interface ipip find] do={\r\ \n :local gw [/interface ipip get \$mytunnel name] ;\r\ \n :if ([:find \$gw \"ampr-\" -1 ] = 0) do={\r\ \n :set \$amprtuns (\$amprtuns, \$gw) ;\r\ \n }\r\ \n :delay \$AmprDelay ;\r\ \n }\r\ \n\r\ \n# ------------------------------------------------------\r\ \n# Process configuration against RIP\r\ \n# ------------------------------------------------------\r\ \n\r\ \n :local riplen [:len \$ripnets ] ;\r\ \n :local amprlen [:len \$amprnets ] ;\r\ \n\r\ \n\r\ \n# check routes and tunnels to add/update\r\ \n# ------------------------------------------------------\r\ \n\r\ \n :set \$AmprPhase \"Logic: Processing new/updated\" ;\r\ \n\r\ \n :for i from 1 to (\$riplen - 1) do={\r\ \n :local subnet [:pick \$ripnets \$i] ;\r\ \n :local gw [:pick \$ripgws \$i] ;\r\ \n\r\ \n # check if route for subnet exists\r\ \n :local f [:find \$amprnets \$subnet -1] ;\r\ \n :if (\$f > 0) do={\r\ \n # route exists, update if gateway has changed\r\ \n :if ([:pick \$amprgws \$f] != \$gw) do={\r\ \n :set \$updatenets (\$updatenets, \$subnet) ;\r\ \n :set \$updategws (\$updategws, \$gw) ;\r\ \n }\r\ \n } else={\r\ \n # route is new, add\r\ \n :set \$addnets (\$addnets, \$subnet) ;\r\ \n :set \$addgws (\$addgws, \$gw) ;\r\ \n\r\ \n }\r\ \n\r\ \n # check if gateway exists, add if new\r\ \n :if ([:find \$amprtuns \$gw -1] < 0) do={\r\ \n :if ([:find \$addtuns \$gw -1] < 0) do={\r\ \n :set \$addtuns (\$addtuns, \$gw) ;\r\ \n }\r\ \n }\r\ \n }\r\ \n\r\ \n# check obsolete routes\r\ \n# ------------------------------------------------------\r\ \n\r\ \n :set \$AmprPhase \"Logic: Processing obsolete\" ;\r\ \n\r\ \n :for i from 1 to (\$amprlen - 1) do={\r\ \n :local subnet [:pick \$amprnets \$i] ;\r\ \n :local gw [:pick \$amprgws \$i] ;\r\ \n\r\ \n # check if route is in rip data\r\ \n :if ([:find \$ripnets \$subnet -1] < 0) do={\r\ \n :set \$delnets (\$delnets, \$subnet) ;\r\ \n :set \$delgws (\$delgws, \$gw) ; \r\ \n }\r\ \n\r\ \n# check obsolete tunnels\r\ \n# ------------------------------------------------------\r\ \n\r\ \n # check if gateway is in rip data, delete if not\r\ \n :if ([:find \$ripgws \$gw -1] < 0) do={\r\ \n :set \$deltuns (\$deltuns, \$gw) ;\r\ \n }\r\ \n }\r\ \n\r\ \n# check orphan tunnels\r\ \n# ------------------------------------------------------\r\ \n\r\ \n # check for orphan tunnels\r\ \n : foreach gw in=\$amprtuns do={\r\ \n :if ([:find \$ripgws \$gw -1] < 0) do={\r\ \n :if ([:find \$deltuns \$gw -1] < 0) do={\r\ \n :set \$deltuns (\$deltuns, \$gw) ;\r\ \n }\r\ \n }\r\ \n }\r\ \n\r\ \n# ------------------------------------------------------\r\ \n# Configure the router\r\ \n# ------------------------------------------------------\r\ \n\r\ \n# add new tunnels\r\ \n# ------------------------------------------------------\r\ \n :if ([:len \$addtuns] > 1) do={\r\ \n :set \$AmprPhase \"Router: Add tunnels\" ;\r\ \n :for i from 1 to ([:len \$addtuns] - 1) do={\r\ \n :local gw [:pick \$addtuns \$i] ;\r\ \n :local ip [:pick \$gw ([:find \$gw \"-\"] + 1) [:len \$gw] \ ];\r\ \n :log info \"AMPR: Add tunnel \$gw to \$ip\"\r\ \n /interface ipip add !keepalive clamp-tcp-mss=yes local-addre\ ss=\$AmprPublicIp remote-address=\$ip name=\$gw comment=(\"Added on \". \$\ runtime)\r\ \n /ip neighbor discovery set \$gw discover=no\r\ \n }\r\ \n }\r\ \n\r\ \n# delete routes\r\ \n# ------------------------------------------------------\r\ \n :if ([:len \$delnets] > 1) do={\r\ \n :set \$AmprPhase \"Router: Delete routes\" ;\r\ \n :for i from 1 to ([:len \$delnets] - 1) do={\r\ \n :local subnet [:pick \$delnets \$i] ;\r\ \n :local gw [:pick \$delgws \$i] ;\r\ \n :log info \"AMPR: Delete route \$subnet via \$gw\"\r\ \n :foreach myroute in=[/ip route find dst-address=\$subnet !ro\ uting-mark] do={\r\ \n :local intf [:pick [/ip route get \$myroute gateway] 0] \ ;\r\ \n :if (\$intf = \$gw) do={\r\ \n /ip route remove \$myroute\r\ \n }\r\ \n }\r\ \n }\r\ \n }\r\ \n\r\ \n# add new routes\r\ \n# ------------------------------------------------------\r\ \n :if ([:len \$addnets] > 1) do={\r\ \n :set \$AmprPhase \"Router: Add routes\" ;\r\ \n :for i from 1 to ([:len \$addnets] - 1) do={\r\ \n :local subnet [:pick \$addnets \$i] ;\r\ \n :local gw [:pick \$addgws \$i] ;\r\ \n :log info \"AMPR: Add route \$subnet via \$gw\"\r\ \n /ip route add dst-address=\$subnet gateway=\$gw distance=\$A\ mprRoutingDistance pref-src=\$AmprMyIp comment=(\"Added on \". \$runtime)\ \r\ \n }\r\ \n }\r\ \n\r\ \n# update routes\r\ \n# ------------------------------------------------------\r\ \n :if ([:len \$updatenets] > 1) do={\r\ \n :set \$AmprPhase \"Router: Update routes\" ;\r\ \n :for i from 1 to ([:len \$updatenets] - 1) do={\r\ \n :local subnet [:pick \$updatenets \$i] ;\r\ \n :local gw [:pick \$updategws \$i] ;\r\ \n :log info \"AMPR: Update route \$subnet via \$gw\"\r\ \n :foreach myroute in=[/ip route find dst-address=\$subnet !ro\ uting-mark] do={\r\ \n :local intf [:pick [/ip route get \$myroute gateway] 0] \ ;\r\ \n :if ([:find \$intf \"ampr-\" -1 ] = 0) do={\r\ \n /ip route set \$myroute gateway=\$gw comment=(\"Upda\ ted on \". \$runtime)\r\ \n }\r\ \n }\r\ \n }\r\ \n }\r\ \n\r\ \n# delete tunnels\r\ \n# ------------------------------------------------------\r\ \n :if ([:len \$deltuns] > 1) do={\r\ \n :set \$AmprPhase \"Router: Delete tunnels\" ;\r\ \n :for i from 1 to ([:len \$deltuns] - 1) do={\r\ \n :local gw [:pick \$deltuns \$i] ;\r\ \n :log info \"AMPR: Delete tunnel \$gw\"\r\ \n /interface ipip remove \$gw\r\ \n }\r\ \n }\r\ \n\r\ \n :set \$AmprPhase \"Idle\" ;\r\ \n" add name=ampr_config owner=admin policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive source="#\r\ \n# RIPv2 based AMPR Tunnel setup script for RouterOS v2.1\r\ \n#\r\ \n# by YO2LOJ, Marius \r\ \n#\r\ \n# This script holds the runtime parameter definitions\r\ \n#\r\ \n\r\ \n# --------------------------------------------------------------\r\ \n# Setup parameters (change as needed)\r\ \n#\r\ \n# These parameters are used by\r\ \n# the \"ampr_gw\" script which is\r\ \n# called by the scheduled \"update_ampr\"\r\ \n# wrapper script.\r\ \n# --------------------------------------------------------------\r\ \n\r\ \n# Your gateway interface\r\ \n:global AmprPublicIp \"192.168.1.1\" ;\r\ \n\r\ \n# router local AMPR IP\r\ \n:global AmprMyIp \"44.128.1.1\" ;\r\ \n\r\ \n# routing distance for AMPR routes\r\ \n:global AmprRoutingDistance 50 ;\r\ \n\r\ \n# global delay between steps\r\ \n:global AmprDelay \"10ms\" ;\r\ \n\r\ \n" /system scheduler add comment="AMPR update" disabled=yes interval=30m name="ampr update" \ on-event=update_amprgw policy=\ ftp,reboot,read,write,policy,test,password,sniff,sensitive start-date=\ apr/12/2016 start-time=00:21:00