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

    Как создать функцию поиска с использованием API + PHP скриптом?

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Как создать функцию поиска с использованием API + PHP скриптом?, RouterOS
     
    jaredharet
    Guest
    #1
    0
    30.08.2012 12:09:00
    Я хочу создать скрипт с использованием этой функции: netwatch enable [find host~"192.168.1.12"].
     
     
     
    boen_robot
    Guest
    #2
    0
    30.08.2012 12:38:00
    [редактировать] Кстати… как у тебя с английским?[/редактировать] API протокол не позволяет использовать фильтрацию по регулярным выражениям, но ты можешь сделать такое фильтрование на стороне PHP. Альтернативно, можно использовать другой приём, который API протокол позволяет: сравнивать IP-адреса как числа. Судя по твоему регулярному выражению, ты хочешь отфильтровать IP-адреса между 192.168.1.120 и 192.168.1.129, а также IP 192.168.1.12. Используя моего PHP клиента (см. мою подпись), это можно сделать так: <?php
    namespace PEAR2\Net\RouterOS;
    require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';

    $client = new Client('192.168.1.1', 'admin', 'password');

    $printRequest = new Request(
       '/tool netwatch print .proplist=.id',
       Query::where('host', '192.168.1.120', Query::ACTION_GREATHER_THAN)
           ->andWhere('host', '192.168.1.129', Query::ACTION_LESS_THAN)
           ->orWhere('host', '192.168.1.120')
           ->orWhere('host', '192.168.1.129')
           ->orWhere('host', '192.168.1.12')
    );

    $idList = '';
    foreach ($client->sendSync($printRequest)->getAllOfType(Response::TYPE_DATA) as $response) {
       $idList .= $response->getArgument('.id'), ',';
    }
    $idList = rtrim($idList, ',');

    $enableRequest = new Request('/tool netwatch enable');
    $enableRequest->setArgument('numbers', $idList);
    $client->sendSync($enableRequest);
     
     
     
    jaredharet
    Guest
    #3
    0
    30.08.2012 20:04:00
    А без PEAR2 может быть?
     
     
     
    boen_robot
    Guest
    #4
    0
    30.08.2012 20:11:00
    Да. Просто бери PHAR файл и подключай его, как в коде выше. Все необходимое встроено прямо в PHAR. PEAR или PEAR2 иметь необязательно. << Перевод для англоязычных: >>
     
     
     
    jaredharet
    Guest
    #5
    0
    30.08.2012 23:03:00
    В целом, я это придумал и работает безотказно, но хочу спросить про скорость, что будет работать лучше? $ARRAY = $API->comm('/tool/netwatch/print');

    for ($i=0; $i<250; $i++)
    {
    $regtable = $ARRAY[$i];
    $IP=$regtable['host'];
    $id=$regtable['.id'];
    if ($IP==$host) {
    $ARRAY = $API->comm("/tool/netwatch/enable", array(
        '.id'=> ''.$id.'',));
    }
    } И еще один вопрос, как заставляешь Mikrotik отправлять запросы, потому что я для этого использую fetch?
     
     
     
    boen_robot
    Guest
    #6
    0
    31.08.2012 11:54:00
    Определил, что мой код работает быстрее – там ты проходишь по всему в netwatch-е и проверяешь, а у меня MikroTik-а проверяет, после чего PHP напрямую получает только необходимое. А то, что так, как ты написал, будет искаться только конкретный IP (вместо любого IP, начинающегося с 192.168.1.12), это так, между прочим. А для отправки (HTTP?) запросов... fetch, конечно. Не, другого не бывает. << Translation for English speakers: >>
     
     
     
    jaredharet
    Guest
    #7
    0
    06.09.2012 20:11:00
    Да не начинаем новую тему, чтобы спросить: есть ли у тебя идея, как написать скрипт для MT, который будет добавлять новую строку в rsc файл?
     
     
     
    boen_robot
    Guest
    #8
    0
    06.09.2012 21:12:00
    Что-то вроде этого? :local imeNaFaila "file.rsc"
    /file set $imeNaFaila contents=([/file get $imeNaFaila contents] . "\nСъдържание на нов ред") Только имей в виду, что чем больше файл, тем больше RAM он будет "выпивать" из роутера, так как всё содержимое загружается, прежде чем его дополнить. Если ты хочешь, чтобы этого не происходило, тебе придется использовать, например, PHP, где файл будет скачиваться и дополняться на веб-сервере, после чего результат будет отправляться. В этом варианте, вместо "больше RAM" тебе нужно больше времени (из-за передачи между роутером и веб-сервером). Если этот файл представляет собой какой-то бэкап, то, пожалуй, лучше просто делать то, что нужно делать, и в конце сделать экспорт. << Translation for English speakers: >>
     
     
     
    jaredharet
    Guest
    #9
    0
    07.09.2012 09:18:00
    Не моя идея записывать в этот файл все недоставленные fetch-запросы, и, возможно, запускать его периодически для повторного выполнения.
     
     
     
    boen_robot
    Guest
    #10
    0
    07.09.2012 10:20:00
    Тогда файл, вероятно, не получится очень большим => всё вышеописанное тебе поможет. В принципе, я бы использовал PHP с какой-нибудь базой данных (где будут храниться проваленные запросы), а потом загружал бы необходимое в роутер. Даже если используешь API, загружать не нужно. Просто используй API для fetch, и храни URL в базе при провале. << Translation for English speakers: >>
     
     
     
    jaredharet
    Guest
    #11
    0
    07.09.2012 10:34:00
    Окей, но как разобраться с внешним сервером, чтобы понять, почему запрос не дошел?
     
     
     
    boen_robot
    Guest
    #12
    0
    07.09.2012 11:11:00
    Ответ всегда приходит, на самом деле. Вопрос в том, это ответ, который ты ожидаешь. Если status-а равен finished, значит, запрос вернул файл с кодом 200 (OK). В любых других обстоятельствах status-а равен failed. В API протоколе есть один баг с fetch-а, он не прерывает автоматически… с моим клиентом это легко “workaround”-ва. Примерно: <?php
    namespace PEAR2\Net\RouterOS;
    require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';

    $client = new Client('192.168.1.1', 'admin', 'password');

    $client->sendAsync(
       new Request('/tool fetch url="http://example.com/index.html" keep-result="yes"', null, 'f'),
       function ($response) {
           switch ($response->getArgument('status')) {
           case 'failed':
               //Запись в базу данных здесь
               //Без break;
           case 'finished':
               return true;
           }
       }
    );
    $client->loop(); << Translation for English speakers: >>
     
     
     
    jaredharet
    Guest
    #13
    0
    07.09.2012 12:40:00
    Это понятно, но это сработает, когда запрос fetch выполняется сервером. А моя идея — чтобы выполнялся роутером.
     
     
     
    boen_robot
    Guest
    #14
    0
    07.09.2012 13:41:00
    Сверху метод, заявка выполняется роутером. Сервер просто заставляет роутер выполнить заявку. То есть, положение такое: сервер → API-запрос к роутеру, роутер → HTTP-запрос к внешнему серверу, внешний сервер → HTTP-ответ к роутеру (передает содержимое файла), роутер → API-ответ к серверу (НЕ передает содержимое файла, а только статус). Разница только в том, ТИ где нажимаешь кнопку/делаешь график. Да, при вышеописанном потребуется периодическое выполнение настраивать на сервере, но сама заявка все равно будет делаться роутером (и результат будет приходить прямо туда, вместо того чтобы проходить через сервер). Мог бы ты вместо того, чтобы настраивать график на сервере, настроить роутер периодически делать один HTTP-запрос к серверу, который, в свою очередь, заставит роутер выполнить все остальное. То есть: роутер → HTTP-запрос к серверу, сервер → API-запрос к роутеру… Таким образом, роутер и начинает процедуру, и у тебя полный контроль над всей работой, пока ты в PHP. << Translation for English speakers: >>
     
     
     
    jaredharet
    Guest
    #15
    0
    10.09.2012 18:01:00
    Да, но суть всего кода в том, чтобы при определенной ситуации роутер отправлял запрос к серверу.
     
     
     
    boen_robot
    Guest
    #16
    0
    10.09.2012 19:16:00
    Что за ситуация? Выкладывай весь сценарий… может, найдём способ сделать это элегантнее. << Translation for English speakers: >>
     
     
     
    jaredharet
    Guest
    #17
    0
    13.09.2012 07:39:00
    Моя идея в том, чтобы netwatch отслеживал состояние заданного хоста и при изменении состояния отправлял запрос к веб-серверу, который будет записывать инфо в БД. И чтобы этот запрос всегда доходил до веб-сервера, рано или поздно.
     
     
     
    boen_robot
    Guest
    #18
    0
    13.09.2012 10:15:00
    Вместо того, чтобы записывать весь URL, можно просто записывать даты в один файл (по одному файлу для каждого хоста; каждая дата на новой строке), и безусловно делать запрос к серверу. Сервер в свою очередь будет выгружать файл, заполняя базу данных, а затем очищать его. Таким образом, все равно существует потенциал для переполнения RAM, но вероятность этого становится значительно меньше, так как размер одной даты меньше, чем целый URL, содержащий ту же самую дату.
     
     
     
    jaredharet
    Guest
    #19
    0
    13.09.2012 10:43:00
    Интересное решение, оно дает мне идею, чтобы не приходилось периодически запускать скрипт с Web-сервера. Можно организовать так, чтобы при изменении статуса netwatch запускался скрипт, который заставлял бы Web-сервер сам скачивать записанный файл и обновлять информацию? Так, как думаешь, будет использовано меньше всего ресурсов? И еще один небольшой вопрос: что будет, если во время чтения файла он будет записываться в него?
     
     
     
    boen_robot
    Guest
    #20
    0
    13.09.2012 11:12:00
    Да, точно это я и предлагаю. Часть ответственности RouterOS как операционной системы — автоматически ставить блокировки на чтение и запись: если чтение приходит первым, запись ждёт, пока чтение не закончится, прежде чем писать, и наоборот. Другой вопрос, что между каждой операцией блокировка освобождается, т.е. если сервер решит очистить файл точно в микросекунду между [/file get $imeNaFaila contents] и записью новой строки, новый файл будет содержать старые данные (плюс новую строку) вместо того, чтобы быть очищенным. Если вы пишете даты (включая время до секунды), это не большая проблема — делайте так, чтобы база данных требовала уникальное содержание для каждой записи, причём следующее обновление просто не будет записывать старые времена повторно и, возможно, уже очистит файл. С другой стороны, серверу хорошо бы взять файл через FTP, используя fopen() в “r+b” режиме, с целью приобрести пишущую блокировку (т.е. гарантировать, что чтение данных не наступит прежде очистки файла). В архиве клиента содержится одна под-библиотека — Net_Transmitter — которая может подсилить коммуникацию в случае. Примерно: <?php
    require_once 'PEAR2_Net_RouterOS-1.0.0b3.phar';

    $trans = new PEAR\Net\Transmitter\Stream($file = fopen('ftp://admin:password@192.168.1.1/192.168.1.12.txt', 'r+b'));
    $mysqli = new mysqli('127.0.0.1', 'root', '', 'db');

    $query = "INSERT INTO `failures` (`dateTime`) VALUES ";
    try {
       while (true) {
           //21 === strlen("mmm/DD/YYYY-HH:MM:SS\n")
           $dateTime = DateTime::createFromFormat('M/j/Y-H:i:s', ucfirst(rtrim($trans->receive(21))))
               ->format('Y-m-d H:i:s');
           $query .= "('" . $mysqli->real_escape_string($dateTime) . "'), ";
       }
    } catch (Exception $e) {
       //Приключихме с четенето на файла ИЛИ връзката е прекъснала по време на четенето.
    }

    $query = rtrim($query, ', ');
    $mysqli->query($query);
    ftruncate($file, 0);//Изчиства файла
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры