93 lines
2.8 KiB
Python
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) |