domainfind: Add a script to find domains in TLDs given dictionaries
This commit is contained in:
		
							
								
								
									
										157
									
								
								domainfind
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										157
									
								
								domainfind
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,157 @@ | ||||
| #! /bin/bash | ||||
| # | ||||
| # tldfind | ||||
| # Copyright (C) 2020 Vintage Salt <rehashedsalt@cock.li> | ||||
| # | ||||
| # Distributed under terms of the MIT license. | ||||
| # | ||||
| set -e | ||||
|  | ||||
| # Read-only set-once variables | ||||
| declare -r _name="$(basename -- "$0")" | ||||
| # Options | ||||
| declare _optdict="/usr/share/dict/words" | ||||
| declare -i _opthelp | ||||
| declare -i _optverbose | ||||
| # Working variables | ||||
| declare -a _args | ||||
| declare _return | ||||
|  | ||||
| # Helper functions | ||||
| log() { | ||||
| 	# Print a line to the terminal if _optverbose is greater than $2 | ||||
| 	# $2 defaults to 0 | ||||
| 	# loglevel 0: Daily-use messages | ||||
| 	# loglevel 1: Detailed but not quite debugging | ||||
| 	# loglevel 2: Definitely debugging | ||||
| 	[ -z "$1" ] && return 1 | ||||
| 	if (( _optverbose >= ${2:-0} )); then | ||||
| 		printf "%s\\n" "$1" | ||||
| 	fi | ||||
| } | ||||
| warn() { | ||||
| 	# Print a yellow line to the terminal, respecting _optverbose | ||||
| 	[ -z "$1" ] && return 1 | ||||
| 	if (( _optverbose >= ${2:-0} )); then | ||||
| 		if [ -t 1 ]; then | ||||
| 			printf "\\e[33m%s\\e[0m\\n" "$1" | ||||
| 		else | ||||
| 			printf "WARN: %s\\n" "$1" | ||||
| 		fi | ||||
| 	fi | ||||
| } | ||||
| error() { | ||||
| 	# Print a red line to the terminal, exit if $2 is specified | ||||
| 	[ -z "$1" ] && return 1 | ||||
| 	if [ -t 2 ]; then | ||||
| 		printf "\\e[31m%s\\e[0m\\n" "$1" 1>&2 | ||||
| 	else | ||||
| 		printf "ERROR: %s\\n" "$1" 1>&2 | ||||
| 	fi | ||||
| 	[ -z "$2" ] && return | ||||
| 	exit "${2:-1}" | ||||
| } | ||||
| has() { | ||||
| 	# Parse out all arguments and try to find them in path | ||||
| 	# If an argument cannot be found, set _return and fail | ||||
| 	for prog in "$@"; do | ||||
| 		if ! command -v "$prog" > /dev/null 2>&1; then | ||||
| 			_return="$prog" | ||||
| 			return 1 | ||||
| 		fi | ||||
| 	done | ||||
| 	return 0 | ||||
| } | ||||
|  | ||||
| # Core program functions | ||||
| printhelp() { | ||||
| 	cat << EOF | ||||
| Usage: $_name [OPTION]... [TLD]... | ||||
| Find available domain names in the dictionary that are whole words ending in | ||||
| the given TLDs | ||||
|  | ||||
|   -d [FILE]		A dictionary to load. Defaults to /usr/share/dict/words | ||||
|   -h			Print this help text | ||||
|   -v			Print more status messages. Stacks | ||||
|  | ||||
| Copyright (c) 2020 rehashedsalt@cock.li | ||||
| Licensed under the MIT license | ||||
| EOF | ||||
| } | ||||
| checkavaildomains() { | ||||
| 	[ -z "$1" ] && return 1 | ||||
| 	# Strip leading periods | ||||
| 	tld="${1#.}" | ||||
| 	while read word; do | ||||
| 		! [[ $word == *$tld ]] && continue | ||||
| 		log "Processing word: $word" 2 | ||||
| 		prefix="${word%$tld}" | ||||
| 		fqdn="$prefix.$tld" | ||||
| 		log "Looking for domain: $fqdn" 2 | ||||
| 		# We wait here so a ^C kills our program, not nslookup | ||||
| 		nslookup "$fqdn" > /dev/null 2>&1 & | ||||
| 		if ! wait -n; then | ||||
| 			log "$fqdn" | ||||
| 		fi | ||||
| 	done < "$_optdict" | ||||
| } | ||||
|  | ||||
| # Main | ||||
| main() { | ||||
| 	# Parse out arguments | ||||
| 	while [ -n "$1" ]; do | ||||
| 		# Parse out flags | ||||
| 		while getopts ":dhv" opt; do | ||||
| 			case $opt in | ||||
| 				d) | ||||
| 					_optdict="$OPTARG" | ||||
| 					;; | ||||
| 				h) | ||||
| 					_opthelp=1 | ||||
| 					;; | ||||
| 				v) | ||||
| 					_optverbose+=1 | ||||
| 					;; | ||||
| 				:) | ||||
| 					error "Option requires argument: -$OPTARG" 2 | ||||
| 					;; | ||||
| 				*) | ||||
| 					error "Invalid option: -$OPTARG" 2 | ||||
| 					;; | ||||
| 			esac | ||||
| 		done | ||||
| 		# Store arguments | ||||
| 		shift $((OPTIND - 1)) | ||||
| 		if [ -n "$1" ]; then | ||||
| 			_args+=("$1") | ||||
| 			shift | ||||
| 		fi | ||||
| 		unset OPTIND | ||||
| 	done | ||||
| 	# Early hook for help | ||||
| 	[ -n "$_opthelp" ] && printhelp && exit 0 | ||||
| 	# Validate critical options | ||||
| 	if ! [ -f "$_optdict" ]; then | ||||
| 		error "Failed to find dictionary: $_optdict" 1 | ||||
| 	fi | ||||
| 	# Validate core program dependencies | ||||
| 	log "Validating dependencies" 2 | ||||
| 	if ! has basename; then | ||||
| 		error "Failed to find program: $_return" 1 | ||||
| 	fi | ||||
|  | ||||
| 	# Do the do | ||||
| 	if [ -n "${_args[*]}" ]; then | ||||
| 		for arg in "${_args[@]}"; do | ||||
| 			if ! checkavaildomains "$arg"; then | ||||
| 				error "Error check domains for TLD: $arg" | ||||
| 			fi | ||||
| 		done | ||||
| 	else | ||||
| 		warn "Nothing to do" | ||||
| 		exit 0 | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| main "$@" | ||||
|  | ||||
		Reference in New Issue
	
	Block a user