Hola!
He encontrado un codigo que hace lo que busco "mas o menos", me muestra la primera ip del rango y la ultima, eso parece que lo hace bien, pero ahora me surge una necesidad...
¿Alguien sabe como puedo conseguir un bucle que me muestre una a una todas las IPv6 del rango? Es que luego hay que ejecutar un comando para agregarlas al sistema linux con, ejemplo:
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0000/112 dev eth0")
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0001/112 dev eth0")
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0002/112 dev eth0")
shell_exec("/sbin/ip -6 addr add 2000.1111.2222.3333.4444.5555.6666.0003/112 dev eth0")
etc...
O no se si exista otra opcion de hacerlo mas sencillo, ando muy verde en el asunto, lo que he conseguido es este codigo:
Código PHP:
<?php
$a_Prefix = "2000:1111:2222:3333:4444:5555:6666::/112";
// Validate input superficially with a RegExp and split accordingly
if(!preg_match('~^([0-9a-f:]+)[[:punct:]]([0-9]+)$~i', trim($a_Prefix), $v_Slices)){
return false;
}
// Make sure we have a valid ipv6 address
if(!filter_var($v_FirstAddress = $v_Slices[1], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)){
return false;
}
// The /## end of the range
$v_PrefixLength = intval($v_Slices[2]);
if($v_PrefixLength > 128){
return false; // kind'a stupid :)
}
$v_SuffixLength = 128 - $v_PrefixLength;
// Convert the binary string to a hexadecimal string
$v_FirstAddressBin = inet_pton($v_FirstAddress);
$v_FirstAddressHex = bin2hex($v_FirstAddressBin);
// Build the hexadecimal string of the network mask
// (if the manually formed binary is too large, base_convert() chokes on it... so we split it up)
$v_NetworkMaskHex = str_repeat('1', $v_PrefixLength) . str_repeat('0', $v_SuffixLength);
$v_NetworkMaskHex_parts = str_split($v_NetworkMaskHex, 8);
foreach($v_NetworkMaskHex_parts as &$v_NetworkMaskHex_part){
$v_NetworkMaskHex_part = base_convert($v_NetworkMaskHex_part, 2, 16);
$v_NetworkMaskHex_part = str_pad($v_NetworkMaskHex_part, 2, '0', STR_PAD_LEFT);
}
$v_NetworkMaskHex = implode(null, $v_NetworkMaskHex_parts);
unset($v_NetworkMaskHex_part, $v_NetworkMaskHex_parts);
$v_NetworkMaskBin = inet_pton(implode(':', str_split($v_NetworkMaskHex, 4)));
// We have the network mask so we also apply it to First Address
$v_FirstAddressBin &= $v_NetworkMaskBin;
$v_FirstAddressHex = bin2hex($v_FirstAddressBin);
// Convert the last address in hexadecimal
$v_LastAddressBin = $v_FirstAddressBin | ~$v_NetworkMaskBin;
$v_LastAddressHex = bin2hex($v_LastAddressBin);
// Return a neat object with information
$v_Return = array(
'Prefix' => "{$v_FirstAddress}/{$v_PrefixLength}",
'FirstHex' => $v_FirstAddressHex,
'LastHex' => $v_LastAddressHex,
'MaskHex' => $v_NetworkMaskHex,
);
//return (object)$v_Return;*/
echo "v_FirstAddressHex: ".$v_FirstAddressHex."</br>";
echo "v_LastAddressHex: ".$v_LastAddressHex."</br>";
//var_dump($v_Return);
?>
Me muestra estos resultados:
v_FirstAddressHex: 20001111222233334444555566660000
v_LastAddressHex: 2000111122223333444455556666ffff
¿Creeis que puedo conseguir lo que busco?
Saludos!