23. Служба netconf

В ПАК “Фортикс” реализована возможность удалённого управления узлом по протоколу NETCONF (Network Configuration Protocol) (см. RFC 6241). Протокол NETCONF реализует обмен управляющими XML-сообщениями и работает по принципу “клиент-сервер”. ПАК “Фортикс” выступает в роли сервера. Аавторизованные клиенты NETCONF имеют возможность запрашивать/изменять конфигурацию ПАК “Фортикс” и инициировать выполнение определённых RPC-процедур (Remote Procedure Call) на ПАК.

В ПАК “Фортикс” в качестве транспорта протокола NETCONF используется протокол SSH (см. RFC 6242).

Протокол NETCONF работает в двух режимах: listen и call-home.

Режим listen – стандартный режим сервера. ПАК “Фортикс” ожидает на сокете и принимает SSH-соединения от клиентов. По умолчанию используется TCP-порт 830. В случае успешной идентификации и аутентификации пользователя SSH, ему разрешаются операции с конфигурацией и RPC-процедуры согласно его ролевой группе, то есть (при включённом NACM) к операциям NETCONF применяются ограничения согласно настройкам ролевой модели (см. раздел 5 Ролевая модель).

Режим call-home (см. RFC 8071) применим в случае, если IP-адрес узла заранее неизвестен или ПАК “Фортикс” находится за областью NAT. В режиме call-home ПАК “Фортикс” первый инициирует TCP-соединение с клиентом (с периодичностью, согласно собственным настройкам). Далее клиент по данному TCP-соединению инициирует транспортную сессию (например, SSH) с идентификацией/аутентификацией и начинает обмен NETCONF-процедурами. Таким образом, ПАК “Фортикс” самостоятельно “звонит домой” (от названия режима) клиенту NETCONF для получения от него команд управления.

23.1. Краткое описание настроек службы netconf

23.1.1. Настройка режима listen

Настройка режима listen осуществляются на следующем уровне конфигурации:

[edit netconf-server listen]

На данном уровне конфигурации доступны следующие настройки:

  • idle-timeout <idle-timeout-value> – указать тайм-аут автоматического закрытия сессии NETCONF при отсутствии запросов от клиента, где <idle-timeout-value> – число секунд, по умолчанию – 180;

  • endpoints endpoint <endpoint-name> ssh – перейти на уровень конфигурации именованной группы настроек одного слушающего сокета протокола NETCONF/SSH, где <endpoint-name> – строка, возможно определение нескольких именнованных групп на данном уровне конфигурации:

    • tcp-server-parameters – перейти на уровень конфигурации TCP-соединений для ожидающего и принимающего сокета:

      • local-address <address> – указать IP-адрес, на котором ожидаются и принимаются входящие соединения, где <address> – IPv4-адрес в формате A.B.C.D;

      • local-port <port-number> – указать TCP-порт, на котором ожидаются и принимаются входящие соединения, где <port-number> – число от 1 до 65535, по умолчанию – 830;

      • keepalives – перейти на уровень конфигурации политики пересылки пакетов, поддерживающих соединение (см. RFC 9293, п. 3.8.4):

        • idle-time <idle-time-value> – указать период отсутствия трафика по TCP-соединению, по истечении которого начинается передача пакетов “TCP keep-alive”, где <idle-time-value> – число секунд, по умолчанию – 7200;

        • max-probe <max-probe-value> – указать максимальное количество переданных подряд пакетов “keep-alive”, оставленных без ответа, до определения TCP-соединения как потерянного, где <max-probe-value> – число от 1 до 65535, по умолчанию – 9;

        • probe-interval <probe-interval-value> – указать интервал между передачей пакетов “keep-alive”, оставленных без ответа, где <probe-interval-value> – число секунд, по умолчанию – 75;

    • ssh-server-parameters – перейти на уровень конфигурации SSH-сервера для слушающего сокета:

      • server-identity host-key <host-key-name> public-key – перейти на уровень конфигурации именованной ассоциации ключевой пары, использующейся для аутентификации сервера SSH, где <host-key-name> – строка, возможно определение нескольких именнованных ассоциаций на данном уровне конфигурации:

        • central-keystore-reference <key-name> – указать ссылку на ключевую пару, хранящуюся на глобальном уровне конфигурации [edit keystore], где <key-name> – строка (см. ниже);

        • inline-definition – перейти на уровень конфигурации непосредственного хранения ключевой пары, без ссылок на другие хранилища (см. ниже);

      • client-authentication – перейти на уровень конфигурации аутентификации клиентов NETCONF/SSH:

        • auth-timeout <auth-timeout-value> – указать тайм-аут аутентификации, где <auth-timeout-value> – число секунд, по умолчанию – 30;

        • endpoint-reference <endpoint-name> – использовать помимо собственных методы аутентификации клиентов из другой именованной группы настроек endpoint, где <endpoint-name> – имя существующей именованной группы настроек endpoint;

      • transport-params – перейти на уровень конфигурации транспортного уровня SSH:

        • encryption encryption-alg <algorithm> – указать приоритетный список алгоритмов шифрования, где <algorithm> – алгоритм(ы) из предложенного в командной строке списка (если настройка не задана, используются алгоритмы по умолчанию);

        • host-key host-key-alg <algorithm> – указать приоритетный список алгоритмов подписи, где <algorithm> – алгоритм(ы) из предложенного в командной строке списка;

        • key-exchange key-exchange-alg <algorithm> – указать приоритетный список алгоритмов выработки общего секрета, где <algorithm> – алгоритм(ы) из предложенного в командной строке списка;

        • mac mac-alg <algorithm> – указать приоритетный список алгоритмов имитозащиты, где <algorithm> – алгоритм(ы) из предложенного в командной строке списка.

На уровне конфигурации [edit netconf-server listen endpoints endpoint <endpoint-name> ssh ssh-server-parameters server-identity host-key <host-key-name> public-key inline-definition] доступны следующие настройки:

  • public-key-format – перейти на уровень конфигурации формата открытого ключа:

    • ssh-public-key-format – использовать формат открытого ключа SSH (см. RFC 4253, п.6);

    • subject-public-key-info-format – использовать ASN.1-кодировку структуры SubjectPublicKeyInfo (см. RFC 5280);

  • public-key <public-key-value> – определить значение открытого ключа, где <public-key-value> – строка в представлении BASE64;

  • private-key-format – перейти на уровень конфигурации формата закрытого ключа:

    • ec-private-key-format – использовать ASN.1-кодировку структуры ECPrivateKey (см. RFC 5915);

    • one-asymmetric-key-format – использовать ASN.1-кодировку структуры OneAsymmetricKey (см. RFC 5958);

    • openssh-private-key-format – использовать формат закрытого ключа OpenSSH;

    • private-key-info-format – использовать ASN.1-кодировку структуры PrivateKeyInfo (см. RFC 5208, PKCS #8);

    • rsa-private-key-format – использовать ASN.1-кодировку структуры RSAPrivateKey (см. RFC 3447);

  • cleartext-private-key <private-key-value> – определить значение закрытого ключа, где <private-key-value> – строка в представлении BASE64.

23.1.2. Настройка режима call-home

Настройка режима call-home осуществляется на следующем уровне конфигурации:

[edit netconf-server call-home]

На данном уровне конфигурации доступны следующие настройки:

  • netconf-client <netconf-client-name> – перейти на уровень конфигурации именованной группы настроек, относящейся к одному клиенту NETCONF, где <netconf-client-name> – строка, возможно определение нескольких именнованных групп на данном уроне конфигурации:

    • connection-type – перейти на уровень конфигурации политики соединения:

      • persistent – использовать постоянное соединение (в случае отсутствия, закрытия или потери соединения сервер повторяет попытку соединения с периодичностью, указанной в настройке max-wait);

      • periodic – перейти на уровень конфигурации периодичного соединения (настройки данного уровня конфигурации применяются совместно с настройками уровня конфигурации reconnect-strategy):

        • period <period-value> – указать период повторного соединения от начала инициации предыдущего соединения, где <period-value> – число минут, по умолчанию – 60, если соединение закрыто аварийно (без использования процедуры close-session), новое соединение инициируется немедленно;

        • idle-timeout <idle-timeout-value> – указать период, по истечении которого при отсутствии трафика соединение автоматически закрывается, где <idle-timeout-value> – число секунд, по умолчанию – 180;

        • anchor-time <yyyy-mm-ddThh:mm:00(Z|+-hh:mm)> – указать точку отсчёта времени для периодов соединений, как в будущее, так и в прошлое, где <yyyy-mm-ddTHH:MM:00(Z|+-HH:MM)> – время, кратное минуте (если настройка не задана, периоды отсчитываются от момента применения конфигурации);

    • reconnect-strategy – перейти на уровень конфигурации политики повторного соединения:

      • max-attempts <max-attempts-value> – указать количество неудачных произведённых подряд попыток соединения, после которых осуществляется переход к следующей группе настроек endpoint, если она имеется, и соединение принимается неудачным, где <max-attempts-value> – число, по умолчанию – 3;

      • max-wait <max-wait-value> – указать период ожидания ответа на соединение, по истечении которого осуществляется переход к следующей попытке, где <max-wait-value> – число секунд, по умолчанию – 5;

      • start-with first-listed – испозовать первую группу настроек endpoint при следующем запланированном соединении (настройка установлена по умолчанию);

      • start-with last-connected – испозовать последнюю удачно применённую группу настроек endpoint при следующем запланированном соединении;

      • start-with random-selection – испозовать случайную группу настроек endpoint при следующем запланированном соединении;

    • endpoints endpoint <endpoint-name> ssh – перейти на уровень конфигурации именованной группы настроек одного клиента NETCONF/SSH, где <endpoint-name> – строка, возможно определение нескольких именнованных групп на данном уровне конфигурации:

      • tcp-client-parameters – перейти на уровень конфигурации TCP-соединения с клиентом:

        • remote-address <address>|<host> – указать IP-адрес/имя хоста NETCONF-клиента, ожидающего и принимающего в режиме call-home, где <address> – IPv4-адрес в формате A.B.C.D[/mask], <host> – имя хоста;

        • remote-port <port-number> – указать порт NETCONF-клиента, ожидающего и принимающего в режиме call-home, где <port-number> – число от 1 до 65535, по умолчанию – 4334;

        • local-address <address> – указать локальный IP-адрес, через который инициируется TCP-соединение call-home, где <address> – IPv4-адрес в формате A.B.C.D[/mask], по умолчанию – 0.0.0.0/:: (первый подходящий);

        • local-port <port-number> – указать локальный порт, от которого инициируется TCP-соединение call-home, где <port-number> – число от 1 до 65535, по умолчанию – 0 (первый свободный);

        • keepalives – перейти на уровень конфигурации политики пересылки пакетов, поддерживающих соединение (аналогично уровню конфигурации [edit netconf-server listen ... tcp-server-parameters keepalives]);

      • ssh-server-parameters – перейти на уровень конфигурации SSH-сервера:

        • server-identity host-key <host-key-name> public-key – указать имя ассоциации ключевой пары для аутентификации SSH-сервера (аналогично режиму listen), где <host-key-name> – строка;

        • client-authentication – перейти на уровень конфигурации аутентификации клиентов NETCONF/SSH (аналогично режиму listen);

        • transport-params – перейти на уровень конфигурации транспортного уровня SSH (аналогично режиму listen).

23.1.3. Настройка глобального хранилища секретных ключей (keystore)

Настройка глобального хранилища секретных ключей осуществляется на следующем уровне конфигурации:

[edit keystore]

На данном уровне конфигурации доступны следующие настройки (далее перечислены только настройки, относящиеся к хранению закрытых ключей, использующихся в секции [edit ... server-identity] настроек сервера NETCONF):

  • asymmetric-keys asymmetric-key <asymmetric-key-name> – перейти на уровень конфигурации именнованной пары асимметричных ключей, которая используется в настройках netconf-server ... ssh-server-parameters server-identity ... central-keystore-reference, где <asymmetric-key-name> – строка, возможно определение нескольких именнованных пар на данном уровне конфигурации:

    • public-key-format – перейти на уровень конфигурации формата открытого ключа:

      • ssh-public-key-format – использовать формат открытого ключа SSH (см. RFC 4253, п.6);

      • subject-public-key-info-format – использовать ASN.1-кодировку структуры SubjectPublicKeyInfo (см. RFC 5280);

    • public-key <public-key-value> – определить значение открытого ключа, где <public-key-value> – строка в представлении BASE64;

      • private-key-format – перейти на уровень конфигурации формата закрытого ключа:

        • ec-private-key-format – использовать ASN.1-кодировку структуры ECPrivateKey (см. RFC 5915);

        • one-asymmetric-key-format – использовать ASN.1-кодировку структуры OneAsymmetricKey (см. RFC 5958);

        • openssh-private-key-format – использовать формат закрытого ключа OpenSSH;

        • private-key-info-format – использовать ASN.1-кодировку структуры PrivateKeyInfo (см. RFC 5208, PKCS #8);

        • rsa-private-key-format – использовать ASN.1-кодировку структуры RSAPrivateKey (см. RFC 3447);

    • cleartext-private-key <cleartext-private-key-value> – определить значение закрытого ключа, где <cleartext-private-key-value> – строка в представлении BASE64.

23.2. Пример минимальной настройки службы netconf в режиме listen

В данном подразделе рассматривается пример настройки доступа по протоколу NETCONF для двух учётных записей:

  • сетевой администратор netadmin с аутентификацией по паролю;

  • администратор admin с аутентификацией по открытому ключу.

Для создания учётных записей применяются команды:

# setup login netadmin
# setup login netadmin password
Change password for netadmin
Password:****
Retype password:****
# setup login admin
# commit

Примечание

Пароль для учётной записи admin не задан, так как аутентификация осуществляется только по открытому ключу.

Для добавления созданных учётных записей в соответствующие ролевые группы применяются команды:

# set nacm groups group netadm user-name netadmin
# set nacm groups group adm user-name admin
# commit

Для добавления разрешённых методов аутентификации по протоколу NETCONF к учётным записям применяются команды:

# set system auth netconf allow-login netadmin method keyboard-interactive
# set system auth netconf allow-login admin method public-key
# commit

Для работы ПАК “Фортикс” в качестве сервера SSH необходимо указание пары асимметричных ключей для подтверждения подлинности. Для создания закрытого асимметричного ключа применяется команда:

# setup netconf-identity <key-name> [<algorithm>]

где

  • <key-name> – произвольный текстовый идентификатор, используемый в дальнейшем для ссылки на ключ;

  • <algorithm> – алгоритм из предложенного в командной строке списка, по умолчанию – rsa2048 (рекомендуется).

Для генерации ключевой пары применяется команда:

# setup netconf-identity idkey
# commit

Конфигурация после выполнения указанной команды:

keystore asymmetric-keys asymmetric-key idkey {
  public-key-format ssh-public-key-format
  private-key-format rsa-private-key-format
  cleartext-private-key <private-key-base64>
}

Примечания:

1 Настройка cleartext-private-key имеет атрибут nacm:default-deny-all, поэтому отображается для учетной записи администратора root. Для других учётных записей (предустановленной ролевой модели) данное поле скрыто.

2 Открытый ключ в поле public-key указывать необязательно, так как он автоматически генерируется NETCONF-сервером из закрытого ключа.

Настройка одного сокета, ожидающего соединение по протоколу SSH, осуществляется на следующем уровне конфигурации:

[edit netconf-server listen endpoints endpoint p1 ssh]

где p1 – имя группы настроек одного сокета.

Для указания локального IP-адреса, на котором служба ожидает NETCONF-соединения, применяется команда:

[edit netconf-server listen endpoints endpoint p1 ssh]
# set tcp-server-parameters local-address 0.0.0.0

Для предоставления службе возможности ожидать соединения на всех интерфейсах указан адрес 0.0.0.0.

Примечание

На данном этапе настройки команда commit не применима из-за ошибки целостности конфигурации.

Настройка SSH-сервера осуществляется на следующем уровне конфигурации:

[edit netconf-server listen endpoints endpoint p1 ssh ssh-server-parameters]

Для указания ссылки на ключ ПАК “Фортикс”, используемого в протоколе SSH для подтверждения подлинности, применяется команда:

[edit netconf-server listen endpoints endpoint p1 ssh ssh-server-parameters]
# set server-identity host-key key1 public-key central-keystore-reference idkey

где

  • key1 – имя ассоциации ключевой пары;

  • idkey – имя ассиметричного ключа.

Для аутентификации учётных записей при подключении по протоколу NETCONF поддерживаются режимы publickey (для авторизации по SSH-ключу) и keyboard-interactive (для авторизации по паролю или по протоколу RADIUS).

Для просмотра конфигурации применяются команды:

# top
<Ctrl>+<Backspace>

Конфигурация NETCONF-сервера согласно указанным настройкам:

netconf-server listen endpoints endpoint p1 ssh {
  tcp-server-parameters local-address 0.0.0.0
  ssh-server-parameters server-identity host-key key1 public-key central-keystore-reference idkey
}

Для проверки работоспособности вышеуказанных настроек применим клиент NETCONF. В качестве клиента возможно использование утилиты netopeer2-cli на сторонней Linux-машине. При этом на данной машине должен присутствовать сгенерированный закрытый ключ для учётной записи admin в файле ~/.ssh/id_rsa.

Для использования утилиты netopeer2-cli необходимо последовательно собрать и установить следующие пакеты:

Для запуска утилиты применяется команда:

$ netopeer2-cli
> _

Для определения приоритетов методов аутентификации применяются команды:

> auth pref publickey 1
> auth pref interactive 2
> auth pref password -1
> auth pref
The SSH authentication method preferences:
    'publickey':   1
    'password':    disabled
    'interactive': 2

Для соединения с ПАК “Фортикс” по протоколу NETCONF/SSH от имени учётной записи netadmin применяется команда:

> connect --host <ip> --login netadmin
Keyboard-Interactive Authentication
Please enter your authentication token
Password: ********
> _

где <ip> – IP-адрес ПАК “Фортикс”.

При отсутсвии сообщений об ошибках полагается, что аутентификация прошла успешно.

Для проверки NETCONF-соединения применяется команда:

> get-config --source running

В случае успеха выводится конфигурация узла ПАК “Фортикс” в формате XML.

Для закрытия соединения учётной записи netadmin применяется команда:

> disconnect

Для регистрации ключевой пары учётной записи admin используются команды:

> auth keys add /home/user-name/.ssh/id_rsa.pub /home/user-name/.ssh/id_rsa
> auth keys
The keys used for SSH authentication:
#0: /home/user-name/.ssh/id_rsa.pub (private /home/user-name/.ssh/id_rsa)

Для инициализации соединения от имени учётной записи администратора admin применяется команда:

> connect --host <ip> --login admin
> _

где <ip> – IP-адрес ПАК “Фортикс”.

При отсутствии запроса на введение пароля полагается, что выполнена аутентификация по ключу.

Для проверки работоспособности NETCONF-соединения применяется команда:

> get-config --source running

Для выхода из утилиты применяется команда:

> exit

23.3. Минимальная настройка службы netconf в режиме call-home

Минимальная настройка службы в режиме call-home аналогична настройкам режима listen, за исключением настройки tcp-client-parameters remote-address, где для режима call-home указывается адрес клиента, с которым ПАК “Фортикс” устанавливает TCP-соединение. Кроме того, указывается тип подключения (настройка connection-type) – постоянное или периодическое. В примере используется постоянное (persistent) подключение, то есть на ПАК “Фортикс” (в случае отсутствия соединения) постоянно осуществляется попытка подключения к клиенту (по умолчанию – каждые 5 секунд на порт 4334).

Пример конфигурации минимальной настроки режима call-home:

netconf-server {
  call-home netconf-client client1 {
    endpoints endpoint p2 ssh {
      tcp-client-parameters remote-address <client_IP_address>
      ssh-server-parameters server-identity host-key key1 public-key central-keystore-reference idkey
    }
    connection-type persistent
  }
}

Для проверки работоспособности с помощью утилиты netopeer2-cli (полагается, что выполнены настройки auth pref и auth keys из примера подраздела 23.2 Пример минимальной настройки службы netconf в режиме listen) применяеются команды:

$ netopeer2-cli
> listen --login netadmin
Waiting 60s for an SSH Call Home connection on port 4334...
Keyboard-Interactive Authentication
Please enter your authentication token
Password: ********
> get-config --source running
... Конфигурация в формате XML
> disconnect

> listen --login admin
Waiting 60s for an SSH Call Home connection on port 4334...
> get-config --source running
... Конфигурация в формате XML
> exit

23.4. RPC-процедуры

23.4.1. Стандартные RPC

В ПАК “Фортикс” поддерживаются представленные в таблице 23.1 стандартные RPC-процедуры протокола NETCONF.

Таблица 23.1 Стандартные RPC-процедуры протокола NETCONF в ПАК “Фортикс”

RPC

Стандарт

cancel-commit

RFC 6241, 8.4.4.1

close-session

RFC 6241, 7.8

commit

RFC 6241, 8.3.4.1

copy-config

RFC 6241, 7.3; RFC 6243, 4.5.1

create-subscription

RFC 5277, 2.1.1

delete-config

RFC 6241, 7.4

delete-subscription

RFC 8639, 2.4.4

discard-changes

RFC 6241, 8.3.4.2

edit-config

RFC 6241, 7.2

edit-data

RFC 8526, 3.1.2

establish-subscription

RFC 8639, 2.4.2

factory-reset

RFC 8808, 2

get

RFC 6241, 7.7

get-config

RFC 6241, 7.1; RFC 6243, 4.5.1

get-data

RFC 8526, 3.1.1

get-schema

RFC 6022, 3.1

kill-session

RFC 6241, 7.9

kill-subscription

RFC 8639, 2.4.5

lock

RFC 6241, 7.5; RFC 8526, 3.2

modify-subscription

RFC 8639, 2.4.3

resync-subscription

RFC 8641, 4.4.4

unlock

RFC 6241, 7.6; RFC 8526, 3.2

validate

RFC 6241, 8.6.4.1; RFC 8526, 3.2

23.4.2. RPC-процедуры, специфические для ПАК “Фортикс”

23.4.2.1. exec-script

Процедура exeс-script позволяет выполнять скрипты на ПАК “Фортикс” и получать результаты его выполнения по протоколу NETCONF (см. раздел 30 Скрипты).

YANG-схема RPC-процедуры exec-script:

module fx-system {
  yang-version "1.1";
  namespace "http://zts.ru/fx/yang/system";
  prefix "system";

  rpc exec-script {
    description "Execute FX script";
    input {
      leaf script {
        description "Path or @[script...]";
        type string;
        mandatory true;
      }
      leaf-list args {
        description "Arguments";
        type string;
      }
    }
    output {
      leaf status {
        description "Status";
        type boolean;
      }
      leaf retval {
        description "Return value";
        type int32;
      }
      leaf stdout {
        description "Stdout";
        type string;
      }
      leaf stderr {
        description "Stderr";
        type string;
      }
    }
  }
}

Например, на ПАК “Фортикс” используется учётная запись netadmin (см. выше).

Для создания скрипта hello.lua в домашней директории пользователя применяется команда:

> edit /home/netadmin/hello.lua

Скрипт:

--@help Simple hello-world script
--@arg a1:string Argument 1
--@arg a2:string Argument 2

print("Hello from Fortics!")
print("Arg1=" .. ARGS.a1)
print("Arg2=" .. ARGS.a2)
command("no-command")

Для сохранения файла и выхода из редактора используются следующие сочетания клавиш: <Ctrl> + <O>, <Ctrl> + <X>.

Примечание

В последней строке вызывается несуществующая команда для получения ошибочного вывода в стандартном потоке вывода ошибок (stderr).

Для вызова RPC-процедуры на сторонней Linux-машине используется утилита netopeer2-cli (полагается, что выполнены необходимые настройки из примеров выше).

Предварительно создаётся файл с RPC-процедурой следующего содержания:

$ vim rpc.xml

<exec-script xmlns="http://zts.ru/fx/yang/system">
  <script>/home/netadmin/hello.lua</script>
  <args>some argument number one</args>
  <args>some argument number two</args>
</exec-script>

Для получения результата выполнения скрипта вызывается RPC-процедура с использованием утилиты netopeer2-cli:

$ netopeer2-cli

> connect --host <ip> --login netadmin
Keyboard-Interactive Authentication
Please enter your authentication token
Password: ********

> user-rpc --content rpc.xml
DATA
<status xmlns="http://zts.ru/fx/yang/system">false</status>
<retval xmlns="http://zts.ru/fx/yang/system">1</retval>
<stdout xmlns="http://zts.ru/fx/yang/system">Hello from Fortics!
Arg1=some argument number one
Arg2=some argument number two</stdout>
<stderr xmlns="http://zts.ru/fx/yang/system">&lt;3&gt;core: Error: Illegal command
&lt;3&gt;system: exit code 1</stderr>

где <ip> – IP-адрес ПАК “Фортикс”.

Предусмотрена возможность передачи скрипта непосредственно в теле RPC-процедуры (без создания файла скрипта на ПАК “Фортикс”). Для этого в начале тела тэга <script> указывается символ @.

Содержимое файла rpc.xml:

<exec-script xmlns="http://zts.ru/fx/yang/system">
  <script>@
    print("\n\nHello, World! Counting to 5...")
    for i=1,5 do
      print(i)
    end
    command("show version", true)
    print("\n")
  </script>
</exec-script>

Вызов RPC-процедуры через утилиту netopeer2-cli:

> user-rpc --content rpc.xml
DATA
<status xmlns="http://zts.ru/fx/yang/system">true</status>
<retval xmlns="http://zts.ru/fx/yang/system">0</retval>
<stdout xmlns="http://zts.ru/fx/yang/system">

Hello, World! Counting to 5...
1
2
3
4
5
Software: Fortics 1.0-0d-240625 (Resurrection)
Version: 1.0
Release: 0d
Revision: r0.f3858b6dfa
Date: 2024.06.25 01:19:56
Kernel: 5.10.208 x86_64
Status: dev r0 debug
License: Full
HWID: 3cba-8fc7-fdb7-0014-92af
Hash (kernel): 35b0fbfe5be498758fa42a1dae3140970cf6061dae260ca7325e6c53805e8069
Hash (rootfs): a1904fdb1cc2dec51ae550007d4653e84fd6d7b7042836e2737c0bdf6bb17f5f
Hash (loader): e34300f7b5fc767f565ffbf09bda715541f51ff843deb62f2698726a71de8648

</stdout>
<stderr xmlns="http://zts.ru/fx/yang/system"/>