diff options
Diffstat (limited to 'bin')
| -rwxr-xr-x | bin/emailcanary | 105 | 
1 files changed, 105 insertions, 0 deletions
| diff --git a/bin/emailcanary b/bin/emailcanary new file mode 100755 index 0000000..2c3a630 --- /dev/null +++ b/bin/emailcanary @@ -0,0 +1,105 @@ +#!/usr/bin/env python + +import argparse +import sys +import smtplib +from emailcanary import canarydb +from emailcanary import canary + +SUCCESS=0 +FAILURE=1 + +def parse_args(): +	parser = argparse.ArgumentParser() +	parser.add_argument('-d', '--database', default='/etc/emailcanary.db', help='Specify the database to use.') +	parser.add_argument('-s', '--smtp', default='localhost:25', help='SMTP Server to send chirps to.') +	parser.add_argument('-f', '--from', dest='fromaddress', help='Specify the email address to send the ping from.') + +	group = parser.add_mutually_exclusive_group(required=True) +	group.add_argument('--chirp', metavar='listAddress', help='Send an email to the given canary list address.') +	group.add_argument('--check', metavar='listAddress', help='Check the recepient addresses for the list address.') +	group.add_argument('--add', nargs=4, metavar=('listAddress', 'address', 'imapserver', 'password'), help='Add a new recepient and list.') +	group.add_argument('--remove', nargs='+', metavar=('listAddress', 'address'), help='Remove recepients from the list.') +	group.add_argument('--list', action='store_true', help='List all configured addresses.') + +	args = parser.parse_args() +	return args + +def get_smtp(address): +	index = address.find(':') +	if index == -1: +		server = address +		port = 465 +	else: +		(server, port) = address.split(':') +	return smtplib.SMTP_SSL(server, port) + +def list(db): +	accounts = db.get_accounts() +	if len(accounts) == 0: +		print('No accounts configured.') +		return SUCCESS +	print "%-25s %-25s %-25s" % ('List Address', 'Recepient', 'IMAP Server') +	print "-" * 80 +	for account in accounts: +		print "%-25s %-25s %-25s" % (account[0], account[1], account[2]) +	return SUCCESS + +def add(db, listAddress, recepient, imapserver, password): +	db.add_account(listAddress, recepient, imapserver, password) +	return SUCCESS + +def remove(db, listAddress, recepients): +	if len(recepients) == 0: +		recepients = db.get_accounts(listAddress) +	for address in recepients: +		db.remove_account(listAddress, address) +	return SUCCESS + +def check(db, birdie, listAddress): +	missing = birdie.check(listAddress) +	if len(missing) == 0: +		return SUCCESS +	print "list recepient uuid time" +	for chirp in missing: +		print "%s %s %s %d" % (chirp[0], chirp[1], chirp[2], chirp[3].total_seconds()) +	return FAILURE + +def main(): +	args = parse_args() +	if not args: +		return + +	smtp = None +	db = None +	try: +		db = canarydb.CanaryDB(args.database) + +		if args.list: +			return list(db) +		elif args.add: +			return add(db, args.add[0], args.add[1], args.add[2], args.add[3]) +		elif args.remove: +			return remove(db, args.remove[0], args.remove[1:]) +		else: +			smtp = get_smtp(args.smtp) +			birdie = canary.Canary(db, smtp, args.fromaddress) +			if args.chirp: +				birdie.chirp(args.chirp) +				return SUCCESS +			elif args.check: +				return check(db, birdie, args.check) +			else: +				raise Exception('Unknown action') + +	except Exception, e: +		sys.stderr.write("Error: %s\n" % (str(e))) +		return FAILURE +	finally: +		if smtp: +			smtp.quit() +		if db: +			db.close() + +if __name__ == "__main__": +	sys.exit(main()) | 
