76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
import logging
|
|
import pathlib
|
|
|
|
from iottb import definitions
|
|
from iottb.definitions import DEVICE_METADATA_FILE, ReturnCodes
|
|
from iottb.logger import logger
|
|
from iottb.models.device_metadata_model import DeviceMetadata
|
|
|
|
logger.setLevel(logging.INFO) # Since module currently passes all tests
|
|
|
|
|
|
def setup_init_device_root_parser(subparsers):
|
|
parser = subparsers.add_parser('add-device', aliases=['add-device-root', 'add'])
|
|
parser.add_argument('--root_dir', type=pathlib.Path, default=pathlib.Path.cwd())
|
|
group = parser.add_mutually_exclusive_group()
|
|
group.add_argument('--guided', action='store_true', help='Guided setup', default=False)
|
|
group.add_argument('--name', action='store', type=str, help='name of device')
|
|
parser.set_defaults(func=handle_add)
|
|
|
|
|
|
def handle_add(args):
|
|
logger.info(f'Add device handler called with args {args}')
|
|
|
|
args.root_dir.mkdir(parents=True,
|
|
exist_ok=True) # else metadata.save_to_file will fail TODO: unclear what to assume
|
|
|
|
if args.guided:
|
|
logger.debug('begin guided setup')
|
|
metadata = guided_setup(args.root_dir)
|
|
logger.debug('guided setup complete')
|
|
else:
|
|
logger.debug('Setup through passed args: setup')
|
|
if not args.name:
|
|
logger.error('No device name specified with unguided setup.')
|
|
return ReturnCodes.ERROR
|
|
metadata = DeviceMetadata(args.name, args.root_dir)
|
|
|
|
file_path = args.root_dir / DEVICE_METADATA_FILE
|
|
if file_path.exists():
|
|
print('Directory already contains a metadata file. Aborting.')
|
|
return ReturnCodes.ABORTED
|
|
serialized_metadata = metadata.to_json()
|
|
response = input(f'Confirm device metadata: {serialized_metadata} [y/N]')
|
|
logger.debug(f'response: {response}')
|
|
if response not in definitions.AFFIRMATIVE_USER_RESPONSE:
|
|
print('Adding device aborted by user.')
|
|
return ReturnCodes.ABORTED
|
|
|
|
logger.debug(f'Device metadata file {file_path}')
|
|
if metadata.save_to_json(file_path) == ReturnCodes.FILE_ALREADY_EXISTS:
|
|
logger.error('File exists after checking, which should not happen.')
|
|
return ReturnCodes.ABORTED
|
|
|
|
print('Device metadata successfully created.')
|
|
return ReturnCodes.SUCCESS
|
|
|
|
|
|
def configure_metadata():
|
|
pass
|
|
|
|
|
|
def guided_setup(device_root) -> DeviceMetadata:
|
|
logger.info('Guided setup')
|
|
response = 'N'
|
|
device_name = ''
|
|
while response.upper() == 'N':
|
|
device_name = input('Please enter name of device: ')
|
|
response = input(f'Confirm device name: {device_name} [y/N] ')
|
|
if device_name == '' or device_name is None:
|
|
print('Name cannot be empty')
|
|
logger.warning('Name cannot be empty')
|
|
logger.debug(f'Response is {response}')
|
|
logger.debug(f'Device name is {device_name}')
|
|
|
|
return DeviceMetadata(device_name, device_root)
|