public void TestToBytes() { Gauge32 c0 = new Gauge32(0); Gauge32 r0 = (Gauge32)DataFactory.CreateSnmpData(c0.ToBytes()); Assert.AreEqual(r0, c0); Gauge32 c5 = new Gauge32(uint.MaxValue); Gauge32 r5 = (Gauge32)DataFactory.CreateSnmpData(c5.ToBytes()); Assert.AreEqual(r5, c5); Gauge32 c4 = new Gauge32(30000000); Gauge32 r4 = (Gauge32)DataFactory.CreateSnmpData(c4.ToBytes()); Assert.AreEqual(r4, c4); Gauge32 c3 = new Gauge32(70000); Gauge32 r3 = (Gauge32)DataFactory.CreateSnmpData(c3.ToBytes()); Assert.AreEqual(r3, c3); Gauge32 c1 = new Gauge32(13); Gauge32 r1 = (Gauge32)DataFactory.CreateSnmpData(c1.ToBytes()); Assert.AreEqual(r1, c1); Gauge32 c2 = new Gauge32(300); Gauge32 r2 = (Gauge32)DataFactory.CreateSnmpData(c2.ToBytes()); Assert.AreEqual(r2, c2); Assert.AreEqual(new byte[] {0x42, 0x01, 0x03}, new Gauge32(3).ToBytes()); Assert.AreEqual(new byte[] {0x42, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00}, new Gauge32(2147483648).ToBytes()); }
public void TestConstructor() { byte[] buffer2 = new byte[] { 01, 44 }; Gauge32 c2 = new Gauge32(buffer2); Assert.AreEqual(300, c2.ToUInt32()); byte[] buffer1 = new byte[] { 13 }; Gauge32 c1 = new Gauge32(buffer1); Assert.AreEqual(13, c1.ToUInt32()); byte[] buffer3 = new byte[] { 1, 17, 112 }; Gauge32 c3 = new Gauge32(buffer3); Assert.AreEqual(70000, c3.ToUInt32()); byte[] buffer4 = new byte[] { 1, 201, 195, 128 }; Gauge32 c4 = new Gauge32(buffer4); Assert.AreEqual(30000000, c4.ToUInt32()); byte[] buffer5 = new byte[] { 0, 255, 255, 255, 255 }; Gauge32 c5 = new Gauge32(buffer5); Assert.AreEqual(uint.MaxValue, c5.ToUInt32()); byte[] buffer0 = new byte[] { 0 }; Gauge32 c0 = new Gauge32(buffer0); Assert.AreEqual(uint.MinValue, c0.ToUInt32()); }
public void TestToBytes() { Gauge32 c0 = new Gauge32(0); Gauge32 r0 = (Gauge32)DataFactory.CreateSnmpData(c0.ToBytes()); Assert.AreEqual(r0, c0); Gauge32 c5 = new Gauge32(uint.MaxValue); Gauge32 r5 = (Gauge32)DataFactory.CreateSnmpData(c5.ToBytes()); Assert.AreEqual(r5, c5); Gauge32 c4 = new Gauge32(30000000); Gauge32 r4 = (Gauge32)DataFactory.CreateSnmpData(c4.ToBytes()); Assert.AreEqual(r4, c4); Gauge32 c3 = new Gauge32(70000); Gauge32 r3 = (Gauge32)DataFactory.CreateSnmpData(c3.ToBytes()); Assert.AreEqual(r3, c3); Gauge32 c1 = new Gauge32(13); Gauge32 r1 = (Gauge32)DataFactory.CreateSnmpData(c1.ToBytes()); Assert.AreEqual(r1, c1); Gauge32 c2 = new Gauge32(300); Gauge32 r2 = (Gauge32)DataFactory.CreateSnmpData(c2.ToBytes()); Assert.AreEqual(r2, c2); Assert.AreEqual(new byte[] { 0x42, 0x01, 0x03 }, new Gauge32(3).ToBytes()); Assert.AreEqual(new byte[] { 0x42, 0x05, 0x00, 0x80, 0x00, 0x00, 0x00 }, new Gauge32(2147483648).ToBytes()); }
public void TestEqual() { var left = new Gauge32(200); var right = new Gauge32(200); Assert.AreEqual(left, right); }
public void TestConstructor() { Gauge32 e = new Gauge32(3); Opaque test = new Opaque(e.ToBytes()); Assert.AreEqual(new byte[] { 0x44, 0x03, 0x42, 0x01, 0x03 }, test.ToBytes()); }
public void TestConstructor() { byte[] buffer2 = new byte[] {01, 44}; Gauge32 c2 = new Gauge32(buffer2); Assert.AreEqual(300, c2.ToUInt32()); byte[] buffer1 = new byte[] {13}; Gauge32 c1 = new Gauge32(buffer1); Assert.AreEqual(13, c1.ToUInt32()); byte[] buffer3 = new byte[] {1, 17, 112}; Gauge32 c3 = new Gauge32(buffer3); Assert.AreEqual(70000, c3.ToUInt32()); byte[] buffer4 = new byte[] {1, 201, 195, 128}; Gauge32 c4 = new Gauge32(buffer4); Assert.AreEqual(30000000, c4.ToUInt32()); byte[] buffer5 = new byte[] {0, 255, 255, 255, 255}; Gauge32 c5 = new Gauge32(buffer5); Assert.AreEqual(uint.MaxValue, c5.ToUInt32()); byte[] buffer0 = new byte[] {0}; Gauge32 c0 = new Gauge32(buffer0); Assert.AreEqual(uint.MinValue, c0.ToUInt32()); }
public void TestConstructor() { Gauge32 e = new Gauge32(3); Opaque test = new Opaque(e.ToBytes()); Assert.AreEqual(new byte[] {0x44, 0x03, 0x42, 0x01, 0x03}, test.ToBytes()); Assert.AreEqual("42 01 03", test.ToString()); Assert.Throws<ArgumentNullException>(() => test.AppendBytesTo(null)); }
public void TestConstructor() { Gauge32 e = new Gauge32(3); Opaque test = new Opaque(e.ToBytes()); Assert.AreEqual(new byte[] { 0x44, 0x03, 0x42, 0x01, 0x03 }, test.ToBytes()); Assert.AreEqual("42 01 03", test.ToString()); Assert.Throws <ArgumentNullException>(() => test.AppendBytesTo(null)); }
/// <summary> /// Returns two LONG values, in and out octets for plotting. /// </summary> /// <param name="interfaceIndex"></param> /// <returns></returns> private long[] getInterfaceOctets(int interfaceIndex) { // Where our SNMP results are going. List <Variable> oidResults = new List <Variable>(); ObjectIdentifier oidSpeed = new ObjectIdentifier(".1.3.6.1.2.1.2.2.1.5." + interfaceIndex); ObjectIdentifier oidType = new ObjectIdentifier(".1.3.6.1.2.1.2.2.1.3." + interfaceIndex); ObjectIdentifier oidInOctets = new ObjectIdentifier(".1.3.6.1.2.1.2.2.1.10. " + interfaceIndex); ObjectIdentifier oidOutOctets = new ObjectIdentifier(".1.3.6.1.2.1.2.2.1.16." + interfaceIndex); // OID's we're going to retrieve. List <Variable> oidList = new List <Variable>(); oidList.Add(new Variable(oidSpeed)); oidList.Add(new Variable(oidType)); oidList.Add(new Variable(oidInOctets)); oidList.Add(new Variable(oidOutOctets)); long[] returnValue = new long[3]; oidResults = snmp.GetOidValues(oidList); Integer32 vIfType = (Integer32)oidResults.Find(o => o.Id == oidType).Data; int dIfType = vIfType.ToInt32(); Gauge32 guageIfSpeed = (Gauge32)oidResults.Find(o => o.Id == oidSpeed).Data; Variable vInOctets = oidResults.Find(o => o.Id == oidInOctets); Variable vOutOctets = oidResults.Find(o => o.Id == oidOutOctets); if (dIfType != 94 && dIfType != 117 && dIfType != 6 && dIfType != 131) { return new long[] { 0, 0, 0 } } ; if (vInOctets.Data.TypeCode == SnmpType.NoSuchInstance || vOutOctets.Data.TypeCode == SnmpType.NoSuchInstance) { return(new long[] { 0, 0, 0 }); } Counter32 counterInOctets = (Counter32)vInOctets.Data; Counter32 counterOutOctets = (Counter32)vOutOctets.Data; returnValue[0] = Convert.ToInt64(guageIfSpeed.ToUInt32()); returnValue[1] = Convert.ToInt64(counterInOctets.ToString()); returnValue[2] = Convert.ToInt64(counterOutOctets.ToString()); return(returnValue); }
public void TestEqual() { var left = new Gauge32(200); var right = new Gauge32(200); Assert.AreEqual(left, right); // ReSharper disable EqualExpressionComparison Assert.IsTrue(left == left); // ReSharper restore EqualExpressionComparison Assert.IsFalse(left == null); Assert.IsFalse(null == right); Assert.IsTrue(left != null); Assert.IsTrue(left.Equals(right)); Assert.AreEqual(((uint)200).GetHashCode(), left.GetHashCode()); Assert.AreEqual("200", left.ToString()); Assert.Throws<ArgumentNullException>(() => left.AppendBytesTo(null)); Assert.Throws<ArgumentNullException>(() => new Gauge32(new Tuple<int, byte[]>(0, new byte[] { 0 }), null)); }
public void TestEqual() { var left = new Gauge32(200); var right = new Gauge32(200); Assert.AreEqual(left, right); // ReSharper disable EqualExpressionComparison Assert.IsTrue(left == left); // ReSharper restore EqualExpressionComparison Assert.IsFalse(left == null); Assert.IsFalse(null == right); Assert.IsTrue(left != null); Assert.IsTrue(left.Equals(right)); Assert.AreEqual(((uint)200).GetHashCode(), left.GetHashCode()); Assert.AreEqual("200", left.ToString()); Assert.Throws <ArgumentNullException>(() => left.AppendBytesTo(null)); Assert.Throws <ArgumentNullException>(() => new Gauge32(0, null)); }
private ISnmpData ConvertStringValue2SnmpData(SnmpType type, string value) { ISnmpData data; try { switch (type) { case SnmpType.Integer32: data = new Integer32(int.Parse(value)); break; case SnmpType.Counter32: data = new Counter32(uint.Parse(value)); break; case SnmpType.Gauge32: data = new Gauge32(uint.Parse(value)); break; case SnmpType.TimeTicks: data = new TimeTicks(uint.Parse(value)); break; case SnmpType.OctetString: data = new OctetString(value); break; case SnmpType.IPAddress: data = new IP((IPAddress.Parse(value)).GetAddressBytes()); break; default: throw new InvalidDataType(); } } catch (InvalidCastException) { throw new InvalidDataType(); } return(data); }
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; } } if ((extra.Count - 1) % 3 != 0) { Console.WriteLine("invalid variable number: " + (extra.Count - 1)); 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); } }
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 - 1) % 3 != 0) { 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 = 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]).GetAddressBytes()); 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) { #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.SetRequestPdu); 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 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 SetRequestMessage(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); } }
private List <Variable> BuildVariableList(Command command, List <string> values) { List <Variable> variables = new List <Variable>(); if (command == Command.Get) { for (int i = 1; i < values.Count; i++) { Variable test = new Variable(new ObjectIdentifier(values[i])); variables.Add(test); } } else { for (int i = 1; i < values.Count; i = i + 3) { string type = values[i + 1]; if (type.Length != 1) { throw new InvalidOperationException("SNMP Error: Invalid type string: " + type); } ISnmpData data; switch (type[0]) { case 'i': data = new Integer32(int.Parse(values[i + 2])); break; case 'u': data = new Gauge32(uint.Parse(values[i + 2])); break; case 't': data = new TimeTicks(uint.Parse(values[i + 2])); break; case 'a': data = new IP(IPAddress.Parse(values[i + 2])); break; case 'o': data = new ObjectIdentifier(values[i + 2]); break; case 'x': data = new OctetString(ByteTool.Convert(values[i + 2])); break; case 's': data = new OctetString(values[i + 2]); break; case 'd': data = new OctetString(ByteTool.ConvertDecimal(values[i + 2])); break; case 'n': data = new Null(); break; default: throw new InvalidOperationException("SNMP Error: Unknown type string: " + type[0]); } Variable test = new Variable(new ObjectIdentifier(values[i]), data); variables.Add(test); } } return(variables); }
public void TestConstructor() { Gauge32 e = new Gauge32(3); Opaque test = new Opaque(e.ToBytes()); Assert.AreEqual(new byte[] {0x44, 0x03, 0x42, 0x01, 0x03}, test.ToBytes()); }
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 - 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]).GetAddressBytes()); 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.GetNextDiscovery(SnmpType.SetRequestPdu); 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 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 SetRequestMessage(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); } }