__author__ = "Vanessa Sochat, Alec Scott"
__copyright__ = "Copyright 2021-2022, Vanessa Sochat and Alec Scott"
__license__ = "Apache-2.0"
from paks.logger import logger
from subprocess import Popen, PIPE, STDOUT
import os
import shlex
import shutil
import getpass
[docs]def which(software, strip_newline=True):
"""get_install will return the path to where Singularity (or another
executable) is installed.
"""
return shutil.which(software)
[docs]def check_install(software, quiet=True, command="--version"):
"""check_install will attempt to run the singularity command, and
return True if installed. The command line utils will not run
without this check.
Parameters
==========
software: the software to check if installed
quiet: should we be quiet? (default True)
command: the command to use to check (defaults to --version)
"""
cmd = [software, command]
try:
version = run_command(cmd, software)
except: # FileNotFoundError
return False
if version:
if not quiet and version["return_code"] == 0:
version = version["message"]
logger.info("Found %s version %s" % (software.upper(), version))
return True
return False
[docs]def get_installdir():
"""get_installdir returns the installation directory of the application"""
return os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
[docs]def get_username():
return getpass.getuser()
[docs]def run_command(cmd, stream=False):
"""run_command uses subprocess to send a command to the terminal.
Parameters
==========
cmd: the command to send, should be a list for subprocess
error_message: the error message to give to user if fails,
if none specified, will alert that command failed.
"""
if not isinstance(cmd, list):
cmd = shlex.split(cmd)
output = Popen(cmd, stderr=STDOUT, stdout=PIPE)
t = output.communicate()[0], output.returncode
output = {"message": t[0], "return_code": t[1]}
if isinstance(output["message"], bytes):
output["message"] = output["message"].decode("utf-8")
return output
[docs]def confirm_action(question, force=False):
"""confirm if the user wants to perform a certain action
Parameters
==========
question: the question that will be asked
force: if the user wants to skip the prompt
"""
if force is True:
return True
response = input(question)
while len(response) < 1 or response[0].lower().strip() not in "ynyesno":
response = input("Please answer yes or no: ")
if response[0].lower().strip() in "no":
return False
return True