############################################################################### # Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) # # and others # # # # All rights reserved. This program and the accompanying materials # # are made available under the terms of the Apache License, Version 2.0 # # which accompanies this distribution, and is available at # # http://www.apache.org/licenses/LICENSE-2.0 # ############################################################################### import re from discover.fetchers.cli.cli_access import CliAccess from utils.inventory_mgr import InventoryMgr class CliFetchHostPnics(CliAccess): def __init__(self): super().__init__() self.inv = InventoryMgr() self.ethtool_attr = re.compile('^\s+([^:]+):\s(.*)$') self.regexps = [ {'name': 'mac_address', 're': '^.*\slink/ether\s(\S+)\s', 'description': 'MAC address'}, {'name': 'IP Address', 're': '^\s*inet ([0-9.]+)/', 'description': 'IP Address v4'}, {'name': 'IPv6 Address', 're': '^\s*inet6 (\S+) .* global ', 'description': 'IPv6 Address'} ] def get(self, id): host_id = id[:id.rindex("-")] cmd = 'ls -l /sys/class/net | grep ^l | grep -v "/virtual/"' host = self.inv.get_by_id(self.get_env(), host_id) if not host: self.log.error("CliFetchHostPnics: host not found: " + host_id) return [] if "host_type" not in host: self.log.error("host does not have host_type: " + host_id + ", host: " + str(host)) return [] host_types = host["host_type"] if "Network" not in host_types and "Compute" not in host_types: return [] interface_lines = self.run_fetch_lines(cmd, host_id) interfaces = [] for line in interface_lines: interface_name = line[line.rindex('/')+1:] interface_name = interface_name.strip() # run 'ip address show' with specific interface name, # since running it with no name yields a list without inactive pNICs interface = self.find_interface_details(host_id, interface_name) if interface: interfaces.append(interface) return interfaces def find_interface_details(self, host_id, interface_name): cmd = "ip address show {}".format(interface_name) lines = self.run_fetch_lines(cmd, host_id) interface = None status_up = None for line in [l for l in lines if l != '']: tokens = None if interface is None: tokens = line.split() line_remainder = line.split(":")[2].strip() interface = { "host": host_id, "name": interface_name, "local_name": interface_name, "lines": [] } self.handle_line(interface, line_remainder) if '