Категорически приветствую.

Недавно мне понадобилось поработать с Mikrotik через его API. Вроде бы ничего примечательного, есть официальная библиотека, есть еще на гитхабе обёртка, но вот беда — мне надо было работать асинхронно через asyncio и c использованием плюшек async/await. И такой библиотеки я не нашел.

Пришлось писать самому.

Сильно длинной статья не будет, т. к. особо и не о чем писать. И вполне достаточно было бы ссылки на репозиторий.

Установка пакета:

pip install aio_api_ros

Вот пример использования:

import asyncio
from aio_api_ros import create_rosapi_connection

async def main():
    # устанавливаем коннект
    mk = await create_rosapi_connection(
        mk_ip='127.0.0.1',
        mk_port=8728,
        mk_user='myuser',
        mk_psw='mypassword'
    )
    # отправляем команду
    mk.talk_word('/ip/hotspot/active/print')
    # считываем ответ от микротика
    res = await mk.read()
    print(res)
    mk.close()


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()

Так же есть возможно создать простенький пул коннектов до микротика, но в боевых условия пул не тестился.

Тот же пример но с пулом коннектов
import asyncio
from aio_api_ros import create_rosapi_simple_pool

async def main():

    mk = await create_rosapi_simple_pool(
        mk_ip='127.0.0.1',
        mk_port=8728,
        mk_user='myuser',
        mk_psw='mypassword',
        max_size=4
    )

    await mk.talk_word('/ip/hotspot/active/print')
    res = await mk.read()
    print(res)
    mk.close()


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()


Для парсинга ответов от микрота я воспользовался наработками из этого репозитория

Надеюсь, кому-то это окажется полезным.

Комментарии (9)


  1. resetme
    29.05.2019 18:29
    -2

    А можно названия функций сделать ещё длиннее? Чтобы потруднее было набирать.


    1. resetme
      31.05.2019 16:00

      Судя по минусам многие любят писать
      create_rosapi_connection за место создания экземпляра объекта из определенного пространства имен и использования методов типа read и write или send и recieve.


      1. chelaxe
        01.06.2019 08:02

        from aio_api_ros import create_rosapi_connection as crc


        1. resetme
          01.06.2019 22:12

          Проблема при этом останется. Вот паттерн из многих подобных библиотек.


          from aio_ros import Connection


          conn = Connection(...)
          resp = conn.send(...)


  1. heyZEUS
    30.05.2019 20:59

    эмммммм, а что мешало посмотреть инфу по хотспотам просто подключившись к микроту по ssh, или через вебморду, ну или через тот же винбокс?)


  1. frostspb Автор
    30.05.2019 21:00

    Ну, например, есть свой микросервис, который должен логинить юзеров на разные микроты, через апи


    1. heyZEUS
      30.05.2019 22:17

      а зачем для этого апи, если всё нужное и так есть в микроте?) Просто на данный момент вижу, что приходится тратить лишнее время на написание команд для подключения к микроту ради выполнения на нем действий, предусмотренными его же синтаксисом


      1. frostspb Автор
        30.05.2019 22:59

        Ну, возникла производственная необходимость встроить этот функционал в приложение на торнаде


      1. chelaxe
        31.05.2019 05:31

        api Mikrotik и так есть в Mikrotik)) Написание команд для ssh, тут равносильно реализации работы с api Mikrotik. ssh, web-интерфейс — это для человека — администратора, api — для автоматизации. Использование api для автоматизации действий с Mikrotik это правильный подход, нежели использовать для этого ssh, web-интерфейс.