Files
scale-build/scale_build/validate.py
2024-05-24 01:06:00 +05:00

72 lines
1.9 KiB
Python

import os
import jsonschema
import logging
import shutil
from truenas_install import dhs, fhs
from .exceptions import CallError, MissingPackagesException
from .utils.manifest import validate_manifest
from .utils.paths import REFERENCE_FILES, REFERENCE_FILES_DIR
logger = logging.getLogger(__name__)
WANTED_PACKAGES = {
'make',
'debootstrap',
'git',
'mksquashfs',
'rsync',
'unzip',
}
def retrieve_missing_packages():
return {pkg for pkg in WANTED_PACKAGES if not shutil.which(pkg)}
def validate_system_state():
if os.geteuid() != 0:
raise CallError('Must be run as root (or using sudo)!')
missing_packages = retrieve_missing_packages()
if missing_packages:
raise MissingPackagesException(missing_packages)
if missing_files := [
f for f in map(lambda f: os.path.join(REFERENCE_FILES_DIR, f), REFERENCE_FILES) if not os.path.exists(f)
]:
raise CallError(f'Missing reference files: {", ".join(missing_files)!r}')
def validate_datasets():
try:
jsonschema.validate(fhs.TRUENAS_DATASETS, fhs.TRUENAS_DATASET_SCHEMA)
except jsonschema.ValidationError as e:
raise CallError(f'Provided dataset schema is invalid: {e}')
def validate_data_dir_schema():
try:
jsonschema.validate(dhs.TRUENAS_DATA_HIERARCHY, dhs.TRUENAS_DATA_HIERARCHY_SCHEMA)
except jsonschema.ValidationError as e:
raise CallError(f'Provided data hierarchy schema is invalid: {e}')
def validate(system_state_flag=True, manifest_flag=True, datasets_flag=True, data_flag=True):
if system_state_flag:
validate_system_state()
logger.debug('System state Validated')
if manifest_flag:
validate_manifest()
logger.debug('Manifest Validated')
if datasets_flag:
validate_datasets()
logger.debug('Dataset schema Validated')
if data_flag:
validate_data_dir_schema()
logger.debug('Data directory schema Validated')