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

    Статистика пула IP-адресов

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Статистика пула IP-адресов, RouterOS
     
    dssmiktik
    Guest
    #1
    0
    29.03.2010 20:38:00
    Я написал скрипт для сбора информации о занятых и доступных адресах во всех IP-пулах. Это может быть полезно, если у вас несколько пулов и нужно равномерно распределять нагрузку между ними. Кроме того, его можно использовать для отслеживания процента заполнения IP-пула с уведомлениями через логи, email или для автоматического запуска какого-либо действия. Скрипт работает с одним IP, диапазоном IP или несколькими диапазонами, заданными в пуле.  
    # Статистика по IP -> Пул  
    #  
    # criticalthreshold = выводить название пула красным, если заполнение пула превышает этот %  
    # warnthreshold = выводить название пула желтым, если заполнение пула превышает этот %  

    :local criticalthreshold 85  
    :local warnthreshold 70  

    # Внутренние вычисления...  
    # ----------------------------------  
    /ip pool {  
      :local poolname  
      :local pooladdresses  
      :local poolused  
      :local poolpercent  
      :local minaddress  
      :local maxaddress  
      :local findindex  
      :local tmpint  
      :local maxindex  
      :local line  

      :put ("Статистика IP-пулов")  
      :put ("------------------")  

    # Перебираем все IP-пулы  
      :foreach p in=[find] do={

         :set poolname [get $p name]
         :set pooladdresses 0  
         :set poolused 0  
         :set line ""  

         :set line ("     " . $poolname)  

    #   Перебираем диапазоны IP в текущем пуле  
         :foreach r in=[:toarray [get $p range]] do={

    #      Определяем минимальный и максимальный адрес  
            :set findindex [:find [:tostr $r] "-"]
            :if ([:len $findindex] > 0) do={
               :set minaddress [:pick [:tostr $r] 0 $findindex]
               :set maxaddress [:pick [:tostr $r] ($findindex + 1) [:len [:tostr $r]]]
            } else={  
               :set minaddress [:tostr $r]
               :set maxaddress [:tostr $r]
            }  

    #       Преобразуем в массив октетов (замена '.' на ',')  
            :for x from=0 to=([:len [:tostr $minaddress]] - 1) do={
               :if ([:pick [:tostr $minaddress] $x ($x + 1)] = ".") do={
                  :set minaddress ([:pick [:tostr $minaddress] 0 $x] . "," . [:pick [:tostr $minaddress] ($x + 1) [:len [:tostr $minaddress]]]) }
            }  
            :for x from=0 to=([:len [:tostr $maxaddress]] - 1) do={
               :if ([:pick [:tostr $maxaddress] $x ($x + 1)] = ".") do={
                  :set maxaddress ([:pick [:tostr $maxaddress] 0 $x] . "," . [:pick [:tostr $maxaddress] ($x + 1) [:len [:tostr $maxaddress]]]) }
            }  

    #      Считаем количество доступных адресов в текущем диапазоне  
            :if ([:len [:toarray $minaddress]] = [:len [:toarray $maxaddress]]) do={
               :set maxindex ([:len [:toarray $minaddress]] - 1)
               :for x from=$maxindex to=0 step=-1 do={  
    #             Вычисляем 256^($maxindex - $x)  
                  :set tmpint 1  
                  :if (($maxindex - $x) > 0) do={  
                     :for y from=1 to=($maxindex - $x) do={ :set tmpint (256 * $tmpint) }  
                  }  
                  :set tmpint ($tmpint * ([:tonum [:pick [:toarray $maxaddress] $x]] - [:tonum [:pick [:toarray $minaddress] $x]]) )
                  :set pooladdresses ($pooladdresses + $tmpint)  
    #         конец цикла for x  
               }  

    #      если длина массива $minaddress = длине $maxaddress  
            }  

    #      Добавляем к общему количеству адресов один текущий диапазон (возвращаем к общему подсчёту)  
            :set pooladdresses ($pooladdresses + 1)  

    #   конец foreach r  
         }  

    #   Теперь у нас есть общее число доступных адресов во всех диапазонах этого пула  
    #   Получаем число занятых адресов в пуле  
         :set poolused [:len [used find pool=[:tostr $poolname]]]
         :set poolpercent (($poolused * 100) / $pooladdresses)  

    #   Выводим информацию  
         :set line ([:tostr $line] . " [" . $poolused . "/" . $pooladdresses . "]")
         :set line ([:tostr $line] . " " . $poolpercent . " % занято")

    #   Устанавливаем цвет вывода в зависимости от порогов заполнения  
         :if ( [:tonum $poolpercent] > $criticalthreshold ) do={
            :log error ("IP Pool " . $poolname . " заполнен на " . $poolpercent . "%")  
            :put ([:terminal style varname] . $line)
         } else={  
            :if ( [:tonum $poolpercent] > $warnthreshold ) do={
               :log warning ("IP Pool " . $poolname . " заполнен на " . $poolpercent . "%")  
               :put ([:terminal style syntax-meta] . $line)
            } else={  
               :put ([:terminal style none] . $line)
            }  
         }  

    # конец foreach p  
      }  
    # /ip pool  
    }
     
     
     
    m4rk0
    Guest
    #2
    0
    07.01.2012 11:29:00
    СУПЕР! Вот что я так давно искал, а нашёл только сейчас в двухлетнем посте!!! СПАСИБО!!
     
     
     
    huigezi
    Guest
    #3
    0
    08.01.2012 08:20:00
    спасибо
     
     
     
    nest
    Guest
    #4
    0
    08.01.2012 23:30:00
    dssmiktik — ты добавил это в вики? Мне кажется, этот скрипт станет очень полезным, когда я добавлю функцию отправки нам уведомлений на почту. Спасибо. У нас уже был один хотспот, куда внезапно набежало много посетителей, и мы быстро исчерпали IP-адреса (обычно за время аренды бывает 50-100 пользователей, а тут внезапно почти в 10 раз больше, с /23 у нас просто не было шансов справиться). Если бы этот скрипт нас вовремя оповестил, мы могли бы принять меры заранее, а не реагировать на звонки с жалобами, что клиенты не могут выйти в интернет. Ещё раз спасибо!
     
     
     
    nileshkahar
    Guest
    #5
    0
    02.08.2014 09:21:00
    Привет, nest! Не мог бы ты поделиться конфигурацией для отправки результата скрипта по электронной почте? Буду благодарен за помощь. Спасибо, Nil.
     
     
     
    aacable
    Guest
    #6
    0
    02.06.2016 12:02:00
    Извините, что разбудил эту очень старую тему. Недавно один автор запроса понадобилось кастомное решение для получения оповещений и записи статистики использования DHCP пула Mikrotik с помощью bash-скрипта на базе Linux. Я использовал этот скрипт и попытался вывести его на новый уровень. Bash-скрипт на Ubuntu удалённо запускает этот скрипт, получает результаты в файл, сохраняет данные в таблицах MySQL, форматирует вывод по желанию и отправляет письмо, если пул использован на XX %. Я сделал это решение — оно не слишком изящное и точно не профессиональное, но я многому научился. Это просто моя идея и её могущественный обмен, возможно, кто-то найдёт это полезным для других проектов. Просто мои пять копеек https://aacable.wordpress.com/2016/06/02/getting-out-of-the-box-solution-with-mikrotik-bash-mysql/
     
     
     
    plisken
    Guest
    #7
    0
    24.06.2017 08:40:00
    Можешь показать пример кода на основе 192.168.100.1/24, пожалуйста? Для меня это немного непонятно. Спасибо!
     
     
     
    plisken
    Guest
    #8
    0
    16.03.2018 20:21:00
    Повторяю свой вопрос: можете показать код на примере 192.168.100.1/24, пожалуйста? Для меня это немного непонятно. Большое спасибо!
     
     
     
    nichky
    Guest
    #9
    0
    17.03.2018 04:21:00
    Где я могу посмотреть результат? Например, когда я делаю копипаст в терминал, результат виден, но если я запускаю скрипт, где тогда увидеть результат? В логах ничего нет. Спасибо.
     
     
     
    Shakib
    Guest
    #10
    0
    19.12.2018 09:01:00
    Ребята, нужна скрипт для переноса VLAN с одного порта на другой. То есть, если моя основная ссылка ether1 падает, созданные VLAN с ether1 автоматически переключаются на ether2. Хочу сделать это для автоматического резервирования канала. Спасибо, Shakib
     
     
     
    Shakib
    Guest
    #11
    0
    19.12.2018 09:05:00
    Ребята, нужна скрипт для автоматической переадресации VLAN с одного порта на другой, если моя основная ссылка падает. То есть: если основной линк ether1 отключается, то созданные VLAN с ether1 автоматически переносились бы на ether2. Хочу сделать это для авто-резервирования линка. Спасибо, Shakib
     
     
     
    Jotne
    Guest
    #12
    0
    20.06.2019 22:26:00
    Нравится этот скрипт, но нашёл в нём большую ошибку. Он не учитывает DHCP IP, которые переведены в статические. /ip dhcp-server lease print показывает все IP во всех пулах, и статические, и динамические. /ip pool used print, который используется в скрипте, показывает только закреплённые IP. Для меня это всего лишь часть всех IP, и scoop показывает гораздо меньше используемых адресов, чем есть на самом деле. Если будет время, посмотрю, как исправить и получить правильные цифры.
     
     
     
    Jotne
    Guest
    #13
    0
    21.06.2019 18:27:00
    Обновлённый скрипт для подсчёта аренды, отображаемой в ip dhcp-server lease, а не того, что используется в пуле, чтобы учесть все статические зарезервированные IP.

    # Сбор информации о DHCP пулах
    # ----------------------------------
    /ip pool {
    :local poolname
    :local pooladdresses
    :local poolused
    :local minaddress
    :local maxaddress
    :local findindex
    :local tmpint
    :local maxindex

    # Перебор IP пулов
    :foreach pool in=[find] do={
    :set poolname [get $pool name]
    :set pooladdresses 0
    :set poolused 0

    # Перебор IP-диапазонов текущего пула
    :foreach range in=[:toarray [get $pool range]] do={

    # Получение минимального и максимального адресов
    :set findindex [:find [:tostr $range] "-"]
    :if ([:len $findindex] > 0) do={
    :set minaddress [:pick [:tostr $range] 0 $findindex]
    :set maxaddress [:pick [:tostr $range] ($findindex + 1) [:len [:tostr $range]]]
    } else={
    :set minaddress [:tostr $range]
    :set maxaddress [:tostr $range]
    }

    # Преобразование в массив октетов (замена '.' на ',')
    :for x from=0 to=([:len [:tostr $minaddress]] - 1) do={
    :if ([:pick [:tostr $minaddress] $x ($x + 1)] = ".") do={
    :set minaddress ([:pick [:tostr $minaddress] 0 $x] . "," . \
    [:pick [:tostr $minaddress] ($x + 1) [:len [:tostr $minaddress]]])
    }
    }

    :for x from=0 to=([:len [:tostr $maxaddress]] - 1) do={
    :if ([:pick [:tostr $maxaddress] $x ($x + 1)] = ".") do={
    :set maxaddress ([:pick [:tostr $maxaddress] 0 $x] . "," . \
    [:pick [:tostr $maxaddress] ($x + 1) [:len [:tostr $maxaddress]]])
    }
    }

    # Подсчёт доступных адресов в текущем диапазоне
    :if ([:len [:toarray $minaddress]] = [:len [:toarray $maxaddress]]) do={
    :set maxindex ([:len [:toarray $minaddress]] - 1)
    :for x from=$maxindex to=0 step=-1 do={
    # Вычисляем 256^($maxindex - $x)
    :set tmpint 1
    :if (($maxindex - $x) > 0) do={
    :for y from=1 to=($maxindex - $x) do={ :set tmpint (256 * $tmpint) }
    }
    :set tmpint ($tmpint * ([:tonum [:pick [:toarray $maxaddress] $x]] - \
    [:tonum [:pick [:toarray $minaddress] $x]]))
    :set pooladdresses ($pooladdresses + $tmpint)
    }
    }

    # Добавляем текущий диапазон к общему количеству доступных адресов пула
    :set pooladdresses ($pooladdresses + 1)

    # /foreach range
    }

    # Проверка, используется ли пул в DHCP или VPN, и вывод количества занятых аренды
    :local dname [/ip dhcp-server find where address-pool=$poolname]
    :if ([:len $dname] = 0) do={
    :set poolused [:len [used find pool=[:tostr $poolname]]]
    } else={
    :local dname [/ip dhcp-server get [find where address-pool=$poolname] name]
    :set poolused [:len [/ip dhcp-server lease find where server=$dname]]
    }

    # Отправляем данные
    :log info message=("script=pool pool=$poolname used=$poolused total=$pooladdresses")

    # /foreach pool
    }
    # /ip pool
    }
     
     
     
    plisken
    Guest
    #14
    0
    21.06.2019 19:12:00
    Очень полезный скрипт. Можно ли сделать так, чтобы информация DHCP приходила на почту? Можешь добавить это в скрипт?
     
     
     
    Jotne
    Guest
    #15
    0
    21.06.2019 19:37:00
    Пока у вас настроена система электронной почты вот так: https://wiki.mikrotik.com/wiki/Manual:Tools/email, тогда измените:  
    # Отправка данных  
    :log info message=("script=pool pool=$poolname used=$poolused total=$pooladdresses")  
    на:  
    # Отправка данных  
    /tool e-mail send to=your.mail@gmail.com subject="test" body="script=pool pool=$poolname used=$poolused total=$pooladdresses" start-tls=yes  

    Проверено — работает отлично. Но вы будете получать по одному письму на каждый пул. Это можно исправить. И вы не получите красивые графики, которые дает Splunk. Смотрите мою подпись.  

    РЕДАКТИРОВАНИЕ  
    Чтобы протестировать в командной строке (cli), замените на:  
    # Отправка данных  
    :put ("script=pool pool=$poolname used=$poolused total=$pooladdresses")  

    И добавьте [ перед первой строкой и ] после последней. Вырежьте и вставьте в cli для теста.
     
     
     
    alcohol
    Guest
    #16
    0
    20.09.2023 22:33:00
    Этот скрипт, вероятно, был написан задолго до того, как в RouterOS появилась прямая поддержка подсетевой арифметики. Если у вас версия 6 или 7, то он должен работать. Замените это:

    # Преобразование в массив октетов (замена '.' на ',')  
    :for x from=0 to=([:len [:tostr $minaddress]] - 1) do={
       :if ([:pick [:tostr $minaddress] $x ($x + 1)] = ".") do={
           :set minaddress ([:pick [:tostr $minaddress] 0 $x] . "," . [:pick [:tostr $minaddress] ($x + 1) [:len [:tostr $minaddress]]])
       }  
    }  

    :for x from=0 to=([:len [:tostr $maxaddress]] - 1) do={
       :if ([:pick [:tostr $maxaddress] $x ($x + 1)] = ".") do={
           :set maxaddress ([:pick [:tostr $maxaddress] 0 $x] . "," . [:pick [:tostr $maxaddress] ($x + 1) [:len [:tostr $maxaddress]]])
       }  
    }  

    # Вычисление доступных адресов для текущего диапазона  
    :if ([:len [:toarray $minaddress]] = [:len [:toarray $maxaddress]]) do={
       :set maxindex ([:len [:toarray $minaddress]] - 1)
       :for x from=$maxindex to=0 step=-1 do={  
           # Вычисляем 256^($maxindex - $x)  
           :set tmpint 1  
           :if (($maxindex - $x) > 0) do={  
               :for y from=1 to=($maxindex - $x) do={ :set tmpint (256 * $tmpint) }  
           }  
           :set tmpint ($tmpint * ([:tonum [:pick [:toarray $maxaddress] $x]] - [:tonum [:pick [:toarray $minaddress] $x]]) )
           :set pooladdresses ($pooladdresses + $tmpint)  
       }  
    }  

    # Добавляем текущий диапазон к общему количеству доступных адресов пула  
    :set pooladdresses ($pooladdresses + 1)  

    На это:  
    :set pooladdresses ($pooladdresses + ([:toip $maxaddress] - [:toip $minaddress]))

    Я думал, что так скрипт будет работать намного быстрее, но похоже, что это особо не влияет. Если у вас много DHCP-пулов, скрипт всё равно долго выполняется. Ещё можно было бы для ускорения поднять poolused наверх и добавить проверку с условием, что если пул пустой — пропускать его. Но всё равно, если пулов много, будет медленно.  

    Вот мой переработанный код с локальными переменными в областях видимости и проверкой if poolused > 0:

    :local criticalthreshold 85  
    :local warnthreshold 70  

    /ip pool {  
      :put ("Статистика IP-пулов")  
      :put ("------------------")  

      # Обход всех IP-пулов  
      :foreach p in=[find] do={

         :local poolname [get $p name]
         :local pooladdresses 0  
         :local poolused [:len [used find pool=[:tostr $poolname]]]
         :local minaddress  
         :local maxaddress  
         
         :if ($poolused > 0) do={  
           :local line ("     " . $poolname)  

           # Обход диапазонов IP текущего пула  
           :foreach r in=[:toarray [get $p range]] do={

             # Получаем минимальный и максимальный адреса  
             :local findindex [:find [:tostr $r] "-"]
             :if ([:len $findindex] > 0) do={
              :set minaddress [:pick [:tostr $r] 0 $findindex]
              :set maxaddress [:pick [:tostr $r] ($findindex + 1) [:len [:tostr $r]]]
             } else={  
              :set minaddress [:tostr $r]
              :set maxaddress [:tostr $r]
             }  

             :set pooladdresses ($pooladdresses + ([:toip $maxaddress] - [:toip $minaddress]))
           }  

           :local poolpercent (($poolused * 100) / $pooladdresses)  

           # Вывод информации  
           :set line ([:tostr $line] . " [" . $poolused . "/" . $pooladdresses . "]")
           :set line ([:tostr $line] . " " . $poolpercent . " % занято")

           # Цветовое выделение в зависимости от порогов заполнения  
           :if ( [:tonum $poolpercent] > $criticalthreshold ) do={
             :log error ("IP-пул " . $poolname . " заполнен на " . $poolpercent . "%")  
             :put ([:terminal style varname] . $line)
           } else={  
             :if ( [:tonum $poolpercent] > $warnthreshold ) do={
               :log warning ("IP-пул " . $poolname . " заполнен на " . $poolpercent . "%")  
               :put ([:terminal style syntax-meta] . $line)
             } else={  
               :put ([:terminal style none] . $line)
             }  
           }  
         }  
      }  
    }
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры