Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • 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
    Запрос функции: OpenAPI для REST API

    Запрос функции: OpenAPI для REST API

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Запрос функции: OpenAPI для REST API, RouterOS
     
    sssuperman
    Guest
    #1
    0
    27.05.2021 08:10:00
    Привет! Здорово, что для новой бета-версии RouterOS v7 появился REST API. Мы пытаемся внедрить автоматизацию через REST API для RouterOS v7, но столкнулись с тем, что требуется немало усилий, чтобы разобраться в использовании API и сопоставить его с интерфейсом команд. Интересно, можно ли получить спецификацию OpenAPI в формате json, чтобы ускорить разработку для пользователей. Chang
     
     
     
    Amm0
    Guest
    #2
    0
    28.02.2022 17:34:00
    Ты когда-нибудь находил OpenAPI или Swagger-документацию для REST API? Кто-нибудь уже сделал её?
     
     
     
    stevenjacobs
    Guest
    #3
    0
    31.10.2022 13:44:00
    +1. Тоже ищу это. Есть какие новости?
     
     
     
    mrz
    Guest
    #4
    0
    01.11.2022 07:32:00
    Возможно, это будет полезно? Вы можете получить список, вызвав: http://ros_adrese/webfig/list
     
     
     
    Amm0
    Guest
    #5
    0
    08.11.2022 15:43:00
    Спасибо, @mrz — очень полезно. Особенно для практического создания скинов (потому что /webfig/list вроде бы совпадает со значениями, которые идут в файл «skin»). Но до удобного использования в REST-инструментах типа Postman ему ещё далеко… Тем не менее, полезно: файлы, к которым обращается /webfig/list, на самом деле перечисляют все атрибуты, что удобно. Но вывод из файла JG, похоже, использует именно имена из «Webfig» (логично, учитывая контекст), при этом нигде не указано эквивалентное имя для CLI/REST (например, «DHCP Client» vs. «dhcp-client»), так что для преобразования нужно как-то сопоставлять их. Весь этот процесс — большой проект. Если кому-то поможет, я написал небольшой код на JavaScript для парсинга вывода — поскольку /webfig/list не является современным JSON (но похож на формат «webfig skin JSON»), для разбора нужно использовать eval(). Я с этим дальше ничего не делал, но хотя бы можно более удобно смотреть данные. Либо можно собрать такие данные с разных версий, чтобы сравнить изменения схемы от релиза к релизу.

    function webfiglist(ip) {
     if (typeof window === "object" && !ip) {
       ip = (new URL(window.location.href)).host
     }
     return new Promise((done) => {
       fetch(`http://${ip}/webfig/list`)
         .then((req) => req.text())
         .then((txt) => {
           var results = {};
           /* это важно...
              /webfig/list — это не валидный JSON, а JS-фрагмент,
              поэтому для преобразования в переменную нужно использовать eval() */
           eval(`results = [${txt}]`);
           done(results);
         });
     });
    }

    function webfigschemas(ip) {
     if (typeof window === "object" && !ip) {
       ip = (new URL(window.location.href)).host
     }
     return webfiglist(ip).then((list) =>
       Promise.all(
         list
           .filter((i) => i.unique)
           .map((i) => {
             return new Promise((done) => {
               let file = i.name
               fetch(`http://${ip}/webfig/${file}`)
                 .then((req) => req.text())
                 .then((txt) => {
                   /* тот же трюк с eval(), только возвращаем «кортеж» [имя файла, данные] */
                   var results
                   eval(`results = ${txt}`)
                   done([file, results])
                 })
             })
           })
       )
     )
    }

    webfiglist().then(console.log)
    webfigschemas().then(console.log)

    // NODE.JS сохранение в файл
    // let ip = "192.168.88.1"
    // const fs = require('fs');
    // webfigschemas(ip).then(d => fs.writeFileSync("./webfig-list-schema.json", JSON.stringify(d)))

    Если вставить этот код в консоль JavaScript в браузере (включив «Inspect» на странице webfig), то в консоли отобразится «датасхема». Если использовать nodeJS, можно передать ip-адрес в webfiglist("192.168.88.1") и получить данные с любого устройства RouterOS (возможно, это получится сделать и в браузере, но для кросс-доменных запросов понадобится настроить проверки безопасности).
     
     
     
    mrz
    Guest
    #6
    0
    08.11.2022 15:59:00
    Ещё одним полезным инструментом может быть /console/inspect. Вы можете запросить завершение, список дочерних команд меню и параметры.
     
     
     
    Larsa
    Guest
    #7
    0
    08.11.2022 18:16:00
    Интересно, есть ли где-нибудь документация по inspect request=child и другим связанным функциям?
     
     
     
    mrz
    Guest
    #8
    0
    08.11.2022 19:03:00
    Это пасхалка
     
     
     
    Amm0
    Guest
    #9
    0
    09.11.2022 13:47:00
    Но теперь мы можем их найти. Это не критично для моих задач, но я написал код, который вытягивает все «дочки» (request=child) из /console/inspect. Он использует рекурсию с ROS-функцией для обхода дерева «child» и возвращает ROS::array (и одновременно кладёт результат в глобальную переменную “$ast”). Удивительно, но это НЕ вызывает переполнение стека или превышение лимитов памяти, по крайней мере в версии v7.6.

    На самом деле, после обхода дерева, даже на небольшом cAP, находится 4329 уникальных ветвей “cmd”, “args” и “path”, каждая с несколькими листами.

    :global ast [:toarray ""]

    :global mkast do={
       :global mkast
       :global ast
       :local path ""
       :if ([:typeof $1] ~ "str|array") do={ :set path $1 }
       :local pchild [/console/inspect as-value request=child path=$path]
       :foreach k,v in=$pchild do={
           :if (($v->"type") = "child") do={
               :local astkey ""
               :local arrpath [:toarray $path]
               :foreach part in=$arrpath do={
                   :set astkey "$astkey/$part"
               }
               :set ($ast->$astkey->($v->"name")) $v
               :put "Обрабатываю: $astkey $($v->"name") $($v->"node-type")"
               :local newpath "$($path),$($v->"name")"
        # TODO использовать [/console/inspect as-value request=syntax path=$path]
               [$mkast $newpath]
           }
       }
       return $ast
    }

    # и этот вызов запускает рекурсию
    :put [$mkast]

    $ast также будет содержать схему в виде вложенного массива, отражающего отношения родитель/дочка… так что можно использовать так: :put ($ast->"/ip/address")

    add=.id=*2;name=add;node-type=cmd;type=child;comment=.id=*3;name=comment;node-type=cmd;type=child;disable=.id=*4;name=disable;node-type=cmd;type=child;edit=.id=*5;name=edit;node-type=cmd;type=child;enable=.id=*6;name=enable;node-type=cmd;type=child;export=.id=*7;name=export;node-type=cmd;type=child;find=.id=*8;name=find;node-type=cmd;type=child;get=.id=*9;name=get;node-type=cmd;type=child;print=.id=*a;name=print;node-type=cmd;type=child;remove=.id=*b;name=remove;node-type=cmd;type=child;reset=.id=*c;name=reset;node-type=cmd;type=child;set=.id=*d;name=set;node-type=cmd;type=child

    Ещё пример — часть вывода массива $ast выше в виде YAML-подобного формата:

    /zerotier/edit:
       number:
         .id: *2
         name: number
         node-type: arg
         type: child
       value-name:
         .id: *3
         name: value-name
         node-type: arg
         type: child
     /zerotier/enable:
       numbers:
         .id: *2
         name: numbers
         node-type: arg
         type: child

    Я тут это не делал, но если добавить ещё один вызов “/console/inspect request=syntax …” для каждого child с тем же путём, можно получить описание (например, тип — «объяснение»). Тогда у вас будет вся информация для REST-схемы. Думаю, RAML было бы легче сгенерировать из ROS-скрипта, так как он использует формат YAML, а не JSON, и YAML проще сгенерировать в ROS-скрипте. Мне кажется, ключи из моего кода достаточно близки к REST POST-полям, так что это будет самый простой путь смоделировать в RAML.

    И, насколько я знаю, кое-какие инструменты могут использовать или конвертировать схему из RAML в swagger/OpenAPI. Но /console/inspect действительно содержит данные для REST-схемы, хотя конвертация — это всё ещё дополнительная работа.

    Единственное замечание: /console/inspect, похоже, знает обо всех пакетах (например, «extra-packages»), даже если они не установлены — так что вы увидите child-записи для calea, iot и прочих, даже если они недоступны.
     
     
     
    Larsa
    Guest
    #10
    0
    09.11.2022 14:07:00
    Отличная информация, спасибо! Похоже, что метаданные proxy-repository довольно согласованы и действительно стоят того, чтобы их изучить для построения дерева команд для автоматической интеграции. С RAML я согласен.
     
     
     
    Amm0
    Guest
    #11
    0
    13.11.2022 22:34:00
    Сегодня снова пересмотрел это, думал, будет легко получить «объяснение». Хотя «request=child» работает с issue, некоторые «request=syntax» (например, «path=ip,address,add,interface», см. ниже) вызывают полный сбой терминала («Console has crashed; please log in again.») — при этом большинство запросов с request=syntax работают нормально.

    [user@router] > /console/inspect request=syntax path=ip,address,add
    Колонки: TYPE, SYMBOL, SYMBOL-TYPE, NESTED, NONORM, TEXT  
    TYPE    SYMBOL     SYMBOL-TYPE  NESTED  NONORM  TEXT  
    syntax             collection        0  yes  
    syntax  address    explanation       1  no      Локальный IP-адрес  
    syntax  broadcast  explanation       1  no      Широковещательный адрес  
    syntax  comment    explanation       1  no      Краткое описание элемента  
    syntax  copy-from  explanation       1  no      Номер элемента  
    syntax  disabled   explanation       1  no      Определяет, игнорируется элемент или используется  
    syntax  interface  explanation       1  no      Имя интерфейса  
    syntax  netmask    explanation       1  no      Маска сети  
    syntax  network    explanation       1  no      Префикс сети  

    [user@router] > /console/inspect request=syntax path=ip,address,add,address
    Колонки: TYPE, SYMBOL, SYMBOL-TYPE, NESTED, NONORM, TEXT  
    TYPE    SYMBOL   SYMBOL-TYPE  NESTED  NONORM  TEXT  
    syntax  Address  definition        0  no      A.B.C.D    (IP-адрес)  

    [user@router] > /console/inspect request=syntax path=ip,address,add,interface

    Консоль упала; пожалуйста, войдите снова. Даже обернув это в «:do {} on-error={}» сбой не ловится, так что этот способ не сработал.  

    :do {  
      /console/inspect request=syntax path=ip,address,add,interface  
    } on-error={:put "got error"}  

    Хотя для схемы это не было бы критично, там всё же есть описание, которое можно установить, и есть какой-то узел типа «collection», который, вероятно, указывает на возможный массив (а не просто строку) в качестве параметра JSON.  

    К слову, тот же /console/inspect можно вызвать и через REST API. Но при тех же параметрах в REST («{ “request”: “syntax”,  “path”: “ip,address,add,interface” }») терминал не падает, а просто виснет без данных (пустой JSON-массив).  

    На самом деле, вот RAML для /console/inspect:  
    #%RAML 1.0  
    title: ROS.RAML sample  
    version: 7.6  
    protocols: [HTTPS]
    mediaType: [application/json]
    securitySchemes:  
     basic:  
       description: |  
         Mikrotik REST API поддерживает только Basic Authentication, защищённую HTTPS  
       type: Basic Authentication  
    securedBy: [basic]
    baseUri: https://{host}:{port}/rest  
    baseUriParameters:  
     host:  
       description: IP-адрес или имя хоста устройства RouterOS  
       default: "192.168.88.1"  
     port:  
       description: HTTPS-порт RouterOS  
       default: "443"  
    documentation:  
     - title: RouterOS RAML Schema  
       content: |  
         Схема генерируется с помощью `/console/inspect` на устройствах RouterOS и  
         интерпретируется согласно правилам из  
         [Mikrotik REST documentation](https://help.mikrotik.com)  
     - title: Только демо  
       content: Просто пробуем несколько команд  

    /console:  
     /inspect:  
       post:  
         description: Инспекция AST RouterOS  
         body:  
           application/json:  
             type: object  
             properties:  
               .proplist?:  
                 type: string  
                 description: Список свойств для возврата (смотрите документы RouterOS)  
               .query?:  
                 type: string  
                 description: Список свойств для возврата (смотрите документы RouterOS)  
               path?:  
                 type: string  
                 description: Строка путей RouterOS, разделённых запятыми  
                 example:  
               input?:  
                 type: string  
               request:  
                 type: string  
                 enum: [self|child|completion|highlight|syntax|error]
             example:  
                 path: "ip,address,add,interface"  
                 request: syntax  
         responses:  
           200:  
             body:  
               application/json:  
                 type: array
     
     
     
    Amm0
    Guest
    #12
    0
    11.09.2023 03:00:00
    Я как-то забыл об этом. Но у меня есть реализация на JavaScript, которая использует /system/console через REST и генерирует схему RAML 1.0. Смотрите https://forum.mikrotik.com/viewtopic.php?t=199476 для альтернативы на основе RAML. Редакция: заметил, что это был бета-форум, поэтому перенес подход с RAML в новую тему в разделе Scripting.
     
     
     
    Amm0
    Guest
    #13
    0
    11.09.2023 17:49:00
    Вот схема OpenAPI, которую я сгенерировал на основе приведённой выше RAML-схемы. Схема OpenAPI 3.0 / swagger https://tikoci.github.io/restraml/routeros-openapi3.json Возможно, в ней есть вызовы, которые не допускаются, и кое-что могло перевестись не идеально. Но она загружается:
     
     
     
    brotherdust
    Guest
    #14
    0
    14.12.2023 20:55:00
    Вау! Спасибо, отличная работа!
     
     
     
    Amm0
    Guest
    #15
    0
    27.05.2024 12:21:00
    Недавно я автоматизировал создание файлов схем на GitHub, включая OpenAPI 2.0 (OAS2). Так что более новые (и старые) версии схем RAML и OpenAPI доступны по адресу: https://tikoci.github.io/restraml. На той же странице есть удобный инструмент для сравнения (diff), чтобы увидеть изменения между версиями RouterOS. Теперь проще отслеживать изменения между версиями…
     
     
     
    Amm0
    Guest
    #16
    0
    10.07.2025 19:01:00
    Дел продвинул далеко с /console/inspect. В общем, между restraml schemas+diff (используя request=syntax и request=child), которые работают с RAML и OpenAPI схемами, и RouterOS LSP для подсветки синтаксиса/ошибок/автозаполнения (используя request=completion и request=highlight) — используется почти всё, что может предложить /console/inspect. Хотя LSP довольно неплохо работает с данными об автозаполнении и подсветке от inspect.

    Но у RouterOS LSP есть ограничение — я так и не смог надёжно понять, что именно является «текущей рабочей директорией» при использовании /console/inspect с запросами типа request=... input="код". Представление LSP о скрипте RouterOS — это только «highlight» токены, привязанные к позиции текста в редакторе LSP (VSCode, nvim и прочих). А вот токенизатор Inspect точно знает текущий path= (в смысле ip,address), потому что умеет разрешать подсценарии вроде [find] и прочий синтаксис, который по умолчанию содержит путь.

    В некоторых случаях путь можно вывести, например /ip/address/add..., где он полностью квалифицирован. Из-за этого LSP ограничен возможностью request=syntax давать редактору «сигнатуру» (то есть помощь CLI по F1). Так что, если у вас есть новые «пасхалки» по поводу этой проблемы cwd, буду рад узнать.

    Полный список ограничений /console/inspect здесь:...

    И ещё загадка — /console/inspect request=error. Я до сих пор не могу понять, что он делает. Есть какие-нибудь новые идеи? Он всегда возвращает nil, независимо от того, что передано (валидный код или самый плохой синтаксис):

    :put [:typeof [/console/inspect request=error input=":put [/system/identity/get name]"]]
    # nil

    :put [:typeof [/console/inspect request=error input="/somebadcommand"]]
    # nil

    Но, подозреваю, что он что-то всё-таки делает, просто я пока не понял что. Сейчас это загадка в этой «пасхальной» инспекции.
     
     
     
    LeonardJeard
    User
    Сообщений: 1 Регистрация: 23.09.2025
    #17
    0
    23.09.2025 20:13:02
    Embark into the massive sandbox of EVE Online. Test your limits today. Fight alongside thousands of explorers worldwide. Play for free
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры