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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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