Люди добрые, помогите найти ошибку в php скрипте. Конец дня, моск уже распух :(
#!/usr/local/bin/php
<?php
$rks_url = 'http://reestr.rublacklist.net/api/current'; //URL файла блокировок
$out_ips = '/usr/local/etc/squid/ks_ips.acl'; //файл, куда мы запишем все IP, упомянутые в списке
$out_urls = '/usr/local/etc/squid/rks_urls.acl'; //Файл, куда пишутся URL-ы
$strGen = '# Generated by an0maly on ' . date('l jS \of F Y h:i:s A'); //Строка с датой создания
$strTmp = file_get_contents ( $rks_url );
// Если начало полученных данных не соответствует ожидаемому - мы что-то не то получили
if ( substr ( $strTmp, 0, 9 ) != '"Updated:') {
echo "Получены неверные входные данные" . PHP_EOL;
die();
}
$arrTmp = explode ( ';', $strTmp ); //Разбиваем список на куски, разделитель - ";"
foreach ( $arrTmp as $strKey ) {
// Удаляем всё до символа перевода строки
$intTmp = strpos ( $strKey, '\n' );
if ( $intTmp !== false ) {
$strKey = substr ( $strKey, $intTmp+2);
}
// Удалили
// Раскодируем
$tmp = preg_replace_callback( '/\\\\u([0-9a-fA-F]{4})/', function ( $match ) { return mb_convert_encoding( pack( 'H*', $match[1] ), 'UTF-8', 'UCS-2BE' ); }, $strKey );
// И продолжаем обработку строки только если в ней есть полезная информация (строка не перекодирвалась - русских букв нет)
if ( $strKey == $tmp ) {
// Если в строке нет точки - это не IP и не URL, не обрабатываем
if ( strpos ( $strKey, '.' ) !== false ) {
//Если в строке есть | - это перечисление, разбираем
if ( strpos ( $strKey, '|' ) ) {
$arrTmp1 = explode ( '|', $strKey );
foreach ( $arrTmp1 as $strKey1 ) {
// Удалим пробелы в начале и конце строки
$strKey1 = trim ( $strKey1 );
// и проверим, не чистый ли IP у нас
$bVld = filter_var ( $strKey1, FILTER_VALIDATE_IP );
// если IP - в массив айпишниками его, иначе обработаем как URL
if ( $bVld != false ) {
$arrIPs[] = $strKey1;
} else {
// если в строке нет указания протокола - это название блокировки (меня интересует только http и https)
if ( strpos ( $strKey1, 'http' ) !== false ) {
$strWL = modUrl ( $strKey1 ); //Обработаем URL
$arrURLs[] = $strWL;
}
}
}
} else {
// аналогичный кусок прокомментирован выше
$strKey = trim ( $strKey );
$bVld = filter_var ( $strKey, FILTER_VALIDATE_IP );
if ( $bVld != false ) {
$arrIPs[] = $strKey;
} else {
if ( strpos ( $strKey, 'http' ) !== false ) {
$strWL = modUrl ( $strKey);
$arrURLs[] = $strWL;
}
}
}
}
}
}
sort ( $arrIPs ); // Отсортируем массив
$arrIPsSort = array_unique ( $arrIPs, SORT_STRING ); // И удалим дубли
array_unshift ( $arrIPsSort, $strGen ); // Добавим в начало строку с временем создания
$strOut = implode ( PHP_EOL, $arrIPsSort ); // Сделаем из массива строку
file_put_contents ( $out_ips, $strOut ); // И запишем её в файл
sort ( $arrURLs );
$arrURLsSort = array_unique ( $arrURLs, SORT_STRING ); // Всё тоже самое сделаем со списком URL
array_unshift ( $arrURLsSort, $strGen );
$strOut = implode ( PHP_EOL, $arrURLsSort );
file_put_contents ( $out_urls, $strOut );
function modUrl ( $strBuff ) {
// В этой функции обработаем URL
// Если в URL встречаются квадратные скобки - squid считает это регулярным выражением и матерится
// Соответственно, обрежем URL до первого включения квадратной скобки.
$intTmp = strpos ($strBuff , '[');
if ( $intTmp === false ) {
$intTmp = strpos ( $strBuff , ']' );
}
if ( $intTmp !== false ) {
$strBuff = substr ( $strBuff, 0, $intTmp );
}
// Уберём слеши в конце строки
if ( substr ( $strBuff, strlen ($strBuff)-1, 1) == '/') {
$strBuff = substr ( $strBuff, 0, strlen ( $strBuff )-1);
}
// Один и тот же ресурс может быть заблокирован как по http, так и по https - лишние строки
$intTmp = strpos ( $strBuff, '//' );
if ( $intTmp !== false ) {
$strBuff = substr ($strBuff, $intTmp + 2);
}
// Вернём результат.
return $strBuff;
}
?>
пишет что в 53й строке неопределённая функция:
$bVld = filter_var ( $strKey, FILTER_VALIDATE_IP );