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

    Упорядочить простую очередь по IP-адресам

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Упорядочить простую очередь по IP-адресам, RouterOS
     
    LoLz
    Guest
    #1
    0
    13.10.2015 20:07:00
    У кого-нибудь есть скрипт для сортировки Simple queue по IP-адресам?
     
     
     
    boen_robot
    Guest
    #2
    0
    02.06.2016 18:10:00
    Думаю, он имеет в виду «порядок» в смысле «перемещения». Очередь может влиять по-разному в зависимости от того, стоит ли она первой или второй в списке. Встроенного способа сортировки элементов нет, но можно сделать это самостоятельно. Как только у вас будет правильный порядок, можно пройти по ID и вызывать «move» для каждого. Вызов «move» без второго аргумента перемещает элемент в конец списка, так что в итоге ваш список будет совпадать с отсортированным. Правда, я до конца не уверен, как это реализовать... Я бы, честно говоря, из-за лени просто использовал API, получил бы все очереди, вынул IP и ID в массив (IP — в качестве ключа), отсортировал бы массив одной функцией (она есть в большинстве языков, точно в PHP), а потом пробежался по массиву и вызвал «move» с нужным ID.
     
     
     
    LoLz
    Guest
    #3
    0
    03.06.2016 02:21:00
    Именно так, у кого-нибудь есть этот скрипт для API и PHP или сам скрипт для MK?
     
     
     
    boen_robot
    Guest
    #4
    0
    03.06.2016 10:24:00
    Учитывая, что очереди имеют маски и интерфейсы, и что в одной очереди может быть несколько целей, это оказалось немного сложнее, чем я думал, но всё равно довольно просто. Вот пример с использованием моего API-клиента: <?php

    use PEAR2\Net\RouterOS;

    require_once 'PEAR2_Net_RouterOS-1.0.0b5.phar';

    $util = new RouterOS\Util($client = new RouterOS\Client('192.168.88.1', 'admin', 'password'));

    $util->setMenu('/queue simple');
    $queues = $util->getAll(array('.proplist' => '.id,target'))->orderBy(
           array(
               'target' => function ($a, $b) {
                   // Если в сравниваемых очередях несколько целей, сортируем по первой
                   if (strpos($a, ',') !== false) {
                       $a = explode(',', $a, 1);
                       $a = $a[0];
                   }
                   if (strpos($b, ',') !== false) {
                       $b = explode(',', $b, 1);
                       $b = $b[0];
                   }

                   // Если нет масок, это очередь интерфейса – сортируем по алфавиту
                   if (strpos($a, '/') === false && strpos($b, '/') === false) {
                       return strcmp($a, $b);
                   }

                   // Если одна из очередей — очередь интерфейса, она идет перед IP-очередью
                   if (strpos($a, '/') === false || strpos($b, '/') === false) {
                       return strpos($a, '/') === false ? -1 : 1;
                   }

                   // Разделяем IP и маску
                   $a = explode('/', $a, 2);
                   $b = explode('/', $b, 2);

                   // Переводим в целочисленный формат
                   $ipA = ip2long($a[0]);
                   $ipB = ip2long($b[0]);
                   $maskA = (int)$a[1];
                   $maskB = (int)$b[1];

                   // Получаем сетевой адрес
                   $netA = $ipA >> $maskA;
                   $netB = $ipB >> $maskB;

                   // Сортируем по сетевому адресу; большая маска = меньшая сеть = ниже в списке
                   if ($netA < $netB) {
                       return 1;
                   } elseif ($netA > $netB) {
                       return -1;
                   } else { // Если сети одинаковы, сортируем по адресу внутри сети
                       $a = ($netA << $maskA) ^ $ipA;
                       $b = ($netB << $maskB) ^ $ipB;
                       return $a < $b ? -1 : (int) $a > $b;
                   }
               }
           )
    );

    $moveRequest = new RouterOS\Request('/queue simple move');
    foreach ($queues as $queue) {
       $client->sendSync($moveRequest->setArgument('numbers', $queue->getProperty('.id')));
    } (К слову, я нашёл баг в своей реализации $util->move()… не поддерживает NULL в качестве назначения… Поэтому я для перемещения использую $client; скоро исправлю, тогда $util->move($queue('.id'), null) будет работать, что по сути равно $util->move($queue('.id')))
     
     
     
    LoLz
    Guest
    #5
    0
    15.06.2016 03:57:00
    Я никогда не запускал API, но думаю, можно ли использовать этот скрипт с XAMPP или на любом Linux с PHP? Пожалуйста, дайте знать.
     
     
     
    boen_robot
    Guest
    #6
    0
    15.06.2016 11:24:00
    Да. Нужно сохранить этот файл с расширением «.php». Если у вас есть XAMPP, то нужно поместить его в папку «htdocs» внутри папки XAMPP. Для этого конкретного скрипта можно просто скачать сам PHP с php.net и запустить файл из командной строки командой «php script.php».
     
     
     
    LoLz
    Guest
    #7
    0
    29.05.2016 21:43:00
    Кто-нибудь может помочь с этим?
     
     
     
    Deantwo
    Guest
    #8
    0
    30.05.2016 13:35:00
    Что вы имеете в виду под «порядком»? Вы хотите их распечатать, отсортировав по IP-адресу? Зачем?
     
     
     
    LoLz
    Guest
    #9
    0
    02.06.2016 14:40:00
    Закажи по IP, можно перемещать или сортировать по IP, но нам нужен именно порядок по IP.
     
     
     
    Deantwo
    Guest
    #10
    0
    02.06.2016 14:50:00
    Я до сих пор не понимаю, что ты имеешь в виду. Что значит «order»? Что ты пытаешься получить? Не думаю, что есть способ отсортировать массив, если только сам не напишешь скрипт для этого.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры