Variable in name of file for named.conf

Jeff Sadowski jeff.sadowski at gmail.com
Thu Apr 2 17:26:30 UTC 2015


On Thu, Apr 2, 2015 at 11:09 AM, Jeff Sadowski <jeff.sadowski at gmail.com> wrote:
> On Wed, Apr 1, 2015 at 8:09 PM, Barry Margolin <barmar at alum.mit.edu> wrote:
>> In article <mailman.1867.1427927445.26362.bind-users at lists.isc.org>,
>>  Jeff Sadowski <jeff.sadowski at gmail.com> wrote:
>>
>>> I have a number of slave domains that I would like a naming scheme and
>>> not have to go to each and change the filename.
>>>
>>> I have the following zones
>>>
>>> zone "1.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "2.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "3.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "4.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "5.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "6.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "7.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "8.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "9.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>> zone "10.168.192.in-addr.arpa" {
>>>         include "named.slave";
>>> };
>>>
>>> named.slave looks as follows
>>>
>>> type slave;
>>> masters {192.168.1.2;};
>>> file "data/db. at .slave";
>>>
>>> It appears to work on my queries.
>>>
>>> nslookup 192.168.1.2
>>>
>>> 2.1.168.192.in-addr.arpa      name = pdc.<domain>
>>>
>>> nslookup 192.168.1.1
>>>
>>> 1.1.168.192.in-addr.arpa      name = gw1.<domain>
>>>
>>> nslookup 192.168.2.1
>>>
>>> 1.2.168.192.in-addr.arpa      name = gw2.<domain>
>>>
>>> the only file created in my data directory seems to be db. at .slave
>>> with the at sign.
>>
>> Why would you expect anything different? @ only has special meaning
>> inside zone files, it's not special in named.conf.
>>
>>>
>>> Do I really need to have each zone with its own file?
>>
>> Yes, you do. What's happening is that every time one of the reverse
>> zones is transferred, it's overwriting that file. But the files are only
>> used when initializing the zones when named starts up; you get the
>> correct answers because the in-memory versions of the zones are
>> distinct. But try restarting named and then see what happens when you do
>> those nslookups. You'll see that 192.168.1.1 and 192.168.2.1 both return
>> the same name.
>>
>>>
>>> Is there a special syntax to get what I expect?
>>> expected files:
>>> data/db.1.168.192.in-addr.arpa.slave
>>> data/db.2.168.192.in-addr.arpa.slave
>>> data/db.3.168.192.in-addr.arpa.slave
>>> ...
>>> data/db.10.168.192.in-addr.arpa.slave
>>>
>>> if not I can have Make do it and build some scripts to do what I want
>>> but if there is syntax to do what I want it would be nice.
>>
>> No, there's no built-in syntax to create the filename based on the zone
>> name.
>>
> I wrote a php script to build my file for me
>
> <?php
> $myslave=array('type'=>'slave'
> ,'masters'=>array('192.168.1.2')
> ,'autofile'=>'data/db. at .slave');
>
> $arpa192='.168.192.in-addr.arpa';
> $domain='<domain>';
> $zone['_msdcs.'.$domain]=$myslave;
> $zone[$domain]=$myslave;
> $slavedsubnets=range('1','10');
>
> build_subnets($slavedsubnets
> ,$arpa192
> ,$myslave);
>
> build_zones();
>
> function build_subnets($subnets
> ,$net
> ,$info)
> {global $zone;
>  foreach($subnets as $subnet)
>  {$zone[$subnet.$net]=$info;
> }}
>
> function build_zones()
> {global $zone,$argv;
>  $pounds=str_repeat('#',30);
>  $warning=$pounds.' WARNING '.$pounds."\n";
>  echo $warning. '# Do not edit this file. '.
>       'It was generated using "php '.
>       $argv[0]."\"\n".$warning;
>  foreach($zone as $z=>$infos)
>  {echo 'zone "'.$z.'" {'."\n";
>   foreach($infos as $item=>$value)
>   {echo "\t".$item.' ';
>    if(is_array($value))
>    {echo '{';
>     foreach($value as $v){echo $v.';';}
>     echo '}';
>    }
>    else
>    {switch($item)
>     {case 'file': echo '"'.$value.'"'; break;
>      case 'autofile': echo '"'.
>            str_replace('@',$z,$value).'"';
>      break;
>      default: echo $value; break;
>    }}
>    echo ";\n";
>   }
>   echo "};\n";
> }}
> ?>
>

correction I forgot I left autofile in there

<?php

$myslave=array('type'=>'slave'
,'masters'=>array('192.168.1.2')
,'autofile'=>'data/db. at .slave');

$arpa192='.168.192.in-addr.arpa';
$domain='<domain>';
$zone['_msdcs.'.$domain]=$myslave;
$zone[$domain]=$myslave;
$slavedsubnets=range('1','10');

build_subnets($slavedsubnets
,$arpa192
,$myslave);

build_zones();

function build_subnets($subnets
,$net
,$info)
{global $zone;
 foreach($subnets as $subnet)
 {$zone[$subnet.$net]=$info;
}}

function build_zones()
{global $zone,$argv;
 $pounds=str_repeat('#',30);
 $warning=$pounds.' WARNING '.$pounds."\n";
 echo $warning. '# Do not edit this file. '.
      'It was generated using "php '.
      $argv[0]."\"\n".$warning;
 foreach($zone as $z=>$infos)
 {echo 'zone "'.$z.'" {'."\n";
  foreach($infos as $item=>$value)
  {if(is_array($value))
   {echo "\t".$item.' ';
    echo '{';
    foreach($value as $v){echo $v.';';}
    echo '}';
   }
   else
   {switch($item)
    {case 'file': echo "\t".$item.' ';
           echo '"'.$value.'"'; break;
     case 'autofile': echo "\tfile ";
           echo '"'.str_replace('@',$z,$value).'"';
     break;
     default: echo "\t".$item.' ';
           echo $value; break;
   }}
   echo ";\n";
  }
  echo "};\n";
}}
?>



>
>> --
>> Barry Margolin
>> Arlington, MA
>> _______________________________________________
>> Please visit https://lists.isc.org/mailman/listinfo/bind-users to unsubscribe from this list
>>
>> bind-users mailing list
>> bind-users at lists.isc.org
>> https://lists.isc.org/mailman/listinfo/bind-users


More information about the bind-users mailing list