Я использую скрипт с http://adminsline.wordpress.com/2012/08/03/mikrotik-youtube/ чтобы создавать список адресов серверов YouTube из DNS-кэша, чтобы потом делать перенаправления. Хочу использовать тот же скрипт, чтобы получить IP-адреса других видеохостингов, типа vimeo.com, imdb.com и так далее. Для серверов YouTube я получаю A-записи в DNS-кэше, а для Vimeo или IMDB – CNAME-записи, и вышеуказанный скрипт их не умеет разрешать. Есть другой скрипт на Mikrotik Wiki: http://wiki.mikrotik.com/wiki/Sync_Address_List_from_DNS_Lookup_Results_-_CNAME_and_A_Records, который тоже работает с CNAME-записями, но он не подходит для моей ситуации (первый скрипт в строке поиска берет часть имени сервера, например “googlevideo”, “vimeocdn” и т.д.). К сожалению, я не очень хорошо разбираюсь в скриптах и не могу понять, как включить часть для разрешения CNAME из второго скрипта в первый. Кто-нибудь делал что-то подобное и готов помочь? Буду очень благодарен.
Слить два скрипта было бы не так уж и сложно, но сейчас у меня нет времени этим заниматься. Скорее всего, понадобится как минимум неделя-две, прежде чем я смогу этим заняться, у меня сейчас семейные дела, которые занимают почти всё моё время. Думаю, на это уйдёт около двух часов.
Я пробовал объединить, но не получилось. Это не срочно, так что если получится сделать это где-то через две недели, когда у тебя будет свободное время, это было бы здорово. С наилучшими пожеланиями!
Занесу в список дел, когда будет время. Если нужно сделать быстрее, могу “посоветоваться” по этому поводу… если тебе это интересно, просто напиши мне на почту.
Вот точный скрипт, который я сейчас запускаю на роутере: :foreach i in=[/ip dns cache find] do={ :local bNew "true"; :local cacheName [/ip dns cache all get $i name] ; # :put $cacheName;
:local tmpAddress [/ip dns cache get $i address] ; # :put $tmpAddress;
# if address list is empty do not check :if ( [/ip firewall address-list find ] = "") do={ :log info ("added entry: $[/ip dns cache get $i name] IP $tmpAddress"); /ip firewall address-list add address=$tmpAddress list=VC-YouTube comment=$cacheName; } else={ :foreach j in=[/ip firewall address-list find ] do={ :if ( [/ip firewall address-list get $j address] = $tmpAddress ) do={ :set bNew "false"; } } :if ( $bNew = "true" ) do={ :log info ("added entry: $[/ip dns cache get $i name] IP $tmpAddress"); /ip firewall address-list add address=$tmpAddress list=VC-YouTube comment=$cacheName; } } } } Он проходит по DNS кэшу в поисках серверов, в названии которых есть слова «youtube» или «googlevideo», а затем добавляет IP-адрес сервера в список адресов с именем VC-YouTube. Если изменить его, чтобы он искал серверы, в названии которых есть «vimeocdn», он найдет, скажем, server10.vimeocdn.com (я это придумал), но поле Type в DNS кэше будет CNAME, а поле Data будет чем-то вроде a1806.dwskn.akamai.net. Чтобы добавить это в список адресов, мне нужно, чтобы a1806.dwskn.akamai.net был дополнительно разрешен до числового IP-адреса. Второй скрипт, упомянутый в моем первом посте, может это сделать, но я не могу передать ему частичное имя сервера и позволить ему найти все серверы, в названии которых есть ключевое слово, поэтому он непригоден для моего случая. Думаю, это может быть интересно и другим, поскольку позволяет осуществлять некоторую продвинутую динамическую переадресацию или маршрутизацию сайтов, которые могут потреблять много пропускной способности. Как я уже говорил, спешки нет, поэтому когда у вас будет свободное время, было бы неплохо, если бы это было сделано и применено к большему количеству сайтов… С уважением!
Огромное спасибо, Efaden!!! Скрипт работает просто идеально. Пришлось убрать вот эту часть, потому что она выдавала ошибку, но это совсем не уменьшает его полезности! timeout=$myTimeout } on-error={ :put "DNSCACHE: Error on $myName $myData $myType" }
Ошибка будет работать только на 6.5 (кажется) и выше. На самом деле я бы посоветовал обновиться, а потом использовать это утверждение. Иначе скрипт упадет из-за дубликатов. Если хочешь, чтобы я сделал его работающим с дубликатами и без `on-error`, дай знать… могу немного переработать… И тайм-аут тоже только на новых версиях. По-моему, 6.7 и выше. Сейчас скрипт не очищает список… так что у тебя возникнут проблемы, если ты удалишь его и запустишь на более старой версии. Если хочешь, чтобы я сделал его работающим на более старой ROS, скажи, какая версия тебе нужна, и я подгоню. -Eric
Спасибо за изменённую версию. Я пока обновил ОС до версии 6.7, и теперь оригинальный скрипт работает без каких-либо изменений. Однако, когда я запускаю его во второй раз (вскоре после первого запуска), он выдаёт ошибку. Посмотрите, пожалуйста:
DNSCACHE: Ошибка на r4---sn-nvm-cxbe.googlevideo.com 193.105.163.207 CNAME DNSCACHE: Ошибка на r1---sn-nvm-cxbe.googlevideo.com 193.105.163.204 CNAME DNSCACHE: Ошибка на r1.sn-nvm-cxbe.googlevideo.com 193.105.163.204 A DNSCACHE: Ошибка на r8---sn-c0q7lne7.googlevideo.com 74.125.108.173 CNAME DNSCACHE: Ошибка на r8.sn-c0q7lne7.googlevideo.com 74.125.108.173 A DNSCACHE: Ошибка на r8.sn-c0q7lner.googlevideo.com 173.194.1.237 A DNSCACHE: Ошибка на r11.sn-c0q7ln7y.googlevideo.com 74.125.108.144 A DNSCACHE: Ошибка на r4.sn-nvm-cxbe.googlevideo.com 193.105.163.207 A DNSCACHE: Ошибка на r3.sn-nvm-cxbe.googlevideo.com 193.105.163.206 A DNSCACHE: Ошибка на r10.sn-c0q7lnee.googlevideo.com 74.125.108.207 A DNSCACHE: Ошибка на r10.sn-c0q7lney.googlevideo.com 173.194.2.143 A DNSCACHE: Ошибка на r11.sn-c0q7lnez.googlevideo.com 173.194.1.48 A DNSCACHE: Ошибка на r2.sn-nvm-cxbe.googlevideo.com 193.105.163.205 A DNSCACHE: Ошибка на r5.sn-c0q7lnek.googlevideo.com 173.194.1.202 A DNSCACHE: Ошибка на r5.sn-c0q7lnez.googlevideo.com 173.194.1.42 A DNSCACHE: Ошибка на r7.sn-c0q7lney.googlevideo.com 173.194.2.140 A DNSCACHE: Ошибка на r5.sn-c0q7lney.googlevideo.com 173.194.2.138 A DNSCACHE: Ошибка на r19.sn-c0q7lnek.googlevideo.com 173.194.1.216 A DNSCACHE: Ошибка на r9.sn-c0q7lne6.googlevideo.com 173.194.1.142 A DNSCACHE: Ошибка на r13.sn-c0q7lnee.googlevideo.com 74.125.108.210 A DNSCACHE: Ошибка на r18.sn-c0q7lnez.googlevideo.com 173.194.1.55 A interrupted no such item (4) Я понимаю, что эти DNSCACHE: Ошибки возникают потому, что адрес уже есть в списке адресов, и это нормально, я так думаю? Но я не понимаю, почему происходит прерывание и какого элемента не хватает. Запись, отработавшая своё в DNS-кэше??
Попробуй это… Я добавил ":resolve" посередине, чтобы убедиться, что записи валидны, когда я их перебираю… также добавил что-то, чтобы обнаруживать, если запись исчезла во время перебора, и просто игнорировать эту запись… Я не тестировал это… дай знать.
В этот раз все прошло без проблем. Даже когда я запускаю его второй раз сразу после первого, он не прерывается и доходит до конца. Забавно, что при первом запуске появилось 30 ошибок “DNSCACHE: Error”, и именно столько записей оно добавило в список адресов. Но, учтите, что эти IP-адреса у меня уже были, но в другом списке (собирались старым скриптом, который я использовал до вашего), так что это может быть причиной такого поведения. В любом случае, все адреса на месте, несмотря на ошибки “DNSCACHE: Error”. Большое спасибо за ваши усилия!