All pastes #1985440 Raw Edit

arab

public text v1 · immutable
#1985440 ·published 2010-11-08 16:26 UTC
rendered paste body
#!/bin/sh# $Id$## Lists the host names associated with each globally routed IPv{4,6} host# address configured on the caller's box, dispatching RDNS queries to# validate the authority of each resolved host name, optionally amending# the AS number and corresponding /descr/ from RADB.##      Author:	vxp/arab <l.illanes@gmx.de>, <irc://arabs.ps/arab># Last update:	Sun Aug 22 11:38:01 CEST 2010#   Tested on:	FreeBSD 7.1, OpenBSD 4.5, and NetBSD 5.0.1.#    Requires:	SuS sh (1), getopt (1); SuS awk (1) or [gn]awk (1);#		ISC BIND dig (1); BSD ifconfig (8), and whois (1).## {{{ Tunables# Maximum string length in characters of an IPv6 address in presentation# format, as per <netinet6/in6.h>.  Note that an IPv4 address string# constitutes a subset of the former in terms of length.ADDRSTRLEN=39# Maximum number of DNS UDP query attempts, including the initial query,# and the maximum duration of each query in seconds.  DIG_TRIES=2DIG_TIME=2# XXXVHOSTS_LIST="/var/run/vhosts"# }}}# {{{ subr_printf() {	local nflag="\\n"; [ "x-n" = "x${1}" ] && { nflag=""; shift; };	local line="`printf \"$@\"`"; printf -- "%s${nflag}" "${line}";	[ -n "${wflag}" ] && { printf -- "%s${nflag}" "${line}"		\		>> "${VHOSTS_LIST}"; };};dig() {	[ -n "${1}" ] || return;	local xflag="${1%%[!!]*}" name="${1#!}" class="${2}" IFS="";	set -- `command dig ${xflag:+-x} "${name}" IN "${class}"	\		+short +nocomments					\		+time="${DIG_TIME}" +tries="${DIG_TRIES}"		\			2>/dev/null`; echo "${1}";};# }}}# trap(1) the relevant set of signals to ensure clean script termination.abort_exec() { printf "\n--- ABORTED ---\n"; exit 1; };trap abort_exec HUP INT QUIT PIPE TERM USR1 USR2;## Parse optionally supplied command options to determine the desired mode of# operation, either cat(1)ting an already present and readable /vhosts/ list# to the standard output or dispatching individual DNS queries.for c in `getopt fwah $* 2>/dev/null`do	case "${c}" in	-f) fflag=1; ;; -w) wflag=1; ;; -a) aflag=1; ;; -h) hflag=1; ;;	--) break; ;;	esacdone;	[ "${hflag}" ] && { echo "usage: $0 [-fwa]"; exit 1; };[ -r "${VHOSTS_LIST}" -a -z "${fflag}" ]				\&& { cat "${VHOSTS_LIST}"; }						\|| {	[ -n "${wflag}" ] && { printf "" >| "${VHOSTS_LIST}" || exit 2; };	#	# Iterate over the subset of IPv{4,6} netif host addresses from every	# netif that is /up/, resolving each and establishing 2-way RDNS	# {authority,hostname} confirmation where applicable.	for ha in `							\		ifconfig -a						|\		awk '	 /\tinet6? alias / { print $3; next; }		\			 /\tinet6? / { print $2; }'			|\		awk '	!/^((127|10|172|192\.168)\.|(fe..)?:)/		\			{ print; }' 2>/dev/null`;	do	type="NO HOST" pf="4" q="A" radb="" host="";		# Infer the protocol family from the presentation format.		[ "x${ha##*:*}" = "x${ha}" ] || { pf="6"; q="AAAA"; };		[ -n "${aflag}" ] && {		# {{{ RADB		radb="`							\		whois -h whois.radb.net "${ha}" 2>/dev/null | awk '	\		/^[^:]+:/ {						\			gsub(/(\t| )+/, " ", $0); split($0, a, ": ");	\			if(v[a[1]]) { next; } else { v[a[1]] = a[2]; };	\		}							\									\		END { printf("[%8.8s/%16.16s]", v["origin"], v["mnt-by"]); }'`";		# }}}		};		_printf -n "%-${ADDRSTRLEN}s${radb} %-2s " "${ha}" "[IPv${pf}]";		host="`dig !${ha} PTR`"; [ -n "${host}" ] && {			[ "x`dig ${host} ${q}`" = "x${ha}" ]		\			&& type="PTR" || type="NO RDNS"; };		_printf "%-12s %s" "--${type}-->" "${host}"	done};# vim:ts=8 sw=8 tw=80 noexpandtab foldmethod=marker