12:02
Обновить
PHP proxy-server - Форум
| RSS



[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: aka_kludge, LeadyTOR  
PHP proxy-server
aka_kludgeДата: Четверг, 29.10.2009, 22:31 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 1058
Награды: 2
Репутация: 25
Статус: Offline
Code
<?php
/*
********************************************************************************
*
*  Library features:
*  ~ multi-threaded work
*  ~ overflow safety
*  ~ high speed
*  ~ zlib compression support
*  ~ proxy to proxy
*
*  Requirements:
*   Not work with non-unix! You have to compile the CGI or CLI version of PHP highest v.4.1.0    
*   with these config options: ./configure '--enable-sockets' '--enable-pcntl' '--enable-sigchild'  
*   '--with-zlib=[DIR]'
*
*  Date: 10.09.2005  
*
*  Coded by n0 [CyberLords]
*
*  Copyright ї n0 2002-2005
*
********************************************************************************
*/

// no time limit
set_time_limit(0);

// no error reporting
error_reporting(0);

declare (ticks = 1);

  /*========================================================================*/
  // Signal handler function
  /*========================================================================*/

function sig_handler($signo)
{
  switch($signo)
  {
   case SIGTERM:
    // handle shutdown tasks
    die();
    break;
   default:
   // handle all other signals
  }
}
    
// Setup signal handlers
pcntl_signal(SIGTERM, "sig_handler");

  /*========================================================================*/
  // Deamon class
  /*========================================================================*/

class DMN
{
  // Server status variables  
  var $onLineF             = 0;
  var $onLineD             = 0;
   
  // Deamon version
  var $_VERSION            = 'v.0.39b';

  // IP & PORT
  var $_SERVER_IP          = '1.2.3.4';  // server ip  
  var $_SERVER_PORT        = '3128'; // server port

  // Sockets variables
  var $_CREAT_SOCKET;
  var $_REMOTE_HOST_SOCK;
  var $_BILI;
  var $_SOCK_ACCEPT;   

  // Query settings & variables
  var $_HTTP_DEFAULT_PORT  = 80;
  var $_HTTP_REMOTE_HOST   = '';
  var $_HTTP_REMOTE_PORT   = '';
     
  // -> && <- variables
  var $_QUERY_VAR;
  var $_REQUEST_VAR;  
  var $_RESPONSE_VAR;
  var $_RESPONSE_DATA;

  // Connections settings
  var $_FM                 = 5000;
  var $_FN                 = 0;
   
  // Compression variables
  var $_GZ                 = 0; // TRUE = compression ON;  FALSE = COMPRESSION OFF
  var $compressed_level    = 0; // 3 recomended
   
  // Proxy to Proxy
  var $_PTP                = 0; // TRUE = PTP ON;  FALSE = PTP OFF
  var $_PROXY_IP           = '5.6.7.8';
  var $_PROXY_PORT         = '3128';
    
  // Logs
  var $logwd               = '/full/path/to/proxy_deamon_access_log'; // Example: /home/myhomepage/logs/proxy_deamon_logs
   
  // Time options
  var $_TO                 = 40; // timout for all connections
   
  /*========================================================================*/
  // Start Deamon
  /*========================================================================*/

  function start_deamon()
  {
   $onError = 0;
   print "\n  Starting deamon->\n\n  * Creating Socket: ";
   $this->_CREAT_SOCKET = socket_create(AF_INET, SOCK_STREAM, 0);
   if ($this->_CREAT_SOCKET) {print "Ok\n";} else {print "Faild\n";$onError++;}
   print "  * Set options: ";   
   if (socket_set_option($this->_CREAT_SOCKET, SOL_SOCKET, SO_REUSEADDR, 1))  {print "Ok\n";} else {print "Faild\n";$onError++;}
   print "  * Binding port: ";
   if ($this->BILI = socket_bind($this->_CREAT_SOCKET, $this->_SERVER_IP, $this->_SERVER_PORT)) {print "Ok\n";} else {print "Faild\n";$onError++;}
   print "  * Listening: ";
   if ($this->BILI = socket_listen($this->_CREAT_SOCKET, 0)) {print "Ok\n\n";} else {print "Faild\n";$onError++;}
   if($onError == 0) {print "~~~~~~~~~~~~~~~~~~~~~~~~~\n\n + Deamon successful started on $this->_SERVER_IP".":"."$this->_SERVER_PORT with PID ".posix_getpid()."\n\n + Server ready\n\n + Waiting for connections.....\n\n"; return TRUE;} else {print "~~~~~~~~~~~~~~~~~~~~~~~~~\n\n - Starting Deamon Faild\n\n\n"; return FALSE;
     }
  }
   
  /*========================================================================*/
  // Stop Deamon
  /*========================================================================*/
      
  function stop_deamon()
  {
   if ($this->_CREAT_SOCKET)  
   {
    $this->onLineF = 0;
    $this->onLineD = 0;
    if (is_writable($this->logwd))
    {
     $ft = fopen ($this->logwd, "a+");
     if (flock($ft, LOCK_EX)) // do an exclusive lock  
     {
      fwrite ($ft, "[".date("d.m.y H:i:s")."] - PHP_PROXY_DEAMON ".$this->_VERSION." Written by n0 [CyberLords] // Successful terminated\n");     
      flock($ft, LOCK_UN); // release the lock
     }  
     fclose($ft);
    }
    print "\n  Stop deamon->\n\n  * Deamon successful terminated\n\n  Press 'Ctrl+C' for exit\n\n";sleep(120);exit();
   }
   else  
   {
    print "\n\n!!!!Deamon is Shut down now!!!!\n\n";
   }
  }

  /*========================================================================*/
  // Parse request
  /*========================================================================*/

  function parse_request($_this_request)
  { // Split query into header sections
   list($_request_headers, $_request_body) = explode("\r\n\r\n", $_this_request, 2);
   $_request_header_lines = explode("\r\n", $_request_headers);
    
    // First line of headers is the HTTP quering method
   $_http_request_line = array_shift($_request_header_lines);
   if (preg_match('!([^ ]+) ([^ ]+) ([^/]+)/([^]+) ([^ ]+)!', $_http_request_line, $_matches))
   {
    $_request_method = $_matches[1];
    $_request_url= $_matches[2];
    $_request_http_version = $_matches[4];
   }
    
   // Parse url
   $_url_parse = parse_url($_matches[2]);
   $_http_host = $_url_parse["host"];
   $_http_port = $_url_parse["port"];
      
   // put the rest of the headers in an array
   $_request_header_array = array();
    
   foreach($_request_header_lines as $_header_line)
   {
    list($_header,$_value) = explode(': ', $_header_line, 2);
    $_request_header_array[$_header] .= $_value."\n";
   }
   // Return all in array
   return array("host" => $_http_host, "port" => $_http_port, "url" => $_request_url, "header" => $_request_header_lines, "header_array" => $_request_header_array);  
  }

  /*========================================================================*/
  // Parse response
  /*========================================================================*/

  function parse_response($_this_response)
  { // Split response into header and body sections
   list($_response_headers, $_response_body) = explode("\r\n\r\n", $_this_response, 2);
   $_response_header_lines = explode("\r\n", $_response_headers);
    
   // Main response hedaer code
   $_response_code = $_response_header_lines[0];
    
   // put the rest of the headers in an array
   $_response_header_array = array();
    
   foreach($_response_header_lines as $_header_line)
   {
    list($_header,$_value) = explode(': ', $_header_line, 2);
    $_response_header_array[$_header] .= $_value."\n";
   }
   return array("code" => $_response_code, "header_array" => $_response_header_array, "header" => $_response_headers, "body" => $_response_body);  
  }

  /*========================================================================*/
  // Prepare contents of the output buffer.
  /*========================================================================*/

  function create_output($_this_output)
  {
   if($this->_GZ)  
   {
    if(strlen($_this_output) > 8192) // Compress the data into a new var. Don't compress any less than 1024 bytes as it's not worth the overhead at either side.
    {  
     $response_array = $this->parse_response($_this_output);

     // Prepare output
     if(empty($response_array["header_array"]["Content-Encoding"]))  
     {
      // Compress output
      $compressed_out = gzcompress($response_array["body"], $this->compressed_level);
       
      // Compression info
      print "Compression info: Before: ".strlen($response_array["body"])." & After: ".strlen($compressed_out)."\n";
       
      $_output = $response_array["code"]."\r\nAccept-Ranges: bytes\r\nContent-Encoding: gzip\r\nVary: Accept-Encoding\r\n"; // Tell the browser the content is compressed with gzip
      if(!empty($response_array["header_array"]["Content-Type"]))  
      {
       $_output .= "Content-Type: ".$response_array["header_array"]["Content-Type"]."\r\n";
      }
      else
      {
       $_output .= "Content-Type: text/html\r\n\r\n";     
      }  
      $_output .= "\x1f\x8b\x08\x00\x00\x00\x00\x00";
      $_output .= $compressed_out;

      socket_write($this->_SOCK_ACCEPT, $_output, strlen($_output));
     }
     else
     {
      socket_write($this->_SOCK_ACCEPT, $_this_output, strlen($_this_output));      
     }     
    }
    else
    { // No compression
     socket_write($this->_SOCK_ACCEPT, $_this_output, strlen($_this_output));
    }
   }
   else
   {
    socket_write($this->_SOCK_ACCEPT, $_this_output, strlen($_this_output));
   }
  }
      
  /*========================================================================*/
  // Main function:  
  //  new proc; get query; send query; get response; send response; kill proc;
  /*========================================================================*/

  function transfer()
  {
   while($this->onLineF)
   {
    while($this->_FN >= $this->_FM)
    {
     print "!!!! Maximum fork..... sleeping..... !!!!\n";          
     sleep($this->_TO);  
     $this->_FN = 0;
    }
    print "Forks created now: ".$this->_FN++."\n";
    if (($this->_SOCK_ACCEPT = socket_accept($this->_CREAT_SOCKET)) < 0)  
    {
     echo "socket_accept() failed: reason: " .socket_strerror($this->_SOCK_ACCEPT) . "\n"; break;
    }
    $cpid = pcntl_fork();
    if ( $cpid == -1 )  
    {
     die( "error\n" );
    }
    elseif ( $cpid  == 0) {}
    else
    {
     $this->_REMOTE_HOST_SOCK = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

     if ($this->_REMOTE_HOST_SOCK < 0)  
     {
      print $log = "[".date("d.m.y H:i:s")."] - Connection ABORTED\n";break;
     }
     else  
     {
      print $log = "[".date("d.m.y H:i:s")."] - New Connection... Process PID: ".$cpid."\n";
     }
     $this->_QUERY_VAR = socket_recv($this->_SOCK_ACCEPT,$this->_REQUEST_VAR,2048,0);
      
     // Parse request and get array with results
     $_request_array = $this->parse_request($this->_REQUEST_VAR);
      
     // Request print and write into log
     print $log .= "[".date("d.m.y H:i:s")."] - Requesting: ".$_request_array["url"]."\n";
      
     // Proxy connection check
     if(!$this->_PTP)
     {
      // HOST:PORT
      $this->_HTTP_REMOTE_HOST = $_request_array["host"];
      $this->_HTTP_REMOTE_PORT = $_request_array["port"];
       
      if (empty($this->_HTTP_REMOTE_PORT))  
      {
       $this->_HTTP_REMOTE_PORT = $this->_HTTP_DEFAULT_PORT; // :80 - default port
      }
     }
     else
     {
      $this->_HTTP_REMOTE_HOST = $this->_PROXY_IP;
      $this->_HTTP_REMOTE_PORT = $this->_PROXY_PORT;
     }
     $fp = socket_connect($this->_REMOTE_HOST_SOCK,$this->_HTTP_REMOTE_HOST,$this->_HTTP_REMOTE_PORT);
     if ($fp < 0)  
     {
      print $log .= "[".date("d.m.y H:i:s")."] - Connection to remote host (".$this->_HTTP_REMOTE_HOST.":".$this->_HTTP_REMOTE_PORT."): Faild...\n";break;
     }
     else  
     {
      print $log .= "[".date("d.m.y H:i:s")."] - Connection to remote host (".$this->_HTTP_REMOTE_HOST.":".$this->_HTTP_REMOTE_PORT."): Ok...\n";
       
      if (socket_write($this->_REMOTE_HOST_SOCK, $this->_REQUEST_VAR, strlen($this->_REQUEST_VAR)))  
      {
       print $log .= "[".date("d.m.y H:i:s")."] - Sending query: Ok...\n";
        
       while ($this->_RESPONSE_VAR =  socket_recv($this->_REMOTE_HOST_SOCK,$_tmp_DATA,4096,0))  
       {
        $this->_RESPONSE_DATA .= $_tmp_DATA;
       }
        
       // Checking client browser about GZIP support if gzib-compression ON
       if($this->_GZ)
       {
        if(!ereg("gzip",$_request_array["header_array"]["Accept-Encoding"]))
        {
         $this->_GZ = 0;
         print $log .= "[".date("d.m.y H:i:s")."] - GZIP compression for process with PID ".posix_getpid().": OFF (GZIP not Supported)\n";
        }
        else
        {
         print $log .= "[".date("d.m.y H:i:s")."] - GZIP compression for process with PID ".posix_getpid().": ON (GZIP Supported)\n";       
        }
       }
       // Send response to client
       $this->create_output($this->_RESPONSE_DATA);
        
       if (!$this->_RESPONSE_VAR)  
       {
        print $log .= "[".date("d.m.y H:i:s")."] - Reading response from ".$this->_HTTP_REMOTE_HOST.":".$this->_HTTP_REMOTE_PORT.": Ok...\n";
       }
       else  
       {
        print $log .= "[".date("d.m.y H:i:s")."] - Reading response from ".$this->_HTTP_REMOTE_HOST.":".$this->_HTTP_REMOTE_PORT.": Faild...\n";break;
       }
      }
      else  
      {
       print $log .= "[".date("d.m.y H:i:s")."] - Sending query: Faild...\n";break;
      }
     }    
     if (is_writable($this->logwd))
     {
      $fw = fopen ($this->logwd, "a+");
      if (flock($fw, LOCK_EX))  
      { // do an exclusive lock
       fwrite ($fw, $log);  
       flock($fw, LOCK_UN); // release the lock
      }  
      fclose($fw);
     }
    @socket_close($this->_REMOTE_HOST_SOCK);
    posix_kill(posix_getpid(), SIGTERM);
    }
   }
  }
}

      
  /*========================================================================*/
  // Keyboard class
  /*========================================================================*/

class DCM
{
  var $_DIN_READ       = '';
  var $_CMD            = '';

  /*========================================================================*/
  // Read command
  /*========================================================================*/

  function din_read()
  {
   global $_DMN;
   print "\nChose command:\n\n   - Start deamon #: 1 (BIND: ".$_DMN->_SERVER_IP.":".$_DMN->_SERVER_PORT.")";
   if($_DMN->_GZ) {print "\n\n     *Compression: ON (Compression level: ".$_DMN->compressed_level.")";} else {print "\n\n     *Compression: OFF";}
   if($_DMN->_PTP) {print "\n\n     *ProxToProxy: ON (Proxy ADDR: ".$_DMN->_PROXY_IP.":".$_DMN->_PROXY_PORT.")";} else {print "\n\n     *ProxToProxy: OFF";}
   print "\n\n   - Stop deamon #: 2\n\n";
   if (file_exists($_DMN->logwd)) {print "   - Show logs #: 3 (".substr(((filesize($_DMN->logwd)/1048576*100)/100),0,6)." Mb)\n\n";}
   print " *For back to main menu press 'ENTER'\n\n";
   print "Command #: ";
   $this->_DIN_READ = fopen('php://stdin','r');
   $this->_CMD = fgets($this->_DIN_READ, 2);
   fclose($this->_DIN_READ);
   return $this->_CMD;
  }    
}

// Cheking OS type
if (ereg("win", strtolower(PHP_OS))) {die("\nCannot run in Windows OS. This deamon only for Unix OS\n\n");}

// Cheking PHP version
if (str_replace(".",NULL,phpversion()) < 410) {die("\nWarning! You should update PHP to 4.1.0. Current version ".phpversion()."\n\n");}
   
  /*========================================================================*/
  // Extension checking function
  /*========================================================================*/
   
function extension_checking($ext)  
{
  if (!extension_loaded($ext))
  {
   dl($ext.".so");
   if (!extension_loaded($ext))  
   {
    die("\n - $ext extension: needed!\n\n");
   }  
  }
  else
  {
   print  "\n + $ext extension: loaded";
  }  
}
print "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nExtensions checking: \n";

// Zlib extension loading
extension_checking("zlib");

// Sockets extension loading
extension_checking("sockets");

print "\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";

  /*========================================================================*/
  // Permissions class
  /*========================================================================*/

class SPM
{
  var $_GID    =   10;
  var $_UID    =   10;

  /*========================================================================*/
  // Set permissions for current process
  /*========================================================================*/

  function set_permissions()
  {
   print "\nTrying set UID and GID for this process\n";
   if ((posix_setgid($this->_GID)) && (posix_setuid($this->_UID)))  
   {
    print "\nGID ".$this->_GID." and UID ".$this->_UID." set for current process successful\n\n"; return TRUE;
   }
   else  
   {
    print "\nSetting GID ".$this->_GID." and UID ".$this->_UID." is faild for current process\n\nYou don`t have permissions\n\n"; return FALSE;
   }
  }    
}

// Main variables
$_DMN = new DMN;
$_DCM = new DCM;
$_SPM = new SPM;

// Welcome message
print "\n\nWellcome to PHP_PROXY_SERVER ".$_DMN->_VERSION."\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWritten by n0 [CyberLords]\n\nUIN#: 899125\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n";
print "Server info: ".php_uname()." as [".get_current_user()."]\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; // OS

// main
if ($_SPM->set_permissions()) // if your uid & gid 0 -> TRUE
{
  while(TRUE)
  {  
   $_DCM->CMD = $_DCM->din_read(); // read command from keyboard    
   switch($_DCM->CMD) { // switch command
   // Start deamon
    case 1:
     unset($_DCM->CMD);
     if(!$_DMN->onLineF)  
     {
      $_DMN->onLineF = TRUE;
      }
     if ($_DMN->onLineD) {print "\nAlready runing with PID ".posix_getpid()."\n";} elseif (!$_DMN->onLineD)
     {
      $_DMN->onLineD = TRUE;
      if ($_DMN->start_deamon()) // if deamon started -> get_send .....
      {
       if (is_writable($_DMN->logwd))
       {
        $fs = fopen ($_DMN->logwd, "a+");
        if (flock($fs, LOCK_EX)) // do an exclusive lock
        {
         fwrite ($fs, "[".date("d.m.y H:i:s")."] - PHP_PROXY_DEAMON ".$_DMN->_VERSION." Written by n0 [CyberLords] // Successful started (PTP: ".$_DMN->_PTP."  Compression: ".$_DMN->_GZ.")\n");
         flock($fs, LOCK_UN); // release the lock
        }  
        fclose($fs);
       }       
       $pid = pcntl_fork();
       if ($pid == -1) {die( "error\n" );} elseif ($pid  == 0) {$_DMN->transfer();} else {}
      }
      else
      {
       if (is_writable($_DMN->logwd))
       {
        $fs = fopen ($_DMN->logwd, "a+");
        if (flock($fs, LOCK_EX))
        {
         fwrite ($fs, "[".date("d.m.y H:i:s")."] - PHP_PROXY_DEAMON ".$_DMN->_VERSION." Written by n0 [CyberLords] // Starting aborted\n");
         flock($fs, LOCK_UN); // release the lock
        }  
        fclose($fs);
       }
       exit(0); // if deamon not started -> exit
      }
     }
      break;
     // Stop deamon
    case 2:
      $_DMN->stop_deamon(); // deamon terminated
      break;
    case 3:   
     unset($_DCM->CMD);
     if (filesize($_DMN->logwd) > 0)  
     {
      include($_DMN->logwd);
     }
     else  
     {
      print "\nLog file empty\n";
     }
     break;
     // Other command  
    default:
     print "\n\nWarning!!!!! Unknown command\n\n";  
     break;
   }
  }
}
else  
{
  exit();
}
?>
 
  • Страница 1 из 1
  • 1
Поиск:

Профиль
ИнформацияУправление
Сегодня: 4, 04.12.2024, 12:02
Вы используете: " v "
ВаШ внешний IP: "18.97.14.91"
У вас новых личных сообщений · Мой профиль | Выход




    Главная      
...
На службе : дней

12:02
Обновить


Пользователи
aka_kludge
qwerty
LeadyTOR
aka_Atlantis
AdHErENt
mAss
Sissutr
hiss
DrBio
tHick

Поиск


Copyright tHR - TeAM 2024 г. admin: aka_kludge (ICQ:334449009) Moderator's: LeadyTOR, ... Яндекс.Метрика