Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
164 commits
Select commit Hold shift + click to select a range
6af3dc3
Merge pull request #330 from marcinpsk/fix/object-scoped-lookups
bonzo81 Aug 18, 2026
afca5fd
fix(import,tables,templates): harden malformed payloads + migrated-mo…
marcinpsk Jun 16, 2026
9c10bbf
feat(pci): parent/LAG/child interface UI and PortStackLagPattern
marcinpsk May 30, 2026
eab0a14
fix(pci): address CodeRabbit review (sub-interface notice XSS, siblin…
marcinpsk Jun 8, 2026
245e47e
fix(pci): refresh Parent/LAG cell on VC member switch; prefetch lag/p…
marcinpsk Jun 9, 2026
c0206c7
fix(pci): scope perms/lookups correctly for VM parent sync, OOB rows,…
marcinpsk Jun 9, 2026
7921d16
fix(pci): scope LAG name-pattern matching to the device's LibreNMS OS
marcinpsk Jun 9, 2026
f55eeae
fix(pci): harden LAG/parent sync fetch, port_stack, VC target, messag…
marcinpsk Jun 9, 2026
f7d6806
fix(pci): reject cross-member links, skip OOB enrichment, guard paylo…
marcinpsk Jun 10, 2026
08bf5ae
fix(pci): expose description filter field, fix F401 noqa placement, a…
marcinpsk Jun 10, 2026
937fdc7
fix(pci): key cross-page LAG/parent selection by stable port_id
marcinpsk Jun 10, 2026
31ccfee
fix(pci): resolve verify-row NetBox interface by stable port_id, not …
marcinpsk Jun 10, 2026
1e4d158
fix(pci): drop unused _server_key class annotation on _PortIdResolveM…
marcinpsk Jun 10, 2026
f48bcb8
fix(pci): harden port_stack fetch, warn on incomplete LAG data, stabl…
marcinpsk Jun 10, 2026
460e972
fix(pci): run auto-select on shift-click range selection too
marcinpsk Jun 10, 2026
4847701
fix(pci): gate verify endpoint, normalize port_id, align VC cache key…
marcinpsk Jun 10, 2026
646ed7e
fix(pci): comment block, marker-gated delete, unique verify row, gate…
marcinpsk Jun 11, 2026
535236a
fix(pci): fail get_port_stack on malformed mappings instead of maskin…
marcinpsk Jun 11, 2026
917ad4a
fix(pci): fail port_stack on non-object payload; target sync by row, …
marcinpsk Jun 11, 2026
f5abeb2
fix(pci): name-hint uses active display field, generic skip reason, a…
marcinpsk Jun 11, 2026
94c06a9
fix(pci): scope LAG port_stack inference to host ports; lock relation…
marcinpsk Jun 11, 2026
42a7c64
fix(pci): port_stack error status, JSON perm errors, robust verify bu…
marcinpsk Jun 12, 2026
f9f54b6
fix(pci): stable-id LAG/parent match and row-targeted missing_nb sync
marcinpsk Jun 12, 2026
f88b8c4
fix(pci): preserve server_key on interface refresh, normalize relatio…
marcinpsk Jun 12, 2026
edd0044
fix(pci): validate LAG/parent links before saving
marcinpsk Jun 12, 2026
1c5ff8f
fix(pci): don't echo validation exception detail in LAG/parent link r…
marcinpsk Jun 12, 2026
dbba132
fix(pci): harden port relationship resolution (malformed names, ambig…
marcinpsk Jun 13, 2026
7486ed6
fix(pci): suppress migrated-donor relationship sync, narrow name-hint…
marcinpsk Jun 13, 2026
333b8a6
fix(pci): finish migrated-mode NetBox-only modal + don't re-enable st…
marcinpsk Jun 13, 2026
d303223
fix(pci): normalize port_id key types; gate verify re-enable on success
marcinpsk Jun 13, 2026
d7bdf82
fix(pci): honor port_stack error status before mappings; roll back ve…
marcinpsk Jun 13, 2026
23cfdad
fix(pci): pin lag/parent resolution to the row's owner; reject cross-…
marcinpsk Jun 13, 2026
afa874c
test(pci): convert port_id interface resolution to real DB
marcinpsk Jun 14, 2026
a6fce03
test(pci): real objects for same-owner guard + lag/parent builders
marcinpsk Jun 14, 2026
5d23e0d
test(oob): real Device/Interface for OOB-row context reconciliation
marcinpsk Jun 14, 2026
cddd266
fix(pci): store canonical port-record ids in sub_interfaces map
marcinpsk Jun 14, 2026
6418e4a
fix(pci): roll back VC member dropdown through TomSelect, not the bar…
marcinpsk Jun 14, 2026
3c8765a
refactor(pci): let format_html be the single escape point for relatio…
marcinpsk Jun 14, 2026
2eecb27
fix(interfaces): detect LAG signals on the selected interface-name field
marcinpsk Jun 15, 2026
ddc013d
fix(interfaces): emit server_key in migrated mode for JS-driven POSTs
marcinpsk Jun 15, 2026
45f03b4
fix(librenms): log a warning when a configured LAG name pattern fails…
marcinpsk Jun 15, 2026
a335230
fix(ui): fail fast on missing CSRF token before relationship-sync POST
marcinpsk Jun 15, 2026
13a7bde
fix(ui/tests): reject empty CSRF token value; check every bulk-select…
marcinpsk Jun 15, 2026
d16774f
fix(ui): seed VC-member verified baseline from select.value fallback
marcinpsk Jun 15, 2026
825a60e
fix(librenms): catch JSON decode errors before broad request exceptio…
marcinpsk Jun 16, 2026
cc02999
test(tables): guard that the LAG sync button lives in the combined Pa…
marcinpsk Jun 16, 2026
6209ab2
fix(pci): clear cross-page auto-parents when auto-select LAG members …
marcinpsk Jun 17, 2026
008492b
fix(pci): guard non-string device_os; seed VC rollback baseline at init
marcinpsk Jun 18, 2026
725bd7a
fix(pci): restore LibreNMS ID column + readable relationship badge; i…
marcinpsk Jun 19, 2026
78f14f9
fix(pci): make the Match relationship badge readable; assert badge co…
marcinpsk Jun 19, 2026
41f92cf
ui(pci): compact single-pill Parent/LAG badges for narrow screens
marcinpsk Jun 19, 2026
5b3f637
fix(pci): guard VC member lookup against a missing interface name
marcinpsk Jun 20, 2026
6eb0ffb
docs: align production docstrings to Google-style
marcinpsk Jun 20, 2026
228c75a
docs(tests): condense test docstrings to the one-line convention
marcinpsk Jun 20, 2026
dcca151
fix(pci): preserve a port-id-resolved interface in format_interface_data
marcinpsk Jun 21, 2026
bf0e7bc
fix(interfaces): exclude OOB rows from relationship sync; guard malfo…
marcinpsk Jun 21, 2026
7cf92d6
fix(interfaces): preserve an empty VC-member baseline for verify roll…
marcinpsk Jun 21, 2026
6e455db
docs(interfaces): correct the LAG-aggregate port_stack position note
marcinpsk Jun 21, 2026
92b1f2d
fix(librenms): disable LAG name-pattern matching for a present-but-un…
marcinpsk Jun 22, 2026
ef2bb20
fix(interfaces): restore shared agg_iface.type when a LAG member fail…
marcinpsk Jun 22, 2026
82c19d2
fix(js): respect a blank VC member-select instead of falling back to …
marcinpsk Jun 22, 2026
a70fce4
fix(interfaces): guard nested lag_members/sub_interfaces maps against…
marcinpsk Jun 22, 2026
9bb262e
fix(interfaces): restrict physical-name normalization to numeric .N s…
marcinpsk Jun 23, 2026
ea75700
fix(interfaces): repaint the member-specific LibreNMS ID badge on VC …
marcinpsk Jun 23, 2026
8fe5ed1
test(pci): repoint the interfaces render patch to the mixin chokepoint
marcinpsk Jun 23, 2026
9952cc4
fix(pci): pin migration 0011 to the NetBox 4.2 extras floor (0122)
marcinpsk Jun 23, 2026
1e0cb55
fix(pci): position-independent, id-normalized port_stack relationship…
marcinpsk Jun 23, 2026
04dd46f
fix(pci): harden verify-path relationship-cache read against malforme…
marcinpsk Jun 23, 2026
4ac6032
fix(pci): stop treating propVirtual as a LAG-fetch signal; real-DB mo…
marcinpsk Jun 23, 2026
68d27cc
refactor(pci): share the cache relationship-map prep across table and…
marcinpsk Jun 23, 2026
b4b3db3
feat(pci): expose the inline relationship sync button on a mismatch row
marcinpsk Jun 23, 2026
30cbb3f
refactor(pci): unify the LAG/parent single-row sync views on a shared…
marcinpsk Jun 23, 2026
b34c5a0
refactor(pci): dedupe the bulk LAG/parent relationship passes
marcinpsk Jun 23, 2026
0974749
docs(pci): note the accepted low-severity ReDoS risk on lag_name_pattern
marcinpsk Jun 23, 2026
9a8ea3d
fix(pci): harden + unify the LAG/parent relationship resolve & persist
marcinpsk Jun 24, 2026
1c16041
fix(pci): consistent VC owner resolution, VM LAG suppression, OS-scop…
marcinpsk Jun 24, 2026
3b670ef
refactor(pci): reuse canonical resolver + shared validation-error helper
marcinpsk Jun 24, 2026
3f58f0b
fix(pci): resolve LAG/parent relationships by the selected name field…
marcinpsk Jun 24, 2026
4ce28b1
fix(parent-child): SAP marker across all names + context server_key i…
marcinpsk Jun 24, 2026
d28730f
fix(sync): suppress "synced successfully" when all interfaces were co…
marcinpsk Jun 25, 2026
dd40e9b
fix(pci): detect sub-interfaces across all known port names
marcinpsk Jun 25, 2026
75276e2
fix(mappings): submit pk for PortStackLagPattern bulk selection
marcinpsk Jun 29, 2026
d2dab1c
fix(parent-child): physical-port + VC-member resolution robustness
marcinpsk Jun 30, 2026
17721dd
fix(migrations): align 0011 PortStackLagPattern field state with the …
marcinpsk Jun 30, 2026
c47f33a
fix(interfaces): drop ambiguous shared names from the port name index
marcinpsk Jun 30, 2026
f3f528c
fix(models): make PortStackLagPattern.librenms_os unique case-insensi…
marcinpsk Jun 30, 2026
d894644
fix(migrations): pre-clean librenms_os casing before the CI-unique co…
marcinpsk Jul 1, 2026
5b1c4da
fix(interfaces): guard non-string names in _has_lag_signals
marcinpsk Jul 1, 2026
3e7aa98
perf(interfaces): load LAG patterns once per refresh; compute names once
marcinpsk Jul 1, 2026
5616071
perf(interfaces): resolve VC member per port from a prebuilt map, not…
marcinpsk Jul 1, 2026
7cf5239
refactor(interfaces): share LAG-aggregate type=lag promotion
marcinpsk Jul 1, 2026
80f2885
test(tables): restore real coverage of render_librenms_id colouring
marcinpsk Jul 1, 2026
5c77ab8
fix(resolver): keep nameless valid port_ids in the by_id LAG lookup
marcinpsk Jul 1, 2026
6c965a1
test(interfaces): update VC-member call assertion for the members_by_…
marcinpsk Jul 1, 2026
783b458
fix(migrate): strip before dedup/canonicalize librenms_os in 0012 pre…
marcinpsk Jul 1, 2026
c6a7836
test(migration): make 0012 strip-canonicalization a real red->green
marcinpsk Jul 1, 2026
d8fb7ae
fix(pci): skip non-string caller-supplied LAG patterns instead of cra…
marcinpsk Jul 4, 2026
5ad78af
docs(pci): correct the LAG/parent delegation comment to the single pa…
marcinpsk Jul 4, 2026
d3e78fc
feat(nav): add Port Stack LAG Patterns to the Rules & Patterns tabs
marcinpsk Jul 7, 2026
34d8564
docs(pci): document resolve_port_relationships' name-field/compiled-p…
marcinpsk Jul 7, 2026
fc55aca
fix(migrate): pin 0012 to its db alias and trim the CI-unique constraint
marcinpsk Jul 9, 2026
9fd51c8
test(interfaces): verify the repaint badge through a real virtual cha…
marcinpsk Jul 9, 2026
d39d269
fix(nav): carry aria-current="page" on the Port Stack LAG Patterns pill
marcinpsk Jul 9, 2026
5ed0abf
fix(interfaces): match LAG/parent by the user-selected name field too
marcinpsk Jul 10, 2026
a8ac555
fix(sync): survive concurrent DB conflicts in the bulk LAG/parent pass
marcinpsk Jul 10, 2026
8d1f147
fix(sync): return a JSON 409 for concurrent conflicts in the single-r…
marcinpsk Jul 11, 2026
cc022dd
fix(utils): tolerate a missing port name in get_virtual_chassis_member
marcinpsk Jul 11, 2026
be3099d
test(templates): make the migrated-guard scanner branch-aware
marcinpsk Jul 11, 2026
82c2564
test(templates): pin a non-empty CSRF token value in the VLAN sync pa…
marcinpsk Jul 11, 2026
db3d3b3
fix(parent-child): resolve R18 CodeRabbit findings
marcinpsk Jul 12, 2026
0120dc0
fix(parent-child): fail-closed OS scoping, authoritative port_id, N+1…
marcinpsk Jul 12, 2026
fb177f9
fix(parent-child): owner-pin name-hint on a VC + restore shared insta…
marcinpsk Jul 12, 2026
0f0cbb0
fix(parent-child): pin a cross-page VC parent to the child row's sele…
marcinpsk Jul 12, 2026
9af3da6
test(parent-child): drive the port_id-authoritative verify tests agai…
marcinpsk Jul 12, 2026
a3b48ed
fix(parent-child): scope VC member name-heuristic to physical/sub-int…
marcinpsk Jul 12, 2026
c3b482f
fix(parent-child): unwind an auto-selected on-page parent when its la…
marcinpsk Jul 12, 2026
917629f
fix(parent-child): preserve a manually-selected LAG member when the a…
marcinpsk Jul 12, 2026
e3f6191
refactor(parent-child): centralize relationship-map normalization; no…
marcinpsk Jul 12, 2026
dad839a
perf(parent-child): build the interface index once in single-row rela…
marcinpsk Jul 12, 2026
fd48fb1
refactor(parent-child): dedupe LAG/parent sync-status computation in …
marcinpsk Jul 12, 2026
399a3ed
refactor(parent-child): hoist the relationship status_map to a module…
marcinpsk Jul 12, 2026
19f0559
refactor(parent-child): dedupe the interface-sync Refresh button acro…
marcinpsk Jul 12, 2026
8f32900
fix(parent-child): also recognize ethernet-family names in the VC mem…
marcinpsk Jul 13, 2026
6336894
fix(migrations): renumber PortStackLagPattern migrations after develo…
marcinpsk Jul 16, 2026
099090e
fix(cascade): harden _build_relationship_maps ports + reconcile verif…
marcinpsk Jul 16, 2026
77650b2
fix(cascade): align develop-owned refresh-button test with parent-chi…
marcinpsk Jul 16, 2026
d60d157
fix(migrations): renumber parent-child migrations
marcinpsk Jul 30, 2026
eb75d93
fix(parent-child): restore persistent relationship warning
marcinpsk Jul 30, 2026
c565275
fix(review): centralize relationship validation paths
marcinpsk Aug 2, 2026
49083ae
fix(parent-child): address review follow-ups
marcinpsk Aug 2, 2026
3ef0385
fix(parent-child): harden relationship review paths
marcinpsk Aug 3, 2026
def877e
refactor(sync): move validation_error_detail to utils
marcinpsk Aug 3, 2026
112858a
fix(ui): CSS.escape the injected-parent selectors
marcinpsk Aug 3, 2026
1583df1
test(review): pin preflight tolerance; tighten verify/render seams
marcinpsk Aug 3, 2026
0ca1525
test(review): make the JS-source pins mutation-proof
marcinpsk Aug 3, 2026
ecbe4c3
fix(vc): treat an empty prefetched member map as no map
marcinpsk Aug 4, 2026
ae014ef
test(templates): match the migrated guard as an and-conjunct
marcinpsk Aug 4, 2026
00fff22
fix(interfaces): scope the relationship sync to the user's own objects
marcinpsk Aug 4, 2026
a5a5adc
test(interfaces): patch the scoped lookup, not the removed shortcut
marcinpsk Aug 4, 2026
b6fe9c7
test(interfaces): use the configured LibreNMS API fixture
marcinpsk Aug 6, 2026
df2b2aa
fix(sync): address relationship review findings
marcinpsk Aug 6, 2026
007a74e
fix(interfaces): prefetch VM parent links
marcinpsk Aug 7, 2026
06c6eb6
test(interfaces): expect invalid targets to skip
marcinpsk Aug 7, 2026
392e614
fix(interfaces): normalize selected port ids
marcinpsk Aug 7, 2026
7069748
test(cables): remove duplicate stale-interface case
marcinpsk Aug 7, 2026
1e01a5f
fix(review): harden interface relationship checks
marcinpsk Aug 8, 2026
f78e565
fix(ui): label parent notice close button
marcinpsk Aug 8, 2026
0508a27
fix(sync): keep relationship targets current
marcinpsk Aug 9, 2026
f6e408e
refactor(sync): share locked interface target selection
marcinpsk Aug 9, 2026
8b81821
fix(interfaces): harden relationship synchronization
marcinpsk Aug 10, 2026
c9a795e
fix(interfaces): declare the chassis re-lock instead of spelling it
marcinpsk Aug 10, 2026
857b904
test(interfaces): put the verify and relationship suites on their rea…
marcinpsk Aug 10, 2026
5b001cb
test(conftest): isolate the cache and restore migration-seeded rows
marcinpsk Aug 11, 2026
565a915
test(interfaces): keep the suite-wide config mock off the stub server
marcinpsk Aug 11, 2026
4571be8
fix(interfaces): read the port_stack keys LibreNMS actually sends
marcinpsk Aug 11, 2026
2374d10
fix(interfaces): keep the cross-chassis parent link working on NetBox…
marcinpsk Aug 11, 2026
2377a3c
fix(sync): close two permission and robustness gaps, harden their tests
marcinpsk Aug 11, 2026
ae16c92
fix(tables): bind the interface table columns per instance, not on th…
marcinpsk Aug 11, 2026
ca882fa
fix(interfaces): complete review contracts
marcinpsk Aug 12, 2026
985db54
fix(interfaces): preserve VM validation errors
marcinpsk Aug 12, 2026
f321f8b
refactor(interfaces): name relationship source cases
marcinpsk Aug 12, 2026
98d5dba
test(interfaces): use configured server key
marcinpsk Aug 12, 2026
d917a1a
refactor(interfaces): share relationship row resolution
marcinpsk Aug 12, 2026
dec85f0
test(interfaces): prove incomplete relationship fetches
marcinpsk Aug 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions netbox_librenms_plugin/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
ModuleTypeMapping,
NormalizationRule,
PlatformMapping,
PortStackLagPattern,
)


Expand Down Expand Up @@ -129,3 +130,13 @@ class Meta:
"carrier_module_type",
"description",
]


class PortStackLagPatternSerializer(NetBoxModelSerializer):
"""Serialize PortStackLagPattern model for REST API."""

class Meta:
"""Meta options for PortStackLagPatternSerializer."""

model = PortStackLagPattern
fields = ["id", "librenms_os", "lag_name_pattern", "description"]
1 change: 1 addition & 0 deletions netbox_librenms_plugin/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
router.register("inventory-ignore-rules", views.InventoryIgnoreRuleViewSet)
router.register("platform-mappings", views.PlatformMappingViewSet)
router.register("carrier-auto-install-rules", views.CarrierAutoInstallRuleViewSet)
router.register("port-stack-lag-patterns", views.PortStackLagPatternViewSet)

urlpatterns = [
path("jobs/<int:job_pk>/sync-status/", views.sync_job_status, name="sync_job_status"),
Expand Down
13 changes: 13 additions & 0 deletions netbox_librenms_plugin/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
ModuleTypeMappingFilterSet,
NormalizationRuleFilterSet,
PlatformMappingFilterSet,
PortStackLagPatternFilterSet,
)
from netbox_librenms_plugin.jobs import FilterDevicesJob, ImportDevicesJob
from netbox_librenms_plugin.models import (
Expand All @@ -32,6 +33,7 @@
ModuleTypeMapping,
NormalizationRule,
PlatformMapping,
PortStackLagPattern,
)

from .serializers import (
Expand All @@ -43,6 +45,7 @@
ModuleTypeMappingSerializer,
NormalizationRuleSerializer,
PlatformMappingSerializer,
PortStackLagPatternSerializer,
)

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -144,6 +147,16 @@ class CarrierAutoInstallRuleViewSet(NetBoxModelViewSet):
serializer_class = CarrierAutoInstallRuleSerializer


class PortStackLagPatternViewSet(NetBoxModelViewSet):
"""API viewset for PortStackLagPattern CRUD operations."""

permission_classes = [LibreNMSPluginPermission]
filterset_class = PortStackLagPatternFilterSet

queryset = PortStackLagPattern.objects.all()
serializer_class = PortStackLagPatternSerializer


@api_view(["POST"])
@permission_classes([LibreNMSPluginPermission])
def sync_job_status(request, job_pk):
Expand Down
23 changes: 23 additions & 0 deletions netbox_librenms_plugin/filters.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import django_filters
from dcim.models import Manufacturer
from django.db.models import Q

from .models import (
CarrierAutoInstallRule,
Expand All @@ -10,6 +11,7 @@
ModuleTypeMapping,
NormalizationRule,
PlatformMapping,
PortStackLagPattern,
)


Expand Down Expand Up @@ -143,3 +145,24 @@ class Meta:
"librenms_child_name_pattern",
"netbox_bay_name_pattern",
]


class PortStackLagPatternFilterSet(django_filters.FilterSet):
"""Filter set for PortStackLagPattern model."""

q = django_filters.CharFilter(method="search")
librenms_os = django_filters.CharFilter(lookup_expr="icontains")
lag_name_pattern = django_filters.CharFilter(lookup_expr="icontains")
description = django_filters.CharFilter(lookup_expr="icontains")

def search(self, queryset, _name, value):
"""Search the fields exposed by the pattern list."""
return queryset.filter(
Q(librenms_os__icontains=value) | Q(lag_name_pattern__icontains=value) | Q(description__icontains=value)
)

class Meta:
"""Meta options."""

model = PortStackLagPattern
fields = ["librenms_os", "lag_name_pattern", "description"]
Comment thread
coderabbitai[bot] marked this conversation as resolved.
31 changes: 31 additions & 0 deletions netbox_librenms_plugin/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
ModuleTypeMapping,
NormalizationRule,
PlatformMapping,
PortStackLagPattern,
)

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -705,6 +706,36 @@ class PlatformMappingFilterForm(NetBoxModelFilterSetForm):
model = PlatformMapping


class PortStackLagPatternForm(NetBoxModelForm):
"""Form for creating and editing PortStackLagPattern objects."""

class Meta:
"""Meta options."""

model = PortStackLagPattern
fields = ["librenms_os", "lag_name_pattern", "description"]


class PortStackLagPatternImportForm(NetBoxModelImportForm):
"""Form for bulk importing PortStackLagPattern objects from CSV/JSON/YAML."""

class Meta:
"""Meta options."""

model = PortStackLagPattern
fields = ["librenms_os", "lag_name_pattern", "description"]


class PortStackLagPatternFilterForm(NetBoxModelFilterSetForm):
"""Form for filtering PortStackLagPattern objects."""

librenms_os = forms.CharField(required=False, label="LibreNMS OS")
lag_name_pattern = forms.CharField(required=False, label="LAG Name Pattern")
description = forms.CharField(required=False, label="Description")

model = PortStackLagPattern
Comment thread
coderabbitai[bot] marked this conversation as resolved.


class BaseSNMPForm(forms.Form):
"""
Base form with fields shared by both SNMPv1/v2c and SNMPv3 LibreNMS device forms.
Expand Down
Loading
Loading