Ejemplo n.º 1
0
def scan_address(ip_address, **kwargs):
    if 'nx-os' in (kwargs.get('snmp_name') or '').lower():
        raise NoMatchError('Incompatible Nexus found.')
    if kwargs.get('http_family') not in ('Proxmox', ):
        raise NoMatchError('It is not Proxmox.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ssh_proxmox', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set SSH_USER and SSH_PASSWORD in your '
            'configuration file.', )
    else:
        try:
            device_info = _ssh_proxmox(ip_address, user, password)
        except (ConnectionError, NoMatchError) as e:
            result['status'] = 'error'
            messages.append(unicode(e))
        else:
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 2
0
def scan_address(ip_address, **kwargs):
    if kwargs.get('http_family') not in ('sscccc', ):
        raise NoMatchError("It's not an ONStor.")
    if 'nx-os' in kwargs.get('snmp_name', '').lower():
        raise NoMatchError("Incompatible Nexus found.")
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ssh_onstor', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set SSH_ONSTOR_USER and SSH_ONSTOR_PASSWORD in '
            'your configuration file.', )
    else:
        try:
            device_info = _ssh_onstor(ip_address, user, password)
        except ConnectionError as e:
            result['status'] = 'error'
            messages.append(unicode(e))
        else:
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 3
0
def scan_address(ip_address, **kwargs):
    if 'nx-os' in (kwargs.get('snmp_name', '') or '').lower():
        raise NoMatchError('Incompatible Nexus found.')
    kwargs['guessmodel'] = gvendor, gmodel = guessmodel.guessmodel(**kwargs)
    if gvendor != 'Cisco' or gmodel not in ('', ):
        raise NoMatchError('It is not Cisco.')
    ssh = _connect_ssh(ip_address)
    try:
        lines = ssh.asa_command(
            "show version | grep (^Hardware|Boot microcode|^Serial|address is)"
        )
    finally:
        ssh.close()
    pairs = parse.pairs(lines=[line.strip() for line in lines])
    sn = pairs.get('Serial Number', None)
    model, ram, cpu = pairs['Hardware'].split(',')
    boot_firmware = pairs['Boot microcode']
    macs = []
    for i in xrange(99):
        try:
            junk, label, mac = pairs['%d' % i].split(':')
        except KeyError:
            break
        mac = mac.split(',', 1)[0]
        mac = mac.replace('address is', '')
        mac = mac.replace('.', '').upper().strip()
        label = label.strip()
        if mac.replace(':', '').upper()[:6] not in MAC_PREFIX_BLACKLIST:
            macs.append(mac)
    ram_size = re.search('[0-9]+', ram).group()
    cpu_match = re.search('[0-9]+ MHz', cpu)
    cpu_speed = cpu_match.group()[:-4]
    cpu_model = cpu[:cpu_match.start()][4:].strip()
    result = get_base_result_template('ssh_cisco_asa')
    result.update({
        'status': 'success',
        'device': {
            'model_name':
            'Cisco ' + model,
            'type':
            str(DeviceType.firewall),
            'mac_adresses':
            macs,
            'boot_firmware':
            boot_firmware,
            'management_ip_addresses': [ip_address],
            'memory': [{
                'size': int(ram_size),
            }],
            'processors': [{
                'model_name': cpu_model,
                'speed': int(cpu_speed),
                'family': cpu_model,
            }],
        },
    })
    if sn not in SERIAL_BLACKLIST:
        result['device']['serial_number'] = sn
    return result
Ejemplo n.º 4
0
def scan_address(ip_address, **kwargs):
    if 'nx-os' in (kwargs.get('snmp_name', '') or '').lower():
        raise NoMatchError('Incompatible Nexus found.')
    if kwargs.get('http_family') not in ('Unspecified', 'Cisco'):
        raise NoMatchError('It is not Cisco.')
    ssh = _connect_ssh(ip_address)
    hostname = network.hostname(ip_address)
    try:
        ssh.cisco_command('terminal length 500')
        mac = '\n'.join(
            ssh.cisco_command(
                "show version | include Base ethernet MAC Address", ))
        raw = '\n'.join(ssh.cisco_command("show inventory"))
        subswitches = get_subswitches(ssh.cisco_command("show version"),
                                      hostname, ip_address)
    finally:
        ssh.close()
    matches = re.match('Base ethernet MAC Address\s+:\s*([0-9aA-Z:]+)', mac)
    if matches.groups():
        mac = matches.groups()[0]
    inventory = list(cisco_inventory(raw))
    dev_inv, parts = inventory[0], inventory[1:]
    sn = dev_inv['sn']
    result = get_base_result_template('ssh_cisco_catalyst')

    if subswitches:
        # virtual switch doesn't have own unique id, reuse first from stack
        sn += '-virtual'
        model_name = 'Virtual Cisco Catalyst %s' % dev_inv['pid']
        model_type = DeviceType.switch_stack
    else:
        model_name = 'Cisco Catalyst %s' % dev_inv['pid']
        model_type = DeviceType.switch
    result.update({
        'status': 'success',
        'device': {
            'hostname':
            hostname if hostname else ip_address,
            'model_name':
            model_name,
            'type':
            model_type.raw,
            'management_ip_addresses': [ip_address],
            'parts': [{
                'serial_number': part['sn'],
                'name': part['name'],
                'label': part['descr'],
            } for part in parts],
        },
    })
    if sn not in SERIAL_BLACKLIST:
        result['device']['serial_number'] = sn
    if subswitches:
        result['device']['subdevices'] = subswitches
    else:
        result['device']['mac_addresses'] = [mac]
    return result
Ejemplo n.º 5
0
def scan_address(ip_address, **kwargs):
    if 'nx-os' in kwargs.get('snmp_name', '').lower():
        raise NoMatchError("Incompatible Nexus found.")
    if 'StorageWorks' not in kwargs.get('snmp_name'):
        raise NoMatchError("No match")
    if not network.check_tcp_port(ip_address, 22):
        raise ConnectionError("Port 22 closed.")
    device = _run_ssh_p2000(ip_address)
    ret = {
        'status': 'success',
        'device': device,
    }
    tpl = get_base_result_template('ssh_hp_p2000')
    tpl.update(ret)
    return json.loads(json.dumps(tpl))  # to ensure its picklable
Ejemplo n.º 6
0
def scan_address(ip_address, **kwargs):
    http_family = (kwargs.get('http_family', '') or '').strip()
    if http_family and http_family.lower() not in ('dell', 'embedthis-http'):
        raise NoMatchError('It is not Dell.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('idrac', messages)
    if not user or not password:
        result.update(status='error')
        messages.append('Not configured.')
    else:
        idrac_manager = IDRAC(ip_address, user, password)
        try:
            device_info = idrac_device_info(idrac_manager)
        except Error as e:
            result.update(status='error')
            messages.append(unicode(e))
        else:
            device_info['management_ip_addresses'] = [ip_address]
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 7
0
def _ssh_proxmox(ip_address, user, password):
    ssh = _connect_ssh(ip_address, user, password)
    try:
        cluster_cfg = None
        for command in (
                'cat /etc/pve/cluster.cfg',
                'cat /etc/pve/cluster.conf',
                'cat /etc/pve/storage.cfg',
                'pvecm help',
        ):
            stdin, stdout, stderr = ssh.exec_command(command)
            data = stdout.read()
            if data != '':
                if command == 'cat /etc/pve/cluster.cfg':
                    cluster_cfg = data
                break
        else:
            raise NoMatchError('This is not a PROXMOX server.')
        master_ip_address = _get_master_ip_address(
            ssh,
            ip_address,
            cluster_cfg,
        )
        cluster_member = _get_cluster_member(ssh, ip_address)
        subdevices = _get_virtual_machines(
            ssh,
            master_ip_address,
            ip_address,
        )
        if subdevices:
            cluster_member['subdevices'] = subdevices
    finally:
        ssh.close()
    return cluster_member
Ejemplo n.º 8
0
Archivo: ipmi.py Proyecto: lmzopq/ralph
def scan_address(ip_address, **kwargs):
    http_family = kwargs.get('http_family', '')
    if http_family not in (
            'Sun',
            'Thomas-Krenn',
            'Oracle-ILOM-Web-Server',
            'IBM System X',
    ):
        raise NoMatchError('It is not compatible device for this plugin.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ipmi', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append('Not configured.')
    else:
        ipmitool = IPMITool(ip_address, user, password)
        try:
            device_info = _ipmi(ipmitool)
        except (AuthError, Error) as e:
            result['status'] = 'error'
            messages.append(unicode(e))
        else:
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 9
0
def scan_address(ip_address, **kwargs):
    snmp_name = (kwargs.get('snmp_name', '') or '')
    http_family = (kwargs.get('http_family', '') or '')
    if ((snmp_name and 'juniper' not in snmp_name.lower()) and
        (http_family and http_family.strip().lower() not in ('juniper', ))):
        raise NoMatchError('It is not Juniper.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ssh_juniper', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set SSH_SSG_USER and SSH_SSG_PASSWORD in your '
            'configuration file.', )
    else:
        try:
            ssh = _connect_ssh(ip_address, user, password)
        except ConnectionError as e:
            result['status'] = 'error'
            messages.append(unicode(e))
        else:
            try:
                device_info = _ssh_juniper(ssh, ip_address)
            finally:
                ssh.close()
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 10
0
def scan_address(ip_address, **kwargs):
    snmp_name = (kwargs.get('snmp_name', '') or '').lower()
    if snmp_name and "onboard administrator" not in snmp_name:
        raise NoMatchError('It is not HP OA.')
    if kwargs.get('http_family', '') not in ('Unspecified', 'RomPager', 'HP'):
        raise NoMatchError('It is not HP OA.')
    messages = []
    result = get_base_result_template('hp_oa', messages)
    try:
        device_info = _hp_oa(ip_address)
    except (IncompatibleAnswerError, IncompleteAnswerError) as e:
        messages.append(unicode(e))
        result['status'] = 'error'
    else:
        result['status'] = 'success'
        result['device'] = device_info
    return result
Ejemplo n.º 11
0
def scan_address(ip_address, **kwargs):
    if 'nx-os' in (kwargs.get('snmp_name', '') or '').lower():
        raise NoMatchError('Incompatible Nexus found.')
    if kwargs.get('http_family', '') not in ('IBM', 'Unspecified'):
        raise NoMatchError('It is not IBM.')
    if not (kwargs.get('snmp_name', 'IBM') or 'IBM').startswith('IBM'):
        raise NoMatchError('It is not IBM.')
    if not network.check_tcp_port(ip_address, 22):
        raise ConnectionError('Port 22 closed on an IBM BladeServer.')
    messages = []
    result = get_base_result_template('ssh_ibm_bladecenter', messages)
    device = _blade_scan(ip_address)
    if not device:
        raise DeviceError("Malformed bladecenter device: %s" % ip_address)
    result['device'] = device
    result['status'] = 'success'
    return result
Ejemplo n.º 12
0
def scan_address(ip_address, **kwargs):
    if kwargs.get('http_family') not in ('WindRiver-WebServer', ):
        raise NoMatchError("It's not a HP MSA Storage.")
    if 'nx-os' in (kwargs.get('snmp_name', '') or '').lower():
        raise NoMatchError("Incompatible Nexus found.")
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ssh_hp_msa', messages)
    if not user or not password:
        raise NotConfiguredError(
            'Not configured. Set SSH_MSA_USER and SSH_MSA_PASSWORD in '
            'your configuration file.', )
    result.update({
        'status': 'success',
        'device': _ssh_hp_msa(ip_address, user, password),
    })
    return result
Ejemplo n.º 13
0
def scan_address(ip, **kwargs):
    if 'nx-os' in kwargs.get('snmp_name', '').lower():
        raise NoMatchError("Incompatible Nexus found.")
    if AIX_USER is None:
        raise NotConfiguredError("No credentials set up")
    kwargs['guessmodel'] = gvendor, gmodel = guessmodel.guessmodel(**kwargs)
    if gvendor != 'IBM':
        raise NoMatchError("No match")
    snmp_name = kwargs.get('snmp_name', '')
    if snmp_name and not snmp_name.startswith('IBM PowerPC'):
        raise NoMatchError("No match")
    device = run_ssh_aix(ip)
    ret = {
        'status': 'success',
        'device': device,
    }
    tpl = get_base_result_template('ssh_cisco_catalyst')
    tpl.update(ret)
    return tpl
Ejemplo n.º 14
0
def scan_address(ip_address, **kwargs):
    snmp_name = kwargs.get('snmp_name', '') or ''
    http_family = kwargs.get('http_family', '') or ''
    if 'nx-os' in snmp_name.lower():
        raise NoMatchError("Incompatible Nexus found.")
    if 'xen' not in snmp_name and 'xen' not in http_family.lower():
        raise NoMatchError("XEN not found.")
    auths = SETTINGS.get('xen_auths')
    messages = []
    result = get_base_result_template('ssh_xen', messages)
    if not auths:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set XEN_AUTHS in your configuration file.',
        )
    else:
        for user, password in auths:
            if user is None or password is None:
                continue
            try:
                ssh = _connect_ssh(ip_address, user, password)
            except AuthError:
                ssh = None
                continue
            else:
                break
        if not ssh:
            result['status'] = 'error'
            messages.append('Authorization failed.')
        else:
            try:
                device_info = _ssh_xen(ssh, ip_address)
            except (Error, ConnectionError) as e:
                result['status'] = 'error'
                messages.append(unicode(e))
            else:
                result.update({
                    'status': 'success',
                    'device': device_info,
                })
            finally:
                ssh.close()
    return result
Ejemplo n.º 15
0
def scan_address(ip_address, **kwargs):
    if 'nx-os' in kwargs.get('snmp_name', '').lower():
        raise NoMatchError("Incompatible nexus found")
    device = run_ssh_ganeti(ip_address)
    ret = {
        'status': 'success',
        'device': device,
    }
    tpl = get_base_result_template('ssh_ganeti')
    tpl.update(ret)
    return tpl
Ejemplo n.º 16
0
def scan_address(ip_address, **kwargs):
    http_family = (kwargs.get('http_family', '') or '').strip().lower()
    snmp_name = (kwargs.get('snmp_name', '') or '').strip().lower()
    if all((
        'esx' not in http_family,
        'esx' not in snmp_name,
        'vmware' not in snmp_name,
    )):
        raise NoMatchError('It is not VMWare.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('vmware', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set VMWARE_USER and VMWARE_PASSWORD in your '
            'configuration file.',
        )
    else:
        try:
            server_conn = _connect(ip_address, user, password)
        except VIApiException as e:
            result['status'] = 'error'
            messages.append(unicode(e))
        else:
            try:
                if 'vcenter' in server_conn.get_server_type().lower():
                    raise NoMatchError(
                        "It is `VMware vCenter Server`. To save real "
                        "hypervisor - VM connecion you should scan only "
                        "VMware ESXi servers.",
                    )
                device_info = _vmware(server_conn, ip_address)
            finally:
                server_conn.disconnect()
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 17
0
def scan_address(ip_address, **kwargs):
    if kwargs.get('http_family', '') not in ('Unspecified', ):
        raise NoMatchError('It is not 3PAR.')
    if not (kwargs.get('snmp_name', '') or '').startswith('3PAR'):
        raise NoMatchError('It is not 3PAR.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ssh_3par', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set SSH_3PAR_USER and SSH_3PAR_PASSWORD in your '
            'configuration file.', )
    else:
        device_info = _ssh_3par(ip_address, user, password)
        result.update({
            'status': 'success',
            'device': device_info,
        })
    return result
Ejemplo n.º 18
0
def scan_address(ip_address, **kwargs):
    if kwargs.get('http_family', '') not in ('Unspecified', 'RomPager', 'HP'):
        raise NoMatchError('It is not HP.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('ilo_hp', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append(
            'Not configured. Set ILO_USER and ILO_PASSWORD in your '
            'configuration file.', )
    else:
        device_info = _ilo_hp(ip_address, user, password)
        result['status'] = 'success'
        result['device'] = device_info
    return result
Ejemplo n.º 19
0
def scan_address(ip_address, **kwargs):
    messages = []
    result = get_base_result_template('ssh_linux', messages)
    snmp_name = kwargs.get('snmp_name', '') or ''
    if not snmp_name:
        raise NoMatchError("No snmp found")
    snmp_name = snmp_name.lower()
    if 'nx-os' in snmp_name:
        messages.append('Incompatible Nexus found.')
        result['status'] = 'error'
        return result
    if all((
            'linux' not in snmp_name,
            'xen' not in snmp_name,
            not snmp_name.startswith('vmware esx'),
    )):
        messages.append('No match.')
        result['status'] = 'error'
        return result
    ssh = None
    auths = SETTINGS.get('auths', [])
    for user, password in auths:
        if user is None or password is None:
            continue
        try:
            ssh = network.connect_ssh(ip_address, user, password)
        except network.AuthError:
            continue
        else:
            break
    if not ssh:
        messages.append('Authorization failed')
        result['status'] = 'error'
        return result
    try:
        device_info = _ssh_linux(ssh, ip_address)
    except (network.Error, paramiko.SSHException) as e:
        messages.append(unicode(e))
        result['status'] = 'error'
    else:
        result.update({
            'status': 'success',
            'device': device_info,
        })
    return result
Ejemplo n.º 20
0
def scan_address(ip_address, **kwargs):
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('http_ibm_system_x', messages)
    if not user or not password:
        raise NotConfiguredError(
            'Not configured. Set IBM_SYSTEM_X_USER and IBM_SYSTEM_X_PASSWORD '
            'in your configuration file.', )
    headers, document = get_http_info(ip_address)
    family = guess_family(headers, document)
    if family != 'IBM System X':
        raise NoMatchError('It is not IBM System X device.')
    result.update({
        'status': 'success',
        'device': _http_ibm_system_x(ip_address, user, password),
    })
    return result
Ejemplo n.º 21
0
def scan_address(ip_address, **kwargs):
    if kwargs.get('http_family', '') not in ('Thomas-Krenn', ):
        raise NoMatchError('It is not Thomas-Krenn.')
    user = SETTINGS.get('user')
    password = SETTINGS.get('password')
    messages = []
    result = get_base_result_template('http_supermicro', messages)
    if not user or not password:
        result['status'] = 'error'
        messages.append('Not configured.')
    else:
        try:
            device_info = _http_supermicro(ip_address, user, password)
        except Error as e:
            result['status'] = 'error'
            messages.append(unicode(e))
        else:
            result.update({
                'status': 'success',
                'device': device_info,
            })
    return result
Ejemplo n.º 22
0
def get_master_hostname(ssh):
    stdin, stdout, stderr = ssh.exec_command('/usr/sbin/gnt-cluster getmaster')
    master = stdout.read().strip()
    if not master:
        raise NoMatchError('not a ganeti node.')
    return master
Ejemplo n.º 23
0
def _ssh_3par(ip_address, user, password):
    ssh = _connect_ssh(ip_address, user, password)
    try:
        stdin, stdout, stderr = ssh.exec_command("showsys")
        lines = list(stdout.readlines())
        if not _3PAR_RE.match(lines[1]):
            raise NoMatchError('Not a 3PAR.')
        line = lines[-1]
        name = line[5:15].strip()
        model_name = line[16:28].strip()
        sn = line[29:37].strip()
        stdin, stdout, stderr = ssh.exec_command(
            "showvv -showcols "
            "Id,Name,VV_WWN,Snp_RawRsvd_MB,Usr_RawRsvd_MB,Prov", )
        shares = {}
        for line in list(stdout.readlines()):
            if line.strip().startswith('Id'):
                continue
            if line.startswith('----'):
                break
            share_id, share_name, wwn, snapshot_size, size, prov = line.split(
                None,
                5,
            )
            if '--' in size or '--' in snapshot_size:
                continue
            share_id = int(share_id)
            if share_id == 0:
                continue
            snapshot_size = int(snapshot_size)
            size = int(size)
            stdin, stdout, stderr = ssh.exec_command(
                "showld -p -vv %s" % share_name, )
            lines = list(stdout.readlines())
            (
                logical_id,
                logical_name,
                preserve,
                disk_type,
                speed,
            ) = lines[1].split(None, 5)
            speed = int(speed) * 1000
            shares[share_id] = (
                share_name,
                wwn,
                snapshot_size,
                size,
                disk_type,
                speed,
                prov.strip() == 'full',
            )
    finally:
        ssh.close()
    device_info = {
        'type': DeviceType.storage.raw,
        'model_name': '3PAR %s' % model_name,
        'hostname': name,
        'management_ip_addresses': [ip_address],
    }
    if sn not in SERIAL_BLACKLIST:
        device_info['serial_number'] = sn
    shares = _handle_shares(shares)
    if shares:
        device_info['disk_exports'] = shares
    return device_info