# Buggy code
def update(self):
    """Update network stats using the input method.

    Stats is a list of dict (one dict per interface)
    """
    # Reset stats
    self.reset()

    if self.input_method == "local":
        # Update stats using the standard system lib

        # Grab network interface stat using the PsUtil net_io_counter method
        try:
            netiocounters = psutil.net_io_counters(pernic=True)
        except UnicodeDecodeError:
            return self.stats

        # New in PsUtil 3.0
        # - import the interface's status (issue #765)
        # - import the interface's speed (issue #718)
        netstatus = {}
        try:
            netstatus = psutil.net_if_stats()
        except AttributeError:
            pass

        # Previous network interface stats are stored in the network_old variable
        if not hasattr(self, "network_old"):
            # First call, we init the network_old var
            try:
                self.network_old = netiocounters
            except (IOError, UnboundLocalError):
                pass
        else:
            # By storing time data we enable Rx/s and Tx/s calculations in the
            # XML/RPC API, which would otherwise be overly difficult work
            # for users of the API
            time_since_update = getTimeSinceLastUpdate("net")

            # Loop over interfaces
            network_new = netiocounters
            for net in network_new:
                # Do not take hidden interface into account
                if self.is_hide(net):
                    continue
                try:
                    cumulative_rx = network_new[net].bytes_recv
                    cumulative_tx = network_new[net].bytes_sent
                    cumulative_cx = cumulative_rx + cumulative_tx
                    rx = cumulative_rx - self.network_old[net].bytes_recv
                    tx = cumulative_tx - self.network_old[net].bytes_sent
                    cx = rx + tx
                    netstat = {
                        "interface_name": net,
                        "time_since_update": time_since_update,
                        "cumulative_rx": cumulative_rx,
                        "rx": rx,
                        "cumulative_tx": cumulative_tx,
                        "tx": tx,
                        "cumulative_cx": cumulative_cx,
                        "cx": cx,
                    }
                except KeyError:
                    continue
                else:
                    # Optional stats (only compliant with PsUtil 3.0+)
                    # Interface status
                    try:
                        netstat["is_up"] = netstatus[net].isup
                    except (KeyError, AttributeError):
                        pass
                    # Interface speed in Mbps, convert it to bps
                    # Can be always 0 on some OS
                    try:
                        netstat["speed"] = netstatus[net].speed * 1048576
                    except (KeyError, AttributeError):
                        pass

                    # Finaly, set the key
                    netstat["key"] = self.get_key()
                    self.stats.append(netstat)

            # Save stats to compute next bitrate
            self.network_old = network_new

    elif self.input_method == "snmp":
        # Update stats using SNMP

        # SNMP bulk command to get all network interface in one shot
        try:
            netiocounters = self.get_stats_snmp(
                snmp_oid=snmp_oid[self.short_system_name], bulk=True
            )
        except KeyError:
            netiocounters = self.get_stats_snmp(snmp_oid=snmp_oid["default"], bulk=True)

        # Previous network interface stats are stored in the network_old variable
        if not hasattr(self, "network_old"):
            # First call, we init the network_old var
            try:
                self.network_old = netiocounters
            except (IOError, UnboundLocalError):
                pass
        else:
            # See description in the 'local' block
            time_since_update = getTimeSinceLastUpdate("net")

            # Loop over interfaces
            network_new = netiocounters

            for net in network_new:
                # Do not take hidden interface into account
                if self.is_hide(net):
                    continue

                try:
                    # Windows: a tips is needed to convert HEX to TXT
                    # http://blogs.technet.com/b/networking/archive/2009/12/18/how-to-query-the-list-of-network-interfaces-using-snmp-via-the-ifdescr-counter.aspx
                    if self.short_system_name == "windows":
                        try:
                            interface_name = str(base64.b16decode(net[2:-2].upper()))
                        except TypeError:
                            interface_name = net
                    else:
                        interface_name = net

                    cumulative_rx = float(network_new[net]["cumulative_rx"])
                    cumulative_tx = float(network_new[net]["cumulative_tx"])
                    cumulative_cx = cumulative_rx + cumulative_tx
                    rx = cumulative_rx - float(self.network_old[net]["cumulative_rx"])
                    tx = cumulative_tx - float(self.network_old[net]["cumulative_tx"])
                    cx = rx + tx
                    netstat = {
                        "interface_name": interface_name,
                        "time_since_update": time_since_update,
                        "cumulative_rx": cumulative_rx,
                        "rx": rx,
                        "cumulative_tx": cumulative_tx,
                        "tx": tx,
                        "cumulative_cx": cumulative_cx,
                        "cx": cx,
                    }
                except KeyError:
                    continue
                else:
                    netstat["key"] = self.get_key()
                    self.stats.append(netstat)

            # Save stats to compute next bitrate
            self.network_old = network_new

    return self.stats


# Traceback (OSError)
Traceback (most recent call last):
File "/home/sturm/bin/anaconda3/bin/glances", line 11, in <module>
sys.exit(main())
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/__init__.py", line 134, in main
start(config=config, args=args)
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/__init__.py", line 100, in start
mode = GlancesMode(config=config, args=args)
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/standalone.py", line 69, in __init__
self.stats.update()
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/stats.py", line 192, in update
self._plugins[p].update()
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/plugins/glances_plugin.py", line 882, in wrapper
ret = fct(self, *args, **kw)
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/plugins/glances_plugin.py", line 891, in wrapper
ret = fct(*args, **kw)
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/glances/plugins/glances_network.py", line 99, in update
netstatus = psutil.net_if_stats()
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/psutil/__init__.py", line 2189, in net_if_stats
return _psplatform.net_if_stats()
File "/home/sturm/bin/anaconda3/lib/python3.6/site-packages/psutil/_pslinux.py", line 977, in net_if_stats
duplex, speed = cext.net_if_duplex_speed(name)
OSError: [Errno 19] No such device

# Fixed code
def update(self):
    """Update network stats using the input method.

    Stats is a list of dict (one dict per interface)
    """
    # Reset stats
    self.reset()

    if self.input_method == "local":
        # Update stats using the standard system lib

        # Grab network interface stat using the PsUtil net_io_counter method
        try:
            netiocounters = psutil.net_io_counters(pernic=True)
        except UnicodeDecodeError:
            return self.stats

        # New in PsUtil 3.0
        # - import the interface's status (issue #765)
        # - import the interface's speed (issue #718)
        netstatus = {}
        try:
            netstatus = psutil.net_if_stats()
        except (AttributeError, OSError):
            pass

        # Previous network interface stats are stored in the network_old variable
        if not hasattr(self, "network_old"):
            # First call, we init the network_old var
            try:
                self.network_old = netiocounters
            except (IOError, UnboundLocalError):
                pass
        else:
            # By storing time data we enable Rx/s and Tx/s calculations in the
            # XML/RPC API, which would otherwise be overly difficult work
            # for users of the API
            time_since_update = getTimeSinceLastUpdate("net")

            # Loop over interfaces
            network_new = netiocounters
            for net in network_new:
                # Do not take hidden interface into account
                if self.is_hide(net):
                    continue
                try:
                    cumulative_rx = network_new[net].bytes_recv
                    cumulative_tx = network_new[net].bytes_sent
                    cumulative_cx = cumulative_rx + cumulative_tx
                    rx = cumulative_rx - self.network_old[net].bytes_recv
                    tx = cumulative_tx - self.network_old[net].bytes_sent
                    cx = rx + tx
                    netstat = {
                        "interface_name": net,
                        "time_since_update": time_since_update,
                        "cumulative_rx": cumulative_rx,
                        "rx": rx,
                        "cumulative_tx": cumulative_tx,
                        "tx": tx,
                        "cumulative_cx": cumulative_cx,
                        "cx": cx,
                    }
                except KeyError:
                    continue
                else:
                    # Optional stats (only compliant with PsUtil 3.0+)
                    # Interface status
                    try:
                        netstat["is_up"] = netstatus[net].isup
                    except (KeyError, AttributeError):
                        pass
                    # Interface speed in Mbps, convert it to bps
                    # Can be always 0 on some OS
                    try:
                        netstat["speed"] = netstatus[net].speed * 1048576
                    except (KeyError, AttributeError):
                        pass

                    # Finaly, set the key
                    netstat["key"] = self.get_key()
                    self.stats.append(netstat)

            # Save stats to compute next bitrate
            self.network_old = network_new

    elif self.input_method == "snmp":
        # Update stats using SNMP

        # SNMP bulk command to get all network interface in one shot
        try:
            netiocounters = self.get_stats_snmp(
                snmp_oid=snmp_oid[self.short_system_name], bulk=True
            )
        except KeyError:
            netiocounters = self.get_stats_snmp(snmp_oid=snmp_oid["default"], bulk=True)

        # Previous network interface stats are stored in the network_old variable
        if not hasattr(self, "network_old"):
            # First call, we init the network_old var
            try:
                self.network_old = netiocounters
            except (IOError, UnboundLocalError):
                pass
        else:
            # See description in the 'local' block
            time_since_update = getTimeSinceLastUpdate("net")

            # Loop over interfaces
            network_new = netiocounters

            for net in network_new:
                # Do not take hidden interface into account
                if self.is_hide(net):
                    continue

                try:
                    # Windows: a tips is needed to convert HEX to TXT
                    # http://blogs.technet.com/b/networking/archive/2009/12/18/how-to-query-the-list-of-network-interfaces-using-snmp-via-the-ifdescr-counter.aspx
                    if self.short_system_name == "windows":
                        try:
                            interface_name = str(base64.b16decode(net[2:-2].upper()))
                        except TypeError:
                            interface_name = net
                    else:
                        interface_name = net

                    cumulative_rx = float(network_new[net]["cumulative_rx"])
                    cumulative_tx = float(network_new[net]["cumulative_tx"])
                    cumulative_cx = cumulative_rx + cumulative_tx
                    rx = cumulative_rx - float(self.network_old[net]["cumulative_rx"])
                    tx = cumulative_tx - float(self.network_old[net]["cumulative_tx"])
                    cx = rx + tx
                    netstat = {
                        "interface_name": interface_name,
                        "time_since_update": time_since_update,
                        "cumulative_rx": cumulative_rx,
                        "rx": rx,
                        "cumulative_tx": cumulative_tx,
                        "tx": tx,
                        "cumulative_cx": cumulative_cx,
                        "cx": cx,
                    }
                except KeyError:
                    continue
                else:
                    netstat["key"] = self.get_key()
                    self.stats.append(netstat)

            # Save stats to compute next bitrate
            self.network_old = network_new

    return self.stats