Several years ago I wrote a simple bash script to check the expiration date of the DNS domains I own. At the time I wrote this purely for my own needs but after receiving 100s of e-mails from folks who were using it (and submitting patches) I decided to enhance it to be more useful. As time has gone on Registrar WHOIS data formats have changed and I came to the realization that there is no standard time format for expiration records. I needed a more suitable solution so I spent last weekend re-writing my original script in Python. The new version is available on github and solves all of the issues I previously encountered.
To work around the Registrar WHOIS data format issue I created a list of strings which can be easily extended as new ones are encountered (or changed):
EXPIRE_STRINGS = [ "Registry Expiry Date:", "Expiration:", "Domain Expiration Date" ]
These strings are checked against the WHOIS data returned from `which whois` and if a match is found I save off $NF which should be the date. To get around the date formatting issues I pulled in the dateutil module which does an AMAZING job of normalizing dates. This module allows me to feed it random date formats which are then normalized to datetime objects which I can perform math on. The github README contains several examples showing how to use the script. The most basic form allows you to see expiration data for a domain or a set of domains in a file:
$ dns-domain-expiration-checker.py --domainname prefetch.net --interactive Domain Name Registrar Expiration Date Days Left prefetch.net DNC Holdings, Inc. 2020-06-23 16:56:05 1056
The script also provides SMTP alerting and Nagios support will be added in the near future. If you use the script and encounter any bugs please shoot me an issue on github.