rpms/bind/devel bind.spec,1.149,1.150 namedGetForwarders,1.2,1.3

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Thu Jan 4 14:37:51 UTC 2007


Author: stransky

Update of /cvs/dist/rpms/bind/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv15155

Modified Files:
	bind.spec namedGetForwarders 
Log Message:
added namedGetForwarders written in shell (#176100)


Index: bind.spec
===================================================================
RCS file: /cvs/dist/rpms/bind/devel/bind.spec,v
retrieving revision 1.149
retrieving revision 1.150
diff -u -r1.149 -r1.150
--- bind.spec	10 Dec 2006 23:52:53 -0000	1.149
+++ bind.spec	4 Jan 2007 14:37:49 -0000	1.150
@@ -17,7 +17,7 @@
 Name: 		bind
 License: 	BSD-like
 Version: 	9.3.3
-Release: 	1%{?prever}%{?dist}
+Release: 	2%{?prever}%{?dist}
 Epoch:   	31
 Url: 		http://www.isc.org/products/BIND/
 Buildroot: 	%{_tmppath}/%{name}-root
@@ -777,6 +777,10 @@
 :;
 
 %changelog
+* Thu Jan 4 2007 Martin Stransky <stransky at redhat.com> - 31:9.3.3-2
+- added namedGetForwarders written in shell (#176100),
+  created by Baris Cicek <baris at nerd.com.tr>.
+
 * Sun Dec 10 2006 Martin Stransky <stransky at redhat.com> - 31:9.3.3-1
 - update to 9.3.3 final
 - fix for #219069: file included twice in src.rpm


Index: namedGetForwarders
===================================================================
RCS file: /cvs/dist/rpms/bind/devel/namedGetForwarders,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- namedGetForwarders	19 Jul 2006 18:46:43 -0000	1.2
+++ namedGetForwarders	4 Jan 2007 14:37:49 -0000	1.3
@@ -1,4 +1,4 @@
-#!/usr/bin/perl
+#!/bin/sh
 #  
 #  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
@@ -9,12 +9,14 @@
 #
 #  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
 #    -r : output in resolv.conf format
 #       : no -r or -n: just list the forwarders
 #
-#  Copyright(C) Jason Vas Dias<jvdias at redhat.com> Red Hat Inc. 2005
+#  This script is based on perl script of Jason Vas Dias <jvdias at redhat.com>. 
+#
+#  Copyright(C) Baris Cicek <baris at nerd.com.tr> Nerd Software. 2007
 #
 #  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
@@ -26,98 +28,131 @@
 #  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:'", at ARGV)."'";
-};
-
- at 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'}) )
-{ # 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";
-    };
-};
+declare -a zones;
+declare -a servers;
+declare -a ports;
+declare -a only; 
+
+output_format='plain';
+zonecnt=0;
+
+function push () {
+	local array 
+	array=( `echo $1` );
+	array[${#array[*]}]=$2;
+	echo ${array[@]};
+}
+
+function concat () { 
+	local string
+	while [ $# -gt 0 ]; do
+		string=${string}$1;
+		shift;
+	done
+	echo $string;
+}
+
+if  [ $# -ge 0 ]; then
+	if [ "$1" == "-r" ]; then
+		output_format='resolv';
+		shift;
+	elif [ "$1" == "-n" ]; then
+		output_format='named';
+		shift;
+	fi
+	zone="";
+	for arg in $*; do
+		zone=$(push "$zone" " string:'$arg'");
+	done
+fi 
+
+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`;
+
+if [ $? -ne 0 ]; then
+	echo -e "dbus-send failed: $? $!";
+	exit 1;
+fi
+
+IFS=$'\n'
+
+
+for line in $DNS; do
+	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"]);}' );
+	match_port=$( echo "$line" | awk '{ match ($0, /\"([[:digit:]]+)\"$/, a); printf "%s", substr($0, a[1, "start"], a[1,"length"]);}' );
+	match_string=$( echo "$line" | awk '{ match ($0, /string.+\"([^\"]+)\"$/, a); printf "%s", substr($0, a[1, "start"], a[1,"length"]);}' );
+	 
+	if [ "$match_ip" != "" ] && [ "$match_ip" != "..." ]; then
+		servers[$zonecnt]=$(push "${servers[$zonecnt]}" "$match_ip");
+	elif [ "$match_port" != "" ]; then 
+		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




More information about the fedora-cvs-commits mailing list