// /** // * File: CrawledHost.cs // * Author: haraldwolff // * // * This file and it's content is copyrighted by the Author and / or copyright holder. // * Any use wihtout proper permission is illegal and may lead to legal actions. // * // * // **/ using System; using System.Collections.Generic; using System.Security.Cryptography.X509Certificates; using ln.types; using ln.types.sync; using System.Net; using System.IO; using System.Net.NetworkInformation; using ln.logging; using System.Linq; using ln.snmp; using ln.snmp.endpoint; using ln.snmp.rfc1213; namespace ln.skyscanner.crawl { public class CrawledHost { private List interfaces = new List(); public RFC1213.Interface[] Interfaces { get => interfaces.ToArray(); set => interfaces = new List(value); } public CIDR[] IPAddresses => interfaces.Select((intf) => intf.IPAddresses).SelectMany((i) => i).ToArray(); public String[] HWAddresses => interfaces.Select((intf) => intf.HWAddr).ToArray(); public String PrimaryHWAddr => HWAddresses.Where((hwa) => hwa != null && !String.Empty.Equals(hwa)).FirstOrDefault(); public String Name { get; set; } public CIDR PrimaryIP { get; set; } Dictionary hints = new Dictionary(); public DateTime FirstSeen; public DateTime LastSeen; public DateTime LastCheck; public DateTime NextCheck; public bool SnmpDetected => GetHint("snmp.version", -1) != -1; public CrawledHost() { Name = "noname"; PrimaryIP = IPAddress.Any; } public KeyValuePair[] Hints => hints.ToArray(); public void SetHint(string name,object value) { hints[name] = value; } public object GetHint(String name) { return hints[name]; } public T GetHint(string name) { return (T)GetHint(name); } public object GetHint(string name,object def) { if (HasHint(name)) return hints[name]; return def; } public T GetHint(string name,T def) { if (HasHint(name)) return (T)hints[name]; return def; } public bool HasHint(string name) { return hints.ContainsKey(name) && (hints[name] != null); } public SnmpEndpoint GetSnmpEndpoint(SNMPEngine engine) { int snmpVersion = GetHint("snmp.version", -1); switch (snmpVersion) { case 1: SnmpV1Endpoint v1 = new SnmpV1Endpoint(engine, new IPEndPoint(PrimaryIP, 161)); v1.CommunityString = GetHint("snmp.community"); return v1; case 2: SnmpV2Endpoint v2 = new SnmpV2Endpoint(engine, new IPEndPoint(PrimaryIP, 161)); v2.CommunityString = GetHint("snmp.community"); return v2; case 3: USMEndpoint endpoint = new USMEndpoint(engine, new IPEndPoint(PrimaryIP, 161)); endpoint.AuthMethod = SnmpV3AuthMethod.SHA; endpoint.Username = GetHint("snmp.username"); endpoint.AuthKeyPhrase = GetHint("snmp.authkey"); return endpoint; default: return null; } } public override string ToString() { return String.Format("[CrawledHost PrimaryIP={0} Name={1}]",PrimaryIP,Name); } } }