First version of pwgen
This commit is contained in:
		
							
								
								
									
										115
									
								
								bin/pwgen
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								bin/pwgen
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,115 @@
 | 
			
		||||
#!/usr/bin/python3
 | 
			
		||||
import argparse
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import pwgen
 | 
			
		||||
 | 
			
		||||
default_config_file=os.path.expanduser('~/.pwgen.cfg')
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
 | 
			
		||||
    parser = argparse.ArgumentParser(description='Generate passwords')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--generate-config', '-g',
 | 
			
		||||
            action='store_true',
 | 
			
		||||
            help='Generate configuration file and then exit')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--config-file', '-c',
 | 
			
		||||
            help='Configuration file to use',
 | 
			
		||||
            default=default_config_file)
 | 
			
		||||
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--myspell-dir', '-i',
 | 
			
		||||
            help='Directory containing myspell dictionaries')
 | 
			
		||||
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--lang', '-l',
 | 
			
		||||
            help='Dictionary language to use')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--word-min-char', '-m',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Minimum number of characters in a word')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--word-max-char', '-M',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Maximum number of characters in a word')
 | 
			
		||||
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--words', '-w',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Number of words to use in the passphrase')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--capitalize', '-C',
 | 
			
		||||
            choices=('true', 'false', 'random'),
 | 
			
		||||
            help='Capitalize the words')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--separators', '-s',
 | 
			
		||||
            help='Possible characters to use as separators')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--trailing-digits', '-d',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Number of digits at the end of the passphrase')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--leading-digits', '-D',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Number of digits at the start of the passphrase')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--special-chars', '-S',
 | 
			
		||||
            help='Possible characters to use as extra special characters')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--trailing-chars', '-p',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Number of special characters to add at the end of the passphrase')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--leading-chars', '-P',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Number of special characters to add at the start of the passphrase')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--passwords', '-n',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help='Number of passwords to generate')
 | 
			
		||||
    parser.add_argument(
 | 
			
		||||
            '--max-length', '-L',
 | 
			
		||||
            type=int,
 | 
			
		||||
            help="Maximum length of the generated passwords. Full-knowledge "\
 | 
			
		||||
                 "entropy calculation doesn't work when this is set.")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    args = vars(parser.parse_args())
 | 
			
		||||
 | 
			
		||||
    config_file = args['config_file']
 | 
			
		||||
    del args['config_file']
 | 
			
		||||
 | 
			
		||||
    if not os.path.isfile(config_file):
 | 
			
		||||
        print("Missing configuration file; generating a new at {}".format(config_file))
 | 
			
		||||
        conf = pwgen.update_config()
 | 
			
		||||
        pwgen.save_config(config_file, conf)
 | 
			
		||||
 | 
			
		||||
    conf = pwgen.get_config(config_file)
 | 
			
		||||
    save_config = args['generate_config']
 | 
			
		||||
    del args['generate_config']
 | 
			
		||||
 | 
			
		||||
    conf = pwgen.update_config(config=conf, **args)
 | 
			
		||||
 | 
			
		||||
    if save_config:
 | 
			
		||||
        print("Updating configuration file at {}".format(config_file))
 | 
			
		||||
        pwgen.save_config(config_file, conf)
 | 
			
		||||
        sys.exit(0)
 | 
			
		||||
 | 
			
		||||
    pwds, seen_entropy = pwgen.generate_passwords(conf)
 | 
			
		||||
 | 
			
		||||
    print("Generated {} passwords".format(len(pwds)))
 | 
			
		||||
    if seen_entropy:
 | 
			
		||||
        print("Full-knowledge entropy is {0:.2g}".format(seen_entropy))
 | 
			
		||||
    else:
 | 
			
		||||
        print("Unable to calculate full-knowledge entropy since max_length is used")
 | 
			
		||||
    print("Blind entropy\tPassword")
 | 
			
		||||
    print("========================")
 | 
			
		||||
    for pw in pwds.keys():
 | 
			
		||||
        print("{:.5n}\t\t{}".format(pwds[pw]['entropy'], pw))
 | 
			
		||||
    print("========================")
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    main()
 | 
			
		||||
		Reference in New Issue
	
	Block a user