2021-05-20 10:47:28 +03:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
2021-05-20 20:44:29 +03:00
|
|
|
# This program is free software. It comes without any warranty, to
|
|
|
|
# the extent permitted by applicable law. You can redistribute it
|
|
|
|
# and/or modify it under the terms of the Do What The Fuck You Want
|
|
|
|
# To Public License, Version 2, as published by Sam Hocevar. See
|
|
|
|
# http://www.wtfpl.net/ for more details.
|
|
|
|
|
2021-05-20 10:47:28 +03:00
|
|
|
import sys
|
|
|
|
import getopt
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
import random
|
|
|
|
import string
|
|
|
|
|
|
|
|
def generate_pass(special_chars: bool, lenght: int, print_pass: bool) -> str:
|
|
|
|
abc = string.ascii_letters + string.digits
|
|
|
|
if special_chars:
|
|
|
|
abc = abc + string.punctuation
|
|
|
|
pw = ''
|
|
|
|
for char in range(lenght):
|
|
|
|
pw = pw + random.choice(abc)
|
|
|
|
|
|
|
|
if print_pass:
|
|
|
|
print(pw)
|
|
|
|
else:
|
|
|
|
# Run xclip. Copy generated password to X clipboard!
|
|
|
|
command = 'xclip -selection clipboard'.split()
|
|
|
|
process = subprocess.Popen(
|
|
|
|
command,
|
|
|
|
stdin=subprocess.PIPE,
|
|
|
|
stdout=subprocess.PIPE,
|
|
|
|
stderr=subprocess.PIPE
|
|
|
|
)
|
|
|
|
process.stdin.write(pw.encode()) # Put password to STDIN.
|
|
|
|
|
|
|
|
def usage():
|
2022-02-06 17:03:01 +03:00
|
|
|
print('Usage: pwc [-h|--help] [-s|--special] [-p|--print] [<lenght>]')
|
2021-05-20 10:47:28 +03:00
|
|
|
|
|
|
|
def print_help():
|
2022-02-06 17:03:01 +03:00
|
|
|
print('Generate password and copy it to clipboard (xclip).')
|
2021-05-20 10:47:28 +03:00
|
|
|
print()
|
|
|
|
usage()
|
|
|
|
print()
|
|
|
|
print(' -s, --special use punctuation characters in password.')
|
|
|
|
print(' -p, --print print password to STDOUT instead of copy to clipboard.')
|
|
|
|
print(' -h, --help print this help message and exit.')
|
|
|
|
|
|
|
|
def main():
|
|
|
|
# Set default values.
|
|
|
|
special_chars = False
|
|
|
|
print_pass = False
|
|
|
|
lenght = 12
|
|
|
|
|
|
|
|
# Parse agrs.
|
|
|
|
try:
|
|
|
|
opts, args = getopt.getopt(
|
|
|
|
sys.argv[1:],
|
|
|
|
"hsp",
|
|
|
|
["help", "special", "print"]
|
|
|
|
)
|
|
|
|
except getopt.GetoptError as err:
|
|
|
|
print(err) # will print something like "option -a not recognized"
|
|
|
|
usage()
|
|
|
|
sys.exit(2)
|
|
|
|
special_chars=False
|
|
|
|
for opt, arg in opts:
|
|
|
|
if opt in ("-h", "--help"):
|
|
|
|
print_help()
|
|
|
|
sys.exit()
|
|
|
|
if opt in ("-s", "--special"):
|
|
|
|
special_chars=True
|
|
|
|
if opt in ("-p", "--print"):
|
|
|
|
print_pass=True
|
|
|
|
if len(args) >= 2:
|
|
|
|
print('Too many arguments.')
|
|
|
|
usage()
|
|
|
|
sys.exit(2)
|
|
|
|
for arg in args:
|
|
|
|
try:
|
|
|
|
lenght = int(arg)
|
|
|
|
except ValueError:
|
|
|
|
print('Argument must be an integer.')
|
|
|
|
usage()
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
# Run password generator.
|
|
|
|
generate_pass(special_chars, lenght, print_pass)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|