#!/usr/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)