Я написал скрипт для сбора информации о занятых и доступных адресах во всех 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
}
# Статистика по 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
}
