added namedGetForwarders written in shell (#176100)
This commit is contained in:
parent
4f2e75b9bf
commit
286aa4d78c
|
@ -17,7 +17,7 @@ Summary: The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) serv
|
||||||
Name: bind
|
Name: bind
|
||||||
License: BSD-like
|
License: BSD-like
|
||||||
Version: 9.3.3
|
Version: 9.3.3
|
||||||
Release: 1%{?prever}%{?dist}
|
Release: 2%{?prever}%{?dist}
|
||||||
Epoch: 31
|
Epoch: 31
|
||||||
Url: http://www.isc.org/products/BIND/
|
Url: http://www.isc.org/products/BIND/
|
||||||
Buildroot: %{_tmppath}/%{name}-root
|
Buildroot: %{_tmppath}/%{name}-root
|
||||||
|
@ -777,6 +777,10 @@ rm -rf ${RPM_BUILD_ROOT}
|
||||||
:;
|
:;
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jan 4 2007 Martin Stransky <stransky@redhat.com> - 31:9.3.3-2
|
||||||
|
- added namedGetForwarders written in shell (#176100),
|
||||||
|
created by Baris Cicek <baris@nerd.com.tr>.
|
||||||
|
|
||||||
* Sun Dec 10 2006 Martin Stransky <stransky@redhat.com> - 31:9.3.3-1
|
* Sun Dec 10 2006 Martin Stransky <stransky@redhat.com> - 31:9.3.3-1
|
||||||
- update to 9.3.3 final
|
- update to 9.3.3 final
|
||||||
- fix for #219069: file included twice in src.rpm
|
- fix for #219069: file included twice in src.rpm
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/perl
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# This script uses the named D-BUS support, which must be enabled in
|
# 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
|
# the running named with the named '-D' option, to get and print the
|
||||||
|
@ -9,12 +9,14 @@
|
||||||
#
|
#
|
||||||
# If no zone argument is specified, all forwarding zones will be listed.
|
# If no zone argument is specified, all forwarding zones will be listed.
|
||||||
#
|
#
|
||||||
# Usage: GetForwarders [-n -r] [ <zone> ]
|
# Usage: namedGetForwarders [-n -r] [ <zone> ]
|
||||||
# -n : output forward zone statements for named.conf
|
# -n : output forward zone statements for named.conf
|
||||||
# -r : output in resolv.conf format
|
# -r : output in resolv.conf format
|
||||||
# : no -r or -n: just list the forwarders
|
# : no -r or -n: just list the forwarders
|
||||||
#
|
#
|
||||||
# Copyright(C) Jason Vas Dias<jvdias@redhat.com> Red Hat Inc. 2005
|
# This script is based on perl script of Jason Vas Dias <jvdias@redhat.com>.
|
||||||
|
#
|
||||||
|
# Copyright(C) Baris Cicek <baris@nerd.com.tr> Nerd Software. 2007
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -26,98 +28,131 @@
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
# GNU General Public License for more details.
|
# GNU General Public License for more details.
|
||||||
#
|
|
||||||
use Getopt::Std;
|
|
||||||
|
|
||||||
%opts=();
|
declare -a zones;
|
||||||
|
declare -a servers;
|
||||||
|
declare -a ports;
|
||||||
|
declare -a only;
|
||||||
|
|
||||||
getopts("rn",\%opts);
|
output_format='plain';
|
||||||
|
zonecnt=0;
|
||||||
|
|
||||||
$zone = '';
|
function push () {
|
||||||
if ( $#ARGV >= 0 )
|
local array
|
||||||
{
|
array=( `echo $1` );
|
||||||
$zone = "string:'". join("' string:'",@ARGV)."'";
|
array[${#array[*]}]=$2;
|
||||||
};
|
echo ${array[@]};
|
||||||
|
|
||||||
@dn=();
|
|
||||||
|
|
||||||
open(DNS,
|
|
||||||
'/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'}) )
|
function concat () {
|
||||||
{ # resolv.conf style:
|
local string
|
||||||
my %svrs=();
|
while [ $# -gt 0 ]; do
|
||||||
print 'search ',
|
string=${string}$1;
|
||||||
join( ' ',
|
shift;
|
||||||
grep { !( $_ =~ /\.in-addr\.arpa$/) }
|
done
|
||||||
map { ${$_}{'n'} }
|
echo $string;
|
||||||
@dn
|
}
|
||||||
),"\n",
|
|
||||||
'nameserver ',
|
if [ $# -ge 0 ]; then
|
||||||
join( "\nnameserver ",
|
if [ "$1" == "-r" ]; then
|
||||||
grep { exists ( $svrs{ $_ } ) ? undef : { $svrs{$_}=$_ } }
|
output_format='resolv';
|
||||||
map { ${$_}{'a'} }
|
shift;
|
||||||
map { @{${$_}{'s'}} } @dn
|
elif [ "$1" == "-n" ]; then
|
||||||
),"\n";
|
output_format='named';
|
||||||
}elsif( exists($opts{'n'}) )
|
shift;
|
||||||
{ # named.conf style:
|
fi
|
||||||
foreach $d (@dn)
|
zone="";
|
||||||
{
|
for arg in $*; do
|
||||||
print 'zone "',${$d}{'n'},'." IN { type forward; forwarders { ',
|
zone=$(push "$zone" " string:'$arg'");
|
||||||
join("; ",
|
done
|
||||||
map { exists( ${$_}{'p'} )
|
fi
|
||||||
? ${$_}{'a'} . ' port ' . ${$_}{'p'}
|
|
||||||
: ${$_}{'a'}
|
DNS=`/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`;
|
||||||
} @{${$d}{'s'}}
|
|
||||||
),
|
if [ $? -ne 0 ]; then
|
||||||
'; }; ',
|
echo -e "dbus-send failed: $? $!";
|
||||||
exists(${$d}{'o'}) ? ' forward only; ' : '',
|
exit 1;
|
||||||
"};\n";
|
fi
|
||||||
};
|
|
||||||
}else
|
IFS=$'\n'
|
||||||
{ # just list:
|
|
||||||
foreach $d (@dn)
|
|
||||||
{
|
for line in $DNS; do
|
||||||
print ${$d}{'n'}, "\n\t",
|
match_ip=$( echo "$line" | awk --re-interval '{ match ($0, /([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})/, a); printf "%s.%s.%s.%s", substr($0, a[1, "start"], a[1, "length"]), substr($0, a[2, "start"], a[2, "length"]), substr($0, a[3, "start"], a[3, "length"]), substr($0, a[4, "start"], a[4, "length"]);}' );
|
||||||
(exists(${$d}{'o'}) ? "forward only\n\t" : ''),
|
match_port=$( echo "$line" | awk '{ match ($0, /\"([[:digit:]]+)\"$/, a); printf "%s", substr($0, a[1, "start"], a[1,"length"]);}' );
|
||||||
join( "\n\t",
|
match_string=$( echo "$line" | awk '{ match ($0, /string.+\"([^\"]+)\"$/, a); printf "%s", substr($0, a[1, "start"], a[1,"length"]);}' );
|
||||||
map { exists( ${$_}{'p'} )
|
|
||||||
? ${$_}{'a'} . ':' . ${$_}{'p'}
|
if [ "$match_ip" != "" ] && [ "$match_ip" != "..." ]; then
|
||||||
: ${$_}{'a'}
|
servers[$zonecnt]=$(push "${servers[$zonecnt]}" "$match_ip");
|
||||||
} @{${$d}{'s'}}
|
elif [ "$match_port" != "" ]; then
|
||||||
),"\n";
|
ports[$zonecnt]=$(push "${ports[$zonecnt]}" "$match_port");
|
||||||
};
|
elif [ "$match_string" == "only" ]; then
|
||||||
};
|
only[$zonecnt]="1";
|
||||||
|
elif [ "$match_string" != "" ] && [ "$match_string" != "first" ]; then
|
||||||
|
zonecnt=$((zonecnt + 1));
|
||||||
|
zones[$zonecnt]="$match_string";
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$output_format" == "resolv" ]; then
|
||||||
|
# resolv.conf style:
|
||||||
|
search_line='search';
|
||||||
|
nameserver_lines='';
|
||||||
|
for index in $(seq 1 $zonecnt); do
|
||||||
|
if [ "` echo ${zones[$index]} | awk ' /\.in-addr\.arpa$/ { print $0 }'`" == '' ]; then
|
||||||
|
search_line=$(push "$search_line" "${zones[$index]}");
|
||||||
|
fi
|
||||||
|
IFS=$' ';
|
||||||
|
for ns in ${servers[$index]}; do
|
||||||
|
nameserver_lines=$(concat "$nameserver_lines" "\nnameserver " "$ns");
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo -n $search_line;
|
||||||
|
echo -e $nameserver_lines;
|
||||||
|
elif [ "$output_format" == "named" ]; then
|
||||||
|
# named.conf style:
|
||||||
|
zone_lines='';
|
||||||
|
for index in $(seq 1 $zonecnt); do
|
||||||
|
zone_line=$(concat 'zone "' "${zones[$index]}" '." IN { type forward; forwarders { ');
|
||||||
|
srvcnt=1;
|
||||||
|
IFS=$' ';
|
||||||
|
for ns in ${servers[$index]}; do
|
||||||
|
srvport=$(eval "echo ${ports[$index]} | awk '{ print \$${srvcnt} }'");
|
||||||
|
if [ "$srvport" != "53" ]; then
|
||||||
|
zone_line=$(concat "$zone_line" " $ns port $srvport;");
|
||||||
|
else
|
||||||
|
zone_line=$(concat "$zone_line" " $ns;");
|
||||||
|
fi
|
||||||
|
srvcnt=$((srvcnt+1));
|
||||||
|
done
|
||||||
|
zone_line=$(concat "$zone_line" " };");
|
||||||
|
if [ "${only[$index]}" == '1' ]; then
|
||||||
|
zone_line=$(concat "$zone_line" " forward only;");
|
||||||
|
fi
|
||||||
|
zone_line=$(concat "$zone_line" " };");
|
||||||
|
zone_lines=$(concat "$zone_lines" "$zone_line\n");
|
||||||
|
done
|
||||||
|
echo -e ${zone_lines%\\n};
|
||||||
|
elif [ "$output_format" == "plain" ]; then
|
||||||
|
# just list:
|
||||||
|
output='';
|
||||||
|
for index in $(seq 1 $zonecnt); do
|
||||||
|
output=$(concat "$output" "${zones[$index]}" "\n");
|
||||||
|
if [ "${only[$index]}" == "1" ]; then
|
||||||
|
output=$(concat "$output" "\t" "forward only" "\n");
|
||||||
|
fi
|
||||||
|
srvcnt=1;
|
||||||
|
IFS=$' ';
|
||||||
|
for ns in ${servers[$index]}; do
|
||||||
|
srvport=$(eval "echo ${ports[$index]} | awk '{ print \$${srvcnt} }'");
|
||||||
|
if [ "$srvport" != "53" ]; then
|
||||||
|
output=$(concat "$output" "\t" "$ns:$srvport" "\n");
|
||||||
|
else
|
||||||
|
output=$(concat "$output" "\t" "$ns" "\n");
|
||||||
|
fi
|
||||||
|
srvcnt=$((srvcnt+1));
|
||||||
|
done
|
||||||
|
done
|
||||||
|
echo -e ${output%\\n};
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in New Issue