Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    Вложенные скрипты DO ON-ERROR

    Вложенные скрипты DO ON-ERROR

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Вложенные скрипты DO ON-ERROR, RouterOS
     
    tabraham
    Guest
    #1
    0
    08.05.2023 22:30:00
    Всем привет. Я пытаюсь реализовать вложенный скрипт :do {} on-error{}. Идея в том, чтобы был внешний (родительский) do цикл, который проверяет, не упал ли скрипт, а внутри, во внутреннем do и on-error, защититься от ошибки таймаута действия скрипта при подписании сертификатов. Проблема в том, что если что-то не срабатывает внутри внутреннего do, ошибка не ловится на собственном on-error блоке, а сразу уходит в on-error родительского цикла. Кто-нибудь может помочь решить эту проблему? Один из возможных вариантов — увеличить таймаут действия скрипта, чтобы сертификаты успевали подписываться, или, может, есть какая-то специальная команда, которая гарантирует подписание сертификатов независимо от таймаута. Я прикрепил скрипт, чтобы можно было воспроизвести. Спасибо большое за ваше время и помощь.

    {; # BeginOfScript

    ######################################################################
    ###Identity: Generate SSH Keys And Certificates Script
    ###Author: Tahasanul Abraham
    ###Created: Apr 18 2023
    ###Last Edited: May 05 2023
    ###Compatible Versions: ROS 7.x
    ###Tested on: ROS 7.0 - 7.9
    ######################################################################

    :do {
    :local ServerName ("XXXXXXXX")
    :local CertificateValidityDays (18250)
    :local CertificatePassword ("XXXXXXX")
    :local KeySize (8192)

    /ip/ssh/ set allow-none-crypto=no always-allow-password-login=yes strong-crypto=yes forwarding-enabled=remote host-key-size=$KeySize

    :do {
    /ip/ssh/ regenerate-host-key
    } on-error={
    :log error ("** Generate SSH Keys And Certificates Script ** Ждем генерацию SSH ключа для $ServerName")
    }; # EndDo

    /ip/ssh/ export-host-key key-file-prefix="$ServerName_SSH"

    /certificate/ add name="$ServerName_CA" common-name="$ServerName_CA" days-valid=$CertificateValidityDays key-size=$KeySize key-usage=crl-sign,key-cert-sign
    /certificate/ add name="$ServerName_Server" common-name="$ServerName_Server" days-valid=$CertificateValidityDays key-size=$KeySize key-usage=digital-signature,key-encipherment,tls-server
    /certificate/ add name="$ServerName_Client" common-name="$ServerName_Client" days-valid=$CertificateValidityDays key-size=$KeySize key-usage=tls-client

    :do {
    /certificate/ sign "$ServerName_CA" name="$ServerName_CA-Certificate"
    } on-error={
    :log error ("** Generate SSH Keys And Certificates Script ** Ждем подпись $ServerName_CA-Certificate")
    }; # EndDo

    :do {
    /certificate/ sign "$ServerName_Server" name="$ServerName_Server-Certificate" ca="$ServerName_CA-Certificate"
    } on-error={
    :log error ("** Generate SSH Keys And Certificates Script ** Ждем подпись $ServerName_Server-Certificate")
    }; # EndDo

    :do {
    /certificate/ sign "$ServerName_Client" name="$ServerName_Client-Certificate" ca="$ServerName_CA-Certificate"
    } on-error={
    :log error ("** Generate SSH Keys And Certificates Script ** Ждем подпись $ServerName_Client-Certificate")
    }; # EndDo


    /certificate/ export-certificate "$ServerName_CA-Certificate" export-passphrase=$CertificatePassword file-name="$ServerName_CA-Certificate"
    /certificate/ export-certificate "$ServerName_Client-Certificate" export-passphrase=$CertificatePassword file-name="$ServerName_Client-Certificate"

    :log warning ("** Generate SSH Keys And Certificates Script ** Завершено")
    } on-error={
    :log error ("** Generate SSH Keys And Certificates Script ** Ошибка выполнения")
    }; # EndDo

    }; #EndOfScript
     
     
     
    adrianTNT
    Guest
    #2
    0
    05.02.2024 20:50:00
    У меня похожая проблема, правильно ли я понял, что нельзя использовать on-error={} внутри циклов? Вот у меня такой код, где я пытаюсь в цикле разрешить имя в IP, и скрипт ломается, если доменное имя неверное. Если добавляю on-error, то выдает ошибку «expected end of command». Единственный вариант — использовать on-error вне цикла?

    # объявляем переменные  
    :local list  
    :local comment  
    :local newip  
    :local oldip  

    # Проходим по каждому элементу в списке адресов  
    :foreach i in=[/ip firewall address-list find] do={

       # Берём первые пять символов из названия списка  
       #:set list [:pick [/ip firewall address-list get $i list] 0 5]
       :set list [/ip firewall address-list get $i list]

       # Если это 'adr_ip_', значит совпадение — обрабатываем  
       :if ($list = "adr_ip_list") do={  

           # Получаем комментарий для этого элемента списка (имя хоста для разрешения)  
           :set comment [/ip firewall address-list get $i comment]
           :set oldip [/ip firewall address-list get $i address]

           # Разрешаем имя и обновляем адрес в списке, если он изменился  
           :if ($newip != $oldip) do={  
               :set newip [:resolve $comment]
               /ip firewall address-list set $i address=$newip  
           }  
           # если тут включить on-error, выдает ошибку "expected end of command"  <<<<<<<<<<<<<<<<<<<<<<<<<<< ЗДЕСЬ <<<<<<<<<<<<  
           # on-error={};  

           :put $comment;  
           :put $newip;  
       }  
    }
     
     
     
    optio
    Guest
    #3
    0
    05.02.2024 20:59:00
    Ты поместил код в блок :do { } перед on-error={} ? В твоём закомментированном коде этого не видно, и именно это, скорее всего, вызывает синтаксическую ошибку.
     
     
     
    adrianTNT
    Guest
    #4
    0
    05.02.2024 21:06:00
    Я попробовал в конце своего кода, там, где это закомментировано, без комментариев эта часть выглядела бы так:  
    if ($newip != $oldip) do={  
      :set newip [:resolve $comment]
      /ip firewall address-list set $i address=$newip  
    } on-error={};  
    Что-то вроде этого, но всё это внутри родительского цикла. Должно ли это работать?  
    У меня есть другая тема по этому поводу: http://forum.mikrotik.com/t/error-expected-end-of-command-when-trying-on-error/173368/1
     
     
     
    optio
    Guest
    #5
    0
    05.02.2024 21:11:00
    Нет, блок on-error должен быть отдельным и содержать код, где может возникнуть ошибка:  
    :if ($newip != $oldip) do={  
     :do {  
       :set newip [:resolve $comment]
       /ip firewall address-list set $i address=$newip  
     } on-error={  
    # здесь можно обработать ошибку или записать в лог, если нужно...  
     }  
    }
     
     
     
    adrianTNT
    Guest
    #6
    0
    05.02.2024 21:57:00
    Отлично, сработало, спасибо. // Заметка для себя: если внутри конструкции : if (…) do={…}, то on-error{} должен иметь свой отдельный блок :do{…}.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры