jvdias 4b4f5fd
#!/usr/bin/perl
jvdias 4b4f5fd
#  
jvdias 4b4f5fd
#  This script uses the named D-BUS support, which must be enabled in
jvdias 4b4f5fd
#  the running named with the named '-D' option, to get and print the
jvdias 4b4f5fd
#  list of forwarding zones in the running server.
jvdias 4b4f5fd
#
jvdias 4b4f5fd
#  It accepts an optional <zone> first argument which is the DNS name
jvdias 4b4f5fd
#  of the zone whose forwarders (if any) will be retrieved.
jvdias 4b4f5fd
#
jvdias 4b4f5fd
#  If no zone argument is specified, all forwarding zones will be listed.
jvdias 4b4f5fd
#
jvdias 4b4f5fd
#  Usage: GetForwarders [-n -r] [ <zone> ]
jvdias 4b4f5fd
#    -n : output forward zone statements for named.conf
jvdias 4b4f5fd
#    -r : output in resolv.conf format
jvdias 4b4f5fd
#       : no -r or -n: just list the forwarders
jvdias 4b4f5fd
#
jvdias 4b4f5fd
#  Copyright(C) Jason Vas Dias<jvdias@redhat.com> Red Hat Inc. 2005
jvdias 4b4f5fd
#
jvdias 4b4f5fd
#  This program is free software; you can redistribute it and/or modify
jvdias 4b4f5fd
#  it under the terms of the GNU General Public License as published by
jvdias 4b4f5fd
#  the Free Software Foundation at
jvdias 4b4f5fd
#           http://www.fsf.org/licensing/licenses/gpl.txt
jvdias 4b4f5fd
#  and included in this software distribution as the "LICENSE" file.
jvdias 4b4f5fd
#
jvdias 4b4f5fd
#  This program is distributed in the hope that it will be useful,
jvdias 4b4f5fd
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
jvdias 4b4f5fd
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jvdias 4b4f5fd
#  GNU General Public License for more details.
jvdias 4b4f5fd
#
jvdias 4b4f5fd
use Getopt::Std;
jvdias 4b4f5fd
jvdias 4b4f5fd
%opts=();
jvdias 4b4f5fd
jvdias 4b4f5fd
getopts("rn",\%opts);
jvdias 4b4f5fd
jvdias 4b4f5fd
$zone = '';
jvdias 4b4f5fd
if ( $#ARGV >= 0 )
jvdias 4b4f5fd
{
jvdias 4b4f5fd
    $zone = "string:'". join("' string:'",@ARGV)."'";
jvdias 4b4f5fd
};
jvdias 4b4f5fd
jvdias 4b4f5fd
@dn=(); 
jvdias 4b4f5fd
jvdias 4b4f5fd
open(DNS,
jvdias 4b4f5fd
     '/usr/bin/dbus-send --system --type=method_call --print-reply --reply-timeout=20000 '
jvdias 4b4f5fd
    .'--dest=com.redhat.named /com/redhat/named com.redhat.named.text.GetForwarders '
jvdias 4b4f5fd
    .$zone .'|'
jvdias 4b4f5fd
    ) || die("dbus-send failed: $?: $!");
jvdias 4b4f5fd
jvdias 4b4f5fd
while(<DNS>)
jvdias 4b4f5fd
{ 
jvdias 4b4f5fd
    $_=~s/[\s\r\n]+$//;
jvdias 4b4f5fd
    if ( /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/ )
jvdias 4b4f5fd
    { # nameserver address
jvdias 4b4f5fd
	push @{${$dn[-1]}{'s'}}, { 'a' => "$1.$2.$3.$4" }; 
jvdias 4b4f5fd
    }elsif
jvdias 4b4f5fd
       ( /\"(\d+)\"$/ )      
jvdias 4b4f5fd
    { # port
jvdias 4b4f5fd
	if ( $1 != 53 )
jvdias 4b4f5fd
	{
jvdias 4b4f5fd
	    ${@{${$dn[-1]}{'s'}}[-1]}{'p'} = $1;
jvdias 4b4f5fd
	};
jvdias 4b4f5fd
    }elsif
jvdias 4b4f5fd
       ( /string\s+\"([^\"]+)\"$/ )
jvdias 4b4f5fd
    { 
jvdias 4b4f5fd
	if ( ($1 eq 'first') || ($1 eq 'only') )
jvdias 4b4f5fd
	{ # policy
jvdias 4b4f5fd
	    if( $1 eq 'only' )
jvdias 4b4f5fd
	    { # not default
jvdias 4b4f5fd
		${$dn[-1]}{'o'} = 1;
jvdias 4b4f5fd
	    }
jvdias 4b4f5fd
	}else
jvdias 4b4f5fd
	{ # new DN - "zone"
jvdias 4b4f5fd
	    push @dn, {'n'=>$1,'s'=>[]}; 
jvdias 4b4f5fd
	};
jvdias 4b4f5fd
    }; 
jvdias 4b4f5fd
};
jvdias 4b4f5fd
close(DNS);
jvdias 4b4f5fd
jvdias 4b4f5fd
if( exists($opts{'r'}) )
jvdias 4b4f5fd
{ # resolv.conf style:
jvdias 4b4f5fd
    my %svrs=();
jvdias 4b4f5fd
    print 'search ', 
jvdias 4b4f5fd
          join( ' ', 
jvdias 4b4f5fd
		grep { !( $_ =~ /\.in-addr\.arpa$/) }
jvdias 4b4f5fd
		map  { ${$_}{'n'} }
jvdias 4b4f5fd
		@dn
jvdias 4b4f5fd
	      ),"\n",
jvdias 4b4f5fd
          'nameserver ',
jvdias 4b4f5fd
	  join( "\nnameserver ",
jvdias 4b4f5fd
		grep { exists ( $svrs{ $_ } ) ? undef : { $svrs{$_}=$_ } } 
jvdias 4b4f5fd
		map  { ${$_}{'a'} }
jvdias 4b4f5fd
		map  { @{${$_}{'s'}} } @dn			     
jvdias 4b4f5fd
	      ),"\n";
jvdias 4b4f5fd
}elsif( exists($opts{'n'}) )
jvdias 4b4f5fd
{ # named.conf style:
jvdias 4b4f5fd
    foreach $d (@dn)
jvdias 4b4f5fd
    {
jvdias 4b4f5fd
	print 'zone "',${$d}{'n'},'." IN { type forward; forwarders { ',
jvdias 4b4f5fd
	      join("; ",
jvdias 4b4f5fd
		   map { exists( ${$_}{'p'} ) 
jvdias 4b4f5fd
			 ? ${$_}{'a'} . ' port ' . ${$_}{'p'}  
jvdias 4b4f5fd
			 : ${$_}{'a'}
jvdias 4b4f5fd
		       } @{${$d}{'s'}}
jvdias 4b4f5fd
		  ),
jvdias 4b4f5fd
	      '; }; ',
jvdias 4b4f5fd
	      exists(${$d}{'o'}) ? ' forward only; ' : '',
jvdias 4b4f5fd
              "};\n";
jvdias 4b4f5fd
    };
jvdias 4b4f5fd
}else
jvdias 4b4f5fd
{ # just list:
jvdias 4b4f5fd
    foreach $d (@dn)
jvdias 4b4f5fd
    {
jvdias 4b4f5fd
	print  ${$d}{'n'}, "\n\t", 
jvdias 4b4f5fd
	       (exists(${$d}{'o'}) ? "forward only\n\t" : ''),
jvdias 4b4f5fd
	       join( "\n\t",	
jvdias 4b4f5fd
		     map { exists( ${$_}{'p'} )
jvdias 4b4f5fd
			   ? ${$_}{'a'} . ':' . ${$_}{'p'} 
jvdias 4b4f5fd
			   : ${$_}{'a'}
jvdias 4b4f5fd
		         } @{${$d}{'s'}}
jvdias 4b4f5fd
		   ),"\n";
jvdias 4b4f5fd
    };
jvdias 4b4f5fd
};