示例#1
0
    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)
示例#2
0
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()