NDCT/ndct/cli/configuration.py

93 lines
2.8 KiB
Python
Raw Permalink Normal View History

2024-06-09 19:22:26 +01:00
import click
import os
import difflib
import yaml
import sys
from jinja2 import Environment, FileSystemLoader
from ndct.core.device import Device
from ndct.core.log import log
from ndct.core.paths import METADATA_PATH, MODULE_PATH, CONFIG_PATH
@click.command(short_help = 'Generate a configuration')
@click.option('-n', '--name', help='Name', required = True)
def generate(name):
'''
Summary:
Generates a configuration file for a specified device.
Takes:
name: Device to generate configuration for
'''
Device.get_devices_from_file()
if os.path.isfile(METADATA_PATH + name + '_metadata.yaml'):
with open(METADATA_PATH + name + '_metadata.yaml', 'r') as metadata:
device_metadata = (yaml.safe_load(metadata))
else:
log('[{}] Metadata does not exist'.format(name), 'info')
sys.exit(1)
device_os = Device.get_device_information(name)['os']
environment = MODULE_PATH + device_os + '/'
j2_env = Environment(loader=FileSystemLoader(environment), trim_blocks=True, lstrip_blocks=True)
for device, data in device_metadata.items():
configuration = j2_env.get_template('template.j2').render(data)
with open(CONFIG_PATH + name + '_generated.txt', 'w') as generated_config_file:
generated_config_file.write(configuration)
log('[{}] Generated configuration'.format(name), 'info')
@click.command(short_help = 'List configuration files')
def stored():
'''
Summary:
Lists all stored configuration files.
Takes:
none
'''
configurations = os.listdir(CONFIG_PATH)
if configurations:
log('Stored configuration files:', 'info')
for configuration_file in configurations:
if configuration_file != '__init__.py':
log(configuration_file, 'info')
else:
log('No configuration files stored', 'info')
@click.command(short_help = 'Show the difference between two configuration files')
@click.option('-c1', '--config1', help='Configuration file 1', required = True)
@click.option('-c2', '--config2', help='Configuration file 2', required = True)
def diff(config1, config2):
'''
Summary:
Outputs the difference between two device configuration files by comparing them line by line.
Takes:
config1: First configuration file
config2: Configuration file to compare with
'''
config1_lines = open(CONFIG_PATH + config1).read().splitlines()
config2_lines = open(CONFIG_PATH + config2).read().splitlines()
diff = difflib.unified_diff(config1_lines, config2_lines)
log('Diff for [{}] < > [{}]'.format(config1, config2), 'info')
for line in diff:
if line[0] == '+' and line[1] != '+':
log('\033[0;32m{}\033[m'.format(line), 'info')
elif line[0] == '-' and line[1] != '-':
log('\033[0;31m{}\033[m'.format(line), 'info')
@click.group(short_help = 'Configuration commands')
def configuration():
pass
configuration.add_command(generate)
configuration.add_command(stored)
configuration.add_command(diff)