def main(): """ 读取扫描所需配置文件 :return: """ with open('conf/scanhosts.yaml') as f: s_conf = yaml.load(f, Loader=yaml.FullLoader) s_nets = s_conf['hostsinfo']['nets'] s_ports = s_conf['hostsinfo']['ports'] s_pass = s_conf['hostsinfo']['ssh_pass'] s_cmds = s_conf['hostsinfo']['syscmd_list'] s_keys = s_conf['hostsinfo']['ssh_key_file'] s_blacks = s_conf['hostsinfo']['black_list'] s_emails = s_conf['hostsinfo']['email_list'] n_sysname_oid = s_conf['netinfo']['sysname_oid'] n_sn_oid = s_conf['netinfo']['sn_oids'] n_commu = s_conf['netinfo']['community'] n_login_sw = s_conf['netinfo']['login_enable'] n_backup_sw = s_conf['netinfo']['backup_enable'] n_backup_sever = s_conf['netinfo']['tfp_server'] d_pass = s_conf['dockerinfo']['ssh_pass'] starttime = datetime.datetime.now() ''' 规则:主机信息,去重、生成关系字典 ''' ft = FilterRules() key_ip_dic = ft.run() ''' 梳理虚拟服务器主机于服务器信息 ''' pv = GetHostType() p_relate_dic = pv.get_host_type(key_ip_dic) ''' 更新宿主机类型中表对应关系 ''' ip_key_dic = {v: k for k, v in key_ip_dic.items()} docker_p_list = p_relate_dic["docker-containerd"] kvm_p_list = p_relate_dic["qemu-system-x86_64"] vmware_p_list = p_relate_dic["vmx"] for item in docker_p_list: PhysicalServerInfo.objects.filter( conn_phy__sn_key=ip_key_dic[item]).update(vir_type="1") for item in kvm_p_list: PhysicalServerInfo.objects.filter( conn_phy__sn_key=ip_key_dic[item]).update(vir_type="0") for item in vmware_p_list: PhysicalServerInfo.objects.filter( conn_phy__sn_key=ip_key_dic[item]).update(vir_type="2") ''' 扫描docker的宿主机和虚拟服务的关系 ''' ds = NmapDocker(s_cmds, d_pass, ip_key_dic) ds.do_nmap(docker_p_list) # # ''' # 扫描KVM的宿主机和虚拟服务的关系 # ''' ks = NmapKVM(ip_key_dic) ks.do_nmap(kvm_p_list) ''' 扫描ESXI虚拟机配置 ''' ne = NmapVMX(vmware_p_list, ip_key_dic) ne.dosnmp() endtime = datetime.datetime.now() totaltime = (endtime - starttime).seconds logger.info("{Finish:Use time %s s}" % totaltime) print("{Finish:Use time %s s}" % totaltime)
def main(): ''' 读取扫描所需配置文件 :return: ''' s_conf = yaml.load(file('conf/scanhosts.yaml')) s_nets = s_conf['hostsinfo']['nets'] print 'hostinfo +++++++++', s_nets s_ports = s_conf['hostsinfo']['ports'] s_pass = s_conf['hostsinfo']['ssh_pass'] s_cmds = s_conf['hostsinfo']['syscmd_list'] s_keys = s_conf['hostsinfo']['ssh_key_file'] s_blacks = s_conf['hostsinfo']['black_list'] s_emails = s_conf['hostsinfo']['email_list'] n_sysname_oid = s_conf['netinfo']['sysname_oid'] n_sn_oid = s_conf['netinfo']['sn_oids'] n_commu = s_conf['netinfo']['community'] n_login_sw = s_conf['netinfo']['login_enable'] n_backup_sw = s_conf['netinfo']['backup_enable'] n_backup_sever = s_conf['netinfo']['tfp_server'] d_pass = s_conf['dockerinfo']['ssh_pass'] starttime = datetime.datetime.now() ''' 扫描主机信息 ''' for nmap_type in s_nets: unkown_list,key_not_login_list = snmp_begin(nmap_type,s_ports,s_pass,s_keys,s_cmds,s_blacks,s_emails) ''' 扫描网络信息 ''' nm = NmapNet(n_sysname_oid,n_sn_oid,n_commu) if key_not_login_list: for item in key_not_login_list: is_net = nm.query(item) if is_net[0] or is_net[1]: HostLoginifo.objects.update_or_create(ip=item,hostname=is_net[0],sn=is_net[1],mathine_type="Network device") else: HostLoginifo.objects.update_or_create(ip=item,ssh_port=key_not_login_list[item][0],ssh_status=0) other_sn = item.replace('.','') ob = OtherMachineInfo.objects.filter(sn_key=other_sn) if not ob: print ".........................OtherMachineInfo",item,other_sn OtherMachineInfo.objects.create(ip=item,sn_key=other_sn,reson_str=u"SSH端口存活,无法登录",oth_cab_id=1) if unkown_list: for item in unkown_list: is_net = nm.query(item) if is_net[0] or is_net[1]: HostLoginifo.objects.update_or_create(ip=item,hostname=is_net,mathine_type="Network device") else: HostLoginifo.objects.update_or_create(ip=item,ssh_status=0) other_sn = item.replace('.','') ob = OtherMachineInfo.objects.filter(sn_key=other_sn) if not ob: OtherMachineInfo.objects.create(ip=item,sn_key=other_sn,reson_str=u"IP存活,非Linux服务器",oth_cab_id=1) ''' 网络设备备份或者登录功能 ''' net_login_dct = {} with open("%s/conf/net_dev.pass"%BASE_DIR,'r') as f: for item in f.readlines(): ip,username,passwd,en_passwd = re.split("\s+",item)[:4] net_login_dct[ip] = (username,passwd,en_passwd) if n_login_sw == "True": res = NetDevLogin(dev_ips=net_login_dct,backup_sw=n_backup_sw,back_server=n_backup_sever) ''' 规则:主机信息,去重、生成关系字典 ''' ft = FilterRules() key_ip_dic = ft.run() ''' 梳理虚拟服务器主机于服务器信息 ''' pv = GetHostType() p_relate_dic = pv.get_host_type(key_ip_dic) ''' 更新宿主机类型中表对应关系 ''' ip_key_dic = {v:k for k,v in key_ip_dic.items()} docker_p_list = p_relate_dic["docker-containerd"] kvm_p_list = p_relate_dic["qemu-system-x86_64"] vmware_p_list = p_relate_dic["vmx"] for item in docker_p_list: PhysicalServerInfo.objects.filter(conn_phy__sn_key=ip_key_dic[item]).update(vir_type="1") for item in kvm_p_list: PhysicalServerInfo.objects.filter(conn_phy__sn_key=ip_key_dic[item]).update(vir_type="0") for item in vmware_p_list: PhysicalServerInfo.objects.filter(conn_phy__sn_key=ip_key_dic[item]).update(vir_type="2") ''' 扫描docker的宿主机和虚拟服务的关系 ''' ds = NmapDocker(s_cmds,d_pass,ip_key_dic) ds.do_nmap(docker_p_list) ''' 扫描KVM的宿主机和虚拟服务的关系 ''' ks = NmapKVM(ip_key_dic) ks.do_nmap(kvm_p_list) ''' 扫描ESXI虚拟机配置 ''' ne = NmapVMX(vmware_p_list,ip_key_dic) ne.dosnmp() ''' 更新状态表,用户信息表 ''' c_sn_lst = [item.sn_key for item in ConnectionInfo.objects.all()] o_sn_lst = [item.sn_key for item in OtherMachineInfo.objects.all()] old_sn_list = [item.sn_key for item in MachineOperationsInfo.objects.all()] new_sn_lst = c_sn_lst + o_sn_lst diff_sn_lst = set(new_sn_lst + old_sn_list) for item in diff_sn_lst: try: nsin = MachineOperationsInfo.objects.filter(sn_key=item) if not nsin: MachineOperationsInfo.objects.create(sn_key=item) except Exception as e: print "Error:SN:%s not insert into database,reason is:%s"%(item,e) logger.error("Error:SN:%s not insert into database,reason is:%s"%(item,e)) ''' 统计总数 ''' info_dic = Machines().get_all_count() StatisticsRecord.objects.create(all_count=info_dic['all_c'],pyh_count=info_dic['pyh_c'],net_count=info_dic['net_c'], other_count=info_dic['other_c'],vmx_count=info_dic['vmx_c'],kvm_count=info_dic['kvm_c'],docker_count=info_dic['docker_c']) endtime = datetime.datetime.now() totaltime = (endtime - starttime).seconds logger.info("{Finish:Use time %s s}"%totaltime) print "{Finish:Use time %s s}"%totaltime
def main(): ''' 读取扫描所需配置文件 :return: ''' s_conf = yaml.load(file('conf/scanhosts.yaml')) s_nets = s_conf['hostsinfo']['nets'] s_ports = s_conf['hostsinfo']['ports'] s_pass = s_conf['hostsinfo']['ssh_pass'] s_cmds = s_conf['hostsinfo']['syscmd_list'] s_keys = s_conf['hostsinfo']['ssh_key_file'] s_blacks = s_conf['hostsinfo']['black_list'] s_emails = s_conf['hostsinfo']['email_list'] n_sysname_oid = s_conf['netinfo']['sysname_oid'] n_sn_oid = s_conf['netinfo']['sn_oids'] n_commu = s_conf['netinfo']['community'] n_login_sw = s_conf['netinfo']['login_enable'] n_backup_sw = s_conf['netinfo']['backup_enable'] n_backup_sever = s_conf['netinfo']['tfp_server'] d_pass = s_conf['dockerinfo']['ssh_pass'] starttime = datetime.datetime.now() # ''' # 扫描主机信息 # ''' for nmap_type in s_nets: unkown_list, key_not_login_list = snmp_begin(nmap_type, s_ports, s_pass, s_keys, s_cmds, s_blacks, s_emails) #snmp_begin(nmap_type,s_ports,s_pass,s_keys,s_cmds,s_blacks,s_emails) print unkown_list print key_not_login_list ''' 扫描网络信息 ''' if key_not_login_list: for item in key_not_login_list: HostLoginifo.objects.update_or_create( ip=item, ssh_port=key_not_login_list[item], ssh_status=0) other_sn = item.replace('.', '') ob = OtherMachineInfo.objects.filter(sn_key=other_sn) if not ob: print ".........................OtherMachineInfo", item, other_sn OtherMachineInfo.objects.create(ip=item, sn_key=other_sn, reson_str=u"SSH端口存活,无法登录", oth_cab_id=1) if unkown_list: for item in unkown_list: HostLoginifo.objects.update_or_create(ip=item, ssh_status=0) other_sn = item.replace('.', '') ob = OtherMachineInfo.objects.filter(sn_key=other_sn) if not ob: OtherMachineInfo.objects.create(ip=item, sn_key=other_sn, reson_str=u"IP存活,非Linux服务器", oth_cab_id=2) ''' 把HostLoginifo中所有可以登录的信息以处理过的sn(没有sn用处理过的mac)为sn_key组成dict,利用该dict,全部插入ConnectionInfo, 区分后kvm VMware虚拟机插入VirtualServerInfo, 此处有个bug,此时PhysicalServerInfo为空,插入时指定了PhysicalServerInfo的外键vir_phy_id,所以在PhysicalServerInfo先插入一条,vir_phy_id指向它的id,后续扫描kvm ESXI宿主机时再把vir_phy_id更改为对应的宿主机id 区分后留下的机器插入PhysicalServerInfo,返回所有物理机组成的dict:{sn_key:ip} ''' ft = FilterRules() key_ip_dic = ft.run() print 'key_ip_dic:', key_ip_dic if key_ip_dic: ''' 区分物理机为kvm VMware docker宿主机,更新HostLoginifo中的host_type为对应的值, 由于Esx宿主机无法通过dmicode命令获取mathine_type,更改PhysicalServerInfo中的machine_brand, 返回检测命令对应宿主机类型list组成的dict ''' pv = GetHostType() p_relate_dic = pv.get_host_type(key_ip_dic) ''' 更新physicalserverinfo中宿主机的类型,即vir_type ''' ip_key_dic = {v: k for k, v in key_ip_dic.items()} docker_p_list = p_relate_dic["docker-containerd"] kvm_p_list = p_relate_dic["qemu-system-x86_64"] vmware_p_list = p_relate_dic["vmx"] for item in docker_p_list: PhysicalServerInfo.objects.filter( conn_phy__sn_key=ip_key_dic[item]).update(vir_type="1") for item in kvm_p_list: PhysicalServerInfo.objects.filter( conn_phy__sn_key=ip_key_dic[item]).update(vir_type="0") for item in vmware_p_list: PhysicalServerInfo.objects.filter( conn_phy__sn_key=ip_key_dic[item]).update(vir_type="2") ''' 首先对docker宿主机列表一个一个进行容器探测,得出容器ssh端口,然后用try_docker_login进行登录探测, 当端口可以登录: 插入一条到ConnectionInfo,指定ssh_type=4(docker可以登录),sn_key=docker在宿主机中的唯一标识, 插入一条到VirtualServerInfo,指定server_type="Docker Contianer",插入登录执行命令返回后的各种信息,conn_vir_id外键等于ConnectionInfo中对应的id, 当PhysicalServerInfo中一条记录对应ConnectionInfo中的记录的sn_key与ip_key_dic[docker宿主机ip]的值吻合时,此时PhysicalServerInfo的物理机为docker的宿主机, vir_phy_id外键等于这条记录的id(其实可以直接在PhysicalServerInfo中通过docker宿主机ip过滤得到物理机外键?) 当端口不能登录: 插入一条到ConnectionInfo,没有ssh_userpasswd,指定ssh_status=0,ssh_type=5(docker不能登录),sn_key=docker在宿主机中的唯一标识, 插入一条到VirtualServerInfo,指定server_type="Docker Contianer",conn_vir_id外键等于ConnectionInfo中对应的id,vir_phy_id外键等于物理机id ''' ds = NmapDocker(s_cmds, d_pass, ip_key_dic) ds.do_nmap(docker_p_list) ''' 对KVM宿主机进行mac地址探测,得到上面所有的虚拟机的mac地址,一一将mac地址与virtualserverinfo中虚拟机的mac地址比对, 符合则得到该虚拟机的宿主机,update虚拟机记录的vir_phy_id和server_type ''' ks = NmapKVM(ip_key_dic) ks.do_nmap(kvm_p_list) ''' 利用sdk SnmpVMS对VMware宿主机进行探测,得到上面所有的虚拟机,在virtualserverinfo中将虚拟机与宿主机关联对应, update虚拟机记录的vir_phy_id和server_type 完成虚拟机关联宿主机后,可以把PhysicalServerInfo中人为插入的那条记录删掉了 ''' ne = NmapVMX(vmware_p_list, ip_key_dic) ne.dosnmp()