#!/usr/bin/env python
import sys

def mkpass(**kw):
	"""
	usage: mkpass(kw['size']=8, kw['type']='dlLp', kw['include']=None, kw['exclude']=None, kw['debug']=False)
		d: digits
		l: lower case letters
		L: upper case letters
		p: punctuation
	"""
	from string import digits,letters,punctuation
	from random import choice
	strs=''
	for t in kw['type']:
		try:
			strs+={ 'd':digits, 'l':letters[0:26], 'L':letters[26:], 'p':punctuation }[t]
		except:
			print("Please specify the correct TYPE string.")
			print("for example: -t dlL")
			sys.exit(0)
	if kw['include']:
		strs+=kw['include']

	if kw['exclude']:
		for e in kw['exclude']:
			strs=strs.replace(e, '', 1)
	if kw['debug']: print("Generating password from string\n%s\n" % strs)
	return ''.join( [ choice(strs) for i in range( kw['size'] ) ])

if __name__=='__main__':
	from optparse import OptionParser

	parser=OptionParser()
	parser.add_option("-s", "--size", action="store", type="int", dest="size", default=8)
	parser.add_option("-t", "--type", action="store", type="string", dest="type", default="dlLp", help="TYPE can be d(digits), l(lower case letters), L(upper case letters) and p(punctuations) or any of the combinations of them, defaults to dlLp")
	parser.add_option("-i", "--include", action="store", type="string", dest="include",default=None, help="use backslash to escape punctuations '\"`?!$;")
	parser.add_option("-e", "--exclude", action="store", type="string", dest="exclude",default=None, help="use backslash to escape punctuations '\"`?!$;")
	parser.add_option("-d", "--debug", action="store_true", dest="debug")

	(opts,args)=parser.parse_args()

	print mkpass(size=opts.size, type=opts.type, include=opts.include, exclude=opts.exclude, debug=opts.debug)