/system scheduler add comment="routeadd" disabled=no interval=1d name="routeadd" on-event="/system script run routeadd" policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=2020-12-18 start-time=13:00:00
/system script add comment="routeadd" dont-require-permissions=no name=routeadd owner=root policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local gateway \"1.2.3.4\"\r\
\n:local bottoken \"1234567890:aaabbbcccdddeeeaaabbbcccdddeeeaaabb\"\r\
\n:local chatid \"1234567890123\"\r\
\n\r\
\n/ip route remove [find comment=vpn]\r\
\n:local f [/file find name=\"bkp/route1.txt\"]\r\
\n:if (\$f != \"nothing\") do={\r\
\n /file remove \$f\r\
\n :log info message=\"\D1\F2\E0\F0\FB\E9 \F4\E0\E9\EB bkp/route1.txt \F3\E4\E0\EB\E5\ED\"\r\
\n}\r\
\n:global addrs [:toarray \"\"]\r\
\n:log info message=\"\CD\E0\F7\E8\ED\E0\E5\EC \EE\E1\F0\E0\E1\EE\F2\EA\F3 \F1\EF\E8\F1\EA\E0 VPN-\E0\E4\F0\E5\F1\EE\E2\"\r\
\n:foreach id in=[/ip firewall address-list find where dynamic list=vpn] do={\r\
\n :local addr [/ip firewall address-list get \$id address]\r\
\n :log info message=(\"\CE\E1\F0\E0\E1\EE\F2\EA\E0 \E0\E4\F0\E5\F1\E0: \" . \$addr)\r\
\n :local allowedChars \"0123456789./\"\r\
\n :local isIp true\r\
\n :for i from=0 to=([:len \$addr] - 1) do={\r\
\n :local c [:pick \$addr \$i (\$i + 1)]\r\
\n :if ([:find \$allowedChars \$c] = -1) do={\r\
\n :set isIp false\r\
\n }\r\
\n }\r\
\n :if (\$isIp) do={\r\
\n :set addrs (\$addrs, \$addr)\r\
\n :log info message=(\"\C4\EE\E1\E0\E2\EB\E5\ED IP: \" . \$addr)\r\
\n }\r\
\n}\r\
\n:local content \"\"\r\
\n:foreach ip in=\$addrs do={\r\
\n :set content (\$content . \$ip . \"\\r\\n\")\r\
\n}\r\
\n:log info message=(\"\CD\E0\E9\E4\E5\ED\EE \E2\E0\EB\E8\E4\ED\FB\F5 IP-\E0\E4\F0\E5\F1\EE\E2: \" . [:len \$addrs])\r\
\n/file add name=\"bkp/route1.txt\" contents=\$content\r\
\n:log info message=\"\D1\EE\E4\E5\F0\E6\E8\EC\EE\E5 \F4\E0\E9\EB\E0 \E7\E0\EF\E8\F1\E0\ED\EE\"\r\
\n:local mask \"/32\"\r\
\n:local f [/file find name=\"bkp/route2.txt\"]\r\
\n:if (\$f != \"\") do={\r\
\n /file remove \$f\r\
\n :log info message=\"\D1\F2\E0\F0\FB\E9 \F4\E0\E9\EB bkp/route2.txt \F3\E4\E0\EB\E5\ED\"\r\
\n}\r\
\n:local content [/file get bkp/route1.txt contents]\r\
\n:log info message=\"\CD\E0\F7\E8\ED\E0\E5\EC \EE\E1\F0\E0\E1\EE\F2\EA\F3 IP-\E0\E4\F0\E5\F1\EE\E2...\"\r\
\n:local lines [:toarray \"\"]\r\
\n:local pos 0\r\
\n:local len [:len \$content]\r\
\n:while (\$pos < \$len) do={\r\
\n :local nextPos [:find \$content \"\\n\" \$pos]\r\
\n :if (\$nextPos = -1) do={\r\
\n :set nextPos \$len\r\
\n }\r\
\n :local line [:pick \$content \$pos \$nextPos]\r\
\n :if ([:len \$line] > 0) do={\r\
\n :if ([:pick \$line ([:len \$line] - 1) [:len \$line]] = \"\\r\") do={\r\
\n :set line [:pick \$line 0 ([:len \$line] - 1)]\r\
\n }\r\
\n }\r\
\n :set pos (\$nextPos + 1)\r\
\n :set lines (\$lines, \$line)\r\
\n}\r\
\n:local result \"\"\r\
\n:foreach line in=\$lines do={\r\
\n :local lenLine [:len \$line]\r\
\n :if (\$lenLine >= 3) do={\r\
\n :local suffix [:pick \$line (\$lenLine - 3) \$lenLine]\r\
\n :if (\$suffix != \$mask) do={\r\
\n :set line (\$line . \$mask)\r\
\n }\r\
\n } else={\r\
\n :set line (\$line . \$mask)\r\
\n }\r\
\n :set result (\$result . \$line . \"\\r\\n\")\r\
\n :log info message=(\"\CE\E1\F0\E0\E1\EE\F2\E0\ED IP: \" . \$line)\r\
\n}\r\
\n/file add name=\"bkp/route2.txt\" contents=\$result\r\
\n:log info message=\"\CE\E1\F0\E0\E1\EE\F2\EA\E0 \E7\E0\E2\E5\F0\F8\E5\ED\E0\"\r\
\n:local content [/file get bkp/route2.txt contents]\r\
\n:local lines [:toarray \"\"]\r\
\n:local pos 0\r\
\n:local len [:len \$content]\r\
\n:while (\$pos < \$len) do={\r\
\n :local nextPos [:find \$content \"\\n\" \$pos]\r\
\n :if (\$nextPos = -1) do={\r\
\n :set nextPos \$len\r\
\n }\r\
\n :local line [:pick \$content \$pos \$nextPos]\r\
\n :if ([:len \$line] > 0) do={\r\
\n :if ([:pick \$line ([:len \$line] - 1) [:len \$line]] = \"\\r\") do={\r\
\n :set line [:pick \$line 0 ([:len \$line] - 1)]\r\
\n }\r\
\n }\r\
\n :set pos (\$nextPos + 1)\r\
\n :if ([:len \$line] > 0) do={\r\
\n :local exists [/ip route find dst-address=\$line gateway=\$gateway]\r\
\n :if (\$exists = \"\") do={\r\
\n /ip route add dst-address=\$line gateway=\$gateway comment=\"vpn\"\r\
\n :log info message=(\"\C4\EE\E1\E0\E2\EB\E5\ED \EC\E0\F0\F8\F0\F3\F2: \" . \$line . \" \F7\E5\F0\E5\E7 \" . \$gateway)\r\
\n :local url (\"
https://api.telegram.org/bot\" . \$bottoken . \"/sendMessage\?chat_id=-\" . \$chatid . \"&text=route add \" . \$line . \" via \" . \$gateway)\r\
\n /tool fetch url=\$url keep-result=no\r\
\n } else={\r\
\n :log info message=(\"\CC\E0\F0\F8\F0\F3\F2 \F3\E6\E5 \F1\F3\F9\E5\F1\F2\E2\F3\E5\F2: \" . \$line)\r\
\n }\r\
\n }\r\
\n}"