def __init__(self, log, inv_file): inv = Inventory(log, inv_file) self.log = log self.ext_label_dev = inv.get_mgmt_switch_external_dev_label() if inv.is_passive_mgmt_switches(): if self.ext_label_dev: self.log.info('Passive Management Switch(es) Detected') print(self.ext_label_dev) sys.exit(0) else: self.log.error('Management switch not found') sys.exit(1) for self.ipv4 in inv.yield_mgmt_switch_ip(): pass mgmt_network = inv.get_ipaddr_mgmt_network() self.broadcast = str(netaddr.IPNetwork(mgmt_network).broadcast) self.mask = str(netaddr.IPNetwork(mgmt_network).netmask) if self.ext_label_dev: self.log.debug('External dev label %s was specified' % self.ext_label_dev) else: self.log.debug('External dev label was not specified') self.ext_ip_dev = inv.get_mgmt_switch_external_dev_ip() self.ext_prefix = inv.get_mgmt_switch_external_prefix() for self.ext_ip_switch in inv.yield_mgmt_switch_external_switch_ip(): pass self.ext_broadcast = str( netaddr.IPNetwork(self.ext_ip_dev + '/' + self.ext_prefix).broadcast) self.ext_mask = str( netaddr.IPNetwork(self.ext_ip_dev + '/' + self.ext_prefix).netmask) self.ipr = IPRoute() for link in self.ipr.get_links(): kind = None try: self.label = (link.get_attr('IFLA_IFNAME')) kind = ( link.get_attr('IFLA_LINKINFO').get_attr('IFLA_INFO_KIND')) except: pass if kind == self.BRIDGE: if self.ipr.get_addr(label=self.label, broadcast=self.broadcast): self.log.info('Bridge %s on management subnet %s found' % (self.label, mgmt_network)) if self._ping(self.ipv4, self.label): self.log.info('Management switch found on %s' % self.label) sys.exit(0) else: self.log.debug('Management switch not found on %s' % self.label) if self.ext_label_dev: self.dev = self.ipr.link_lookup(ifname=self.ext_label_dev)[0] self._add_ip() # Print to stdout for Ansible playbook to register print(self.ext_label_dev) else: switch_found = False for link in self.ipr.get_links(): kind = None try: self.label = (link.get_attr('IFLA_IFNAME')) kind = (link.get_attr('IFLA_LINKINFO').get_attr( 'IFLA_INFO_KIND')) except: pass if self.label != self.LOCAL and not kind: self.dev = self.ipr.link_lookup(ifname=self.label)[0] self._add_ip() if self._ping(self.ext_ip_switch, self.label): switch_found = True self.log.info('Management switch found on %s' % self.label) self._configure_switch() else: self.log.debug('Management switch not found on %s' % self.label) self._del_ip() if switch_found: break if not switch_found: self.log.error('Management switch not found') sys.exit(1) # Print to stdout for Ansible playbook to register print(self.label)
def main(log, inv_file): inv = Inventory(log, inv_file) print() mgmt_network_ext_cidr = None key_addr = None try: mgmt_network_port = inv.get_port_mgmt_network() userid = inv.get_userid_mgmt_switch() password = inv.get_password_mgmt_switch() mgmt_network_gen = inv.get_ipaddr_mgmt_network() mgmt_network_ext = inv.get_mgmt_switch_external_dev_ip() mgmt_network_ext_prefix = inv.get_mgmt_switch_external_prefix() mgmt_network_ext = mgmt_network_ext + '/' + mgmt_network_ext_prefix mgmt_network_ext = netaddr.IPNetwork(mgmt_network_ext) mgmt_network_ext_cidr = str(mgmt_network_ext.cidr) except KeyError: print('Switch access information not present in: {}'.format(inv_file)) print('Cluster Genesis may be in "passive" mode') else: output = subprocess.check_output(['bash', '-c', 'ip route']) if mgmt_network_ext_cidr in output: key_addr = 'addr_ext' elif mgmt_network_gen in output: key_addr = 'addr_gen' else: print('No route found using config file addresses') if key_addr: print('==============================') print('Defined switches: ') index = 1 switches_m = {} for rack, ipv4 in inv.yield_mgmt_rack_ipv4(): switches_m[index] = {'rack': rack, 'addr_gen': ipv4} index += 1 index = 1 for ipv4 in inv.yield_mgmt_switch_external_switch_ip(): switches_m[index]['addr_ext'] = ipv4 print(' ' + str(index) + ') rack: ' + switches_m[index]['rack'] + ', external address: ' + switches_m[index]['addr_ext'] + ', Genesis address: ' + switches_m[index]['addr_gen']) index += 1 if not (len(switches_m) == 1): sw = get_int_input("\n\nSelect a switch: ", 1, len(switches_m)) else: sw = 1 addr = switches_m[sw][key_addr] print() else: # output = subprocess.check_output(['bash', '-c', 'ip route']) addr = '192.168.32.20/24' userid = 'admin' password = '******' while 1: addr = rlinput("Enter an address for the management switch: ", addr) mgmt_network_ext = netaddr.IPNetwork(addr) mgmt_network_ext_cidr = str(mgmt_network_ext.cidr) userid = rlinput("Enter a userid for the management switch: ", userid) password = rlinput( "Enter a password for the management switch (last char = '.' to terminate): ", password) if password[-1:] == '.': sys.exit(0) output = subprocess.check_output(['bash', '-c', 'ip route']) if mgmt_network_ext_cidr in output: addr = addr[:addr.find('/')] break # the G8052 misbehaves & closes it's SSH connection # after every paramiko 'exec_command', so using SSH # with commands strung together ssh = SSH(log) cmd = 'show interface ip;show vlan;show interface port %s;' \ % (str(mgmt_network_port)) try: _, switch_info, _ = ssh.exec_cmd(addr, userid, password, cmd, ssh_log=ssh_log, look_for_keys=False) except SSH_Exception as exc: print('Failed to SSH to switch at {} using userid {} and password {}'. format(addr, userid, password)) print(exc) sys.exit(1) print_lines(switch_info, ['Interface information:', 'IP4']) print('\n\nVLAN information: ') print_lines(switch_info, ['- ------ -', ' VLAN ']) print() print('Deployer port: ') print_lines(switch_info, ['Current port', 'VLANs']) print()