Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - austind/npm_bind: Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM · GitHub
Skip to content

Latest commit

History

29 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

npm_bind

DISCLAIMER: This is alpha code. Expect bugs, issues, and the likelihood of major behavioral changes.

Overview

Auto-generates BIND9-compatible forward and reverse DNS zone / config files for all L3 interfaces in SolarWinds Orion NPM.

  1. Queries the SolarWinds Information Service (SWIS) for a list of all managed layer 3 interfaces, using SolarWinds Query Language (similar syntax to native SQL)
  2. Generates forward lookup records (A and CNAME)
  3. Generates reverse lookup records (PTR)
  4. Creates the appropriate BIND9 zone and configuration files

At this time, npm_bind does not automatically copy or enable the generated BIND9 config. This must be done manually for DNS changes to take effect.

Setup

Python

Required modules:

SolarWinds NPM

npm_bind depends on two custom fields added to NPM:

  1. IPAddress interface custom field. This allows for manually-defined interface addresses in cases when the SNMP-queried address is incorrect or nonexistent.
  2. DeviceClass node custom field. Helpful in differentiating types of nodes (e.g. network devices vs. servers)

Script Config

All npm_bind config resides in config/config.yaml. Refer to inline comments for details.

Templates

All BIND9 files are generated from jinja2 templates located in config/templates. They will need little or no modification.

Source Data

npm_bind has two data sources:

  1. SolarWinds NPM, as received by the SolarWinds API (SWIS)
  2. Manual input, as defined in config.yaml.

The objective of this project is to rely as heavily as possible on NPM as the source of truth, using manual input as sparingly as possible. Ideally, npm_bind will need little or no post-deployment adjustment; all relevant changes occur directly in NPM.

Schema

Data begins as a list of dicts (iface_list) with the following schema:

  • node_id - Node unique ID as assigned by NPM
  • node_uri - Node SWIS URI (beginning with swis://)
  • node_name - Node hostname (SWIS caption property)
  • node_addr - Node polling IP address
  • node_fqdn - Node fully-qualified domain name
  • node_class - DeviceClass NPM custom property. I use this to differentiate between network nodes and servers.
  • iface_id - Interface unique ID as assigned by NPM
  • iface_uri - Interface SWIS URI (beginning with swis://)
  • iface_name - Interface description, which includes both the device's interface name (e.g. Gi0/1) and any administratively assigned description string
  • iface_speed - Interface's negotiated speed in bits per second (bps). Note: a) that NPM does not accurately query this value in all cases, and b) that the interface's negotiated speed may differ from its line speed.

SWQL Query

npm_bind ships with an example query in config/query.swql. This is tailored to our use-case, but will likely need minimal or no adjustment, as long as the custom fields described above are created and populated.

Query Details

Orion NPM can query an interface's IP address via SNMP for many devices, but certain vendors do not support that (notably: Palo Alto). For such devices, their managed interfaces in Orion will show as "Unknown" IP address.

To further complicate things, best I can tell, Orion does not allow us to administratively set an interface's IP address, either via the web GUI or SWIS.

The workaround here is to create an interface custom property called IPAddress and manually set that in NPM. We then have two fields from which we may obtain an interface's IP address.

If the interface's custom property IPAddress is set, that takes precedence over an interface's SNMP address.

If an interface has neither an administratively-defined nor an SNMP-queried IP address, it is not included in the result set at all.

Returns a list of all managed interfaces known by Orion NPM that have the DeviceClass custom property set to "Network" and have either an SNMP-queried L3 address, or an administratively-set IP address via an interface custom property called IPAddress.

Documentation and References:

About

Auto-generates BIND-compatible forward and reverse DNS zone files and configuration for all L3 interfaces in SolarWinds Orion NPM

Resources

Stars

6 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages