public bool Set(RSU rsu, Core.Entities.User user, string OID, SnmpType type, string value) { IPEndPoint receiver = new IPEndPoint(rsu.IP, rsu.Port); int timeout = _managerSettings.Timeout; Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(timeout, receiver); var auth = new SHA1AuthenticationProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Auth)); var priv = new DESPrivacyProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Priv), auth); ISnmpData data; try { data = ConvertStringValue2SnmpData(type, value); } catch (InvalidDataType invalidDataType) { throw invalidDataType; } catch (FormatException formatException) { throw formatException; } List <Variable> variables = new List <Variable>() { new Variable(new ObjectIdentifier(OID), data) }; SetRequestMessage request = new SetRequestMessage(VersionCode.V3 , Messenger.NextMessageId , Messenger.NextRequestId , new OctetString(user.UserName) , new OctetString(String.Empty) , variables , priv , Messenger.MaxMessageSize , report); ISnmpMessage reply = request.GetResponse(timeout, receiver); // Need to send again (RFC 3414) if (reply is ReportMessage) { //throw new ReplyIsReportMessage(); request = new SetRequestMessage(VersionCode.V3 , Messenger.NextMessageId , Messenger.NextRequestId , new OctetString(user.UserName) , new OctetString(String.Empty) , variables , priv , Messenger.MaxMessageSize , reply); reply = request.GetResponse(timeout, receiver); if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw new InvalidDataType(); } } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw new InvalidDataType(); } return(true); }
private bool CommandMatched(ISnmpMessage message) { var codeString = message.Pdu().TypeCode.ToString(); return StringEquals(_command, "*") || StringEquals(_command + "RequestPdu", codeString) || StringEquals(_command + "Pdu", codeString); }
public static void Main(string[] args) { string community = "public"; bool showHelp = false; bool showVersion = false; VersionCode version = VersionCode.V1; int timeout = 1000; int retry = 0; Levels level = Levels.Reportable; string user = string.Empty; string authentication = string.Empty; string authPhrase = string.Empty; string privacy = string.Empty; string privPhrase = string.Empty; bool dump = false; OptionSet p = new OptionSet() .Add("c:", "Community name, (default is public)", delegate(string v) { if (v != null) { community = v; } }) .Add("l:", "Security level, (default is noAuthNoPriv)", delegate(string v) { if (v.ToUpperInvariant() == "NOAUTHNOPRIV") { level = Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHNOPRIV") { level = Levels.Authentication | Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHPRIV") { level = Levels.Authentication | Levels.Privacy | Levels.Reportable; } else { throw new ArgumentException("no such security mode: " + v); } }) .Add("a:", "Authentication method (MD5 or SHA)", delegate(string v) { authentication = v; }) .Add("A:", "Authentication passphrase", delegate(string v) { authPhrase = v; }) .Add("x:", "Privacy method", delegate(string v) { privacy = v; }) .Add("X:", "Privacy passphrase", delegate(string v) { privPhrase = v; }) .Add("u:", "Security name", delegate(string v) { user = v; }) .Add("h|?|help", "Print this help information.", delegate(string v) { showHelp = v != null; }) .Add("V", "Display version number of this application.", delegate(string v) { showVersion = v != null; }) .Add("d", "Display message dump", delegate(string v) { dump = true; }) .Add("t:", "Timeout value (unit is second).", delegate(string v) { timeout = int.Parse(v) * 1000; }) .Add("r:", "Retry count (default is 0)", delegate(string v) { retry = int.Parse(v); }) .Add("v:", "SNMP version (1, 2, and 3 are currently supported)", delegate(string v) { switch (int.Parse(v)) { case 1: version = VersionCode.V1; break; case 2: version = VersionCode.V2; break; case 3: version = VersionCode.V3; break; default: throw new ArgumentException("no such version: " + v); } }); if (args.Length == 0) { ShowHelp(p); return; } List <string> extra; try { extra = p.Parse(args); } catch (OptionException ex) { Console.WriteLine(ex.Message); return; } if (showHelp) { ShowHelp(p); return; } if (extra.Count < 2) { Console.WriteLine("invalid variable number: " + extra.Count); return; } if (showVersion) { Console.WriteLine(Assembly.GetEntryAssembly().GetCustomAttribute <AssemblyVersionAttribute>().Version); return; } IPAddress ip; bool parsed = IPAddress.TryParse(extra[0], out ip); if (!parsed) { var addresses = Dns.GetHostAddressesAsync(extra[0]); addresses.Wait(); foreach (IPAddress address in addresses.Result.Where(address => address.AddressFamily == AddressFamily.InterNetwork)) { ip = address; break; } if (ip == null) { Console.WriteLine("invalid host or wrong IP address found: " + extra[0]); return; } } try { List <Variable> vList = new List <Variable>(); for (int i = 1; i < extra.Count; i++) { Variable test = new Variable(new ObjectIdentifier(extra[i])); vList.Add(test); } IPEndPoint receiver = new IPEndPoint(ip, 161); if (version != VersionCode.V3) { GetNextRequestMessage message = new GetNextRequestMessage(0, version, new OctetString(community), vList); ISnmpMessage response = message.GetResponse(timeout, receiver); if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } foreach (Variable variable in response.Pdu().Variables) { Console.WriteLine(variable); } return; } if (string.IsNullOrEmpty(user)) { Console.WriteLine("User name need to be specified for v3."); return; } IAuthenticationProvider auth = (level & Levels.Authentication) == Levels.Authentication ? GetAuthenticationProviderByName(authentication, authPhrase) : DefaultAuthenticationProvider.Instance; IPrivacyProvider priv; if ((level & Levels.Privacy) == Levels.Privacy) { #if NET452 priv = new DESPrivacyProvider(new OctetString(privPhrase), auth); #else Console.WriteLine("DES (ECB) is not supported by .NET Core."); return; #endif } else { priv = new DefaultPrivacyProvider(auth); } Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetNextRequestPdu); ReportMessage report = discovery.GetResponse(timeout, receiver); GetNextRequestMessage request = new GetNextRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(timeout, receiver); if (dump) { Console.WriteLine("Request message bytes:"); Console.WriteLine(ByteTool.Convert(request.ToBytes())); Console.WriteLine("Response message bytes:"); Console.WriteLine(ByteTool.Convert(reply.ToBytes())); } if (reply is ReportMessage) { if (reply.Pdu().Variables.Count == 0) { Console.WriteLine("wrong report message received"); return; } var id = reply.Pdu().Variables[0].Id; if (id != Messenger.NotInTimeWindow) { var error = id.GetErrorMessage(); Console.WriteLine(error); return; } // according to RFC 3414, send a second request to sync time. request = new GetNextRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, reply); reply = request.GetResponse(timeout, receiver); } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, reply); } foreach (Variable v in reply.Pdu().Variables) { Console.WriteLine(v); } } catch (SnmpException ex) { Console.WriteLine(ex); } catch (SocketException ex) { Console.WriteLine(ex); } }
public List <MIBObject> Get(RSU rsu, Core.Entities.User user, string OID) { List <MIBObject> mibObjects; try { IPEndPoint receiver = new IPEndPoint(rsu.IP, rsu.Port); int timeout = _managerSettings.Timeout; Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report = discovery.GetResponse(timeout, receiver); var auth = new SHA1AuthenticationProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Auth)); var priv = new DESPrivacyProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Priv), auth); GetRequestMessage request = new GetRequestMessage(VersionCode.V3 , Messenger.NextMessageId , Messenger.NextRequestId , new OctetString(user.UserName) , new OctetString(String.Empty) , new List <Variable> { new Variable(new ObjectIdentifier(OID)) } , priv , Messenger.MaxMessageSize , report); ISnmpMessage reply = request.GetResponse(timeout, receiver); // Need to send again (RFC 3414)??? if (reply is ReportMessage) { //throw new ReplyIsReportMessage(); request = new GetRequestMessage(VersionCode.V3 , Messenger.NextMessageId , Messenger.NextRequestId , new OctetString(user.UserName) , new OctetString(String.Empty) , new List <Variable> { new Variable(new ObjectIdentifier(OID)) } , priv , Messenger.MaxMessageSize , reply); reply = request.GetResponse(timeout, receiver); if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw new SnmpGetError(); } } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw new SnmpGetError(); } mibObjects = SNMPVariables2MIBObjects(reply.Pdu().Variables); return(mibObjects); } catch (Lextm.SharpSnmpLib.Messaging.TimeoutException ex) { mibObjects = new List <MIBObject>(); mibObjects.Add(new MIBObject("0", SnmpType.OctetString, "Timeout")); return(mibObjects); } }
public async Task <Variable?> GetV3TsmAsync(IPAddress ip, string oid, int retries, int port, TimeSpan timeout, X509Certificate2 certificate, TimeSpan connectionTimeout) { if (ip == null) { throw new ArgumentNullException(nameof(ip)); } if (string.IsNullOrWhiteSpace(oid)) { throw new ArgumentNullException(nameof(oid)); } if (!Regex.IsMatch(oid, @"^(([0-9]+)\.)+[0-9]+$")) { throw new ArgumentException(oid, nameof(oid)); } if (port <= 0) { throw new ArgumentOutOfRangeException(nameof(port), port.ToString()); } if (retries <= 0) { throw new ArgumentOutOfRangeException(nameof(retries), retries.ToString()); } if (timeout <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException(nameof(timeout), timeout.ToString()); } if (connectionTimeout <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException(nameof(connectionTimeout)); } if (certificate is null) { throw new ArgumentNullException(nameof(certificate)); } var startDate = DateTime.Now; var snmpType = "GET"; var snmpVersion = $"3 {SecurityModel.Tsm}"; var attempt = 0; IEnumerable <Variable> reply = new List <Variable>(); while (attempt < retries) { try { var receiver = new IPEndPoint(ip, port); var clientEndPoint = ip.AddressFamily == AddressFamily.InterNetwork ? new IPEndPoint(IPAddress.Any, 0) : new IPEndPoint(IPAddress.IPv6Any, 0); var vList = new List <Variable>() { new Variable(new ObjectIdentifier(oid)) }; var chain = new X509Chain(); chain.Build(certificate); using var client = new Client(clientEndPoint); client.LoadX509Certificate(chain); client.SupportedCipherSuites.Add(TCipherSuite.TLS_RSA_WITH_AES_256_CBC_SHA); var auth = TsmAuthenticationProvider.Instance; IPrivacyProvider priv = new TsmPrivacyProvider(auth); var request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, OctetString.Empty, vList, priv, Messenger.MaxMessageSize); ISnmpMessage response = await request.GetSecureResponseAsync(connectionTimeout, timeout, receiver, client).ConfigureAwait(false); if (response is ReportMessage) { if (response.Pdu().Variables.Count == 0) { throw new Exception("wrong report message received"); } var id = response.Pdu().Variables[0].Id; if (id != Messenger.NotInTimeWindow) { var error = id.GetErrorMessage(); throw new Exception($"ERROR: {error}"); } // according to RFC 3414, send a second request to sync time. var request2 = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, OctetString.Empty, OctetString.Empty, vList, priv, Messenger.MaxMessageSize, response); response = await request2.GetSecureResponseAsync(connectionTimeout, timeout, receiver, client).ConfigureAwait(false); } else if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } reply = response.Pdu().Variables; break; } catch (Exception ex) when(ex is SnmpException || ex is SocketException || ex is OperationCanceledException || ex is System.TimeoutException) { if (ex is System.TimeoutException && ex.Message == "Could Not Connect To Server") { _Logger.LogInformation($"{ip} - DTLS failed {attempt + 1} time(s)"); } await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, null, snmpType, snmpVersion, ex.GetType().ToString(), ex.Message).ConfigureAwait(false); ++attempt; if (attempt >= retries) { throw; } } } var type = string.Empty; var data = string.Empty; foreach (var res in reply) { type += res.Data.TypeCode; data += res.Data.ToString(); } await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, null, snmpType, snmpVersion, type, data).ConfigureAwait(false); return(reply.FirstOrDefault()); }
private bool CommandMatched(ISnmpMessage message) { var codeString = message.Pdu().TypeCode.ToString(); return(StringEquals(_command, "*") || StringEquals(_command + "RequestPdu", codeString) || StringEquals(_command + "Pdu", codeString)); }
public async Task <Variable?> GetV3UsmAsync(IPAddress ip, string oid, string community, int retries, int port, TimeSpan timeout, string authPass, string privPass) { if (ip == null) { throw new ArgumentNullException(nameof(ip)); } if (string.IsNullOrWhiteSpace(oid)) { throw new ArgumentNullException(nameof(oid)); } if (!Regex.IsMatch(oid, @"^(([0-9]+)\.)+[0-9]+$")) { throw new ArgumentException(oid, nameof(oid)); } if (port <= 0) { throw new ArgumentOutOfRangeException(nameof(port), port.ToString()); } if (retries <= 0) { throw new ArgumentOutOfRangeException(nameof(retries), retries.ToString()); } if (timeout <= TimeSpan.Zero) { throw new ArgumentOutOfRangeException(nameof(timeout), timeout.ToString()); } if (string.IsNullOrWhiteSpace(authPass)) { throw new ArgumentNullException(nameof(authPass)); } if (string.IsNullOrWhiteSpace(privPass)) { throw new ArgumentNullException(nameof(privPass)); } var startDate = DateTime.Now; var snmpType = "GET"; var snmpVersion = $"3 {SecurityModel.Usm}"; var attempt = 0; IEnumerable <Variable> reply = new List <Variable>(); while (attempt < retries) { try { var receiver = new IPEndPoint(ip, port); var clientEndPoint = ip.AddressFamily == AddressFamily.InterNetwork ? new IPEndPoint(IPAddress.Any, 0) : new IPEndPoint(IPAddress.IPv6Any, 0); var vList = new List <Variable>() { new Variable(new ObjectIdentifier(oid)) }; using var cts = new CancellationTokenSource(timeout); var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); var report = await discovery.GetResponseAsync(receiver).ConfigureAwait(false); var auth = new SHA1AuthenticationProvider(new OctetString(authPass)); // AuthenticationPassword var priv = new DESPrivacyProvider(new OctetString(privPass), auth); //PrivacyPassword var request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(community), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage response = await request.GetResponseAsync(receiver, cts.Token).ConfigureAwait(false); if (response is ReportMessage) { if (response.Pdu().Variables.Count == 0) { throw new Exception("wrong report message received"); } var id = response.Pdu().Variables[0].Id; if (id != Messenger.NotInTimeWindow) { var error = id.GetErrorMessage(); throw new Exception($"ERROR: {error}"); } } else if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } reply = response.Pdu().Variables; break; } catch (Exception ex) when(ex is SnmpException || ex is SocketException || ex is OperationCanceledException || ex is System.TimeoutException) { if (ex is System.TimeoutException && ex.Message == "Could Not Connect To Server") { _Logger.LogInformation($"{ip} - DTLS failed {attempt + 1} time(s)"); } await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, ex.GetType().ToString(), ex.Message).ConfigureAwait(false); ++attempt; if (attempt >= retries) { throw; } } } var type = string.Empty; var data = string.Empty; foreach (var res in reply) { type += res.Data.TypeCode; data += res.Data.ToString(); } await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, type, data).ConfigureAwait(false); return(reply.FirstOrDefault()); }
static void Main(string[] args) { string community = "public"; bool showHelp = false; bool showVersion = false; VersionCode version = VersionCode.V1; int timeout = 1000; int retry = 0; Levels level = Levels.Reportable; string user = string.Empty; string authentication = string.Empty; string authPhrase = string.Empty; string privacy = string.Empty; string privPhrase = string.Empty; OptionSet p = new OptionSet() .Add("c:", "Community name, (default is public)", delegate(string v) { if (v != null) { community = v; } }) .Add("l:", "Security level, (default is noAuthNoPriv)", delegate(string v) { if (v.ToUpperInvariant() == "NOAUTHNOPRIV") { level = Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHNOPRIV") { level = Levels.Authentication | Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHPRIV") { level = Levels.Authentication | Levels.Privacy | Levels.Reportable; } else { throw new ArgumentException("no such security mode: " + v); } }) .Add("a:", "Authentication method (MD5 or SHA)", delegate(string v) { authentication = v; }) .Add("A:", "Authentication passphrase", delegate(string v) { authPhrase = v; }) .Add("x:", "Privacy method", delegate(string v) { privacy = v; }) .Add("X:", "Privacy passphrase", delegate(string v) { privPhrase = v; }) .Add("u:", "Security name", delegate(string v) { user = v; }) .Add("h|?|help", "Print this help information.", delegate(string v) { showHelp = v != null; }) .Add("V", "Display version number of this application.", delegate(string v) { showVersion = v != null; }) .Add("t:", "Timeout value (unit is second).", delegate(string v) { timeout = int.Parse(v) * 1000; }) .Add("r:", "Retry count (default is 0)", delegate(string v) { retry = int.Parse(v); }) .Add("v:", "SNMP version (1, 2, and 3 are currently supported)", delegate(string v) { switch (int.Parse(v)) { case 1: version = VersionCode.V1; break; case 2: version = VersionCode.V2; break; case 3: version = VersionCode.V3; break; default: throw new ArgumentException("no such version: " + v); } }); if (args.Length == 0) { ShowHelp(p); return; } List <string> extra; try { extra = p.Parse(args); } catch (OptionException ex) { Console.WriteLine(ex.Message); return; } if (showHelp) { ShowHelp(p); return; } if ((extra.Count - 1) % 3 != 0) { Console.WriteLine("invalid variable number: " + extra.Count); return; } if (showVersion) { Console.WriteLine(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); return; } IPAddress ip; bool parsed = IPAddress.TryParse(extra[0], out ip); if (!parsed) { foreach (IPAddress address in Dns.GetHostAddresses(extra[0]).Where(address => address.AddressFamily == AddressFamily.InterNetwork)) { ip = address; break; } if (ip == null) { Console.WriteLine("invalid host or wrong IP address found: " + extra[0]); return; } } try { List <Variable> vList = new List <Variable>(); for (int i = 1; i < extra.Count; i = i + 3) { string type = extra[i + 1]; if (type.Length != 1) { Console.WriteLine("invalid type string: " + type); return; } ISnmpData data; switch (type[0]) { case 'i': data = new Integer32(int.Parse(extra[i + 2])); break; case 'u': data = new Gauge32(uint.Parse(extra[i + 2])); break; case 't': data = new TimeTicks(uint.Parse(extra[i + 2])); break; case 'a': data = new IP(IPAddress.Parse(extra[i + 2])); break; case 'o': data = new ObjectIdentifier(extra[i + 2]); break; case 'x': data = new OctetString(ByteTool.Convert(extra[i + 2])); break; case 's': data = new OctetString(extra[i + 2]); break; case 'd': data = new OctetString(ByteTool.ConvertDecimal(extra[i + 2])); break; case 'n': data = new Null(); break; default: Console.WriteLine("unknown type string: " + type[0]); return; } Variable test = new Variable(new ObjectIdentifier(extra[i]), data); vList.Add(test); } IPEndPoint receiver = new IPEndPoint(ip, 161); if (version != VersionCode.V3) { foreach (Variable variable in Messenger.Set(version, receiver, new OctetString(community), vList, timeout)) { Console.WriteLine(variable); } return; } if (string.IsNullOrEmpty(user)) { Console.WriteLine("User name need to be specified for v3."); return; } IAuthenticationProvider auth = (level & Levels.Authentication) == Levels.Authentication ? GetAuthenticationProviderByName(authentication, authPhrase) : DefaultAuthenticationProvider.Instance; IPrivacyProvider priv; if ((level & Levels.Privacy) == Levels.Privacy) { priv = new DESPrivacyProvider(new OctetString(privPhrase), auth); } else { priv = new DefaultPrivacyProvider(auth); } Discovery discovery = Messenger.NextDiscovery; ReportMessage report = discovery.GetResponse(timeout, receiver); SetRequestMessage request = new SetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage response = request.GetResponse(timeout, receiver); if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } foreach (Variable v in response.Pdu().Variables) { Console.WriteLine(v); } } catch (SnmpException ex) { Console.WriteLine(ex); } catch (SocketException ex) { Console.WriteLine(ex); } }
public bool SetMessageStr(string objectId, string value, out string result) { string output = ""; bool success = false; switch (VersionCode) { case VersionCode.V3: { //Discover Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu); ReportMessage report; try { report = discovery.GetResponse(10000, new IPEndPoint(IpRequestManager, IpRequestPORT)); } catch (Exception ex) { ErrorString = String.Format("Message: {0}\r\nSource: {1}\r\nStackTrace:{2}", ex.Message, ex.Source, ex.StackTrace); result = output; return(false); } SetRequestMessage request = new SetRequestMessage( VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, UName, new List <Variable> { new Variable(new ObjectIdentifier(objectId), new OctetString(value, Encoding)) }, Priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(60000, new IPEndPoint(IpRequestManager, IpRequestPORT)); if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { ErrorString += "error in response: " + reply; result = ""; return(false); } success = true; break; } default: { try { IList <Variable> results = Messenger.Set(VersionCode, new IPEndPoint(IpRequestManager, IpRequestPORT), UName, new List <Variable> { new Variable(new ObjectIdentifier(objectId), new OctetString(value, Encoding)) }, 15000); output = results.Aggregate("", (current, var) => String.Format("{0}\r\nId: {1}\r\nData: {2}", current, var.Id, var.Data)); success = true; } catch (Exception ex) { ErrorString = String.Format("Message: {0}\r\nSource: {1}\r\nStackTrace:{2}", ex.Message, ex.Source, ex.StackTrace); //return false; } break; } } result = output; return(success); }
public IList <KeyValuePair <string, string> > GetMessageKvp(string objectId) { IList <KeyValuePair <string, string> > kvpOut = new List <KeyValuePair <string, string> >(); string output = ""; switch (VersionCode) { case VersionCode.V3: { ISnmpMessage reply = GetMessageV3(objectId); string Response = ""; if (reply == null) { ErrorString = String.Format("{0}\r\nNo response on {1}.", ErrorString, IpRequestManager); return(kvpOut); } if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { ErrorString = String.Format("{0}\r\nResponse error on {1}:\r\n{2}", ErrorString, IpRequestManager, reply.Parameters.ToString()); } output = reply.Parameters.ToString(); break; } default: { try { var result = Messenger.Get(VersionCode, new IPEndPoint(IpRequestManager, IpRequestPORT), UName, new List <Variable> { new Variable(new ObjectIdentifier(objectId)) }, 15000); //"1.3.6.1.2.1.1.1.0" foreach (Variable var in result) { //output = string.Format("{0}\r\n{1}:{2}", output, var.Id, var.Data); kvpOut.Add(new KeyValuePair <string, string>(var.Id.ToString(), var.Data.ToString())); } } catch (Exception ex) { ErrorString = String.Format("Message: {0}\r\nSource: {1}\r\nStackTrace:{2}", ex.Message, ex.Source, ex.StackTrace); } break; } } return(kvpOut); }
public static void Main(string[] args) { string community = "public"; bool showHelp = false; bool showVersion = false; VersionCode version = VersionCode.V1; int timeout = 1000; int retry = 0; Levels level = Levels.Reportable; string user = string.Empty; string authentication = string.Empty; string authPhrase = string.Empty; string privacy = string.Empty; string privPhrase = string.Empty; OptionSet p = new OptionSet() .Add("c:", "-c for community name, (default is public)", delegate(string v) { if (v != null) { community = v; } }) .Add("l:", "-l for security level, (default is noAuthNoPriv)", delegate(string v) { if (v.ToUpperInvariant() == "NOAUTHNOPRIV") { level = Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHNOPRIV") { level = Levels.Authentication | Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHPRIV") { level = Levels.Authentication | Levels.Privacy | Levels.Reportable; } else { throw new ArgumentException("no such security mode: " + v); } }) .Add("a:", "-a for authentication method (MD5 or SHA)", delegate(string v) { authentication = v; }) .Add("A:", "-A for authentication passphrase", delegate(string v) { authPhrase = v; }) .Add("x:", "-x for privacy method", delegate(string v) { privacy = v; }) .Add("X:", "-X for privacy passphrase", delegate(string v) { privPhrase = v; }) .Add("u:", "-u for security name", delegate(string v) { user = v; }) .Add("h|?|help", "-h, -?, -help for help.", delegate(string v) { showHelp = v != null; }) .Add("V", "-V to display version number of this application.", delegate(string v) { showVersion = v != null; }) .Add("t:", "-t for timeout value (unit is second).", delegate(string v) { timeout = int.Parse(v) * 1000; }) .Add("r:", "-r for retry count (default is 0)", delegate(string v) { retry = int.Parse(v); }) .Add("v:", "-v for SNMP version (1, 2, and 3 are currently supported)", delegate(string v) { switch (int.Parse(v)) { case 1: version = VersionCode.V1; break; case 2: version = VersionCode.V2; break; case 3: version = VersionCode.V3; break; default: throw new ArgumentException("no such version: " + v); } }); List <string> extra = p.Parse(args); if (showHelp) { ShowHelp(); return; } if (showVersion) { Console.WriteLine(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); return; } if (extra.Count < 2) { ShowHelp(); return; } IPAddress ip; bool parsed = IPAddress.TryParse(extra[0], out ip); if (!parsed) { foreach (IPAddress address in Dns.GetHostAddresses(extra[0]).Where(address => address.AddressFamily == AddressFamily.InterNetwork)) { ip = address; break; } if (ip == null) { Console.WriteLine("invalid host or wrong IP address found: " + extra[0]); return; } } try { List <Variable> vList = new List <Variable>(); for (int i = 1; i < extra.Count; i++) { Variable test = new Variable(new ObjectIdentifier(extra[i])); vList.Add(test); } IPEndPoint receiver = new IPEndPoint(ip, 161); if (version != VersionCode.V3) { GetNextRequestMessage message = new GetNextRequestMessage(0, version, new OctetString(community), vList); ISnmpMessage response = message.GetResponse(timeout, receiver); if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } foreach (Variable variable in response.Pdu().Variables) { Console.WriteLine(variable); } return; } if (string.IsNullOrEmpty(user)) { Console.WriteLine("User name need to be specified for v3."); return; } IAuthenticationProvider auth = (level & Levels.Authentication) == Levels.Authentication ? GetAuthenticationProviderByName(authentication, authPhrase) : DefaultAuthenticationProvider.Instance; IPrivacyProvider priv; if ((level & Levels.Privacy) == Levels.Privacy) { priv = new DESPrivacyProvider(new OctetString(privPhrase), auth); } else { priv = new DefaultPrivacyProvider(auth); } Discovery discovery = Messenger.NextDiscovery; ReportMessage report = discovery.GetResponse(timeout, receiver); GetNextRequestMessage request = new GetNextRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(timeout, receiver); if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, reply); } foreach (Variable v in reply.Pdu().Variables) { Console.WriteLine(v); } } catch (SnmpException ex) { Console.WriteLine(ex); } catch (SocketException ex) { Console.WriteLine(ex); } }