utils.executable based on PATH instead of YML

This commit is contained in:
Jörn-Michael Miehe 2020-08-12 17:18:20 +02:00
parent daced4dd7d
commit 8c2cdbda3a
5 changed files with 62 additions and 85 deletions

View file

@ -15,8 +15,3 @@ markers:
network: network:
name: kiwihub name: kiwihub
cidr: 10.22.46.0/24 cidr: 10.22.46.0/24
executables:
docker: /usr/bin/docker
docker-compose: /usr/local/bin/docker-compose
sudo: /usr/bin/sudo

View file

@ -5,7 +5,6 @@ from .._constants import KIWI_CONF_NAME
from ..config import DefaultConfig from ..config import DefaultConfig
from ._subcommand import SubCommand from ._subcommand import SubCommand
from .utils.executable import get_exe_key, is_executable, find_exe_file
def user_input(config, key, prompt): def user_input(config, key, prompt):
@ -21,21 +20,6 @@ def user_input(config, key, prompt):
config[key] = result config[key] = result
def user_input_exe(config, exe_name):
key = get_exe_key(exe_name)
exe_file = config[key]
if not is_executable(exe_file):
logging.info(f"Reconfiguring '{exe_name}' executable path.")
exe_file = find_exe_file(exe_name)
if exe_file is not None:
logging.debug(f"Found executable at '{exe_file}'.")
config[key] = exe_file
else:
user_input(config, key, f"Enter path to '{exe_name}' executable")
class InitCommand(SubCommand): class InitCommand(SubCommand):
def __init__(self): def __init__(self):
super().__init__( super().__init__(
@ -71,11 +55,6 @@ class InitCommand(SubCommand):
user_input(config, 'network:name', "Enter name for local docker network") user_input(config, 'network:name', "Enter name for local docker network")
user_input(config, 'network:cidr', "Enter CIDR block for local docker network") user_input(config, 'network:cidr', "Enter CIDR block for local docker network")
# executables
user_input_exe(config, 'docker')
user_input_exe(config, 'docker-compose')
user_input_exe(config, 'sudo')
config.save() config.save()
except KeyboardInterrupt: except KeyboardInterrupt:

View file

@ -1,67 +1,36 @@
import logging
import subprocess import subprocess
from ...config import LoadedConfig from .executable import Executable
from .executable import get_exe_key
class DockerCommand: class DockerCommand:
class __DockerCommand:
__cmd = []
def __init__(self, exe_name):
config = LoadedConfig.get()
self.__cmd = [config[get_exe_key(exe_name)]]
if DockerCommand.__requires_root:
self.__cmd = [config[get_exe_key("sudo")], *self.__cmd]
def __build_cmd(self, args, **kwargs):
cmd = [*self.__cmd, *args]
logging.debug(f"DockerProgram cmd{cmd}, kwargs{kwargs}")
return cmd
def run(self, args, **kwargs):
return subprocess.run(
self.__build_cmd(args, **kwargs),
**kwargs
)
def run_less(self, args, **kwargs):
process = subprocess.Popen(
self.__build_cmd(args, **kwargs),
stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,
**kwargs
)
less_process = subprocess.run(
['less', '-R', '+G'],
stdin=process.stdout
)
process.communicate()
return less_process
__exe_name = None
__instances = {}
__requires_root = None __requires_root = None
__exe = None
def __init__(self, exe_name): def __init__(self, exe_name):
if DockerCommand.__requires_root is None: if DockerCommand.__requires_root is None:
try: try:
config = LoadedConfig.get() Executable('docker').run(
subprocess.run( ['ps'], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
[config[get_exe_key('docker')], 'ps'],
check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL
) )
DockerCommand.__requires_root = False DockerCommand.__requires_root = False
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
DockerCommand.__requires_root = True DockerCommand.__requires_root = True
self.__exe_name = exe_name self.__exe = Executable(exe_name, DockerCommand.__requires_root)
if exe_name not in DockerCommand.__instances:
DockerCommand.__instances[exe_name] = DockerCommand.__DockerCommand(exe_name)
def __getattr__(self, item): def __getattr__(self, item):
return getattr(self.__instances[self.__exe_name], item) return getattr(self.__exe, item)
def run_less(self, args, **kwargs):
process = self.Popen(
args, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,
**kwargs
)
less_process = Executable('less').run(
['-R', '+G'], stdin=process.stdout
)
process.communicate()
return less_process

View file

@ -1,8 +1,6 @@
import os import os
import logging
import subprocess
def get_exe_key(exe_name):
return f'executables:{exe_name}'
def is_executable(filename): def is_executable(filename):
@ -18,4 +16,44 @@ def find_exe_file(exe_name):
if is_executable(exe_file): if is_executable(exe_file):
return exe_file return exe_file
return None raise FileNotFoundError(f"Executable '{exe_name}' not found in $PATH!")
class Executable:
__exe_name = None
__instances = {}
class __Executable:
__cmd = None
def __init__(self, exe_name, requires_root=False):
self.__cmd = [find_exe_file(exe_name)]
if requires_root:
self.__cmd = [find_exe_file("sudo"), *self.__cmd]
def __build_cmd(self, args, **kwargs):
cmd = [*self.__cmd, *args]
logging.debug(f"Executable cmd{cmd}, kwargs{kwargs}")
return cmd
def run(self, args, **kwargs):
return subprocess.run(
self.__build_cmd(args, **kwargs),
**kwargs
)
def Popen(self, args, **kwargs):
return subprocess.Popen(
self.__build_cmd(args, **kwargs),
**kwargs
)
def __init__(self, exe_name, requires_root=False):
self.__exe_name = exe_name
if exe_name not in Executable.__instances:
Executable.__instances[exe_name] = Executable.__Executable(exe_name, requires_root)
def __getattr__(self, item):
return getattr(self.__instances[self.__exe_name], item)

View file

@ -8,7 +8,3 @@ markers:
network: network:
name: kiwihub name: kiwihub
cidr: 10.22.46.0/24 cidr: 10.22.46.0/24
executables:
docker: null
docker-compose: null
sudo: null