diff --git a/izzylib/misc.py b/izzylib/misc.py index 3f93f59..83dbc5b 100644 --- a/izzylib/misc.py +++ b/izzylib/misc.py @@ -1,9 +1,9 @@ -import grp, hashlib, os, platform, random, signal, socket, statistics, string, time, timeit +import grp, hashlib, os, platform, random, shlex, signal, socket, statistics, string, time, timeit from datetime import datetime from getpass import getpass, getuser from importlib import util -from pathlib import Path +from subprocess import Popen, PIPE from urllib.parse import urlparse from . import izzylog @@ -26,6 +26,7 @@ __all__ = [ 'random_gen', 'remove', 'signal_handler', + 'sudo', 'time_function', 'time_function_pprint', 'timestamp', @@ -221,7 +222,7 @@ def nfs_check(path): return proc = Path('/proc/mounts') - path = Path(path).resolve + path = Path(path).resolve() if not proc.exists: return True @@ -284,7 +285,7 @@ def prompt(prompt, default=None, valtype=str, options=[], password=False): Arguments: prompt (str): The string to display to the user default (various): The value that should be returned if there is no user input - valtype (str): The type the value should be returned as + valtype (function): The type the value should be returned as options (list(str)): If set, these are the only values the user can select password (bool): If set to True, the input will be treated like a password and not show the user's input on screen @@ -376,6 +377,22 @@ def signal_handler(func=None, *args, original_args=False, **kwargs): signal.signal(signal.SIGTERM, handler) +# This currently uses os.system instead of subprocess.Popen which I don't want +def sudo(command, argstring, password=None): + if command.startswith('/'): + assert Path(command).isfile + + while not password: + password = prompt(f'[PySudo] password for {getuser()}', password=True) + + #proc = Popen(['sudo', command, *shlex.split(argstring), *args], stdin=PIPE) + #proc.communicate(bytes(password + '\n', 'utf-8')) + + #return proc + + return os.system(f'echo {password} | sudo -S -- {command} {argstring}') + + def time_function(func, *args, passes=1, use_gc=True, **kwargs): '''Run a function and return the time it took