Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/12/2019, 14:35
Avatar de rompeguesos
rompeguesos
 
Fecha de Ingreso: marzo-2009
Mensajes: 692
Antigüedad: 15 años, 1 mes
Puntos: 8
Respuesta: Existe algo para generar rangos de ipv6 con php¿?

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_IPFILTER_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_NetworkMaskHex8);
    foreach(
$v_NetworkMaskHex_parts as &$v_NetworkMaskHex_part){
        
$v_NetworkMaskHex_part base_convert($v_NetworkMaskHex_part216);
        
$v_NetworkMaskHex_part str_pad($v_NetworkMaskHex_part2'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_NetworkMaskHex4)));

    
// 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!