2020-08-10 12:50:47 +00:00
|
|
|
import os
|
2020-08-08 17:41:11 +00:00
|
|
|
import subprocess
|
|
|
|
|
|
2020-08-10 13:48:15 +00:00
|
|
|
from ..core import Parser
|
2020-08-08 17:41:11 +00:00
|
|
|
from ..config import LoadedConfig
|
|
|
|
|
|
2020-08-10 12:50:47 +00:00
|
|
|
|
|
|
|
|
def is_executable(filename):
|
|
|
|
|
if filename is None:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return os.path.isfile(filename) and os.access(filename, os.X_OK)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def find_exe_file(exe_name):
|
|
|
|
|
for path in os.environ['PATH'].split(os.pathsep):
|
|
|
|
|
exe_file = os.path.join(path, exe_name)
|
|
|
|
|
if is_executable(exe_file):
|
|
|
|
|
return exe_file
|
|
|
|
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_exe_key(exe_name):
|
|
|
|
|
return f'executables:{exe_name}'
|
|
|
|
|
|
2020-08-08 17:41:11 +00:00
|
|
|
|
|
|
|
|
class SubCommand:
|
2020-08-10 13:48:15 +00:00
|
|
|
__name = None
|
|
|
|
|
__parser = None
|
2020-08-08 17:41:11 +00:00
|
|
|
|
2020-08-10 13:48:15 +00:00
|
|
|
def __init__(self, name, **kwargs):
|
|
|
|
|
self.__name = name
|
|
|
|
|
self.__parser = Parser().get_subparsers().add_parser(name, **kwargs)
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return self.__name
|
|
|
|
|
|
|
|
|
|
def get_parser(self):
|
|
|
|
|
return self.__parser
|
2020-08-08 17:41:11 +00:00
|
|
|
|
2020-08-10 13:48:15 +00:00
|
|
|
def run(self):
|
2020-08-08 17:41:11 +00:00
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
2020-08-10 14:28:42 +00:00
|
|
|
class DockerProgram:
|
|
|
|
|
class __DockerProgram:
|
|
|
|
|
__cmd = []
|
|
|
|
|
|
|
|
|
|
def __init__(self, exe_name):
|
|
|
|
|
config = LoadedConfig.get()
|
|
|
|
|
self.__cmd = [config[get_exe_key(exe_name)]]
|
|
|
|
|
|
|
|
|
|
if DockerProgram.__requires_root:
|
|
|
|
|
self.__cmd = [config[get_exe_key("sudo")], *self.__cmd]
|
|
|
|
|
|
|
|
|
|
def run(self, args, **kwargs):
|
|
|
|
|
cmd = [*self.__cmd, *args]
|
|
|
|
|
print(cmd)
|
|
|
|
|
return subprocess.run(cmd, **kwargs)
|
|
|
|
|
|
|
|
|
|
__exe_name = None
|
|
|
|
|
__instances = {}
|
2020-08-08 17:41:11 +00:00
|
|
|
__requires_root = None
|
|
|
|
|
|
2020-08-10 14:28:42 +00:00
|
|
|
def __init__(self, exe_name):
|
|
|
|
|
if DockerProgram.__requires_root is None:
|
2020-08-08 17:41:11 +00:00
|
|
|
try:
|
|
|
|
|
config = LoadedConfig.get()
|
|
|
|
|
subprocess.run(
|
2020-08-10 12:50:47 +00:00
|
|
|
[config[get_exe_key('docker')], 'ps'],
|
2020-08-10 14:28:42 +00:00
|
|
|
check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
|
2020-08-08 17:41:11 +00:00
|
|
|
)
|
2020-08-10 14:28:42 +00:00
|
|
|
DockerProgram.__requires_root = False
|
2020-08-08 17:41:11 +00:00
|
|
|
except subprocess.CalledProcessError:
|
2020-08-10 14:28:42 +00:00
|
|
|
DockerProgram.__requires_root = True
|
2020-08-08 17:41:11 +00:00
|
|
|
|
2020-08-10 14:28:42 +00:00
|
|
|
self.__exe_name = exe_name
|
2020-08-08 17:41:11 +00:00
|
|
|
|
2020-08-10 14:28:42 +00:00
|
|
|
if exe_name not in DockerProgram.__instances:
|
|
|
|
|
DockerProgram.__instances[exe_name] = DockerProgram.__DockerProgram(exe_name)
|
2020-08-08 17:41:11 +00:00
|
|
|
|
2020-08-10 14:28:42 +00:00
|
|
|
def __getattr__(self, item):
|
|
|
|
|
return getattr(self.__instances[self.__exe_name], item)
|