'''
Copyright (C) 2019 Vanessa Sochat.
This Source Code Form is subject to the terms of the
Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
'''
from watchme.logger import bot
from subprocess import (
Popen,
PIPE,
STDOUT
)
import os
import re
import shlex
# User Prompts
[docs]def confirm_prompt(prompt):
'''A wrapper around choice_prompt, but ask the user specifically for a
yes / no response that is converted to boolean for the calling agent.
Parameters
==========
prompt: the prompt to ask the user
'''
choice = choice_prompt(prompt, choices = ["Y", "N", "y", "n"])
return convert2boolean(choice)
[docs]def choice_prompt(prompt, choices=None, choice=None):
'''Ask the user for a prompt, and only return when one of the requested
options is provided.
Parameters
==========
prompt: the prompt to ask the user
choices: a list of choices that are valid, defaults to [Y/N/y/n]
'''
if not choices:
choices = ["y", "n", "Y", "N"]
print(prompt)
get_input = getattr(__builtins__, 'raw_input', input)
pretty_choices = '/'.join(choices)
message = 'Please enter your choice [%s] : ' %(pretty_choices)
while choice not in choices:
choice = get_input(message).strip()
# If the option isn't valid, this is shown next
message = "Please enter a valid option in [%s]" %(pretty_choices)
return choice
[docs]def regexp_prompt(prompt, regexp='.', answer=''):
'''Ask the user for a text entry that matches a regular expression
Parameters
==========
prompt: the prompt to ask the user
regexp: the regular expression to match. defaults to anything.
'''
get_input = getattr(__builtins__, 'raw_input', input)
while not re.search(regexp, answer):
answer = get_input(prompt + ': ').strip()
# If the option isn't valid, this is shown next
message = "Your entry must match the regular expression %s" % regexp
return answer
# Terminal Commands
[docs]def which(software, strip_newline=True):
'''get_install will return the path to where an executable is installed.
'''
if software is None:
software = "watchme"
cmd = 'which %s' % software
try:
result = run_command(cmd)
if strip_newline is True:
result['message'] = result['message'].strip('\n')
if "message" in result:
return result['message']
return result
except: # FileNotFoundError
return None
[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 run_command(cmd, sudo=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.
'''
cmd = shlex.split(cmd)
if sudo is True:
cmd = ['sudo'] + cmd
try:
output = Popen(cmd, stderr=STDOUT, stdout=PIPE)
except FileNotFoundError:
cmd.pop(0)
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 convert2boolean(arg):
'''
convert2boolean is used for environmental variables
that must be returned as boolean
'''
if not isinstance(arg, bool):
return arg.lower() in ("yes", "true", "t", "1", "y")
return arg