%PDF- %PDF-
Direktori : /lib/python2.7/site-packages/salt/modules/ |
Current File : //lib/python2.7/site-packages/salt/modules/ethtool.py |
# -*- coding: utf-8 -*- ''' Module for running ethtool command .. versionadded:: 2016.3.0 :codeauthor: Krzysztof Pawlowski <msciciel@msciciel.eu> :maturity: new :depends: python-ethtool :platform: linux ''' # Import python libs from __future__ import absolute_import, print_function, unicode_literals import logging # Import third party libs try: import ethtool HAS_ETHTOOL = True except ImportError: HAS_ETHTOOL = False log = logging.getLogger(__name__) ethtool_coalesce_map = { 'pkt_rate_high': 'pkt_rate_high', 'pkt_rate_low': 'pkt_rate_low', 'sample_interval': 'rate_sample_interval', 'rx_usecs': 'rx_coalesce_usecs', 'rx_usecs_high': 'rx_coalesce_usecs_high', 'rx_usecs_irq': 'rx_coalesce_usecs_irq', 'rx_usecs_low': 'rx_coalesce_usecs_low', 'rx_frames': 'rx_max_coalesced_frames', 'rx_frames_high': 'rx_max_coalesced_frames_high', 'rx_frames_irg': 'rx_max_coalesced_frames_irq', 'rx_frames_low': 'rx_max_coalesced_frames_low', 'stats_block_usecs': 'stats_block_coalesce_usecs', 'tx_usecs': 'tx_coalesce_usecs', 'tx_usecs_high': 'tx_coalesce_usecs_high', 'tx_usecs_irq': 'tx_coalesce_usecs_irq', 'tx_usecs_low': 'tx_coalesce_usecs_low', 'tx_frames': 'tx_max_coalesced_frames', 'tx_frames_high': 'tx_max_coalesced_frames_high', 'tx_frames_irq': 'tx_max_coalesced_frames_irq', 'tx_frames_low': 'tx_max_coalesced_frames_low', 'adaptive_rx': 'use_adaptive_rx_coalesce', 'adaptive_tx': 'use_adaptive_tx_coalesce', } ethtool_coalesce_remap = {} for k, v in ethtool_coalesce_map.items(): ethtool_coalesce_remap[v] = k ethtool_ring_map = { 'rx': 'rx_pending', 'rx_max': 'rx_max_pending', 'rx_mini': 'rx_mini_pending', 'rx_mini_max': 'rx_mini_max_pending', 'rx_jumbo': 'rx_jumbo_pending', 'rx_jumbo_max': 'rx_jumbo_max_pending', 'tx': 'tx_pending', 'tx_max': 'tx_max_pending', } ethtool_ring_remap = {} for k, v in ethtool_ring_map.items(): ethtool_ring_remap[v] = k # Define the module's virtual name __virtualname__ = 'ethtool' def __virtual__(): ''' Only load this module if python-ethtool is installed ''' if HAS_ETHTOOL: return __virtualname__ else: return (False, 'The ethtool module could not be loaded: ethtool ' 'python libraries not found.') def show_ring(devname): ''' Queries the specified network device for rx/tx ring parameter information CLI Example: .. code-block:: bash salt '*' ethtool.show_ring <devname> ''' try: ring = ethtool.get_ringparam(devname) except IOError: log.error('Ring parameters not supported on %s', devname) return 'Not supported' ret = {} for key, value in ring.items(): ret[ethtool_ring_remap[key]] = ring[key] return ret def show_coalesce(devname): ''' Queries the specified network device for coalescing information CLI Example: .. code-block:: bash salt '*' ethtool.show_coalesce <devname> ''' try: coalesce = ethtool.get_coalesce(devname) except IOError: log.error('Interrupt coalescing not supported on %s', devname) return 'Not supported' ret = {} for key, value in coalesce.items(): ret[ethtool_coalesce_remap[key]] = coalesce[key] return ret def show_driver(devname): ''' Queries the specified network device for associated driver information CLI Example: .. code-block:: bash salt '*' ethtool.show_driver <devname> ''' try: module = ethtool.get_module(devname) except IOError: log.error('Driver information not implemented on %s', devname) return 'Not implemented' try: businfo = ethtool.get_businfo(devname) except IOError: log.error('Bus information no available on %s', devname) return 'Not available' ret = { 'driver': module, 'bus_info': businfo, } return ret def set_ring(devname, **kwargs): ''' Changes the rx/tx ring parameters of the specified network device CLI Example: .. code-block:: bash salt '*' ethtool.set_ring <devname> [rx=N] [rx_mini=N] [rx_jumbo=N] [tx=N] ''' try: ring = ethtool.get_ringparam(devname) except IOError: log.error('Ring parameters not supported on %s', devname) return 'Not supported' changed = False for param, value in kwargs.items(): if param in ethtool_ring_map: param = ethtool_ring_map[param] if param in ring: if ring[param] != value: ring[param] = value changed = True try: if changed: ethtool.set_ringparam(devname, ring) return show_ring(devname) except IOError: log.error('Invalid ring arguments on %s: %s', devname, ring) return 'Invalid arguments' def set_coalesce(devname, **kwargs): ''' Changes the coalescing settings of the specified network device CLI Example: .. code-block:: bash salt '*' ethtool.set_coalesce <devname> [adaptive_rx=on|off] [adaptive_tx=on|off] [rx_usecs=N] [rx_frames=N] [rx_usecs_irq=N] [rx_frames_irq=N] [tx_usecs=N] [tx_frames=N] [tx_usecs_irq=N] [tx_frames_irq=N] [stats_block_usecs=N] [pkt_rate_low=N] [rx_usecs_low=N] [rx_frames_low=N] [tx_usecs_low=N] [tx_frames_low=N] [pkt_rate_high=N] [rx_usecs_high=N] [rx_frames_high=N] [tx_usecs_high=N] [tx_frames_high=N] [sample_interval=N] ''' try: coalesce = ethtool.get_coalesce(devname) except IOError: log.error('Interrupt coalescing not supported on %s', devname) return 'Not supported' changed = False for param, value in kwargs.items(): if param in ethtool_coalesce_map: param = ethtool_coalesce_map[param] if param in coalesce: if coalesce[param] != value: coalesce[param] = value changed = True try: if changed: ethtool.set_coalesce(devname, coalesce) return show_coalesce(devname) except IOError: log.error('Invalid coalesce arguments on %s: %s', devname, coalesce) return 'Invalid arguments' def show_offload(devname): ''' Queries the specified network device for the state of protocol offload and other features CLI Example: .. code-block:: bash salt '*' ethtool.show_offload <devname> ''' try: sg = ethtool.get_sg(devname) and "on" or "off" except IOError: sg = "not supported" try: tso = ethtool.get_tso(devname) and "on" or "off" except IOError: tso = "not supported" try: ufo = ethtool.get_ufo(devname) and "on" or "off" except IOError: ufo = "not supported" try: gso = ethtool.get_gso(devname) and "on" or "off" except IOError: gso = "not supported" offload = { 'scatter_gather': sg, 'tcp_segmentation_offload': tso, 'udp_fragmentation_offload': ufo, 'generic_segmentation_offload': gso, } return offload def set_offload(devname, **kwargs): ''' Changes the offload parameters and other features of the specified network device CLI Example: .. code-block:: bash salt '*' ethtool.set_offload <devname> tcp_segmentation_offload=on ''' for param, value in kwargs.items(): if param == 'tcp_segmentation_offload': value = value == "on" and 1 or 0 try: ethtool.set_tso(devname, value) except IOError: return 'Not supported' return show_offload(devname)