<?php
//***********************************************************************
// Назначение: ip_runet (06.06.2008)
// cоздание pазмеченной базы и поиск (для ipgeobase.ru)
//***********************************************************************
// Используется новый мастер файл
$new_master = true;
// файлы
$master_fale = 'cidr_ru_master_index.db';
$slave_fale = 'cidr_ru_slave_index.db';
$master_new_fale = 'cidr_ru_master_index_new.db';
// Создание нового мастер файла
// в командной строке: php ip_runet.php new_master
if ($argc == 1
|| @in_array('new_master', $argv)) {
my_new_master_file($master_fale, $slave_fale, $master_new_fale);
}
// Обработка ввода
if ($_POST['submit']) {
$long = my_ip_test($_POST['ip']);
if ($long) {
$subm_ip = $_POST['ip'];
if ($new_master) { // Используется new_master (~1МБ памяти)
$ip_runet = my_ip_runet_new($long, $master_new_fale, $slave_fale);
} else { // НЕ используется new_master (~30МБ памяти)
$ip_runet = my_ip_runet($long, $master_fale, $slave_fale);
}
if (!$ip_runet) {
$error_print = "IP-адреса нет в базе: <b>$subm_ip</b>";
}
} else {
$error_print = 'Некорректный IP-адрес: <b>'.strip_tags($_POST['ip']).'</b>';
}
}
// Верх страницы
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>ip_runet</title>
<meta http-equiv="content-type" content="text/html; charset=windows-1251">
</head>
<body bgcolor="#ffffff">';
// Форма
print '
<form action="'.$_SERVER['PHP_SELF'].'" method="post" name="testip">
IP: <input type="text" name="ip" value="">
<input type="submit" name="submit" value="ввод"><br>
</form>';
// Вывод
if ($ip_runet and !$error_print) { // для Русского IP
print "
<table border=0 cellspacing=0 cellpadding=2>
<tr><td colspan=2>IP адрес <b>$subm_ip</b> найден в базе</td></tr>
<tr><td>База:</td><td>".(($ip_runet['8'])?"master":"clave")."</td></tr>
<tr><td>Блок:</td><td>$ip_runet[2]</td></tr>
<tr><td>Страна:</td><td>$ip_runet[3]</td></tr>
<tr><td>Город:</td><td>$ip_runet[4]</td></tr>
<tr><td>Регион:</td><td>$ip_runet[5]</td></tr>
<tr><td>Округ:</td><td>$ip_runet[6]</td></tr>
<tr><td>Статус:</td><td>$ip_runet[7]</td></tr>
</table>";
} elseif ($error_print) {
print $error_print;
}
// Низ страницы
print '</body>
</html>';
/////////////////// Функции /////////////////////
// Проверка корректности IP
function my_ip_test ($ip) {
if (preg_match_all("/^([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})$/", $ip, $match)) {
if ($long == -1 || $long === FALSE) {
return false;
} else {
return $long;
}
} else {
return false;
}
}
// Поиск IP в базе (только новый master_fale)
function my_ip_runet_new ($long, $master_fale, $slave_fale) {
$master = file($master_fale);
foreach ($master as $value) {
if ($long >= $cell['0'] && $long <= $cell['1']) {
if ($cell['8'] == -1) {
return $cell; // результат в master_fale
} else {
$slave_fp = fopen($slave_fale, "rb");
fseek($slave_fp, $cell['10'], SEEK_SET
);
$i = 1;
while ($i <= $cell['9']) {
$slave = fgets($slave_fp);
if ($long >= $cell2['0'] && $long <= $cell2['1']) {
return $cell2; // результат в slave_fale
}
$i++;
}
return false; // нет в slave_fale
}
}
}
return false; // нет в master_fale
}
// Поиск IP в базе (стандартный master_fale)
function my_ip_runet ($long, $master_fale, $slave_fale) {
$master = file($master_fale);
foreach ($master as $value) {
if ($long >= $cell['0'] && $long <= $cell['1']) {
if ($cell['8'] == -1) {
return $cell; // результат в master_fale
} else {
$slave = file($slave_fale);
foreach ($slave as $value) {
if ($long >= $cell['0'] && $long <= $cell['1']) {
return $cell; // результат в slave_fale
}
}
return false; // нет в slave_fale
}
}
}
return false; // нет в master_fale
}
// Расстановка смещений для строк (в командной строке)
function my_new_master_file ($master_fale, $slave_fale, $master_new_fale) {
print "start my_new_master_file\n";
// потоки
$master_fp = fopen($master_fale, "rb");
$slave_fp = fopen($slave_fale, "rb");
$master_new_fp = fopen($master_new_fale, "wb");
// обработка
while (!feof($master_fp)) {
$master_line = fgets($master_fp);
$master_line = trim($master_line);
if ($cell['8'] == '-1' or $cell['8'] == '0') {
fwrite($master_new_fp, $master_line . "\t0\n");
} else {
rewind($slave_fp); // вернутся в начало
$i = 2;
while (!feof($slave_fp)) {
if ($i == $cell['8']) {
$a = ftell($slave_fp); // текущее смещение
fwrite($master_new_fp, $master_line . "\t" . $a . "\n");
break;
}
$i++;
}
}
}
// закрыть
print "stop - time: $time c.\n";
}
?>