File: //opt/cwprads/update_user_pw
#!/usr/lib/cwprads/venv/bin/python3
import argparse
import secrets
from subprocess import PIPE, Popen
from email.mime.text import MIMEText
PASSWORD_ALLOWED_CHARS = (
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
)
def runCommand(args, input=""):
args_string = []
for i in range(len(args)):
if type(args[i]) == str:
args_string.append(args[i])
else:
args_string.append(str(args[i]))
process = Popen(args_string, stdin=PIPE, stdout=PIPE, stderr=PIPE)
output = {"stdout": "", "stderr": "", "returncode": -1}
output["stdout"], output["stderr"] = process.communicate(
bytes(input, 'utf-8')
)
process.poll()
if not process.returncode == 0:
command = " ".join(args_string)
print(f"System call failed with error code {process.returncode}")
print("Command:")
print(command)
print("stdout:")
print(output["stdout"])
print("stderr:")
print(output["stderr"])
raise Exception(f"Command {command} failed to run")
else:
return str(output["stdout"], "UTF-8").strip()
def randomPassword(length):
return "".join(
secrets.choice(PASSWORD_ALLOWED_CHARS) for i in range(length)
)
def mailUser(email, username, password):
hostname = runCommand(["/usr/bin/hostname", "--fqdn"])
mailbody = f"""Hello {username},
Your CWP password for {username} has been reset.
Your username is: {username}
Your password is: {password}"""
msg = MIMEText(mailbody)
msg['Subject'] = f"CWP Password Change on {hostname}"
msg['From'] = f"root@{hostname}"
msg['To'] = email
p = Popen(["/usr/sbin/sendmail", "-t"], stdin=PIPE)
p.communicate(msg.as_bytes())
def updateUserPW(username, email):
newpw = randomPassword(16)
runCommand(["/usr/bin/passwd", username, "--stdin"], newpw)
mailUser(email, username, newpw)
parser = argparse.ArgumentParser(description="Reset User Password")
parser.add_argument("username", type=str, help="Username")
parser.add_argument("email", type=str, help="E-mail to send password to")
args = parser.parse_args()
updateUserPW(args.username, args.email)