Всем привет. Я пытаюсь реализовать вложенный скрипт :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
{; # 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
