download this file: mknetmask-from-krnic.php view text/plain: mknetmask-from-krnic.php file encoding: UTF-8 [goback]
#!/usr/local/bin/php -q
<?php
##
## -- make network / netmask
## -- san2(at)linuxchannel.net
## -- 2008.04.04: update
##    2006.04.04: update
##    2006.03.24: add inet_ntocidr()
##    2005.11.07: bug fixed
##    2004.10.??: new build
##
## 1. korean all ISP IP Addrress by date
##  - http://member.nic.or.kr/link/ISPIpAddress.jsp
##
## 2. korean all ISP IP Address by ISP name
##  - old:       http://member.nic.or.kr/link/ISPAllocation.jsp
##  - new(2013): http://krnic.or.kr/jsp/ipas/situation/ispListIpv4.jsp
##  - new(2016): http://www.krnic.or.kr/jsp/business/management/isCurrentIpv4.jsp
##  - korean-ispname      6KANet  203.254.0.0     203.254.63.255  19940401

function search_net($ln$start$end)
{
  for(
$l=$ln$l<=32$l++)
  {
    
$hbit 32 $l;
    
$host pow(2,$hbit);
    
$tbit str_repeat(1,$l).str_repeat(0,$hbit);
    
$tnet bindec($tbit);
    
$tend $start $host 1;

    
//echo $l."\n";
    
if($tend $end) continue;

    
$tand bindec($tbit sprintf('%032b',$tend));

    if(
$start == $tand)
    {
        
//echo inet_ntoa($start)."\t".inet_ntoa($tend)."\t".
        //    inet_ntoa($tnet)."\n";

        
$nstart $tend 1// change
        
break;
    }
  }

  return array(
$tend,$tnet);
}

function 
is_subnet($some)
{
  
$some trim($some);

  if(
preg_match('/^[\d]+\.[\d]+\.[\d]+\.[\d]+$/',$some))
  {
    
$some sprintf('%u',ip2long($some));
  }

  
$dec abs($some);
  
$bits decbin($dec);

  
//echo $bits."\n"; // debug

  
return (boolean) preg_match('/^[1]+[0]*$/',$bits);
}

function 
is_network($some)
{
  return 
FALSE// all false

  
$some trim($some);

  if(!
preg_match('/^[\d]+\.[\d]+\.[\d]+\.[\d]+$/',$some))
  {
    
$some long2ip($some);
  }

  
$tmp explode('.',$some);
  
$r TRUE;

  if(
$tmp[3] % 2$r FALSE;
  else if(
$tmp[2] % 2$r FALSE;
  else if(
$tmp[1] % 2$r FALSE;
  else if(
$tmp[0] % 2$r FALSE;

  return (boolean) 
$r;
}

function 
inet_ntocidr($netmask)
{
  
$netmask trim($netmask);

  
$bits decbin(abs(sprintf('%u',ip2long($netmask))));
  
$cidr strpos($bits,'0') + 0;

  return (
$cidr 0) ? $cidr 32;
}

function 
inet_cidrtonetmask($cidr)
{
  
$cidr = (int)preg_replace('/[^\d]+/','',$cidr);

  if(
$cidr 32) return FALSE;

  
$n floor($cidr/8);
  
$p $cidr 8;
  
$m '';

  for(
$i=1$i<=$n$i++) $m .= '255.';
  if(
$p 0) { $m .= (256-pow(2,8-$p)).'.'$n++; }
  for(
$i=$n$i<4$i++) $m .= '0.';

  
$m preg_replace('/\.$/','',$m);

  return 
$m;
}

function 
inet_aton($ipaddr)
{
  return 
sprintf('%u',ip2long($ipaddr));
}

function 
inet_ntoa($base)
{
  return 
long2ip($base);
}

function 
inet_ntob($base)
{
  return 
sprintf('%032b',$base);
}

function 
inet_atob($ipaddr)
{
  return 
sprintf('%032b',ip2long($ipaddr));
}

function 
inet_btoa($bits)
{
  return 
long2ip(sprintf('%u',$bits));
}

function 
_file($file)
{
  if(!
$fp fopen($file,'r')) return;
  
  while(!
feof($fp)) $r[] = trim(fgets($fp,1024));
  
fclose($fp);

  return 
$r// array
}

set_time_limit(0);
//ini_set('memory_limit','512M');

## file format:
## korean-ispname      6KANet  203.254.0.0     203.254.63.255  19940401
##
if(!file_exists($file=$_SERVER['argv'][1])) exit;

$lists file($file); // dot.ipv4
//$lists = _file($file);
$size sizeof($lists);

## get array and get block group
##
for($i=0$i<$size$i++)
{
  list(
$kblock,$eblock,$s,$e) = preg_split('/\t+/',trim($lists[$i]));

  
$kblock trim($kblock);
  
$eblock trim($eblock);
  
$e trim($e);
  
$s trim($s);

  if(
preg_match('/^#/',$kblock) || !$kblock) continue;

  
$s inet_aton($s);
  
$e inet_aton($e);

  
//$netmask = inet_ntoa($j + inet_aton('255.255.255.255') - inet_aton($e));

  //$krblock[$eblock][$s] = $kblock."\t".$eblock."\t".$s."\t".$e."\t".$netmask;
  //$krblock[$eblock][$s] = $kblock."\t".$eblock."\t".$s."\t".$e;
  
$krblock[$eblock][$s] = array($kblock,$eblock,$s,$e);
}

//print_r($krblock);
//exit;

$merge = array();

## merge
##
foreach($krblock AS $arr)
{
  unset(
$start); // reset
  
ksort($arr);

  
$new array_values($arr);
  
$size sizeof($new);

  for(
$i=0$i<$size$i++)
  {
    
$total++;
    
$kname $new[$i][0];
    
$ename $new[$i][1];
    
$start $start $start $new[$i][2];
    
$end   $new[$i][3];

    if((
$new[$i][3] + 1) == $new[$i+1][2])
    {
        continue; 
// not next skip
    
}

    
$m++; // count of merge

    ## patch 2005.11.07, is if(TRUE)
    ##
    
$nn $start inet_aton('255.255.255.255') - $end;
    
$nu $end $start 1// number of host

    //if(!is_subnet($nn = $start + inet_aton('255.255.255.255') - $end) || !is_network($start))
    //{
    //    $nu = $end - $start + 1; // number of host
    //}

    //$ps = inet_ntoa($start);
    //$pe = inet_ntoa($end);
    //$netmask = inet_ntoa($nn);
    //echo "=>$kname\t$ename\t$ps\t$pe\t$netmask\t<--$ck ($nu)\n\n";

    
$merge[$ename][] = array($kname,$ename,$start,$end,$nu,$nn);

    unset(
$nu);
    unset(
$start);
  }
}

//print_r($merge);
//exit;

$class_a inet_aton('127.0.0.0');
$class_b inet_aton('192.0.0.0');
$me 0;

foreach(
$merge AS $arr)
{
  foreach(
$arr AS $tmp)
  {
    
//list($kname,$ename,$start,$end,$nu) = each($tmp);
    
$kname $tmp[0];
    
$ename $tmp[1];
    
$start $tmp[2];
    
$end   $tmp[3];
    
$nu    $tmp[4];
    
$nn    $tmp[5];

    if(
$nu)
    {
        
$ln strlen(preg_replace('/^([1]+).*$/','\1',decbin($nn)));
        
$sbit decbin($start);

        if(
$start $class_a$ln 1// A class
        
else if($start $class_b$ln 8// B class

        
while($start $end)
        {
            list(
$tend,$mask) = search_net($ln,$start,$end);

            
$ps inet_ntoa($start);
            
$pe inet_ntoa($tend);
            
$netmask inet_ntoa($mask);
            
$idx explode('.',$ps);

            
//echo implode("\t",$tmp)."\n";
            //echo "$kname\t$ename\t$ps\t$pe\t$netmask\n";
            //echo "\$_IPNETWORK['$ename'][] = array('$ps','$pe','$netmask','$kname');\n";

            //$_IPNETWORK[$idx[0]]['netmask'][] = (string) inet_ntob($mask);
            
$_IPNETWORK[$idx[0]]['netmask'][] = $netmask;
            
$_IPNETWORK[$idx[0]][inet_aton($ps)] = array($ps,$pe,$netmask,$kname,$ename);

            
$start $tend 1// change
            
$me++;
        }
    } else
    {
        
$ps inet_ntoa($start);
        
$pe inet_ntoa($end);
        
$mask $start inet_aton('255.255.255.255') - $end;
        
$netmask inet_ntoa($mask);
        
$idx explode('.',$ps);

        
//echo implode("\t",$tmp)."\n";
        //echo "$kname\t$ename\t$ps\t$pe\t$netmask\n";
        //echo "\$_IPNETWORK['$ename'][] = array('$ps','$pe','$netmask','$kname');\n";

        //$_IPNETWORK[$idx[0]]['netmask'][] = (string) inet_ntob($mask);
        
$_IPNETWORK[$idx[0]]['netmask'][] = $netmask;
        
$_IPNETWORK[$idx[0]][inet_aton($ps)] = array($ps,$pe,$netmask,$kname,$ename);
        
$me++;
    }
  }
}

//print_r($_IPNETWORK);
//exit;

$ipas array_keys($_IPNETWORK);
sort($ipas);

foreach(
$ipas AS $ipa)
{
  
//$_IPNETWORK[$ipa]['netmask'] = array_values(array_unique($_IPNETWORK[$ipa]['netmask']));
  
$_NETMASK array_unique($_IPNETWORK[$ipa]['netmask']);
  
sort($_NETMASK);

  
$v array_values($_NETMASK);
  
$s sizeof($v) - 1;

  echo 
"\$_NET[$ipa] = array(";
  for(
$i=0$i<$s$i++) echo "'".$v[$i]."',";
  echo 
"'".$v[$s]."');\n";
}

foreach(
$ipas AS $ipa)
{
  unset(
$_IPNETWORK[$ipa]['netmask']);
  
ksort($_IPNETWORK[$ipa]);

  foreach(
$_IPNETWORK[$ipa] AS $k=>$arr)
  {
    echo 
"\$_ISP['$k'] = array('$arr[0]','$arr[1]','$arr[2]','$arr[3]','$arr[4]');\n";
  }
}

//print_r($ipas);
//print_r($_IPNETWORK);

echo $total.' '.$me."\n";

exit;
?>