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