Автоматизация при помощи встроенного скриптового языка и RouterOS API
verdad
Сообщения: 14 Зарегистрирован: 13 дек 2016, 21:57
Сообщение
verdad » 13 дек 2016, 22:12
Всем доброго времени суток! Пробую вытянуть из микротика инфу по подключенным устройствам. Без строк 2 и 3 работает, но нужно только несколько столбцов выводе.
Код: Выделить всё
$request='/caps-man/registration-table/print'
1. $api_object->write($request);
2. $api_object->write('=stats=');
3. $api_object->write('=.proplist=interface,mac-address,rx-signal,uptime,packets');
Вывод такой:
Код: Выделить всё
Array ( [0] => !trap [1] => =message=no such command prefix [2] => !done )
Какого вида должен быть запрос?
Последний раз редактировалось verdad 15 дек 2016, 20:42, всего редактировалось 2 раза.
Chupaka
Сообщения: 4086 Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Сообщение
Chupaka » 14 дек 2016, 10:13
Доброго. Подозреваю, в команде write должен быть второй аргумент - завершать ли запрос и выполнять его. Он должен быть, например, true (по умолчанию) в последней части команды, а предыдущие части должны содержать false.
Пробуйте так:
Код: Выделить всё
$api_object->write($request, false);
$api_object->write('=stats=', false);
$api_object->write('=.proplist=interface,mac-address,rx-signal,uptime,packets');
Идеальный вариант - почитать документацию к своей реализации php API
verdad
Сообщения: 14 Зарегистрирован: 13 дек 2016, 21:57
Сообщение
verdad » 14 дек 2016, 13:47
verdad
Сообщения: 14 Зарегистрирован: 13 дек 2016, 21:57
Сообщение
verdad » 15 дек 2016, 16:17
Еще маленький вопрос.
Хочу на страничке мониторинга выводить события авторизации из лога микротика.
мне подходит токая команда: /log print where message~"log"
пытаюсь все тем же способом ее выполнить через php.
Код: Выделить всё
$message = "log";
$api_object->write('/log/print', false);
$api_object->write('=where=', false);
$api_object->write('?=message='.$message,true);
$hs_log = $api_object->read(false);
В итоге: Array ( [0] => !done ) Array ( [0] => !done ) Array ( [0] => !done )
Так вообще можно делать или брать все сообщения и фильтровать?
Chupaka
Сообщения: 4086 Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Сообщение
Chupaka » 15 дек 2016, 16:58
Фильтровать все, я не вижу в API оператора, похожего на "~"
?=message=blabla - это сравнение, а не поиск подстроки, увы
конкретно по авторизации можно ещё попробовать
Код: Выделить всё
$api_object->write('/log/print', false);
$api_object->write('?topics=system,info,account');
verdad
Сообщения: 14 Зарегистрирован: 13 дек 2016, 21:57
Сообщение
verdad » 15 дек 2016, 19:40
Команда:
Код: Выделить всё
/log print where topics=hotspot,info,debug || topics=hotspot,account,info,debug
полностью удовлетворяет моим нуждам. Но как правильно их объединить в скрипте?
Код: Выделить всё
$api_object->write('/log/print', false);
$api_object->write('?topics=hotspot,info,debug', false);
$api_object->write('?topics=hotspot,account,info,debug');
Возвращает пустой результат. Можно конечно по отдельности каждый выполнить, но мне придется делать огород на огороде)
Chupaka
Сообщения: 4086 Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Сообщение
Chupaka » 15 дек 2016, 20:09
http://wiki.mikrotik.com/wiki/Manual:API#Queries
т.е. запрос должен быть таким:
Код: Выделить всё
$api_object->write('/log/print', false);
$api_object->write('?topics=hotspot,info,debug', false);
$api_object->write('?topics=hotspot,account,info,debug', false);
$api_object->write('?#|');
по умолчанию, как у вас, считает И, а не ИЛИ
verdad
Сообщения: 14 Зарегистрирован: 13 дек 2016, 21:57
Сообщение
verdad » 15 дек 2016, 20:40
Ранее видел эту инструкцию и даже пробовал ее читать, но мой английский ни на что не годен. Она меня только запутала. Спасибо большое!