<?php ini_set('max_execution_time'300);

unset(
$lines$hosts);

if (!
$zonefilename)
    
$zonefilename    'null.zone.file';
?>
<html>

<head>
<meta name="author" value="Peter Lowe; pgl@yoyo.org">
<meta name="description" value="a simple script with which to convert a hosts file to BIND zone file format">
<meta name="keywords" value="ad blocking, blocking ads, ad servers, ads, banners, hosts file, privacy, blocking spyware, mac hosts">
<meta name="cabal" value="">

<title>
Hosts file to BIND config file converter
</title>

<?=$style_head?>

</head>

<body>

<p>
    [ <a href="index.php">back to the ad server index page</a>
    | <a href="null.zone.file">example null zone file</a>
    | <a href="software/nsblock.zip">VB script alternative</a>
    | <a href="hosts2bind.phps">php source</a>
    | <a href="hosts2zonefile.php">convert hosts files to BIND zone files</a>
    ]

<p>(Don't know what this page is about? Have a look at <a href="index.php#hosts2bind">the main page</a>.)

<p>OK, here's the drill: paste a hosts file into the textarea, and hit "convert to BIND zone file format". Then -- and I know this might come as a surprise, but keep with me here -- if you pasted a valid hosts file into the textarea, it will be converted into BIND zone file format, and presented below the textarea. Or, if you prefer, you can upload a hosts file instead. The textarea takes preference though, so if you try uploading both you'll only get results from the stuff from there.

<p><b style="color: #800000;">Notes:</b>

<ul>
<li>The maximum file upload size is 5 MB, and the maximum amount of data you can put in the textarea is 9 MB, hopefully enough for a hosts file. If your hosts file is bigger than this, have a look through the ODP's <a href="http://dmoz.org/Computers/Software/File_Management/File_Splitters/"> File Splitters</a> category for an application that will split it into smaller chunks.

<li>Each line of your hosts file is assumed to be in this format:

    <blockquote style="font-family: lucida console;">
    &lt;ip address&gt; &lt;hostname&gt; [hostname] [hostname] [...]
    </blockquote>

Where <span style="font-family: lucida console;">[hostname]</span>s in square brackets are optional. So, something like this:</i>

    <blockquote style="font-family: lucida console;">
    127.0.0.1 example.net example.org
    <br>127.0.0.1 www.example.com
    <br>... etc...
    </blockquote>

<li>Any lines the script doesn't understand are ignored.

<li>Exact duplicates of hostnames found are removed from the output. Hostnames that are subdomains of other entries are not, however. For a script that does this, check out <a href="http://ntcanuck.com/">ObiWan</a>'s <a href="software/nsblock.zip">VB script</a>.
<li>Hosts are converted to lowercase before output.
</ul>

<center>

<p><table cellpadding=4 cellspacing=1 style="border: 1px solid #444444;" bgcolor="#EEEEEE" width="95%">

<form action="<?=$PHP_SELF?>" method=post enctype="multipart/form-data">

<tr>
<td>paste your hosts file into the text area below...</td>
<td align=right>
    <table cellpadding=2 cellspacing=1>
    
    <tr>
    <td>... or upload a hosts file:</td>
    <td><input type=file name=hostsfile style="width: 200px;"></td>
    </tr>

    </table>
</td>
</tr>

<tr><td colspan=2>
<textarea name=hostsdata rows=8 cols=100 style="width: 100%;"></textarea>
</td></tr>

<tr>
<td>
    <table cellpadding=2 cellspacing=1>

    <tr>
    <td>filename containing bogus data for ad servers:</td>
    <td><input type=text size=30 name=zonefilename value="<?=$zonefilename?>"></td>
    <td>[ download <a href="null.zone.file">this file</a> for an example ]</td>
    </tr>

    </table>
</td>
<td align=right><input type=submit value="convert to BIND config file format"></td>
</tr>

</form>

</table>

</center>

<?php if ($hostsdata || is_uploaded_file($_FILES['hostsfile']['tmp_name'])) { ?>

<p><hr size=1 noshade>

<pre>
<?php     foreach (($hostsdata preg_split('/[\r\n]/ism'$hostsdata) : file($_FILES['hostsfile']['tmp_name'])) as $line) {
        
// trim comments off the end of lines and skip blanks
        
if (!$line preg_replace('/(^\s+|\s*#.*$)/'''$line))
            continue;

        
// get the ip address and hostnames
        
if (preg_match('/^((?:\d{1,3}\.){3}\d{1,3})\s+(.*)/'$line$m)) {
            
$ip    $m[1];
            
$hosts    preg_split('/\s+/'$m[2], -1PREG_SPLIT_NO_EMPTY);
            }

        if (
is_array($hosts)) foreach ($hosts as $host) {
            
// skip existing hosts
            
if ($seen_hosts[$host])
                continue;

            
// add host to list of existing if we got this far
            
$seen_hosts[$host] = 1;
?>
zone "<?=strtolower($host)?>" { type master; notify no; file "<?=$zonefilename?>"; };
<?php             }
        }
?>
</pre>
<?php ?>

</body>

</html>