-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhier_config_cli.py
More file actions
119 lines (95 loc) · 3.6 KB
/
hier_config_cli.py
File metadata and controls
119 lines (95 loc) · 3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import click
from hier_config import Platform, WorkflowRemediation, get_hconfig
from hier_config.utils import read_text_from_file
# Mapping for driver platforms
PLATFORM_MAP = {
"ios": Platform.CISCO_IOS,
"nxos": Platform.CISCO_NXOS,
"iosxr": Platform.CISCO_XR,
"eos": Platform.ARISTA_EOS,
"junos": Platform.JUNIPER_JUNOS,
"vyos": Platform.VYOS,
"generic": Platform.GENERIC,
"hp_comware5": Platform.HP_COMWARE5,
"hp_procurve": Platform.HP_PROCURVE,
}
@click.group()
def cli():
"""Hier Config CLI Tool"""
pass
def common_options(func):
"""Reusable options for platform, running config, and generated config."""
func = click.option(
"--platform",
type=click.Choice(PLATFORM_MAP.keys(), case_sensitive=False),
required=True,
help="Platform driver to use (e.g., ios, nxos, iosxr, eos, junos, vyos, generic).",
)(func)
func = click.option(
"--running-config",
type=click.Path(exists=True, readable=True),
required=True,
help="Path to the running configuration file.",
)(func)
func = click.option(
"--generated-config",
type=click.Path(exists=True, readable=True),
required=True,
help="Path to the generated (intended) configuration file.",
)(func)
return func
@cli.command()
@common_options
def remediation(platform, running_config, generated_config):
"""
Generate the remediation configuration.
"""
platform_enum = PLATFORM_MAP[platform.lower()]
running_config_text = read_text_from_file(running_config)
generated_config_text = read_text_from_file(generated_config)
running_hconfig = get_hconfig(platform_enum, running_config_text)
generated_hconfig = get_hconfig(platform_enum, generated_config_text)
workflow = WorkflowRemediation(running_hconfig, generated_hconfig)
click.echo("\n=== Remediation Configuration ===")
for line in workflow.remediation_config.all_children_sorted():
click.echo(line.cisco_style_text())
@cli.command()
@common_options
def rollback(platform, running_config, generated_config):
"""
Generate the rollback configuration.
"""
platform_enum = PLATFORM_MAP[platform.lower()]
running_config_text = read_text_from_file(running_config)
generated_config_text = read_text_from_file(generated_config)
running_hconfig = get_hconfig(platform_enum, running_config_text)
generated_hconfig = get_hconfig(platform_enum, generated_config_text)
workflow = WorkflowRemediation(running_hconfig, generated_hconfig)
click.echo("\n=== Rollback Configuration ===")
for line in workflow.rollback_config.all_children_sorted():
click.echo(line.cisco_style_text())
@cli.command()
@common_options
def future(platform, running_config, generated_config):
"""
Generate the future configuration.
"""
platform_enum = PLATFORM_MAP[platform.lower()]
running_config_text = read_text_from_file(running_config)
generated_config_text = read_text_from_file(generated_config)
running_hconfig = get_hconfig(platform_enum, running_config_text)
generated_hconfig = get_hconfig(platform_enum, generated_config_text)
future_config = running_hconfig.future(generated_hconfig)
click.echo("\n=== Future Configuration ===")
for line in future_config.all_children_sorted():
click.echo(line.cisco_style_text())
@cli.command()
def list_platforms():
"""
List all available platforms.
"""
click.echo("\n=== Available Platforms ===")
for platform in PLATFORM_MAP.keys():
click.echo(f"- {platform}")
if __name__ == "__main__":
cli()