diff --git a/fw-addr-lists.rsc b/fw-addr-lists.rsc index c85cc8bf..fece692c 100644 --- a/fw-addr-lists.rsc +++ b/fw-addr-lists.rsc @@ -117,7 +117,7 @@ :local Branch; :if ($Address ~ "^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}(/[0-9]{1,2})?\$") do={ :local Net $Address; - :local CIDR 32; + :local CIDR "32"; :local Slash [ :find $Address "/" ]; :if ([ :typeof $Slash ] = "num") do={ :set Net [ :toip [ :pick $Address 0 $Slash ] ] @@ -130,7 +130,7 @@ } :if ($Address ~ "^[0-9a-zA-Z]*:[0-9a-zA-Z:\\.]+(/[0-9]{1,3})?\$") do={ :local Net $Address; - :local CIDR 128; + :local CIDR "128"; :local Slash [ :find $Address "/" ]; :if ([ :typeof $Slash ] = "num") do={ :set Net [ :toip6 [ :pick $Address 0 $Slash ] ] diff --git a/global-functions.rsc b/global-functions.rsc index b7cff0fe..7b3a56fd 100644 --- a/global-functions.rsc +++ b/global-functions.rsc @@ -1004,27 +1004,27 @@ :local FuncName $0; :local CIDR [ :tostr $1 ]; - :global IfThenElse; - :global MAX; - :global MIN; - :global NetMask6Cache; - :if ([ :typeof ($NetMask6Cache->$CIDR) ] = "ip6") do={ + :global GetRandom20CharAlNum; + + :if ([ :typeof $NetMask6Cache ] = "array") do={ :return ($NetMask6Cache->$CIDR); } - :if ([ :typeof $NetMask6Cache ] = "nothing") do={ - :set NetMask6Cache ({}); + :set NetMask6Cache { "128"=(~::) }; + + :local GenList ($FuncName . "-" . [ $GetRandom20CharAlNum ]); + :for I from=0 to=127 do={ + /ipv6/firewall/address-list/add dynamic=yes timeout=1m list=$GenList address=((~::) . "/" . $I) comment=$I; + } + :foreach FwAddrList in=[ /ipv6/firewall/address-list/find where list=$GenList ] do={ + :local Address [ /ipv6/firewall/address-list/get $FwAddrList ]; + :set ($NetMask6Cache->($Address->"comment")) \ + [ :toip6 [ :pick ($Address->"address") 0 [ :find ($Address->"address") "/" ] ] ]; } - :local Mask ""; - :for I from=0 to=7 do={ - :set Mask ($Mask . [ :convert from=num to=hex (0xffff - (0xffff >> [ :tonum [ $MIN [ $MAX ($CIDR - ((16 * $I))) 0 ] 16 ] ])) ] . [ $IfThenElse ($I < 7) ":" ]); - } - :set Mask [ :toip6 $Mask ]; - :set ($NetMask6Cache->$CIDR) $Mask; - :return $Mask; + :return ($NetMask6Cache->$CIDR); } # prepare NotificationFunctions array diff --git a/mod/ipcalc.rsc b/mod/ipcalc.rsc index d65d4724..fecf6f26 100644 --- a/mod/ipcalc.rsc +++ b/mod/ipcalc.rsc @@ -36,32 +36,21 @@ :local Input [ :tostr $1 ]; :global NetMask4; - :global NetMask6; - :local Address [ :pick $Input 0 [ :find $Input "/" ] ]; + :local Address [ :toip [ :pick $Input 0 [ :find $Input "/" ] ] ]; :local Bits [ :tonum [ :pick $Input ([ :find $Input "/" ] + 1) [ :len $Input ] ] ]; - :local Mask; - :local One; - :if ([ :typeof [ :toip $Address ] ] = "ip") do={ - :set Address [ :toip $Address ]; - :set Mask [ $NetMask4 $Bits ]; - :set One 0.0.0.1; - } else={ - :set Address [ :toip6 $Address ]; - :set Mask [ $NetMask6 $Bits ]; - :set One ::1; - } + :local Mask [ $NetMask4 $Bits ]; - :local Return ({ + :local Return { "address"=$Address; "netmask"=$Mask; "networkaddress"=($Address & $Mask); "networkbits"=$Bits; "network"=(($Address & $Mask) . "/" . $Bits); - "hostmin"=(($Address & $Mask) | $One); - "hostmax"=(($Address | ~$Mask) ^ $One); + "hostmin"=(($Address & $Mask) | 0.0.0.1); + "hostmax"=(($Address | ~$Mask) ^ 0.0.0.1); "broadcast"=($Address | ~$Mask); - }); + } :return $Return; }