summaryrefslogtreecommitdiff
path: root/files/domain-check
diff options
context:
space:
mode:
Diffstat (limited to 'files/domain-check')
-rwxr-xr-xfiles/domain-check535
1 files changed, 535 insertions, 0 deletions
diff --git a/files/domain-check b/files/domain-check
new file mode 100755
index 0000000..89a39f8
--- /dev/null
+++ b/files/domain-check
@@ -0,0 +1,535 @@
+#!/bin/bash
+#
+# Program: Domain Expiration Check <domain-check>
+#
+# Author: Matty < matty91 at gmail dot com >
+#
+# Current Version: 1.10
+#
+# Revision History:
+#
+# Version 1.11
+# Added support for .is domains
+# Fixing mail program path
+# Fixing output for .br domains when expiry date is not available
+# Fixing awk usage
+# -- Silvio Rhatto <rhatto at riseup dot net>
+#
+# Version 1.10
+# Do not add extra line on quiet mode -- Silvio Rhatto <rhatto at riseup dot net>
+#
+# Version 1.9
+# Added support for .br domains -- Silvio Rhatto <rhatto at riseup dot net>
+#
+# Version 1.8
+# Bug fix added $MAIL -- Vivek Gite <vivek@nixcraft.com>
+#
+# Version 1.7
+# Added support for .jp domain names -- Vivek Gite <vivek@nixcraft.com>
+#
+# Version 1.6
+# Added support for .uk domain names; fixed a bug detecting tldtype -- Vivek Gite <vivek@nixcraft.com>
+#
+# Version 1.5
+# Added support for .org, .in, .biz and .info domain names -- Vivek Gite <vivek@nixcraft.com>
+#
+# Version 1.4
+# Updated the documentation.
+#
+# Version 1.3
+# Gracefully Handle the case where the expiration data is unavailable
+#
+# Version 1.2
+# Added "-s" option to allow arbitrary registrars
+#
+# Version 1.1
+# Fixed issue with 'e' getopt string -- Pedro Alves
+#
+# Version 1.0
+# Initial Release
+#
+# Last Updated: 01-Oct-2009
+#
+# Purpose:
+# domain-check checks to see if a domain has expired. domain-check
+# can be run in interactive and batch mode, and provides faciltities
+# to alarm if a domain is about to expire.
+#
+# License:
+# 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.
+#
+# Notes:
+# Since each registrar provides expiration data in a unique format (if
+# they provide it at all), domain-check is currently only able to
+# processess expiration information for a subset of the available
+# registrars.
+#
+# Requirements:
+# Requires whois
+#
+# Installation:
+# Copy the shell script to a suitable location
+#
+# Tested platforms:
+# -- Solaris 9 using /bin/bash
+# -- Solaris 10 using /bin/bash
+# -- OS X 10.4.2 using /bin/sh
+# -- OpenBSD using /bin/sh
+# -- FreeBSD using /bin/sh
+# -- Redhat advanced server 3.0MU3 using /bin/sh
+#
+# Usage:
+# Refer to the usage() sub-routine, or invoke domain-check
+# with the "-h" option.
+#
+# Example:
+#
+# The first example will print the expiration date and registrar for prefetch.net:
+#
+# $ domain-check.sh -d prefetch.net
+#
+# Domain Registrar Status Expires Days Left
+# ----------------------------------- ----------------- -------- ----------- ---------
+# prefetch.net INTERCOSMOS MEDIA Valid 13-feb-2006 64
+#
+# The second example prints the expiration date and registrar for the domains
+# listed in the file "domains":
+#
+# $ domain-check.sh -f domains
+#
+# Domain Registrar Status Expires Days Left
+# ----------------------------------- ----------------- -------- ----------- ---------
+# sun.com NETWORK SOLUTIONS Valid 20-mar-2010 1560
+# google.com EMARKMONITOR INC. Valid 14-sep-2011 2103
+# ack.com NETWORK SOLUTIONS Valid 09-may-2008 880
+# prefetch.net INTERCOSMOS MEDIA Valid 13-feb-2006 64
+# spotch.com GANDI Valid 03-dec-2006 357
+#
+# The third example will e-mail the address admin@prefetch.net with the domains that
+# will expire in 60-days or less:
+#
+# $ domain-check -a -f domains -q -x 60 -e admin@prefetch.net
+#
+
+PATH=/bin:/usr/bin:/usr/local/bin:/usr/local/ssl/bin:/usr/sfw/bin ; export PATH
+
+# Who to page when an expired domain is detected (cmdline: -e)
+ADMIN="root"
+
+# Number of days in the warning threshhold (cmdline: -x)
+WARNDAYS=30
+
+# If QUIET is set to TRUE, don't print anything on the console (cmdline: -q)
+QUIET="FALSE"
+
+# Don't send emails by default (cmdline: -a)
+ALARM="FALSE"
+
+# Whois server to use (cmdline: -s)
+WHOIS_SERVER="whois.internic.org"
+
+# Location of system binaries
+AWK="/usr/bin/awk"
+WHOIS="/usr/bin/whois"
+DATE="/bin/date"
+CUT="/usr/bin/cut"
+MAIL="/usr/bin/mail"
+# Place to stash temporary files
+WHOIS_TMP="/var/tmp/whois.$$"
+
+#############################################################################
+# Purpose: Convert a date from MONTH-DAY-YEAR to Julian format
+# Acknowledgements: Code was adapted from examples in the book
+# "Shell Scripting Recipes: A Problem-Solution Approach"
+# ( ISBN 1590594711 )
+# Arguments:
+# $1 -> Month (e.g., 06)
+# $2 -> Day (e.g., 08)
+# $3 -> Year (e.g., 2006)
+#############################################################################
+date2julian()
+{
+ if [ "${1} != "" ] && [ "${2} != "" ] && [ "${3}" != "" ]
+ then
+ ## Since leap years add aday at the end of February,
+ ## calculations are done from 1 March 0000 (a fictional year)
+ d2j_tmpmonth=$((12 * ${3} + ${1} - 3))
+
+ ## If it is not yet March, the year is changed to the previous year
+ d2j_tmpyear=$(( ${d2j_tmpmonth} / 12))
+
+ ## The number of days from 1 March 0000 is calculated
+ ## and the number of days from 1 Jan. 4713BC is added
+ echo $(( (734 * ${d2j_tmpmonth} + 15) / 24 - 2 * ${d2j_tmpyear} + ${d2j_tmpyear}/4
+ - ${d2j_tmpyear}/100 + ${d2j_tmpyear}/400 + $2 + 1721119 ))
+ else
+ echo 0
+ fi
+}
+
+#############################################################################
+# Purpose: Convert a string month into an integer representation
+# Arguments:
+# $1 -> Month name (e.g., Sep)
+#############################################################################
+getmonth()
+{
+ LOWER=`tolower $1`
+
+ case ${LOWER} in
+ jan) echo 1 ;;
+ feb) echo 2 ;;
+ mar) echo 3 ;;
+ apr) echo 4 ;;
+ may) echo 5 ;;
+ jun) echo 6 ;;
+ jul) echo 7 ;;
+ aug) echo 8 ;;
+ sep) echo 9 ;;
+ oct) echo 10 ;;
+ nov) echo 11 ;;
+ dec) echo 12 ;;
+ *) echo 0 ;;
+ esac
+}
+
+#############################################################################
+# Purpose: Calculate the number of seconds between two dates
+# Arguments:
+# $1 -> Date #1
+# $2 -> Date #2
+#############################################################################
+date_diff()
+{
+ if [ "${1}" != "" ] && [ "${2}" != "" ]
+ then
+ echo $(expr ${2} - ${1})
+ else
+ echo 0
+ fi
+}
+
+##################################################################
+# Purpose: Converts a string to lower case
+# Arguments:
+# $1 -> String to convert to lower case
+##################################################################
+tolower()
+{
+ LOWER=`echo ${1} | tr [A-Z] [a-z]`
+ echo $LOWER
+}
+
+##################################################################
+# Purpose: Access whois data to grab the registrar and expiration date
+# Arguments:
+# $1 -> Domain to check
+##################################################################
+check_domain_status()
+{
+ local REGISTRAR=""
+ # Avoid WHOIS LIMIT EXCEEDED - slowdown our whois client by adding 3 sec
+ sleep 3
+ # Save the domain since set will trip up the ordering
+ DOMAIN=${1}
+ TLDTYPE="`echo ${DOMAIN} | cut -d '.' -f3 | tr '[A-Z]' '[a-z]'`"
+ if [ "${TLDTYPE}" == "" ];
+ then
+ TLDTYPE="`echo ${DOMAIN} | cut -d '.' -f2 | tr '[A-Z]' '[a-z]'`"
+ fi
+
+ # Invoke whois to find the domain registrar and expiration date
+ #${WHOIS} -h ${WHOIS_SERVER} "=${1}" > ${WHOIS_TMP}
+ # Let whois select server
+ if [ "${TLDTYPE}" == "org" ];
+ then
+ ${WHOIS} -h "whois.pir.org" "${1}" > ${WHOIS_TMP}
+ elif [ "${TLDTYPE}" == "in" ]; # India
+ then
+ ${WHOIS} -h "whois.registry.in" "${1}" > ${WHOIS_TMP}
+ elif [ "${TLDTYPE}" == "uk" ]; # United Kingdom
+ then
+ ${WHOIS} -h "whois.nic.uk" "${1}" > ${WHOIS_TMP}
+
+ elif [ "${TLDTYPE}" == "br" ]; # Brazil
+ then
+ ${WHOIS} -h "whois.nic.br" "${1}" > ${WHOIS_TMP}
+
+ elif [ "${TLDTYPE}" == "biz" ];
+ then
+ ${WHOIS} -h "whois.neulevel.biz" "${1}" > ${WHOIS_TMP}
+ elif [ "${TLDTYPE}" == "info" ];
+ then
+ ${WHOIS} -h "whois.afilias.info" "${1}" > ${WHOIS_TMP}
+ elif [ "${TLDTYPE}" == "jp" ]; # Japan
+ then
+ ${WHOIS} -h "whois.jprs.jp" "${1}" > ${WHOIS_TMP}
+
+ elif [ "${TLDTYPE}" == "com" -o "${TLDTYPE}" == "net" -o "${TLDTYPE}" == "edu" ];
+ then
+ ${WHOIS} -h ${WHOIS_SERVER} "=${1}" > ${WHOIS_TMP}
+ else
+ ${WHOIS} "${1}" > ${WHOIS_TMP}
+ fi
+
+ # Parse out the expiration date and registrar -- uses the last registrar it finds
+ REGISTRAR=`cat ${WHOIS_TMP} | ${AWK} -F: '/Registrar/ && $2 != "" { REGISTRAR=substr($2,2,17) } END { print REGISTRAR }'`
+
+ if [ "${TLDTYPE}" == "uk" ]; # for .uk domain
+ then
+ REGISTRAR=`cat ${WHOIS_TMP} | ${AWK} -F: '/Registrar:/ && $0 != "" { getline; REGISTRAR=substr($0,2,17) } END { print REGISTRAR }'`
+ elif [ "${TLDTYPE}" == "jp" ];
+ then
+ REGISTRAR=`cat ${WHOIS_TMP} | ${AWK} '/Registrant/ && $2 != "" { REGISTRAR=substr($2,1,17) } END { print REGISTRAR }'`
+ elif [ "${TLDTYPE}" == "br" ];
+ then
+ REGISTRAR="registro.br"
+ elif [ "${TLDTYPE}" == "is" ];
+ then
+ REGISTRAR="`cat ${WHOIS_TMP} | ${AWK} '/source:/ { print $2 }' | uniq`"
+ fi
+
+ # If the Registrar is NULL, then we didn't get any data
+ if [ "${REGISTRAR}" = "" ]
+ then
+ prints "$DOMAIN" "Unknown" "Unknown" "Unknown" "Unknown"
+ return
+ fi
+
+ # The whois Expiration data should resemble the following: "Expiration Date: 09-may-2008"
+
+ # for .in, .info, .org domains
+ if [ "${TLDTYPE}" == "in" -o "${TLDTYPE}" == "info" -o "${TLDTYPE}" == "org" ];
+ then
+ DOMAINDATE=`cat ${WHOIS_TMP} | ${AWK} '/Expiration Date:/ { print $2 }' | cut -d':' -f2`
+ elif [ "${TLDTYPE}" == "biz" ]; # for .biz domain
+ then
+ DOMAINDATE=`cat ${WHOIS_TMP} | ${AWK} '/Domain Expiration Date:/ { print $6"-"$5"-"$9 }'`
+ elif [ "${TLDTYPE}" == "uk" ]; # for .uk domain
+ then
+ DOMAINDATE=`cat ${WHOIS_TMP} | ${AWK} '/Renewal date:/ { print $3 }'`
+ elif [ "${TLDTYPE}" == "br" ]; # for .br domain
+ then
+ DOMAINDATE=`cat ${WHOIS_TMP} | ${AWK} '/expires:/ { print $2 }'`
+ elif [ "${TLDTYPE}" == "is" ]; # for .is domain
+ then
+ DOMAINDATE=`cat ${WHOIS_TMP} | ${AWK} '/expires:/ { print $3"-"$2"-"$4 }'`
+ elif [ "${TLDTYPE}" == "jp" ]; # for .jp 2010/04/30
+ then
+ tdomdate=`cat ${WHOIS_TMP} | awk '/Expires on/ { print $3 }'`
+ tyear=`echo ${tdomdate} | cut -d'/' -f1`
+ tmon=`echo ${tdomdate} | cut -d'/' -f2`
+ case ${tmon} in
+ 1|01) tmonth=jan ;;
+ 2|02) tmonth=feb ;;
+ 3|03) tmonth=mar ;;
+ 4|04) tmonth=apr ;;
+ 5|05) tmonth=may ;;
+ 6|06) tmonth=jun ;;
+ 7|07) tmonth=jul ;;
+ 8|08) tmonth=aug ;;
+ 9|09) tmonth=sep ;;
+ 10)tmonth=oct ;;
+ 11) tmonth=nov ;;
+ 12) tmonth=dec ;;
+ *) tmonth=0 ;;
+ esac
+ tday=`echo ${tdomdate} | cut -d'/' -f3`
+ DOMAINDATE=`echo $tday-$tmonth-$tyear`
+ else # .com, .edu, .net and may work with others
+ DOMAINDATE=`cat ${WHOIS_TMP} | ${AWK} '/Expiration/ { print $NF }'`
+ fi
+
+ #echo $DOMAINDATE # debug
+ if [ "${TLDTYPE}" == "br" ]; # for .br domain
+ then
+ # If registro.br outputs in reduced mode when query limits are
+ # reached, the whois server does not output expiry information.
+ if [ ! -z "${DOMAINDATE}" ];
+ then
+ # Convert the date to seconds
+ DOMAINJULIAN=`$DATE -d ${DOMAINDATE} "+%-m %-d %-Y"`
+ DOMAINJULIAN=`date2julian ${DOMAINJULIAN}`
+ fi
+ else
+ # Whois data should be in the following format: "13-feb-2006"
+ IFS="-"
+ set -- ${DOMAINDATE}
+ MONTH=$(getmonth ${2})
+ IFS=""
+
+ # Convert the date to seconds
+ DOMAINJULIAN=$(date2julian ${MONTH} ${1#0} ${3})
+ fi
+
+ # Get the diff between NOW and the expiration date
+ if [ ! -z "${DOMAINJULIAN}" ];
+ then
+ DOMAINDIFF=$(date_diff ${NOWJULIAN} ${DOMAINJULIAN})
+ else
+ # We have no information
+ DOMAINDIFF="Unknown"
+ fi
+
+ if [ "${TLDTYPE}" == "br" ] && [ ! -z "${DOMAINDATE}" ]; # for .br domain
+ then
+ # Fix domain date for displaying
+ DOMAINDATE=`$DATE -d ${DOMAINDATE} +"%m-%b-%Y"`
+ fi
+
+ if [ ${DOMAINDIFF} == 'Unknown' ];
+ then
+ prints ${DOMAIN} "Unknown" "Unknown" "Unknown" ${REGISTRAR}
+ elif [ ${DOMAINDIFF} -lt 0 ]
+ then
+ if [ "${ALARM}" = "TRUE" ]
+ then
+ echo "The domain ${DOMAIN} has expired!" \
+ | ${MAIL} -s "Domain ${DOMAIN} has expired!" ${ADMIN}
+ fi
+
+ prints ${DOMAIN} "Expired" "${DOMAINDATE}" "${DOMAINDIFF}" ${REGISTRAR}
+
+ elif [ ${DOMAINDIFF} -lt ${WARNDAYS} ]
+ then
+ if [ "${ALARM}" = "TRUE" ]
+ then
+ echo "The domain ${DOMAIN} will expire on ${DOMAINDATE}" \
+ | ${MAIL} -s "Domain ${DOMAIN} will expire in ${WARNDAYS}-days or less" ${ADMIN}
+ fi
+ prints ${DOMAIN} "Expiring" "${DOMAINDATE}" "${DOMAINDIFF}" "${REGISTRAR}"
+ else
+ prints ${DOMAIN} "Valid" "${DOMAINDATE}" "${DOMAINDIFF}" "${REGISTRAR}"
+ fi
+}
+
+####################################################
+# Purpose: Print a heading with the relevant columns
+# Arguments:
+# None
+####################################################
+print_heading()
+{
+ if [ "${QUIET}" != "TRUE" ]
+ then
+ printf "\n%-35s %-17s %-8s %-11s %-5s\n" "Domain" "Registrar" "Status" "Expires" "Days Left"
+ echo "----------------------------------- ----------------- -------- ----------- ---------"
+ fi
+}
+
+#####################################################################
+# Purpose: Print a line with the expiraton interval
+# Arguments:
+# $1 -> Domain
+# $2 -> Status of domain (e.g., expired or valid)
+# $3 -> Date when domain will expire
+# $4 -> Days left until the domain will expire
+# $5 -> Domain registrar
+#####################################################################
+prints()
+{
+ if [ "${QUIET}" != "TRUE" ]
+ then
+ MIN_DATE=$(echo $3 | ${AWK} '{ print $1, $2, $4 }')
+ printf "%-35s %-17s %-8s %-11s %-5s\n" "$1" "$5" "$2" "$MIN_DATE" "$4"
+ fi
+}
+
+##########################################
+# Purpose: Describe how the script works
+# Arguments:
+# None
+##########################################
+usage()
+{
+ echo "Usage: $0 [ -e email ] [ -x expir_days ] [ -q ] [ -a ] [ -h ]"
+ echo " {[ -d domain_namee ]} || { -f domainfile}"
+ echo ""
+ echo " -a : Send a warning message through email "
+ echo " -d domain : Domain to analyze (interactive mode)"
+ echo " -e email address : Email address to send expiration notices"
+ echo " -f domain file : File with a list of domains"
+ echo " -h : Print this screen"
+ echo " -s whois server : Whois sever to query for information"
+ echo " -q : Don't print anything on the console"
+ echo " -x days : Domain expiration interval (eg. if domain_date < days)"
+ echo ""
+}
+
+### Evaluate the options passed on the command line
+while getopts ae:f:hd:s:qx: option
+do
+ case "${option}"
+ in
+ a) ALARM="TRUE";;
+ e) ADMIN=${OPTARG};;
+ d) DOMAIN=${OPTARG};;
+ f) SERVERFILE=$OPTARG;;
+ s) WHOIS_SERVER=$OPTARG;;
+ q) QUIET="TRUE";;
+ x) WARNDAYS=$OPTARG;;
+ \?) usage
+ exit 1;;
+ esac
+done
+
+### Check to see if the whois binary exists
+if [ ! -f ${WHOIS} ]
+then
+ echo "ERROR: The whois binary does not exist in ${WHOIS} ."
+ echo " FIX: Please modify the \$WHOIS variable in the program header."
+ exit 1
+fi
+
+### Check to make sure a date utility is available
+if [ ! -f ${DATE} ]
+then
+ echo "ERROR: The date binary does not exist in ${DATE} ."
+ echo " FIX: Please modify the \$DATE variable in the program header."
+ exit 1
+fi
+
+### Baseline the dates so we have something to compare to
+MONTH=$(${DATE} "+%m")
+DAY=$(${DATE} "+%d")
+YEAR=$(${DATE} "+%Y")
+NOWJULIAN=$(date2julian ${MONTH#0} ${DAY#0} ${YEAR})
+
+### Touch the files prior to using them
+touch ${WHOIS_TMP}
+
+### If a HOST and PORT were passed on the cmdline, use those values
+if [ "${DOMAIN}" != "" ]
+then
+ print_heading
+ check_domain_status "${DOMAIN}"
+### If a file and a "-a" are passed on the command line, check all
+### of the domains in the file to see if they are about to expire
+elif [ -f "${SERVERFILE}" ]
+then
+ print_heading
+ while read DOMAIN
+ do
+ check_domain_status "${DOMAIN}"
+
+ done < ${SERVERFILE}
+
+### There was an error, so print a detailed usage message and exit
+else
+ usage
+ exit 1
+fi
+
+# Add an extra newline
+if [ "${QUIET}" != "TRUE" ]; then
+ echo
+fi
+
+### Remove the temporary files
+rm -f ${WHOIS_TMP}
+
+### Exit with a success indicator
+exit 0
+