Недавно мне понадобилось поработать с 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)
heyZEUS
30.05.2019 20:59эмммммм, а что мешало посмотреть инфу по хотспотам просто подключившись к микроту по ssh, или через вебморду, ну или через тот же винбокс?)
frostspb Автор
30.05.2019 21:00Ну, например, есть свой микросервис, который должен логинить юзеров на разные микроты, через апи
heyZEUS
30.05.2019 22:17а зачем для этого апи, если всё нужное и так есть в микроте?) Просто на данный момент вижу, что приходится тратить лишнее время на написание команд для подключения к микроту ради выполнения на нем действий, предусмотренными его же синтаксисом
frostspb Автор
30.05.2019 22:59Ну, возникла производственная необходимость встроить этот функционал в приложение на торнаде
chelaxe
31.05.2019 05:31api Mikrotik и так есть в Mikrotik)) Написание команд для ssh, тут равносильно реализации работы с api Mikrotik. ssh, web-интерфейс — это для человека — администратора, api — для автоматизации. Использование api для автоматизации действий с Mikrotik это правильный подход, нежели использовать для этого ssh, web-интерфейс.
resetme
А можно названия функций сделать ещё длиннее? Чтобы потруднее было набирать.
resetme
Судя по минусам многие любят писать
create_rosapi_connection за место создания экземпляра объекта из определенного пространства имен и использования методов типа read и write или send и recieve.
chelaxe
resetme
Проблема при этом останется. Вот паттерн из многих подобных библиотек.
from aio_ros import Connection
conn = Connection(...)
resp = conn.send(...)