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());
        }
Beispiel #4
0
        public void TestEqual()
        {
            var left  = new Gauge32(200);
            var right = new Gauge32(200);

            Assert.AreEqual(left, right);
        }
Beispiel #5
0
        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));
        }
Beispiel #9
0
        /// <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);
        }
Beispiel #10
0
        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));
        }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
            }
        }
Beispiel #14
0
        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);
            }
        }
Beispiel #15
0
        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());
 }
 public void TestEqual()
 {
     var left = new Gauge32(200);
     var right = new Gauge32(200);
     Assert.AreEqual(left, right);
 }
Beispiel #18
0
        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);
            }
        }