Add environment check on startup

Use an environment check function to test if the env is
configured for running subiquity.

Signed-off-by: Ryan Harper <ryan.harper@canonical.com>
This commit is contained in:
Ryan Harper 2015-10-22 14:39:25 -05:00
parent 128535179e
commit f43bca96a3
3 changed files with 84 additions and 4 deletions

View File

@ -18,10 +18,11 @@ import argparse
import sys import sys
import logging import logging
import signal import signal
from subiquity.log import setup_logger from subiquity.log import setup_logger, LOGFILE
from subiquity import __version__ as VERSION from subiquity import __version__ as VERSION
from subiquity.core import Controller as Subiquity from subiquity.core import Controller as Subiquity
from subiquity.ui.frame import SubiquityUI from subiquity.ui.frame import SubiquityUI
from subiquity.utils import environment_check
def parse_options(argv): def parse_options(argv):
@ -55,10 +56,15 @@ def main():
signal.signal(signal.SIGINT, control_c_handler) signal.signal(signal.SIGINT, control_c_handler)
env_ok = environment_check()
if env_ok is False:
print('Failed environment check. Check {} for errors.'.format(LOGFILE))
return 1
ui = SubiquityUI() ui = SubiquityUI()
subiquity_interface = Subiquity(ui, opts) subiquity_interface = Subiquity(ui, opts)
subiquity_interface.run() subiquity_interface.run()
if __name__ == '__main__': if __name__ == '__main__':
main() sys.exit(main())

View File

@ -17,10 +17,10 @@ import logging
import os import os
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
def setup_logger(name=__name__):
LOGDIR = "logs" LOGDIR = "logs"
LOGFILE = os.path.join(LOGDIR, "debug.log") LOGFILE = os.path.join(LOGDIR, "debug.log")
def setup_logger(name=__name__):
if not os.path.isdir(LOGDIR): if not os.path.isdir(LOGDIR):
os.makedirs(LOGDIR) os.makedirs(LOGDIR)
log = TimedRotatingFileHandler(LOGFILE, log = TimedRotatingFileHandler(LOGFILE,

View File

@ -18,11 +18,85 @@ import errno
import logging import logging
import os import os
import random import random
import yaml
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
from subiquity.async import Async from subiquity.async import Async
log = logging.getLogger("subiquity.utils") log = logging.getLogger("subiquity.utils")
SYS_CLASS_NET = "/sys/class/net/" SYS_CLASS_NET = "/sys/class/net/"
ENVIRONMENT_CHECK = '''
checks:
read:
file:
- /var/log/syslog
write:
directory:
- /tmp
mount:
directory:
- /proc
- /sys
exec:
file:
- /sbin/hdparm
- /usr/bin/curtin
'''
def environment_check(check=ENVIRONMENT_CHECK):
''' Check the environment to ensure subiquity can run without issues.
'''
log.info('Checking environment for installer requirements...')
def is_file(x):
return os.path.isfile(x)
def is_directory(x):
return os.path.isdir(x)
def is_mount(x):
return os.path.ismount(x)
def is_writable(x):
return os.access(x, os.W_OK)
def is_readable(x):
return os.access(x, os.R_OK)
def is_executable(x):
return os.access(x, os.X_OK)
check_map = {
'read': is_readable,
'write': is_writable,
'exec': is_executable,
'file': is_file,
'directory': is_directory,
'mount': is_mount,
}
checks = yaml.safe_load(check).get('checks', None)
if not checks:
log.error('Invalid environment check configuration')
return False
env_ok = True
for check_type in [c for c in checks
if c in ['read', 'write', 'mount', 'exec']]:
for ftype, items in checks[check_type].items():
for i in items:
if not os.path.exists(i):
log.error('FAIL: {} is not found on the filesystem'.format(i))
env_ok = False
continue
if check_map[ftype](i) is False:
log.error('FAIL: {} is NOT of type: {}'.format(i, ftype))
env_ok = False
continue
if check_map[check_type](i) is False:
log.error('FAIL: {} does NOT have required attr: {}'.format(i,
check_type))
env_ok = False
return env_ok
def run_command_async(cmd, timeout=None): def run_command_async(cmd, timeout=None):