Hide unused network interfaces in Zabbix - snmp

I am interested in filtering out network interfaces that aren't connected to make things a bit simpler. I tried the filter
{#SNMPVALUE} : ^u|^1
on this page:https://www.zabbix.com/forum/showthread.php?t=37656
I added it to the filter on "Template OS Linux: Network interface discovery" but that just hides all network interfaces. I am not sure if there have been some updates in how I should filter that out in the newer versions of Zabbix.

The forum thread you found talks about discovering SNMP interfaces, while the template you mentioned is for Linux.
For the agent interface discovery, {#SNMPVALUE} is not populated at all, thus your filter never matches.
To filter out interfaces, you would have to figure out the criteria. The built-in interface discovery only returns the interface name, thus there is no way to filter interfaces by another criteria - unless you implement a custom LLD.
Built-in support for filtering agent interfaces by state is requested in the comments of ZBXNEXT-2286.

Related

Binding golang sockets to a specific interface globally

I've been working with a golang application lately that does network i/o using a bunch of protocols- HTTP (TCP), DNS and WHOIS (UDP) as well as a few others. Some make use of third-party APIs
The application is open-source so I would like to make changes allowing me to specify the network interface for the sockets to bind to, allowing me to use different interfaces depending on a runtime flag. The only way around this without writing code would be to modify the system-wide routing table each time I want to utilize a different interface, which isn't a very appealing solution
Before I go an modify every instance where a Dialer is used (or try to create a wrapper that they can all use) is there a golang feature that would allow setting the interface globally once, so that the various Dialer invocations would "Just Work"- and adhere to the interface I specified?
I did some searching and have only found ways to do this when each Dialer is created (using DialerContext.LocalAddr) but given I'm really a C programmer and not a golang programmer, I realize I may be totally missing a golang idiom for doing something like this

Detect network connection availability changes

I am writing a Go application for Mac and Windows, which will perform some action whenever there is a network change( Client move from Wi-fi 1 to Wi-fi 2 or to 3G to LAN). I am aware of a solution for Application running on mac in swift language but I am looking for a platform-agnostic solution here.
So far I have tried checking for an event on an interface but I am not sure if that is sufficient.
I expect that on a network change (moving from Wifi-1 to Wifi-2 or 3G or LAN) my Go app should be able to know to take some action.
I doubt there would be such a solution.
Every project which tries to provide some platform-agnostic solution to an inherently OS-tied problem inevitably hides the platform-specific details behind a common API.
Look at https://github.com/fsnotify/fsnotify for a good example.
So, I'd take that route and would have put up a package which would have two platform-specific "backends" which would be compiled conditionally using build tags.
To get notified about network-related events under Windows,
you should probably start here.
Unfortunately, this stuff is COM-oriented, but you could use https://github.com/go-ole/go-ole to help with that.
You might also ask a non-Go-specific question tagged winapi to ask about what would be the best way to hook into the kernel to get notified about the availability of the networks.
There is no platform agnostic solution that exists, however platforms like OSx,Linux,Windiws has ways to get network events with their platform specific limitations.
OSx: Raw socket SOCK_RAW of AF_ROUTE type can be used to detect any network events that occurs in user machine. there are various types of network event that can be detected.
This thread talk about an example on BSD for network event
Windows : Windows has its APIs given as part of iphlpapi library. APIs like NotifyAddrChange, NotifyRouteChange allows you to have almost all network events( apart from metric change etc.) this git repo has a working example NotifyAddrChange, which gives back and event whenever a interface goes down or comes up.
Linux : In Linux netlink sockets allows a user space application to receive network events using netlink sockets.

SNMP in context of SDN

SNMP is generally used to monitor the health of components in network.
For SDN [Software Defined network], is it desirable to use SNMP . I am having doubt like is it better to use some other protocol like NETCONFIG
In general SNMP can be used for configuration of a device, however personally I will not stretch it too far specifically when network configuration operation potentially spans across multiple devices and as a result will have higher order transaction requirements.
RFC3512 provides good perspective around configuration using SNMP. Reading through the RFC it will become apparent that within a device transaction relies on how well the MIBs (the objects used via SNMP for performing configuration changes) are designed and implemented. For configuration spanning across multiple devices the device transaction alone will not suffice, if rolling back the configuration is a requirement (this depending on the nature of service/use-case being addressed by your SDN controller). I would recommend reading the Transaction Control in MIB Objects further to understand the requirements on the protocol and eventually the capabilities of the MIB modules that one will be using for configuration.
Netconf was created with configuration of devices in mind and it offers various capabilities that are of use in this regard. These are covered in detail in the IETF standard for Netconf Protocol RFC under Capabilities section. The capabilities such as Candidate Configuration, Validate Configuration, Confirmed Commit, Rollback on Error and other such are specified in the standard which shall further aid in orchestration of a transaction across multiple device.

OIDs expected by NMS to draw the topology

I am writing a SNMP Agent for an Ethernet switch.
The agent is able to run and reply to provide SysDescr. It has been written in a modular design, such that, one can add OIDs very easily.
Now, my intention is to create a topology (say ring) of the switches and discover the topology using a common Network Management System like HP-NNMi or OpenNMS (I am testing on OpenNMS btw).
I just want to know, what oids are queried by an NMS, to gather enough information to draw the topology?
[EDIT] I can know, what is the MAC of the remote switches connected to any port of a switch, through MAC learning.
The answer depends on what type of topology you want to capture through your ethernet switch. Usually for a layer two switch (which appears to be the case) LLDP MIB (This is an IEEE std implemented by many switches) is quite useful. From what you described above that is you have information about MACs on a port it appears you probably can go this route. There are some other Physical topology MIBs (like RFC2292) that you may want to look at.
You can have a look at the OpenNMS Enhanced Linkd documentation. It will give you some hints which OID's are used to build a Layer-2 topology based on LLDP, CDP and the Bridge MIB. To build it a topology based on the Bridge MIB, OpenNMS has implemented the algorithm described in Topology Discovery for Large Ethernet Networks. You'll find also hints what information is used to build an OSPF and IS-IS topology.
Every NMS uses their proprietary topology discovery.
Depending on what your switch supports, you'll want to consider at least
RFC1213-MIB ipAddrTable, ipRouteTable
IF-MIB ifTable
IP-FORWARD-MIB inetCidrRouteTable
BRIDGE-MIB dot1dTpFdbTable, dot1dStpPortTable
Q-BRIDGE-MIB dot1qTpFdbTable
LLDP-MIB lldpLocPortTable, lldpRemTable
OSPF-MIB
BGP4-MIB
and if you support VLANs, you'll want to describe those.
We have seen other MIBs queried by NMS applications.

How to determine whether a printer supports bidirectional communication, or not

I am using the Print Spooler API to automate some printer management tasks; currently I work on certain functionality that requires bidirectional communication, which is not a problem (sending BIDI requests and reading output data works as expected) but before trying to do a request, I would like to assure that BIDI communication is supported by the acual device (to avoid any COM exceptions).
The documentation about Print Spooler Components explains, that both the application and the driver must implement the bidirectional communication interfaces; of course I did that for my application (otherwise no requests can be send), but the driver is usually provided by a third-party. Furthermore the print provider DLL must implement the SendRecvBidiData function...
Since the Enable bidirectional communication option is available for any printer (via printer properties dialog), I assume it must be possible to easily query this information from the system (in case of the feature is not supported the checkbox is disabled, for instance).
I already checked the various DRIVER_INFO_X and PRINTER_INFO_X structures, but none of them contain a BIDI flag, or such... I also had the idea that this information might be inferred from the driver itself.
Is there a way to determine if the driver implements the required interfaces, or any other solution that allows to infer whether the driver supports bidirectional communication, or not?
Check the Attributes member on PRINTER_INFO_2, there is an undocumented entry:
PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800

Resources