NDCT/ndct/cli/configuration.py

93 lines
2.8 KiB
Python

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)