mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 21:10:29 +01:00
Add a custom script variable for IP addresses #2878
Closed
opened 2025-12-29 18:23:01 +01:00 by adam
·
11 comments
No Branch/Tag Specified
main
update-changelog-comments-docs
feature-removal-issue-type
20911-dropdown
20239-plugin-menu-classes-mutable-state
21097-graphql-id-lookups
feature
fix_module_substitution
20923-dcim-templates
20044-elevation-stuck-lightmode
feature-ip-prefix-link
v4.5-beta1-release
20068-import-moduletype-attrs
20766-fix-german-translation-code-literals
20378-del-script
7604-filter-modifiers-v3
circuit-swap
12318-case-insensitive-uniqueness
20637-improve-device-q-filter
20660-script-load
19724-graphql
20614-update-ruff
14884-script
02496-max-page
19720-macaddress-interface-generic-relation
19408-circuit-terminations-export-templates
20203-openapi-check
fix-19669-api-image-download
7604-filter-modifiers
19275-fixes-interface-bulk-edit
fix-17794-get_field_value_return_list
11507-show-aggregate-and-rir-on-api
9583-add_column_specific_search_field_to_tables
v4.5.0
v4.4.10
v4.4.9
v4.5.0-beta1
v4.4.8
v4.4.7
v4.4.6
v4.4.5
v4.4.4
v4.4.3
v4.4.2
v4.4.1
v4.4.0
v4.3.7
v4.4.0-beta1
v4.3.6
v4.3.5
v4.3.4
v4.3.3
v4.3.2
v4.3.1
v4.3.0
v4.2.9
v4.3.0-beta2
v4.2.8
v4.3.0-beta1
v4.2.7
v4.2.6
v4.2.5
v4.2.4
v4.2.3
v4.2.2
v4.2.1
v4.2.0
v4.1.11
v4.1.10
v4.1.9
v4.1.8
v4.2-beta1
v4.1.7
v4.1.6
v4.1.5
v4.1.4
v4.1.3
v4.1.2
v4.1.1
v4.1.0
v4.0.11
v4.0.10
v4.0.9
v4.1-beta1
v4.0.8
v4.0.7
v4.0.6
v4.0.5
v4.0.3
v4.0.2
v4.0.1
v4.0.0
v3.7.8
v3.7.7
v4.0-beta2
v3.7.6
v3.7.5
v4.0-beta1
v3.7.4
v3.7.3
v3.7.2
v3.7.1
v3.7.0
v3.6.9
v3.6.8
v3.6.7
v3.7-beta1
v3.6.6
v3.6.5
v3.6.4
v3.6.3
v3.6.2
v3.6.1
v3.6.0
v3.5.9
v3.6-beta2
v3.5.8
v3.6-beta1
v3.5.7
v3.5.6
v3.5.5
v3.5.4
v3.5.3
v3.5.2
v3.5.1
v3.5.0
v3.4.10
v3.4.9
v3.5-beta2
v3.4.8
v3.5-beta1
v3.4.7
v3.4.6
v3.4.5
v3.4.4
v3.4.3
v3.4.2
v3.4.1
v3.4.0
v3.3.10
v3.3.9
v3.4-beta1
v3.3.8
v3.3.7
v3.3.6
v3.3.5
v3.3.4
v3.3.3
v3.3.2
v3.3.1
v3.3.0
v3.2.9
v3.2.8
v3.3-beta2
v3.2.7
v3.3-beta1
v3.2.6
v3.2.5
v3.2.4
v3.2.3
v3.2.2
v3.2.1
v3.2.0
v3.1.11
v3.1.10
v3.2-beta2
v3.1.9
v3.2-beta1
v3.1.8
v3.1.7
v3.1.6
v3.1.5
v3.1.4
v3.1.3
v3.1.2
v3.1.1
v3.1.0
v3.0.12
v3.0.11
v3.0.10
v3.1-beta1
v3.0.9
v3.0.8
v3.0.7
v3.0.6
v3.0.5
v3.0.4
v3.0.3
v3.0.2
v3.0.1
v3.0.0
v2.11.12
v3.0-beta2
v2.11.11
v2.11.10
v3.0-beta1
v2.11.9
v2.11.8
v2.11.7
v2.11.6
v2.11.5
v2.11.4
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.10
v2.10.9
v2.11-beta1
v2.10.8
v2.10.7
v2.10.6
v2.10.5
v2.10.4
v2.10.3
v2.10.2
v2.10.1
v2.10.0
v2.9.11
v2.10-beta2
v2.9.10
v2.10-beta1
v2.9.9
v2.9.8
v2.9.7
v2.9.6
v2.9.5
v2.9.4
v2.9.3
v2.9.2
v2.9.1
v2.9.0
v2.9-beta2
v2.8.9
v2.9-beta1
v2.8.8
v2.8.7
v2.8.6
v2.8.5
v2.8.4
v2.8.3
v2.8.2
v2.8.1
v2.8.0
v2.7.12
v2.7.11
v2.7.10
v2.7.9
v2.7.8
v2.7.7
v2.7.6
v2.7.5
v2.7.4
v2.7.3
v2.7.2
v2.7.1
v2.7.0
v2.6.12
v2.6.11
v2.6.10
v2.6.9
v2.7-beta1
Solcon-2020-01-06
v2.6.8
v2.6.7
v2.6.6
v2.6.5
v2.6.4
v2.6.3
v2.6.2
v2.6.1
v2.6.0
v2.5.13
v2.5.12
v2.6-beta1
v2.5.11
v2.5.10
v2.5.9
v2.5.8
v2.5.7
v2.5.6
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.9
v2.5-beta2
v2.4.8
v2.5-beta1
v2.4.7
v2.4.6
v2.4.5
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.7
v2.4-beta1
v2.3.6
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.10
v2.3-beta2
v2.2.9
v2.3-beta1
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.6
v2.2-beta2
v2.1.5
v2.2-beta1
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.10
v2.1-beta1
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v2.0-beta3
v1.9.6
v1.9.5
v2.0-beta2
v1.9.4-r1
v1.9.3
v2.0-beta1
v1.9.2
v1.9.1
v1.9.0-r1
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.3
v1.7.2-r1
v1.7.1
v1.7.0
v1.6.3
v1.6.2-r1
v1.6.1-r1
1.6.1
v1.6.0
v1.5.2
v1.5.1
v1.5.0
v1.4.2
v1.4.1
v1.4.0
v1.3.2
v1.3.1
v1.3.0
v1.2.2
v1.2.1
v1.2.0
v1.1.0
v1.0.7-r1
v1.0.7
v1.0.6
v1.0.5
v1.0.4
v1.0.3-r1
v1.0.3
1.0.0
Labels
Clear labels
beta
breaking change
complexity: high
complexity: low
complexity: medium
needs milestone
netbox
pending closure
plugin candidate
pull-request
severity: high
severity: low
severity: medium
status: accepted
status: backlog
status: blocked
status: duplicate
status: needs owner
status: needs triage
status: revisions needed
status: under review
topic: GraphQL
topic: Internationalization
topic: OpenAPI
topic: UI/UX
topic: cabling
topic: event rules
topic: htmx navigation
topic: industrialization
topic: migrations
topic: plugins
topic: scripts
topic: templating
topic: testing
type: bug
type: deprecation
type: documentation
type: feature
type: housekeeping
type: translation
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/netbox#2878
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @jeremystretch on GitHub (Sep 17, 2019).
Environment
Proposed Functionality
Add a variable type for representing IP addresses in custom scripts. This would be similar to the existing
IPNetworkVar, but for individual IPs rather than prefixes.Use Case
Adding this variable type will allow for validation of IP addresses.
Database Changes
None
External Dependencies
None
@jeremystretch commented on GitHub (Sep 17, 2019):
Considering this further,
IPNetworkVarcurrently accepts either a network or an IP address. Is it worth splitting these into separate variable types?@dgarros commented on GitHub (Oct 1, 2019):
if
IPNetworkVaralready accept an IP address it's probably not necessary to have a dedicated variable type for IP ..@jeremystretch commented on GitHub (Oct 1, 2019):
I can imagine instances where you want to prompt the user for specifically either an IP address (e.g. defining an NTP server) or a prefix (e.g. a site aggregate). It should be minimal effort to introduce an
IPAddressVarvariable and enforce a specific type for each.@jeremystretch commented on GitHub (Jan 15, 2020):
@hSaria I started commenting on #3924 but wanted to share some more thoughts here.
IMO we should accept a mask value for IP addresses. I think the ideal behavior for the two fields would be:
IPAddressVar: Accepts a host IP, with or without a maskIPNetworkVar: Accepts a network (non-host) address; requires a maskIPAddressVarwould be suitable for representing either assigned IPs (with a mask) or source/destination addresses (no mask), whereasIPNetworkVarwould represent a prefix (e.g. a route).I think it would make sense to allow the user to require or disable the innclusion of a mask on
IPAddressVarto support the two different use cases.@hSaria commented on GitHub (Jan 15, 2020):
I'm not quite following. Wouldn't an
IPNetworkVarreturn an object ofnetaddr.IPNetworkwhich already has a subnet mask in it?So wouldn't that be used in case a subnet mask is needed for an address? I figured that, from your NTP example, you'd want the user to indicate that this is an IP with no relation to the L3 domain it lives in, like – as you mentioned – a source/destination address.
I'm probably misunderstanding, but I'm not sure how
IPAddressVarwould be different fromIPNetworkVarat that point since they both accept subnet masks (i.e. what condition/check would I put inIPAddressVarthat it warrants its own type).@jeremystretch commented on GitHub (Jan 15, 2020):
There are three use cases for an IP-like value that I can think of:
A prefix must include a mask and must not be a host address. For example,
192.0.2.0/24is valid but192.0.2.17/24is not, because we want to define the prefix itself rather than an IP within the prefix. (I realize that192.0.2.17/24is essentially identical to192.0.2.0/24and will resolve fine in most cases. This is simply about sanity-checking and validation.)Where we run into an issue is the way
netaddrwants to represent IP objects: The first two use cases would require anIPAddressand anIPNetwork, respectively. So this boils down to whether it's acceptable to pass either type to the script context, depending on how theIPAddressVaris invoked. For example:would return an
IPAddressobject (no mask), butwould return an
IPNetworkobject (with a mask).Granted it may not be the most intuitive approach, but I do think we need to support all three discrete use cases above.
@hSaria commented on GitHub (Jan 15, 2020):
Ah, now I see. That would introduce a change to the
IPNetworkVarto make it so it'll check that it's a network (i.e.IPNetwork.network != IPNetwork.ip) or just throw away the host bits (i.e. returnIPNetwork.cidr) when returning the object. Is that okay?Edit: another option would be to add an optional argument to
IPNetworkVarthat will strip the host bits (or raise an exception). So that would leave us withIPAddressVar: address, no maskIPNetworkVar (default/existing): return network while keeping the hostbitsIPNetworkVar (network=True): returns network with the hostbits removed or raises an exception (not sure which is better)This would be backwards compatible with existing scripts.
@jeremystretch commented on GitHub (Jan 16, 2020):
We should maintain the current validation behavior when creating a prefix normally in NetBox, which is to raise a ValidationError. For example, if I try to create the prefix
192.0.2.123/24, it fails with an error:(Again, this is primarily a sanity check against the input data.)
We should use
IPAddressVarfor IPs andIPNetworkVarfor networks, since that it was a script author would expect.@hSaria commented on GitHub (Jan 16, 2020):
I fully agree.
That's the thing. The current behavior for
IPNetworkVaris to quietly accept a network with host bits. I'm happy to change it so it raisesValidationErrorif this is the case, but that would entail people changing up their scripts. Let me know if what you'd like do with that regard (i.e. to start raising an exception or not to).Final thing: do you want
IPAddressVarto returnnetaddr.IPAddresswhich has no mask ornetaddr.IPNetworkwhich has one?@jeremystretch commented on GitHub (Jan 16, 2020):
Yeah, I think we've tolerated
IPNetworkVarbeing overloaded simply because there was no other option for representing an IP address (other than a raw string). I'm fine with changing it; we'll just need to ensure it gets documented clearly.I think that's really the only option. Should be fine so long as the script author knows to expect either type (which should be indicated in the documentation for the field).
@hSaria commented on GitHub (Jan 16, 2020):
Alright, I've adjusted the PR.
Best way to answer an
orquestion 🤣; I assumed you meant the latter.