sergkh icon

Untitled

sergkh | PRO | 09/13/17 11:26:27 AM UTC | 0 ⭐ | 419 👁️ | Never ⏰ | []
Python |

7.12 KB

|

None

|

0 👍

/

0 👎

import re
import argparse
import paramiko
from netaddr import IPAddress
 
 
 
 
def scanparams():
    parser = argparse.ArgumentParser(description='scan hardware at remote host using /proc /sys data via ssh connection.')
    parser.add_argument("scanedhost", help="IP or hostname for detecting hardware", type = str, default = '127.0.0.1')
    parser.add_argument("-s", "--sshkey", help="path to the ssh private file ", default = './.ssh/id_rsa')
    
    args = parser.parse_args()
    hostlist = args.scanedhost.split(",")
    print("args: {0}; {1}".format(args.scanedhost, args.sshkey))
    return args.sshkey, hostlist
    
def detecthostname(client):
    """ """
    stdin,stdout,stderr = client.exec_command('hostname')
    return stdout.readlines()[0]
def detectcpu(client):
    """ detecting cpu models and count it"""
    stdin,stdout,stderr = client.exec_command('cat /proc/cpuinfo')
    cpuinfotext = stdout.readlines()
    cpucount = 0
    cpuname = 'not detected'
    for mystr in cpuinfotext:
        m = re.search('(^model\ name\t)(?P<cpuname>.*)', mystr)
        if m is not None:
            cpucount +=1
            cpuname = m.group('cpuname')
    return cpuname, cpucount
def detectmemory(client):
    """ """
    stdin,stdout,stderr = client.exec_command('cat /proc/meminfo')    
    return stdout.readlines()[0].split()[1]
def detectdrives(client):
    """ """
    stdin,stdout,stderr = client.exec_command('ls /sys/block')
    devicelist = stdout.readlines()
    localdrivelist = []
    drives = {}
    for localdrive  in devicelist:
        m = re.search('(?P<drivename>h|sd.)',localdrive)
        if m  is not None:
            localdrivelist.append(m.group('drivename'))
    for selecteddrive in localdrivelist:
        drives[selecteddrive] = {}           
        stdin,stdout,stderr = client.exec_command('cat /sys/class/block/{0}/device/model'.format(selecteddrive))
        drives[selecteddrive]['model'] = stdout.readlines()[0].rstrip()
        stdin,stdout,stderr = client.exec_command('cat /sys/block/{0}/size'.format(selecteddrive))
        drivesize = int(stdout.readlines()[0])/2028
        drives[selecteddrive]['size'] = drivesize
    return drives
def detectnetworkcards(client):
    """ detect netcar procedure"""
    busvendordict = {}
    namesettingdict = {}
    netcardlist = []
    stdin,stdout,stderr = client.exec_command("lspci")
    etherlist= stdout.readlines()
    for mystr in etherlist:
        m = re.search('(?P<hwid>^[0-9a-fA-F]{2}:[0-9a-fA-F]{2}\.[0-9a-fA-F]) Ethernet controller: (?P<vendorname>.*)', mystr)
        if m is not None:
            busvendordict[m.group('hwid')] = m.group('vendorname')
            netcardlist.append({'hardwareid':m.group('hwid'),'vendorname':m.group('vendorname')})
    for hwid in busvendordict:
        stdin,stdout,stderr = client.exec_command('ls /sys/bus/pci/devices/0000\:{0}/net/'.format(hwid))
        systemname = stdout.readlines()[0].rstrip()
        for card in netcardlist:
            if card['hardwareid'] == hwid:
                card.update({'systemname':systemname})
        namesettingdict[systemname] = {}
        namesettingdict[systemname]['systemname'] = hwid
        namesettingdict[systemname]['vendorname'] = busvendordict[hwid]
        netcard = {'systemname': hwid, 'vendorname':busvendordict[hwid]}
 
    stdin,stdout,stderr = client.exec_command('cat /proc/net/route')
    routestings = stdout.readlines()
    for mystr in routestings:
        st = mystr.split('\t')
        if ((st[2] ==  '00000000') and (st[7] !=  'FFFFFFFF') and (st[1] != '0000FEA9')):
            IPnetwork = '.'.join([str(int(st[1][i-2:i], 16)) for i in reversed(range(2,10,2))])
            IPnetmask = '.'.join([str(int(st[7][i-2:i], 16)) for i in reversed(range(2,10,2))])
            IPnetmaskhex = ''.join([st[7][i-2:i] for i in reversed(range(2,10,2))])
            IPnetmaskshortform = bin(int(IPnetmaskhex,16)).count("1")
            logicalinterfacename = st[0]
            for netcard in netcardlist:
                if re.match('{0}.*'.format(netcard['systemname']), logicalinterfacename):
                    if not netcard.has_key('logicalname'):
                        netcard.update({'logicalname': list()})
                    netcard['logicalname'].append({'name':logicalinterfacename, 'IPv4':'0.0.0.0', 'IPnetwork':IPnetwork, 'IPnetmask':IPnetmask, 'IPnetmaskshortform': IPnetmaskshortform})
                        
    stdin,stdout,stderr = client.exec_command('cat /proc/net/fib_trie')
    fib_trie_result  = stdout.readlines()
    if (len(fib_trie_result) == 0):
        print( "No information about IPs !")
        return netcardlist
    for pos, mystr in enumerate(fib_trie_result):
        if re.match( r'(.*)host(.*)', mystr):
            localIP = re.search('(?P<IP>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})', fib_trie_result[pos-1])
            if localIP is  None:
                pass
            Network = re.search('(?P<Network>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})/(?P<Netmask>\d{1,2})', fib_trie_result[pos-5])
            if Network is not None:
                for netcard in netcardlist:
                    try:
                        if not 'logicalname' in  netcard:
                                continue
                        for linterface in  netcard['logicalname']:
                            logicalinterface = linterface['name']
                            if (int(Network.group('Netmask')) == linterface['IPnetmaskshortform']) and (Network.group('Network')==linterface['IPnetwork']):
                                linterface['IPv4'] = localIP.group('IP')
 
                    except:
 
                        print ("Exception netcard structure : {0}   1: {1}".format(netcard, netcard[1]))        
 
    return  netcardlist
 
def main():
    """ main function for scanning hardware using ssh connection"""
    sshkeyfile, hostlist = scanparams()
    for hostname in hostlist:
        print("="*50)
        print("trying to get information from host: {0}".format(hostname))
        print("="*50)
        client = paramiko.SSHClient()
        client.load_system_host_keys()
        client.load_host_keys(sshkeyfile)
        client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        client.connect(hostname, username='root')
        print("*"*50)
        print("Hostname:{0}".format(detecthostname(client)))
        cpuname, cpucount = detectcpu(client)
        print ("*"*20+"CPU information"+"*"*20)
        print("CPUCount: {0}\n CPU  model: {1}".format(cpucount, cpuname))
        print("*"*30+"Memory information"+"*"*20)
        print(("Momory size in kb: {0}\n"+"="*30).format(detectmemory(client)))
        print("*"*20+"Netcard's information'"+"*"*20)
        netcardlist = detectnetworkcards(client)
        drives = detectdrives(client)
        print("{0}\n {1}\n {0}".format("#"*50, netcardlist))
        
        print("*"*20+"Drives information"+"*"*20)
        for drive in drives:
            print("Drive system name:/dev/{0}\nDrive vendor:{1}\nDrive size: {2} MB".format(drive, drives[drive]['model'], drives[drive]['size']))
        client.close()
if __name__=="__main__":
    main()

Comments