kiwi-scp/src/kiwi/subcommands/utils/executable.py

98 lines
2.7 KiB
Python
Raw Normal View History

2020-08-12 15:46:50 +00:00
# system
import logging
2020-08-12 15:46:50 +00:00
import os
import subprocess
2020-08-12 14:43:13 +00:00
2020-08-17 09:57:08 +00:00
def _update_kwargs(config, **kwargs):
if config is not None:
2020-08-17 12:13:42 +00:00
# ensure there is an environment
2020-08-17 09:57:08 +00:00
if 'env' not in kwargs:
kwargs['env'] = {}
2020-08-17 12:13:42 +00:00
# add common environment from config
if config['runtime:env'] is not None:
kwargs['env'].update(config['runtime:env'])
2020-08-17 09:57:08 +00:00
logging.debug(f"kwargs updated: {kwargs}")
return kwargs
def _is_executable(filename):
2020-08-12 14:43:13 +00:00
if filename is None:
return False
return os.path.isfile(filename) and os.access(filename, os.X_OK)
2020-08-17 09:57:08 +00:00
def _find_exe_file(exe_name):
2020-08-12 14:43:13 +00:00
for path in os.environ['PATH'].split(os.pathsep):
exe_file = os.path.join(path, exe_name)
2020-08-17 09:57:08 +00:00
if _is_executable(exe_file):
2020-08-12 14:43:13 +00:00
return exe_file
raise FileNotFoundError(f"Executable '{exe_name}' not found in $PATH!")
class Executable:
class __Executable:
2020-08-12 15:39:55 +00:00
__exe_path = None
2020-08-17 09:57:08 +00:00
def __init__(self, exe_name):
self.__exe_path = _find_exe_file(exe_name)
2020-08-12 15:39:55 +00:00
def __build_cmd(self, args, requires_root=False, **kwargs):
cmd = [self.__exe_path, *args]
if requires_root:
2020-08-17 09:57:08 +00:00
self.__exe_path = [_find_exe_file("sudo"), self.__exe_path]
logging.debug(f"Executable cmd{cmd}, kwargs{kwargs}")
return cmd
2020-08-17 09:57:08 +00:00
def run(self, process_args, config=None, requires_root=False, **kwargs):
kwargs = _update_kwargs(config, **kwargs)
return subprocess.run(
2020-08-13 09:34:30 +00:00
self.__build_cmd(process_args, requires_root, **kwargs),
**kwargs
)
2020-08-17 09:57:08 +00:00
def Popen(self, process_args, config=None, requires_root=False, **kwargs):
kwargs = _update_kwargs(config, **kwargs)
return subprocess.Popen(
2020-08-13 09:34:30 +00:00
self.__build_cmd(process_args, requires_root, **kwargs),
**kwargs
)
2020-08-17 09:57:08 +00:00
def run_less(self, process_args, config=None, requires_root=False, **kwargs):
2020-08-13 09:34:30 +00:00
kwargs['stdout'] = subprocess.PIPE
kwargs['stderr'] = subprocess.DEVNULL
process = self.Popen(
2020-08-17 09:57:08 +00:00
process_args, config, requires_root,
2020-08-13 09:34:30 +00:00
**kwargs
)
less_process = Executable('less').run(
['-R', '+G'],
stdin=process.stdout
)
process.communicate()
return less_process
2020-08-12 15:39:55 +00:00
__exe_name = None
__instances = {}
2020-08-17 09:57:08 +00:00
def __init__(self, exe_name):
self.__exe_name = exe_name
if exe_name not in Executable.__instances:
2020-08-17 09:57:08 +00:00
Executable.__instances[exe_name] = Executable.__Executable(exe_name)
def __getattr__(self, item):
return getattr(self.__instances[self.__exe_name], item)