def lldp_details(self): """ :return: lldp info for the bond members """ _header = [_('lldp'), '', ''] _table = [] for _bondmem in self.iface.members.values(): lldp_output = _bondmem.lldp if not lldp_output: continue _table.append([ "%s(%s)" % (_bondmem.name, self.abbrev_bondstate(_bondmem)), '====', "%s(%s)" % (lldp_output[0].get('adj_port'), lldp_output[0].get('adj_hostname')) ]) del lldp_output[0] for _entry in lldp_output: _table.append([ '', '====', "%s(%s)" % (_entry.get('adj_port'), _entry.get('adj_hostname')) ]) if len(_table) > 0: return tabulate(_table, _header) else: return _('no_lldp_entries')
def port_category(self): """ :return: port category for bridge member """ if self.iface.is_trunk(): return _('trunk/l2') return _('access/l2')
def port_category(self): """ :return: port category of bridge. Then return its a L2 or L3 port as wel """ if self.iface.is_l3(): return _('bridge/l3') return _('bridge/l2')
def lldp_details(self): """ :return: lldp info for the bond members """ _header = [_('lldp'), '', ''] _table = [] for _bondmem in self.iface.members.values(): lldp_output = _bondmem.lldp if not lldp_output: continue _table.append(["%s(%s)" % (_bondmem.name, self.abbrev_bondstate(_bondmem)), '====', "%s(%s)" % (lldp_output[0].get('adj_port'), lldp_output[0].get('adj_hostname'))]) del lldp_output[0] for _entry in lldp_output: _table.append(['', '====', "%s(%s)" % (_entry.get('adj_port'), _entry.get('adj_hostname'))]) if len(_table) > 0: return tabulate(_table, _header) else: return _('no_lldp_entries')
def state_in_bond(self): """ :return: text describing the state of the port in the bond """ if self.iface.bondstate == 1: return _('port_in_bond') else: return _('port_not_in_bond')
def cli_output(self): """ print linux basic system output on a terminal """ _str = '' _str += "%s %s\n" % (self.system.os_name, self.system.version) _str += "%s: %s\n" % (_('build'), self.system.os_build) _str += "%s: %s\n" % (_('uptime'), self.uptime) return _str
def abbrev_linksummary(cls, linuxiface): """ :return: 'U' if port is up :return: 'D' if port is down or admdn """ if linuxiface.linkstate == 2: return _('U') else: return _('D')
def abbrev_bondstate(cls, bondmem): """ :param bondmem: :class:`netshowlib.linux.BondMember` instance :return: 'P' if bondmem in bond :return: 'N' if bondmem is not in bond """ if bondmem.bondstate == 1: return _('P') else: return _('N')
def cli_header(self): """ :return common cli header when printing single iface info """ _header = ['', _('name'), _('mac'), _('speed'), _('mtu'), _('mode')] _table = [[ self.linkstate, self.name, self.iface.mac, self.speed, self.iface.mtu, self.port_category ]] return tabulate(_table, _header) + self.new_line()
def ip_info(self): _arr = [''] if self.iface.is_l3(): _arr = [] if self.iface.ip_addr_assign == 1: first_addr = self.iface.ip_address.allentries[0] _arr.append("%s: %s(%s)" % (_('ip'), first_addr, _('dhcp'))) else: self.print_list_in_chunks(self.iface.ip_address.allentries, _('ip'), _arr) return _arr
def port_category(self): """ :return: port category for a bond """ if self.iface.is_l3(): return _('bond/l3') elif self.iface.is_trunk(): return _('bond/trunk') elif self.iface.is_access(): return _('bond/access') else: return _('bond')
def lacp_rate(self): """ :return: lacp rate in plain english """ _lacp = self.iface.lacp if _lacp: if _lacp.rate == '1': return _('fast_lacp') elif _lacp.rate == '0': return _('slow_lacp') else: return _('unknown')
def hash_policy(self): """ :return: hash policy for bond """ _hash_policy = self.iface.hash_policy if _hash_policy == '1': return _('layer3+4') elif _hash_policy == '2': return _('layer2+3') elif _hash_policy == '0': return _('layer2') else: return _('unknown')
def linkstate(self): """ :return string that prints out link state. admin down or down or up """ _linkstate_value = self.iface.linkstate if _linkstate_value == 0: return _('admdn') elif _linkstate_value == 1: return _('dn') elif _linkstate_value == 2: return _('up') elif _linkstate_value == 3: return _('drmnt')
def print_bondmems(self): """ :return: bondmember list when showing summary in netshow interfaces \ for the bond interface """ _arr = [] for _bondmem in self.iface.members.values(): _arr.append("%s(%s%s)" % (_bondmem.name, self.abbrev_linksummary(_bondmem), self.abbrev_bondstate(_bondmem))) if len(_arr) > 0: return ': '.join([_('bondmems'), ', '.join(sorted(_arr))]) else: return _('no_bond_members_found')
def port_category(self): """ :return: port type. Via interface discovery determine classify port \ type """ if self.iface.is_loopback(): return _('loopback') elif self.iface.is_l3(): if self.iface.is_subint(): return _('subint/l3') else: return _('access/l3') return _('unknown_int_type')
def no_stp_details(self): """ :return: details when stp is not enabled """ _header = [_('bridge_details'), ''] _table = [] memberlist = self.iface.members.keys() _table2 = [] self.print_portlist_in_chunks(memberlist, '', _table2) _table.append([_('bridge_members') + ':', _table2[0]]) for i in range(1, len(_table2)): _table.append(['', _table2[i]]) _table.append([_('stp_mode') + ':', _('disabled')]) _table.append(self.vlan_id_field().split(':')) return tabulate(_table, _header) + self.new_line()
def no_stp_details(self): """ :return: details when stp is not enabled """ _header = [_('bridge_details'), ''] _table = [] memberlist = self.iface.members.keys() _table2 = [] self.print_list_in_chunks(memberlist, '', _table2) _table.append([_('bridge_members') + ':', _table2[0]]) for i in range(1, len(_table2)): _table.append(['', _table2[i]]) _table.append([_('stp_mode') + ':', _('disabled')]) _table.append(self.vlan_id_field().split(':')) return tabulate(_table, _header) + self.new_line()
def trunk_summary(self): """ :return: summary info for a trunk port """ _vlanlist = self.iface.vlan_list native_bridges = [] tagged_bridges = [] for _bridgename, _vlanid in _vlanlist.items(): if len(_vlanid) > 0 and int(_vlanid[0]) > 0: _vlan_tags = ','.join(_vlanid) tagged_bridges.append('%s(%s)' % (_bridgename, _vlan_tags)) else: native_bridges.append(_bridgename) _strlist = [_('bridge_membership') + ':'] self.print_list_in_chunks(tagged_bridges, _('tagged'), _strlist) self.print_list_in_chunks(native_bridges, _('untagged'), _strlist) return _strlist
def stp_summary(self): """ :return: root switch priority if switch is root of bridge :return: root port if switch is not root of bridge :return: stp disabled if stp is disabled """ _str = ["%s:" % (_('stp'))] if self.iface.stp: if self.iface.stp.is_root(): _str.append("%s(%s)" % (_('rootswitch'), self.iface.stp.root_priority)) else: _str.append("%s(%s)" % (','.join(self.root_port()), _('root'))) _str.append("%s(%s)" % (self.iface.stp.root_priority, _('root_priority'))) else: _str.append(_('disabled')) return ' '.join(_str)
def tagged_ifaces(self): """ :return: list of tagged interfaces of the bridge """ _tagmems = self.iface.tagged_members.keys() if _tagmems: _str = [] self.print_portlist_in_chunks(_tagmems, _('tagged_members'), _str) return _str return []
def summary(self): """ :return: summary info for bond members for 'netshow interfaces' """ _arr = [] _arr.append("%s: %s(%s%s)" % (_('master'), self.iface.master.name, PrintIface.abbrev_linksummary(self.iface.master), PrintBond.abbrev_bondstate(self.iface))) return _arr
def summary(self): """ :return: summary info for bond members for 'netshow interfaces' """ _arr = [] _arr.append("%s: %s(%s%s)" % (_('master'), self.iface.master.name, PrintIface.abbrev_linksummary(self.iface), PrintBond.abbrev_bondstate(self.iface))) return _arr
def tagged_ifaces(self): """ :return: list of tagged interfaces of the bridge """ _tagmems = self.iface.tagged_members.keys() if _tagmems: _str = [] self.print_list_in_chunks(_tagmems, _('tagged_members'), _str) return _str return []
def vlan_id(self): """ :return: vlan id :return: 'untagged' if non is available """ _vlantag = self.iface.vlan_tag if _vlantag: _str = ','.join(_vlantag) else: _str = _('untagged') return _str
def ip_details(self): """ :return: basic IP info about the interface for single iface info """ _header = [_('ip_details'), ''] _table = [] if not self.iface.is_l3(): return '' else: self.print_list_in_chunks(self.iface.ip_address.allentries, _('ip'), _table, place_in_list=False, break_into_list=True) _table.append([ "%s:" % (_('arp_entries')), len(self.iface.ip_neighbor.allentries) ]) return tabulate(_table, _header) + self.new_line()
def bondmem_details(self): """ print out table with bond member summary info for netshow interface [ifacename] for bond interface """ _header = ['', _('port'), _('speed'), _('link_failures')] _table = [] _bondmembers = self.iface.members.values() if len(_bondmembers) == 0: return _('no_bond_members_found') for _bondmem in _bondmembers: _printbondmem = PrintBondMember(_bondmem) _table.append([_printbondmem.linkstate, "%s(%s)" % (_printbondmem.name, self.abbrev_bondstate(_bondmem)), _printbondmem.speed, _bondmem.linkfailures]) return tabulate(_table, _header) + self.new_line()
def bondmem_details(self): """ print out table with bond member summary info for netshow interface [ifacename] for bond interface """ _header = ['', _('port'), _('speed'), _('link_failures')] _table = [] _bondmembers = self.iface.members.values() if len(_bondmembers) == 0: return _('no_bond_members_found') for _bondmem in _bondmembers: _printbondmem = PrintBondMember(_bondmem) _table.append([ _printbondmem.linkstate, "%s(%s)" % (_printbondmem.name, self.abbrev_bondstate(_bondmem)), _printbondmem.speed, _bondmem.linkfailures ]) return tabulate(_table, _header) + self.new_line()
def print_neighbor_info(self): """ :return: cli output of netshow neighbor """ _header = [ _('local'), _('speed'), _('mode'), '', _('remote'), _('sw/hostname'), _('summary') ] _table = [] for _iface in self.ifacelist.values(): _table.append([ _iface.name, _iface.speed, _iface.port_category, '====', _iface.iface.lldp[0].get('adj_port'), _iface.iface.lldp[0].get('adj_hostname'), ', '.join(_iface.summary) ]) del _iface.iface.lldp[0] if _iface.iface.lldp: for _entry in _iface.iface.lldp: _table.append([ '', '', '', '====', _entry.get('adj_port'), _entry.get('adj_hostname') ]) return legend_wrapped_cli_output(tabulate(_table, _header), self.show_legend)
def ports_of_some_kind_of_state(self, statename): _header = [_("ports in %s state") % (inflection.titleize(statename))] _table = [] _portlist = [ _x.name for _x in self.iface.stp.member_state.get(statename) ] if _portlist: _table2 = [] self.print_list_in_chunks(_portlist, '', _table2) for i in _table2: _table.append([i]) return tabulate(_table, _header) + self.new_line() return ''
def ports_of_some_kind_of_state(self, statename): _header = [_("ports in %s state") % (inflection.titleize(statename))] _table = [] _portlist = [_x.name for _x in self.iface.stp.member_state.get(statename)] if _portlist: _table2 = [] self.print_portlist_in_chunks(_portlist, '', _table2) for i in _table2: _table.append([i]) return tabulate(_table, _header) + self.new_line() return ''
def bondmem_details(self): """ :return: string with output shown when netshow interfaces is issued on a \ bond member """ _header = [_('bond_details'), ''] _master = self.iface.master _printbond = PrintBond(_master) _table = [] _table.append([_('master_bond') + ':', _master.name]) _table.append([_('state_in_bond') + ':', self.state_in_bond]) _table.append([_('link_failures') + ':', self.iface.linkfailures]) _table.append([_('bond_members') + ':', ', '.join(_master.members.keys())]) _table.append([_('bond_mode') + ':', _printbond.mode]) _table.append([_('load_balancing') + ':', _printbond.hash_policy]) _table.append([_('minimum_links') + ':', _master.min_links]) _lacp_info = self.iface.master.lacp if _lacp_info: _table.append([_('lacp_sys_priority') + ':', _master.lacp.sys_priority]) _table.append([_('lacp_rate') + ':', _printbond.lacp_rate()]) return tabulate(_table, _header) + self.new_line()
def stp_details(self): """ :return: stp details for the bridge interface """ _header = [_('bridge_details'), ''] _table = [] _table.append([_('stp_mode') + ':', _('802.1d / per bridge instance')]) if self.iface.stp.is_root(): _table.append([_('root_port') + ':', _('rootswitch')]) else: _table.append([_('root_port') + ':', ', '.join(self.root_port())]) _table.append([_('root_priority') + ':', self.iface.stp.root_priority]) _table.append([_('bridge_priority') + ':', self.iface.stp.bridge_priority]) _table.append(self.vlan_id_field().split(':')) return tabulate(_table, _header) + self.new_line()
def stp_details(self): """ :return: stp details for the bridge interface """ _header = [_('bridge_details'), ''] _table = [] _table.append([_('stp_mode') + ':', _('802.1d / per bridge instance')]) if self.iface.stp.is_root(): _table.append([_('root_port') + ':', _('rootswitch')]) else: _table.append([_('root_port') + ':', ', '.join(self.root_port())]) _table.append([_('root_priority') + ':', self.iface.stp.root_priority]) _table.append( [_('bridge_priority') + ':', self.iface.stp.bridge_priority]) _table.append(self.vlan_id_field().split(':')) return tabulate(_table, _header) + self.new_line()
def speed(self): """ :return: print out current speed """ _str = _('n/a') _speed_value = self.iface.speed if _speed_value is None or int(_speed_value) > 4294967200: return _str elif int(_speed_value) < 1000: _str = str(_speed_value) + 'M' else: # Python3 supports this true division thing so 40/10 gives you 4.0 # To not have the .0, have to do double _'/'_ _str = str(int(_speed_value) // 1000) + 'G' return _str
def print_single_iface(self): """ :return: netshow terminal output or JSON of a single iface """ feature_cache = linux_cache.Cache() feature_cache.run() _printiface = print_iface.iface(self.single_iface, feature_cache) if not _printiface: return _('interface_does_not_exist') if self.use_json: return json.dumps(_printiface, cls=NetEncoder, indent=4) else: return _printiface.cli_output(show_legend=self.show_legend)
def bondmem_details(self): """ :return: string with output shown when netshow interfaces is issued on a \ bond member """ _header = [_('bond_details'), ''] _master = self.iface.master _printbond = PrintBond(_master) _table = [] _table.append([_('master_bond') + ':', _master.name]) _table.append([_('state_in_bond') + ':', self.state_in_bond]) _table.append([_('link_failures') + ':', self.iface.linkfailures]) _table.append( [_('bond_members') + ':', ', '.join(_master.members.keys())]) _table.append([_('bond_mode') + ':', _printbond.mode]) _table.append([_('load_balancing') + ':', _printbond.hash_policy]) _table.append([_('minimum_links') + ':', _master.min_links]) _lacp_info = self.iface.master.lacp if _lacp_info: _table.append( [_('lacp_sys_priority') + ':', _master.lacp.sys_priority]) _table.append([_('lacp_rate') + ':', _printbond.lacp_rate()]) return tabulate(_table, _header) + self.new_line()
def bridgemem_details(self): """ :return: list vlans or bridge names of various stp states """ if not self.iface.is_bridgemem(): return None _str = '' _stpstate = self.iface.stp.state for _category, _bridgelist in _stpstate.items(): if _stpstate.get(_category): _header = [ _("vlans in %s state") % (inflection.titleize(_category)) ] _table = [self._pretty_vlanlist(_bridgelist)] _str += tabulate(_table, _header, numalign="left") + \ self.new_line() return _str
def bond_details(self): """ print out table with bond details for netshow interface [ifacename] """ _header = [_('bond_details'), ''] _table = [] _table.append([_('bond_mode') + ':', self.mode]) _table.append([_('load_balancing') + ':', self.hash_policy]) _table.append([_('minimum_links') + ':', self.iface.min_links]) _lacp_info = self.iface.lacp if _lacp_info: _table.append([_('lacp_sys_priority') + ':', self.iface.lacp.sys_priority]) _table.append([_('lacp_rate') + ':', self.lacp_rate()]) return tabulate(_table, _header) + self.new_line()
def mode(self): """ :return: name of the bond mode """ _mode = self.iface.mode if _mode == '4': return _('lacp') elif _mode == '3': return _('broadcast') elif _mode == '2': return _('balance-xor') elif _mode == '1': return _('active-backup') elif _mode == '0': return _('balance-rr') else: return _('unknown')
def print_neighbor_info(self): """ :return: cli output of netshow neighbor """ _header = [_('local'), _('speed'), _('mode'), '', _('remote'), _('sw/hostname'), _('summary')] _table = [] for _iface in self.ifacelist.values(): _table.append([_iface.name, _iface.speed, _iface.port_category, '====', _iface.iface.lldp[0].get('adj_port'), _iface.iface.lldp[0].get('adj_hostname'), ', '.join(_iface.summary)]) del _iface.iface.lldp[0] if _iface.iface.lldp: for _entry in _iface.iface.lldp: _table.append(['', '', '', '====', _entry.get('adj_port'), _entry.get('adj_hostname')]) return legend_wrapped_cli_output(tabulate(_table, _header), self.show_legend)
def summary_header(self): """ :return: summary header for 'netshow interfaces' """ if self.show_mac: return ['', _('name'), _('mac'), _('speed'), _('mtu'), _('mode'), _('summary')] else: return ['', _('name'), _('speed'), _('mtu'), _('mode'), _('summary')]
def port_category(self): """ :return: port category for a bondmem """ return _('bondmem')
def vlan_id_field(self): """ return: list with label saying 'vlan id' and vlan tag """ _str = "%s: %s" % (_('802.1q_tag'), self.vlan_id()) return _str