Skip to content

Commit 6e4615c

Browse files
authored
Version 2.8.0
1 parent 9d6bc9d commit 6e4615c

File tree

8 files changed

+56
-13
lines changed

8 files changed

+56
-13
lines changed

docs/changelog.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
# Changelog
22

33

4+
## 2.8.0 (2024-11-10)
5+
6+
* [#76](https://github.com/miaow2/netbox-config-diff/issues/76) Add in NetBox 4.0 and higher some statistics for diff
7+
* [#81](https://github.com/miaow2/netbox-config-diff/issues/81) Fix error in rendering config with several substitutes
8+
* [#84](https://github.com/miaow2/netbox-config-diff/issues/84) Strip multiple empty lines in configs
9+
10+
## 2.7.0 (2024-09-29)
11+
12+
* [#79](https://github.com/miaow2/netbox-config-diff/issues/79) Add support for NetBox 4.1
13+
14+
This release drops support for NetBox 3.6.
15+
416
## 2.6.0 (2024-07-14)
517

618
* [#62](https://github.com/miaow2/netbox-config-diff/issues/62) Add support for NetBox 4.0

docs/colliecting-diffs.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ If you have configs in NetBox DataSource, you can define it, the script instead
4242
!!! note
4343
Only synced DataSources are acceptable
4444

45+
!!! note
46+
Diff replaces sequences of 3 or more empty lines with one empty line
47+
4548
If in your DataSource config names are different from the hostnames of the devices, you can specify config name with Jinja2 template in `Name template` field.
4649
Reference device with `{{ object }}` variable.
4750

netbox_config_diff/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
__author__ = "Artem Kotik"
1010
__email__ = "[email protected]"
11-
__version__ = "2.7.0"
11+
__version__ = "2.8.0"
1212

1313

1414
class ConfigDiffConfig(PluginConfig):

netbox_config_diff/compliance/utils.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ def __init__(self, choices, *args, **kwargs):
4040

4141
def get_unified_diff(rendered_config: str, actual_config: str, device: str) -> str:
4242
diff = unified_diff(
43-
actual_config.splitlines(),
44-
rendered_config.strip().splitlines(),
43+
re.sub("\n{3,}", "\n", actual_config).splitlines(),
44+
re.sub("\n{3,}", "\n", rendered_config).strip().splitlines(),
4545
fromfiledate=device,
4646
tofiledate=device,
4747
lineterm="",
@@ -60,3 +60,16 @@ def get_remediation_commands(name: str, platform: str, actual_config: str, rende
6060
host.load_running_config(config_text=actual_config)
6161
host.load_generated_config(config_text=rendered_config)
6262
return host.remediation_config_filtered_text(include_tags={}, exclude_tags={})
63+
64+
65+
def get_diff_statistics(diff: str) -> tuple[int, int]:
66+
lines_added = 0
67+
lines_deleted = 0
68+
69+
for line in diff.splitlines():
70+
if line.startswith("+") and not line.startswith("+++"):
71+
lines_added += 1
72+
elif line.startswith("-") and not line.startswith("---"):
73+
lines_deleted += 1
74+
75+
return lines_added, lines_deleted

netbox_config_diff/configurator/base.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,15 @@ async def _collect_one_diff(self, device: ConfiguratorDeviceDataClass) -> None:
137137

138138
device.diff = get_unified_diff(device.rendered_config, device.actual_config, device.name)
139139
self.logger.add_diff(device.name, diff=device.diff)
140-
device.missing = diff_network_config(
141-
device.rendered_config, device.actual_config, PLATFORM_MAPPING[device.platform]
142-
)
143-
device.extra = diff_network_config(
144-
device.actual_config, device.rendered_config, PLATFORM_MAPPING[device.platform]
145-
)
140+
try:
141+
device.missing = diff_network_config(
142+
device.rendered_config, device.actual_config, PLATFORM_MAPPING[device.platform]
143+
)
144+
device.extra = diff_network_config(
145+
device.actual_config, device.rendered_config, PLATFORM_MAPPING[device.platform]
146+
)
147+
except Exception as e:
148+
self.logger.log_warning(f"Unable to get missing/extra commands for {device.name}: {e}")
146149
device.patch = get_remediation_commands(
147150
device.name, device.platform, device.actual_config, device.rendered_config
148151
)

netbox_config_diff/configurator/platforms.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ def _render_substituted_config(
4646

4747
replace_sections = [(name, re.search(pattern=pattern, string=source_config)) for name, pattern in substitutes]
4848

49-
rendered_config = ""
49+
rendered_config = config_template
5050
for name, replace_section in replace_sections:
5151
if not replace_section:
52-
msg = f"substitution pattern {name} was unable to find a match in the target config" " source"
52+
msg = f"substitution pattern {name} was unable to find a match in the target configsource"
5353
self.logger.critical(msg)
5454
raise TemplateError(msg)
5555

5656
replace_group = replace_section.group()
57-
rendered_config = config_template.replace(f"{{{{ {name} }}}}", replace_group)
57+
rendered_config = rendered_config.replace(f"{{{{ {name} }}}}", replace_group)
5858

5959
# remove any totally empty lines (from bad regex, or just device spitting out lines w/
6060
# nothing on it

netbox_config_diff/templates/netbox_config_diff/configcompliance/data.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,14 @@ <h5 class="card-header">Error</h5>
3535
<div class="row mb-3">
3636
<div class="col col-md-12">
3737
<div class="card">
38-
<h5 class="card-header">Diff</h5>
38+
<h2 class="card-header">Diff
39+
{% if version|first != "3" and statistics %}
40+
<div class="card-actions">
41+
<span style="color: #1a7f37;">{{ statistics.0 }}</span> line(s) missing,
42+
<span style="color: #d1242f;">{{ statistics.1 }}</span> extra line(s)
43+
</div>
44+
{% endif %}
45+
</h2>
3946
<div class="card-body" id="diffElement"></div>
4047
</div>
4148
</div>

netbox_config_diff/views/compliance.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from netbox.views import generic
66
from utilities.views import ViewTab, register_model_view
77

8+
from netbox_config_diff.compliance.utils import get_diff_statistics
89
from netbox_config_diff.filtersets import ConfigComplianceFilterSet, PlatformSettingFilterSet
910
from netbox_config_diff.forms import (
1011
ConfigComplianceFilterForm,
@@ -25,10 +26,14 @@ class ConfigComplianceView(generic.ObjectView):
2526
template_name = "netbox_config_diff/configcompliance/data.html"
2627

2728
def get_extra_context(self, request, instance):
29+
statistics = None
30+
if instance.diff:
31+
statistics = get_diff_statistics(instance.diff)
2832
return {
2933
"instance": instance,
3034
"base_template": self.base_template,
3135
"version": VERSION,
36+
"statistics": statistics,
3237
}
3338

3439

0 commit comments

Comments
 (0)