PHP Classes
elePHPant
Icontem

File: DNServer.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Cesar D. Rodas  >  DNServer  >  DNServer.php  >  Download  
File: DNServer.php
Role: Class source
Content type: text/plain
Description: Main Class
Class: DNServer
Implement a DNS server in pure PHP
Author: By
Last change: * Linux and UnixLikeOS Bind bug fixed.
Date: 8 years ago
Size: 3,789 bytes
 

Contents

Class file image Download
<?
/*
** DNServer (Public Domain)
** Cesar Rodas <saddor@guaranix.org>
**
** The Idea is to give a simple way to handle DNS querys and retrives an IP.
** This project could be used as a DNS Trafic Balancer to mirrow sites with a
** close geografic position, of course with a IP2Country Module.
****************************************************************************************
** La idea es dar una manera de manejar las peticiones de DNS y retornar un IP.
** El proyecto puede ser usado como un Balanceador de Trafico hacia sitios espejos
** con una posicion geografica cercana, desde luego que con un modulo de IP2Country.
**
*/
class DNServer
{
    var
$func;
    var
$socket;
    var
$types;
    var
$localip;

   
/*
    ** Function Constructor.
    ** The argument is the name of a function that became
    ** a callback function. See the example
    */
   
function DNServer($callback,$ip = NULL)
    {
       
$this->localip = $ip;
       
$this->func = $callback;
       
set_time_limit(0);
       
$this->types = array(
           
"A" => 1,
           
"NS" => 2,
           
"CNAME" => 5,
           
"SOA" => 6,
           
"WKS" => 11,
           
"PTR" => 12,
           
"HINFO" => 13,
           
"MX" => 15,
           
"TXT" => 16,
           
"RP" => 17,
           
"SIG" => 24,
           
"KEY" => 25,
           
"LOC" => 29,
           
"NXT" => 30,
           
"AAAA" => 28,
           
"CERT" => 37,
           
"A6" => 38,
           
"AXFR" => 252,
           
"IXFR" => 251,
           
"*" => 255
       
);
 
        
$this->Begin();
    }
   
    function
Begin()
    {
       
$this->socket = socket_create(AF_INET,SOCK_DGRAM, SOL_UDP);
        if (
$this->socket < 0)
        {
           
printf("Error in line %d", __LINE__ - 3);
            exit();
        }
        if (
socket_bind($this->socket, $this->localip, "53") == false)
        {
           
printf("Error in line %d",__LINE__-2);
            exit();
        }
       
       
/*
         * Server Loop
         */
       
while(1)
        {
       
           
$len = socket_recvfrom($this->socket, $buf, 1024*4, 0, $ip, $port);
            if (
$len > 0)
            {
               
$this->HandleQuery($buf,$ip,$port);
            }
        }
    }
   
    function
HandleQuery($buf,$clientip,$clientport)
    {
   
       
$dominio="";
       
$tmp = substr($buf,12);
       
$e=strlen($tmp);
        for(
$i=0; $i < $e; $i++)
        {
           
$len = ord($tmp[$i]);
            if (
$len==0)
                break;
           
$dominio .= substr($tmp,$i+1, $len).".";
           
$i += $len;
        }
       
$i++;$i++; /* move two char */
        /* Saving the domain name as queried*/
       
print $DomainAsQueried;
       
       
$querytype = array_search((string)ord($tmp[$i]), $this->types ) ;
       
       
$dominio = substr($dominio,0,strlen($dominio)-1);
       
$callback = $this->func;
       
$ips = $callback($dominio, $querytype);

       
$answ = $buf[0].$buf[1].chr(129).chr(128).$buf[4].$buf[5].$buf[4].$buf[5].chr(0).chr(0).chr(0).chr(0);
       
$answ .= $tmp;
       
$answ .= chr(192).chr(12);
       
$answ .= chr(0).chr(1).chr(0).chr(1).chr(0).chr(0).chr(0).chr(60).chr(0).chr(4);
       
$answ .= $this->TransformIP($ips);

            

        if (
socket_sendto($this->socket,$answ, strlen($answ), 0,$clientip, $clientport) === false)
           
printf("Error in socket\n");
    }
   
    function
TransformIP($ip)
    {
       
$nip="";
        foreach(
explode(".",$ip) as $pip)
           
$nip.=chr($pip);

        return
$nip;
    }
}


?>