<?php


$flag_http_blacklist_1gb = "/var/log/cpu/http-blacklist/".$_SERVER["REMOTE_ADDR"];
if (@is_file ($flag_http_blacklist_1gb))
{
    die ("Access from your IP is blocked.");
}

    
    $path_1gb = $_SERVER["SCRIPT_FILENAME"];
    if ($path_1gb == '')
        $path_1gb = $_SERVER["PATH_TRANSLATED"];
    $path_1gb = substr( $path_1gb, 0, - strlen($_SERVER['SCRIPT_NAME'])) . '/';
    
    $config_1gb = "$path_1gb/.cpu_limit.conf";
    $config_1gb_auto = "$path_1gb/.cpu_limit.auto.conf";
    $config_1gb_message = "$path_1gb/.cpu_limit_message.conf";

    if( !($cfg_1gb = @file($config_1gb_auto ) ) )
        if( !($cfg_1gb = @file($config_1gb ) ) )
            return;
        
    $logfile_1gb_path = $path_1gb . '/.proclimit_' . strtolower( @md5($path_1gb) );
    
    @mkdir($logfile_1gb_path);
    
    $logfile_1gb = "$logfile_1gb_path/.cpu_limit_".date('Y-m-d').".log";
    $logfile_1gb_debug = "$logfile_1gb_path/.cpu_limit_".date('Y-m-d')."_ok.log";

    $full_time_1gb = 60 * 60 * 1000;

    $ip_1gb = $_SERVER["REMOTE_ADDR"];
    @list($ip_1gb) = @split( ',', $ip_1gb );
    $ip_parts_1gb = @split( '\.', $ip_1gb );
    if (count ($ip_parts_1gb) != 4)
        return;
    $ip_1gb = @intval( $ip_parts_1gb[0] ) << 24;
    $ip_1gb |= @intval( $ip_parts_1gb[1] ) << 16;
    $ip_1gb |= @intval( $ip_parts_1gb[2] ) << 8;
    $ip_1gb |= @intval( $ip_parts_1gb[3] );

    if( $ip_1gb > 2147483647 )
    {
        // Значит у нас 64-битная система. Нужно получить отрицательное число, как в 32-битной
        $ip_1gb |= 0xFFFFFFFF00000000;
    }

    $host_1gb = @addslashes(@strtoupper($_SERVER["SERVER_NAME"]));
    if( @substr($host_1gb, 0, 4) == "WWW." )
        $host_1gb = substr( $host_1gb, 4 );
    $site_id_1gb = @strtoupper( @md5( $host_1gb ) );
    
    $full_block_1gb = 0.50 * $full_time_1gb;
    $client_block_1gb = 0.50 * $full_time_1gb;
    $client_block_1gb_header = '';
    foreach( $cfg_1gb as $lin1_1gb )
    {
        $lparts_1gb = @split("=", $lin1_1gb);
        if( count( $lparts_1gb) != 2 )
            continue;
        $name_1gb = strtoupper( trim( $lparts_1gb[0] ) );
        $val_1gb = trim( $lparts_1gb[1] );
        
        if( $name_1gb == "FULL_BLOCK" )
            $full_block_1gb = @floatval( $val_1gb ) / 100 * $full_time_1gb;
        if( $name_1gb == "IP_BLOCK" )
            $client_block_1gb = @floatval( $val_1gb ) / 100 * $full_time_1gb;
        if( $name_1gb == "HTTP_CODE" )
        {
            if ($val_1gb == 403) $client_block_1gb_header = ('HTTP/1.0 403 Forbidden');
            else if ($val_1gb == 500) $client_block_1gb_header = ('HTTP/1.0 500 Internal Server Error');
            else if ($val_1gb == 501) $client_block_1gb_header = ('HTTP/1.0 501 Not Implemented');
            else if ($val_1gb == 502) $client_block_1gb_header = ('HTTP/1.0 502 Bad Gateway');
            else if ($val_1gb == 503) $client_block_1gb_header = ('HTTP/1.0 503 Service Unavailable');
            else if ($val_1gb == 504) $client_block_1gb_header = ('HTTP/1.0 504 Gateway Timeout');
            else $client_block_1gb_header = ('HTTP/1.0 '.(0 + $val_1gb));
        }
    }
    
    $con_1gb = @mysql_connect( "127.0.0.1:3399", "user" );
    if( !$con_1gb )
    {
        if( $logfile = @fopen( $logfile_1gb_debug, "at+" ) )
        {
            @fwrite( $logfile, date( "Y-m-d H:i:s" ) . ", accounting database is offline\n" );
            @fclose( $logfile );
        }
        return;    
    }
    @mysql_query( "use ProcLimit;", $con_1gb);

    
    $__limit__message = 
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head><title>Ограничение нагрузки сайта</title>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1251">
<meta name="robots" content="noindex,nofollow">
</head><body>
<div style="padding: 32px; margin: 40px; border: 1px solid gray; width:440px; white-space:nowrap;">
<p>Cайт превышает предел нагрузки на процессор
<br>приобретенного тарифного плана хостинга.</p>
<p>Попробуйте зайти позже.</p>
<p style="margin-top:40px;">Site exceeds CPU load allowed by purchased hosting plan.</p>
<p>Please try again later.</p></div>
<p style="color:gray;">Владельцу сайта:<br>описание ситуации на странице <a href="http://www.1gb.ru/autolimit" 
style="color:gray;">www.1gb.ru/autolimit</a>.</p>
</body></html>';
    
    
    $q_1gb = "SELECT ProcessorTime FROM Summary WHERE Summary.Site_ID = '$site_id_1gb'";
    $res_1gb = @mysql_query( $q_1gb, $con_1gb );
    if( $res_1gb )
        $res_1gb = @mysql_fetch_row( $res_1gb );

    if( $res_1gb )
    {
        $load_from_ip_1gb = @round ($res_1gb[0] * 100 / $full_time_1gb, 2);
        if( $res_1gb[0] >= $full_block_1gb )
        {
            if( $logfile = @fopen( $logfile_1gb, "at+" ) )
            {
                @fwrite( $logfile, date( "Y-m-d H:i:s" ) . ", blocked: $_SERVER[REMOTE_ADDR] ($load_from_ip_1gb %)\n" );
                @fclose( $logfile );
            }
            if ($client_block_1gb_header != '')
                header ($client_block_1gb_header);
            if ($f = @fopen ($config_1gb_message, 'rb'))
                die (fread ($f, 65536));
            else 
                die( $__limit__message );
        }
    }

                
    $q_1gb = "SELECT ProcessorTime FROM IPSummary WHERE IPSummary.Site_ID = '$site_id_1gb' AND IPSummary.IP = '$ip_1gb'";
    $res_1gb = @mysql_query( $q_1gb, $con_1gb );
    if( $res_1gb )
        $res_1gb = @mysql_fetch_row( $res_1gb );
    
    if( $res_1gb )
    {
        $load_total_1gb = @round ($res_1gb[0] * 100 / $full_time_1gb, 2);
        if( $res_1gb[0] > $client_block_1gb )
        {
            if( $logfile = @fopen( $logfile_1gb, "at+" ) )
            {
                @fwrite( $logfile, date( "Y-m-d H:i:s" ) . ", blocked: $_SERVER[REMOTE_ADDR] (IP load = $load_total_1gb %)\n" );
                @fclose( $logfile );
            }
            if ($client_block_1gb_header != '')
                header ($client_block_1gb_header);
            if ($f = @fopen ($config_1gb_message, 'rb'))
                die (fread ($f, 65536));
            else 
                die( $__limit__message );
        }
    }

    
    if( $logfile = @fopen( $logfile_1gb_debug, "at+" ) )
    {
        @fwrite( $logfile, date( "Y-m-d H:i:s" ) . ", ok $_SERVER[REMOTE_ADDR] (IP load = $load_total_1gb %, total = $load_from_ip_1gb %)\n" );
        @fclose( $logfile );
    }
    
    
    unset( 
        $path_1gb, $config_gile, $ip_1gb, $host_1gb, $logfile_1gb, $logfile_1gb_debug, $logfile, $cfg_1gb, $full_1gb, $full_block_1gb, $client_block_1gb, 
        $lin1_1gb, $lparts_1gb, $name_1gb, $val_1gb, $q_1gb, $res_1gb, $ip_parts_1gb, $full_time_1gb, $load_from_ip_1gb, $load_total_1gb, $site_id_1gb, $logfile_1gb_path,
        $__limit__message, $config_1gb_auto, $config_1gb_message, $client_block_1gb_header
        );
    
?>