<?php

if(isset($_SERVER['REMOTE_ADDR'])) die();
include_once('../../global.php');

$Serial = date('Ymds', time());
$MinimumTime = 7200;
$RetryTime = 7200;
$ExpireTime = 2419200;
$RefreshTime = 28800;
$MinimumTime = 10800;
$TTL = 86400;
$BaseDir = '/var/named/';
$MailServer = 'centrala';

function GenerateDNS($DNS)
{
  $Output = '$ORIGIN '.$DNS['Domain'].'.'."\n".
  '$TTL '.$DNS['TTL']."\n".
  $DNS['Domain'].".\tIN\tSOA\t".$DNS['NameServer'][0].".\troot.".$DNS['Domain'].".  (\n".
  "\t\t\t".$DNS['Serial']."\t; serial\n".
  "\t\t\t".$DNS['Refresh']."\t; refresh\n".
  "\t\t\t".$DNS['Retry']."\t; retry\n".
  "\t\t\t".$DNS['Expire']."\t; expire\n".
  "\t\t\t".$DNS['Minimum']."\t; minimum\n".
  "\t\t\t)\n";
  foreach($DNS['NameServer'] as $NameServer)
  {
    $Output .= "\t\tIN\tNS\t".strtolower($NameServer).".\n";
  }
  $Output .= "\t\t\tTXT\t".'"'.$DNS['Description'].'"'."\n";

  // Mail server records
  $Priority = 10;
  foreach($DNS['MailServer'] as $MailServer)
  {
    $Output .="\t\t\tMX\t".$Priority." ".strtolower($MailServer).".\n";
    $Priority += 10;
  }
  $Output .= "; SPF\n".
    $DNS['Domain'].".\tIN\tTXT\t\"v=spf1 mx -all\"\n".
    $DNS['Domain'].".\tIN\tSPF\t\"v=spf1 mx -all\"\n";
  foreach($DNS['MailServer'] as $MailServer)
  {
    $Output .= $MailServer.".\tIN\tTXT\t\"v=spf1 a -all\"\n".
    $MailServer.".\tIN\tSPF\t\"v=spf1 a -all\"\n";
  }

  // Host list
  foreach($DNS['Host'] as $Host)
  {
    if(strlen($Host['Name']) < 8) $Host['Name'] .= "\t";
    $Output .= strtolower($Host['Name'])."\tIN\tA\t".$Host['Address']."\n";
  }

  // Alias list
  foreach($DNS['Alias'] as $Alias)
  {
    if(strlen($Alias['Name']) < 8) $Alias['Name'] .= "\t";
    $Output .= strtolower($Alias['Name'])."\tIN\tCNAME\t".strtolower($Alias['Target'])."\n";
  }

  $File = fopen($DNS['BaseDir'].$DNS['Domain'].'.zone', 'w');
  fputs($File, $Output);
  fclose($File);

  // Generate reverse DNS records
  foreach($DNS['Network'] as $Network)
  {
    $Parts = explode('.', $Network);
    $Output = // '$ORIGIN '.$Parts[2].'.'.$Parts[1].'.'.$Parts[0].'.in-addr.arpa'."\n".
    '$TTL '.$DNS['TTL']."\n".
    "@\tIN\tSOA\t".$DNS['NameServer'][0].".\troot.".$DNS['Domain'].".  (\n".
    "\t\t\t\t".$DNS['Serial']."\t; serial\n".
    "\t\t\t\t".$DNS['Refresh']."\t; refresh\n".
    "\t\t\t\t".$DNS['Retry']."\t; retry\n".
    "\t\t\t\t".$DNS['Expire']."\t; expire\n".
    "\t\t\t\t".$DNS['Minimum']."\t; minimum\n".
    "\t\t\t\t)\n";
    foreach($DNS['ReverseNameServer'] as $NameServer)
    {
      if(substr($NameServer, -strlen($DNS['Domain'])) == $DNS['Domain'])
        $Output .= "@\tIN\tNS\t".$NameServer.".\n";
      else $Output .= "\tIN\tNS\t".$NameServer.".\n";
    }
    foreach($DNS['Host'] as $Host)
    if(substr($Host['Address'], 0, strlen($Network)) == $Network)
    {
      $AddressParts = explode('.', $Host['Address']);
      $Host['Name'] = strtolower($Host['Name']);
      $Output .= $AddressParts[3]."\tIN\tPTR\t".$Host['Name'].".".$DNS['Domain'].".\n";
    }
    $File = fopen($DNS['BaseDir'].$Parts[2].'.'.$Parts[1].'.'.$Parts[0].'.in-addr.arpa.zone', 'w+');
    fputs($File, $Output);
    fclose($File);
  }
}

$BaseDomain = 'zdechovnet.czf';
$LocalDNS = array(
  'Domain' => $BaseDomain,
  'Serial' => $Serial,
  'Refresh' => $RefreshTime,
  'Expire' => $ExpireTime,
  'Retry' => $RetryTime,
  'Minimum' => $MinimumTime,
  'TTL' => $TTL,
  'Description' => 'ZdechovNET community network',
  'BaseDir' => $BaseDir,
  'MailServer' => array('centrala.'.$BaseDomain),
  'NameServer' => array('centrala.'.$BaseDomain, 'tv.'.$BaseDomain),
  'ReverseNameServer' => array('centrala.'.$BaseDomain, 'tv.'.$BaseDomain),
  'Host' => array(),
  'Alias' => array(),
  'Network' => array('10.145.64', '10.145.65', '10.145.66', '10.145.67', '77.92.221'),
);

// Local records
$DbResult = $Database->query('SELECT NetworkInterface.*, NetworkDevice.Name AS DeviceName FROM NetworkInterface JOIN NetworkDevice ON NetworkDevice.Id = NetworkInterface.Device WHERE NetworkInterface.LocalIP <> ""');
while($Interface = $DbResult->fetch_assoc())
{
  $Name = $Interface['DeviceName'];
  if($Interface['Name'] != '') $Name .= '-'.$Interface['Name'];
  $LocalDNS['Host'][] = array('Name' => $Name, 'Address' => $Interface['LocalIP']);
}


// Domain aliases
$DbResult = $Database->select('NetworkDomainAlias', '*');
while($Alias = $DbResult->fetch_assoc())
{
  $LocalDNS['Alias'][] = array('Name' => $Alias['Name'], 'Target' => $Alias['Target']);
}


// === External network DNS server ===
$BaseDomain = 'zdechov.net';
$ExternalDNS = array(
  'Domain' => $BaseDomain,
  'Serial' => date('Ymds', time()),
  'Refresh' => 28800,
  'Expire' => 2419200,
  'Retry' => 7200,
  'Minimum' => 10800,
  'TTL' => 86400,
  'Description' => 'ZdechovNET community network',
  'BaseDir' => $BaseDir,
  'MailServer' => array('centrala.'.$BaseDomain),
  'NameServer' => array('gw-hajda.inext.cz', 'ns1.vcsweb.com', 'ns1.twisted4life.com'),
  'ReverseNameServer' => array('gw-hajda.inext.cz', 'inext.inext.cz'),
  'Host' => array(),
  'Alias' => array(),
  'Network' => array('81.2.194', '193.86.238', '212.111.4', '77.92.221'),
);

$DbResult = $Database->query('SELECT NetworkInterface.*, NetworkDevice.Name AS DeviceName FROM NetworkInterface JOIN NetworkDevice ON NetworkDevice.Id = NetworkInterface.Device WHERE NetworkInterface.ExternalIP != ""');
while($Interface = $DbResult->fetch_assoc())
{
  $Name = $Interface['DeviceName'];
  if($Interface['Name'] != '') $Name .= '-'.$Interface['Name'];
  $ExternalDNS['Host'][] = array('Name' => $Name, 'Address' => $Interface['ExternalIP']);
}

// Domain alias
$DbResult = $Database->query('SELECT NetworkDomainAlias.* FROM `NetworkDomainAlias`'); 
// JOIN `NetworkDevice` ON NetworkDomainAlias.Target LIKE NetworkDevice.Name AND NetworkInterface.ExternalIP != ""');
while($Alias = $DbResult->fetch_assoc())
{
  $ExternalDNS['Alias'][] = array('Name' => $Alias['Name'], 'Target' => $Alias['Target']);
}

GenerateDNS($LocalDNS);
GenerateDNS($ExternalDNS);

?>
