<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Mikrotik.moscow [тема: Вложенные скрипты DO ON-ERROR]</title>
		<link>http://mikrotik.moscow</link>
		<description>Новое в теме Вложенные скрипты DO ON-ERROR форума RouterOS на сайте Mikrotik.moscow [mikrotik.moscow]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 31 Jul 2026 20:37:07 -0400</pubDate>
		<item>
			<title>Вложенные скрипты DO ON-ERROR</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385816">Вложенные скрипты DO ON-ERROR</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Отлично, сработало, спасибо. // Заметка для себя: если внутри конструкции : if (…) do={…}, то on-error{} должен иметь свой отдельный блок :do{…}. <br />
			<i>05.02.2024 21:57:00, adrianTNT.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385816</link>
			<guid>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385816</guid>
			<pubDate>Mon, 05 Feb 2024 21:57:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Вложенные скрипты DO ON-ERROR</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385815">Вложенные скрипты DO ON-ERROR</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Нет, блок on-error должен быть отдельным и содержать код, где может возникнуть ошибка: &nbsp;<br />:if ($newip != $oldip) do={ &nbsp;<br /> &nbsp;:do { &nbsp;<br /> &nbsp; &nbsp;:set newip [:resolve $comment]  <br /> &nbsp; &nbsp;/ip firewall address-list set $i address=$newip &nbsp;<br /> &nbsp;} on-error={ &nbsp;<br /># здесь можно обработать ошибку или записать в лог, если нужно... &nbsp;<br /> &nbsp;} &nbsp;<br />} <br />
			<i>05.02.2024 21:11:00, optio.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385815</link>
			<guid>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385815</guid>
			<pubDate>Mon, 05 Feb 2024 21:11:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Вложенные скрипты DO ON-ERROR</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385814">Вложенные скрипты DO ON-ERROR</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Я попробовал в конце своего кода, там, где это закомментировано, без комментариев эта часть выглядела бы так: &nbsp;<br />if ($newip != $oldip) do={ &nbsp;<br />  :set newip [:resolve $comment]  <br />  /ip firewall address-list set $i address=$newip &nbsp;<br />} on-error={}; &nbsp;<br />Что-то вроде этого, но всё это внутри родительского цикла. Должно ли это работать? &nbsp;<br />У меня есть другая тема по этому поводу: <noindex><a href="http://forum.mikrotik.com/t/error-expected-end-of-command-when-trying-on-error/173368/1" target="_blank" rel="nofollow" >http://forum.mikrotik.com/t/error-expected-end-of-command-when-trying-on-error/173368/1</a></noindex> <br />
			<i>05.02.2024 21:06:00, adrianTNT.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385814</link>
			<guid>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385814</guid>
			<pubDate>Mon, 05 Feb 2024 21:06:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Вложенные скрипты DO ON-ERROR</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385813">Вложенные скрипты DO ON-ERROR</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Ты поместил код в блок :do { } перед on-error={} ? В твоём закомментированном коде этого не видно, и именно это, скорее всего, вызывает синтаксическую ошибку. <br />
			<i>05.02.2024 20:59:00, optio.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385813</link>
			<guid>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385813</guid>
			<pubDate>Mon, 05 Feb 2024 20:59:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Вложенные скрипты DO ON-ERROR</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385812">Вложенные скрипты DO ON-ERROR</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			У меня похожая проблема, правильно ли я понял, что нельзя использовать on-error={} внутри циклов? Вот у меня такой код, где я пытаюсь в цикле разрешить имя в IP, и скрипт ломается, если доменное имя неверное. Если добавляю on-error, то выдает ошибку «expected end of command». Единственный вариант — использовать on-error вне цикла?<br /><br /># объявляем переменные &nbsp;<br />:local list &nbsp;<br />:local comment &nbsp;<br />:local newip &nbsp;<br />:local oldip &nbsp;<br /><br /># Проходим по каждому элементу в списке адресов &nbsp;<br />:foreach i in=[/ip firewall address-list find] do={  <br /><br /> &nbsp; &nbsp;# Берём первые пять символов из названия списка &nbsp;<br /> &nbsp; &nbsp;#:set list [:pick [/ip firewall address-list get $i list] 0 5]  <br /> &nbsp; &nbsp;:set list [/ip firewall address-list get $i list]  <br /><br /> &nbsp; &nbsp;# Если это 'adr_ip_', значит совпадение — обрабатываем &nbsp;<br /> &nbsp; &nbsp;:if ($list = "adr_ip_list") do={ &nbsp;<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;# Получаем комментарий для этого элемента списка (имя хоста для разрешения) &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;:set comment [/ip firewall address-list get $i comment]  <br /> &nbsp; &nbsp; &nbsp; &nbsp;:set oldip [/ip firewall address-list get $i address]  <br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;# Разрешаем имя и обновляем адрес в списке, если он изменился &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if ($newip != $oldip) do={ &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:set newip [:resolve $comment]  <br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/ip firewall address-list set $i address=$newip &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;# если тут включить on-error, выдает ошибку "expected end of command" &nbsp;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ЗДЕСЬ &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;# on-error={}; &nbsp;<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;:put $comment; &nbsp;<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put $newip; &nbsp;<br /> &nbsp; &nbsp;} &nbsp;<br />} <br />
			<i>05.02.2024 20:50:00, adrianTNT.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385812</link>
			<guid>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385812</guid>
			<pubDate>Mon, 05 Feb 2024 20:50:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Вложенные скрипты DO ON-ERROR</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385811">Вложенные скрипты DO ON-ERROR</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Всем привет. Я пытаюсь реализовать вложенный скрипт :do {} on-error{}. Идея в том, чтобы был внешний (родительский) do цикл, который проверяет, не упал ли скрипт, а внутри, во внутреннем do и on-error, защититься от ошибки таймаута действия скрипта при подписании сертификатов. Проблема в том, что если что-то не срабатывает внутри внутреннего do, ошибка не ловится на собственном on-error блоке, а сразу уходит в on-error родительского цикла. Кто-нибудь может помочь решить эту проблему? Один из возможных вариантов — увеличить таймаут действия скрипта, чтобы сертификаты успевали подписываться, или, может, есть какая-то специальная команда, которая гарантирует подписание сертификатов независимо от таймаута. Я прикрепил скрипт, чтобы можно было воспроизвести. Спасибо большое за ваше время и помощь.<br /><br />{; # BeginOfScript<br /><br />######################################################################<br />###Identity: Generate SSH Keys And Certificates Script<br />###Author: Tahasanul Abraham<br />###Created: Apr 18 2023<br />###Last Edited: May 05 2023<br />###Compatible Versions: ROS 7.x<br />###Tested on: ROS 7.0 - 7.9<br />######################################################################<br /><br />:do {<br />	:local ServerName ("XXXXXXXX")<br />	:local CertificateValidityDays (18250)<br />	:local CertificatePassword ("XXXXXXX")<br />	:local KeySize (8192)<br />	<br />	/ip/ssh/ set allow-none-crypto=no always-allow-password-login=yes strong-crypto=yes forwarding-enabled=remote host-key-size=$KeySize<br /><br />	:do {<br />		/ip/ssh/ regenerate-host-key<br />	} on-error={<br />		:log error ("** Generate SSH Keys And Certificates Script ** Ждем генерацию SSH ключа для $ServerName")<br />	}; # EndDo<br />	<br />	/ip/ssh/ export-host-key key-file-prefix="$ServerName_SSH"<br />	<br />	/certificate/ add name="$ServerName_CA" common-name="$ServerName_CA" days-valid=$CertificateValidityDays key-size=$KeySize key-usage=crl-sign,key-cert-sign<br />	/certificate/ add name="$ServerName_Server" common-name="$ServerName_Server" days-valid=$CertificateValidityDays key-size=$KeySize key-usage=digital-signature,key-encipherment,tls-server<br />	/certificate/ add name="$ServerName_Client" common-name="$ServerName_Client" days-valid=$CertificateValidityDays key-size=$KeySize key-usage=tls-client<br /><br />	:do {	<br />		/certificate/ sign "$ServerName_CA" name="$ServerName_CA-Certificate"<br />	} on-error={<br />		:log error ("** Generate SSH Keys And Certificates Script ** Ждем подпись $ServerName_CA-Certificate")<br />	}; # EndDo<br /><br />	:do {	<br />		/certificate/ sign "$ServerName_Server" name="$ServerName_Server-Certificate" ca="$ServerName_CA-Certificate"<br />	} on-error={<br />		:log error ("** Generate SSH Keys And Certificates Script ** Ждем подпись $ServerName_Server-Certificate")<br />	}; # EndDo<br /><br />	:do {	<br />		/certificate/ sign "$ServerName_Client" name="$ServerName_Client-Certificate" ca="$ServerName_CA-Certificate"<br />	} on-error={<br />		:log error ("** Generate SSH Keys And Certificates Script ** Ждем подпись $ServerName_Client-Certificate")<br />	}; # EndDo<br /><br /><br />	/certificate/ export-certificate "$ServerName_CA-Certificate" export-passphrase=$CertificatePassword file-name="$ServerName_CA-Certificate"<br />	/certificate/ export-certificate "$ServerName_Client-Certificate" export-passphrase=$CertificatePassword file-name="$ServerName_Client-Certificate"	<br />	<br />	:log warning ("** Generate SSH Keys And Certificates Script ** Завершено")<br />} on-error={<br />	:log error ("** Generate SSH Keys And Certificates Script ** Ошибка выполнения")<br />}; # EndDo<br /><br />}; #EndOfScript <br />
			<i>08.05.2023 22:30:00, tabraham.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385811</link>
			<guid>http://mikrotik.moscow/forum/forum57/84363-vlozhennye-skripty-do-on_error/message385811</guid>
			<pubDate>Mon, 08 May 2023 22:30:00 -0400</pubDate>
			<category>RouterOS</category>
		</item>
	</channel>
</rss>
