# IP Pool Statistics - MikroTik Script RouterOS

    This script will list the used, available, and percent usage of IPs in IP -> Pools in RouterOS.

    # List stats for IP -> Pool
    #
    # criticalthreshold = output pool display in red if pool used is above this %
    # warnthreshold = output pool display in gold if pool used is above this %
    :local criticalthreshold 85
    :local warnthreshold 70
    # Internal processing below...
    # ----------------------------------
    /ip pool {
       :local poolname
       :local pooladdresses
       :local poolused
       :local poolpercent
       :local minaddress
       :local maxaddress
       :local findindex
       :local tmpint
       :local maxindex
       :local line
       :put ("IP Pool Statistics")
       :put ("------------------")
    # Iterate through IP Pools
       :foreach p in=[find] do={
          :set poolname [get $p name]
          :set pooladdresses 0
          :set poolused 0
          :set line ""
          :set line ("     " . $poolname)
    #   Iterate through current pool's IP ranges
          :foreach r in=[:toarray [get $p range]] do={
    #      Get min and max addresses
             :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]
             }
    #       Convert to array of octets (replace '.' with ',')
             :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]]]) }
             }
    #      Calculate available addresses for current range
             :if ([:len [:toarray $minaddress]] = [:len [:toarray $maxaddress]]) do={
                :set maxindex ([:len [:toarray $minaddress]] - 1)
                :for x from=$maxindex to=0 step=-1 do={
    #             Calculate 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
                }
    #      if len array $minaddress = $maxaddress
             }
    #      Add current range to total pool's available addresses
             :set pooladdresses ($pooladdresses + 1)
    #   foreach r
          }
    #   Now, we have the available address for all ranges in this pool
    #   Get the number of used addresses for this pool
          :set poolused [:len [used find pool=[:tostr $poolname]]]
          :set poolpercent (($poolused * 100) / $pooladdresses)

    #   Output information
          :set line ([:tostr $line] . "  [" . $poolused . "/" . $pooladdresses . "]")
          :set line ([:tostr $line] . "  " . $poolpercent . " % used")

    #   Set colored display for used thresholds
          :if ( [:tonum $poolpercent] > $criticalthreshold ) do={
             :log error ("IP Pool " . $poolname . " is " . $poolpercent . "% full")
             :put ([:terminal style varname] . $line)
          } else={
             :if ( [:tonum $poolpercent] > $warnthreshold ) do={
                :log warning ("IP Pool " . $poolname . " is " . $poolpercent . "% full")
                :put ([:terminal style syntax-meta] . $line)
             } else={
                :put ([:terminal style none] . $line)
             }
          }
    # foreach p
       }
    # /ip pool
    }
    Credit: wiki.mikrotik.com