Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • 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
    Помощь с php api

    Помощь с php api

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Помощь с php api, RouterOS
     
    rubence1975
    Guest
    #1
    0
    25.01.2017 13:17:00
    Кто-нибудь может помочь написать PHP API? С моей PHP-страницы хочу отключить NAT-правило с определённым комментарием. Или просто, как вызвать следующую команду CLI из PHP-страницы: /ip firewall nat disable [/ip firewall nat find comment=1234] Заранее спасибо!
     
     
     
    rubence1975
    Guest
    #2
    0
    11.03.2017 18:19:00
    Привет снова! Последние несколько недель я много игрался с твоим API Client. Спасибо за такой классный инструмент. Но снова сижу в тупике. Хочу увеличить или уменьшить лимит в simple queue в два раза для конкретного IP-адреса. Например, если в simple queue для IP 192.168.100.2 максимальный лимит на загрузку — 10M, а на скачивание — 20M, то через API хочу сделать загрузку 5M, а скачивание 10M… и наоборот. Это возможно? Заранее спасибо!
     
     
     
    boen_robot
    Guest
    #3
    0
    11.03.2017 19:42:00
    Значение max-limit в очереди содержит лимит в формате «upload/download». Если я правильно помню, число задаётся в битах в секунду, так что удвоить существующий лимит будет достаточно просто: разделить строку по «/», умножить обе части и заново собрать строку с новыми значениями через «/». Например:

    $util->setMenu('/queue simple');  
    $queueId = $util->find(RouterOS\Query::where('target', '192.168.100.2/32'));  
    $maxLimit = $util->get($queueId, 'max-limit');  
    list($maxUp, $maxDown) = explode('/', $maxLimit, 2);  
    $maxUp *= 2;  
    $maxDown *= 2;  
    $util->set(  
       $queueId,  
       array(  
           'max-limit' => "{$maxUp}/{$maxDown}"  
       )  
    );  

    (то же самое, если нужно уменьшить вдвое — только делите на 2 вместо умножения и округляете результат, чтобы не было дробей).
     
     
     
    rubence1975
    Guest
    #4
    0
    11.03.2017 20:26:00
    Спасибо за быстрый ответ. Отлично, братан. Будь на чеку!
     
     
     
    chenashop
    Guest
    #5
    0
    03.04.2017 18:46:00
    Привет, я тоже пользуюсь вашим клиентом. Хочу изменить пароль PPPoE с помощью PHP-страницы, чтобы пользователь мог менять свой собственный пароль.  
    $name = "user1";  
    $password = "password1";  
    $service = pppoe  
    Можете помочь с этим?
     
     
     
    boen_robot
    Guest
    #6
    0
    04.04.2017 08:27:00
    $util->setMenu('/ppp secret')->set($name, array('password' => $password, 'service' => $service)); будет эквивалентно команде в строке /ppp secret set numbers="user1" password="password1" service="pppoe"
     
     
     
    evandromac
    Guest
    #7
    0
    10.01.2019 00:26:00
    Боэн, можешь помочь? Мне удалось сделать пару классных вещей с твоим API. Но сейчас я устал, у меня шея в огне (весь день просидел перед компьютером). Если я отправляю скрипт с script::prepare и потом запускаю его на роутере, он может выполнять сетевой тест (ping) для проверки соединения. А если запускаю тот же самый скрипт через util->exec, он не пингует ничего вне сети. Политика для обоих случаев одинаковая: read, write, test. Сейчас мне нужно принять лекарства для шеи и ждать твоей помощи. Заранее спасибо!
     
     
     
    boen_robot
    Guest
    #8
    0
    10.01.2019 09:42:00
    Как ты запускаешь это из роутера? Util::exec() использует «/system script run». Если ты, например, используешь scheduler или импортируешь файл через /import, то это другое. К тому же, Util::exec() добавляет текущий меню путь, а Script::prepare() этого не делает (потому что у него нет понятия меню). Если в твоём скрипте написано просто «ping», вместо «/ping» или «/tool ping», возможно, ты запускаешь его не из того меню. С Script::prepare() ты точно запускаешь с корня. Есть ли ошибки на стороне PHP, или скрипт работает без ошибок, но ты просто не видишь результатов пинга? Если первые — какая именно ошибка? Если вторые… Может, попробуй записывать результаты в глобальную переменную и проверить её потом?
     
     
     
    evandromac
    Guest
    #9
    0
    10.01.2019 12:35:00
    Я запускаю это на роутере, открывая скрипт и нажимая «run». Честно говоря, я пытался запустить скрипт, который отправлял с ::prepare из браузера через PHP, но не получилось, а так как времени в обрез, использовал util->exec. Но если кто-то знает, как запустить скрипт, который я отправлял ранее, используя ::prepare, буду очень признателен за помощь. Пробовал разные комбинации setCommand, request, setArgument (передавая имя скрипта), но ничего: ни ошибки, ни выполнения скрипта таким способом.

    По твоему второму вопросу: мой скрипт использует /tool ping, как видишь здесь:  
    :global pingPPPoE do={  
    :return [/tool ping $1 src-address=$2 count=$3];
    }  
    Он принимает такие параметры: $1 — адрес для пинга, $2 — адрес источника, $3 — сколько пингов роутер должен отправить. И возвращает, сколько ответов получил.

    Пока не пробовал сохранять количество ответов в глобальную переменную, так как думал, что проблема в правах доступа.

    Что касается твоего третьего вопроса: ошибки ни с одной стороны нет. Просто в ответ приходит 0 пакетов.

    P.S. Пробовал заменить «/tool ping» на просто «/ping» — и всё равно нет пакетов.
     
     
     
    boen_robot
    Guest
    #10
    0
    10.01.2019 13:28:00
    А как насчёт запуска реального ping через API? Если результаты важны для дальнейших шагов в скрипте, можно передать нужные части результата в параметры Util::exec() и действовать соответственно.

    Реальный ping можно выполнить так:
    $pingResults = $client->sendSync(
       $util->setMenu('/tool')->newRequest('ping', ['address' => $ip, 'src-address' => $src, 'count' => $count])
    )->getAllOfType(RouterOS\Response::TYPE_DATA);

    Util::exec() использует Script::prepare() «под капотом» (точнее, Script::append(), но он тоже основан на Script::prepare()), так что по сути это почти то же самое. Единственное отличие в том, что exec() добавляет меню в начало, создаёт скрипт в «/system script» с случайным именем, запускает его и затем удаляет.

    Эти же шаги можно сделать вручную вокруг Script::prepare() или их часть. Можно попробовать использовать Script::prepare(), затем добавить полученный скрипт в планировщик задач, чтобы он запустился через секунду или около того. Но при этом результаты всё равно нужно записывать в глобальные переменные или в лог, чтобы PHP смог их потом прочитать.
     
     
     
    evandromac
    Guest
    #11
    0
    10.01.2019 14:37:00
    Спасибо еще раз, Boen. На самом деле пинг и другие проверки должны выполняться внутри скрипта. Использовать PHP для проверки я не могу по причинам, связанным с разработкой (это часть более большого скрипта). Попробую воспользоваться твоим советом: использовать ::prepare и добавить в планировщик, чтобы запускать через секунду. Вернусь сюда с результатами.
     
     
     
    evandromac
    Guest
    #12
    0
    12.01.2019 19:12:00
    Да, Boen! Только сегодня (16:47 суббота в Бразилии) мне удалось выделить время, чтобы вернуться к этому проекту. И твоя подсказка сработала именно так, как ты сказал. Чтобы считать количество пингов из контекста routerOS, я просто сохранил значение в «comment» скрипта. В моём случае мне нужен только код результата всей операции (в моём исходном скрипте), но это простое и эффективное решение. Для тех, кому нужны дополнительные значения, подходит то же решение. Несколько значений можно сохранить, используя разделители, и потом легко разбивать их на части и читать отдельные значения. Чтобы лучше объяснить и помочь другим, я написал небольшой код ниже:

    <?php
    use PEAR2\Net\RouterOS;
    require_once 'PEAR2_Net_RouterOS-1.0.0b6.phar';

    # объявление переменных

    $device_ip = '<x.x.x.x>';
    $device_login = '<login>';
    $device_password = '<password>';
    $script_name = '<script_name>';
    $where_to_ping = '<ip_to_ping>';
    $how_many_packets = <ping_count>;

    try {
       $util = new RouterOS\Util(
    $client = new RouterOS\Client($device_ip, $device_login, $device_password));
    } catch (Exception $e) {
       die('Не удалось подключиться к устройству по адресу '.$device_ip.'.');
    }

    // Сначала отправляем скрипт на маршрутизатор через script::prepare
    // Скрипт просто сохраняется, но не выполняется

    $util->setMenu('/system script')->add(
    array(
    'name' => $script_name,
    'comment' => 'Тестовое выполнение скрипта от Boen Mikrotik PHP API',
    'policy' => 'read,write,test',
    'source' => RouterOS\Script::prepare(
    '
    :local pingcount [/ping $where count=$packets]
    /system script set [find name=$mynameis] comment="pingcount=$pingcount"

    ',
    array(
    'mynameis' => $script_name,
    'where' => $where_to_ping,
    'packets' => $how_many_packets
    )
    )
    )
    );

    // Теперь ставим этот же скрипт в планировщик, чтобы он запустился через 2 секунды

    $util->setMenu('/system scheduler')->add(
    array(
    'name' => 'big_test',
    'start-time' => date_add($util->getCurrentTime(),date_interval_create_from_date_string("2 seconds"))->format('H:i:s'),
    'on-event' => $script_name
    )
    );

    ?>

    Я решил запустить скрипт через 2 секунды после его добавления. Создам тему, чтобы другие могли найти этот пример. Ещё раз спасибо тебе, Boen, за помощь!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры