public void TestWrongCommunityV12()
        {
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
            engine.Start();

            try
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                var identifier            = new Variable(new ObjectIdentifier(oidIdentifier));
                GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public2"),
                                                                  new List <Variable> {
                    identifier
                });

                Assert.Throws <Messaging.TimeoutException>(() => message.GetResponse(1500, serverEndPoint, socket));
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
        public async Task TestResponseAsyncIPv6()
        {
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.IPv6Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
            engine.Start();

            try
            {
                Socket            socket  = new Socket(AddressFamily.InterNetworkV6, SocketType.Dgram, ProtocolType.Udp);
                GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString(communityPublic),
                                                                  new List <Variable> {
                    new Variable(new ObjectIdentifier(oidIdentifier))
                });

                var users1   = new UserRegistry();
                var response = await message.GetResponseAsync(serverEndPoint, users1, socket);

                Assert.Equal(SnmpType.ResponsePdu, response.TypeCode());
                Assert.Equal(message.RequestId(), response.RequestId());
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
Beispiel #3
0
        public void TestTimeOut()
        {
            Socket            socket  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List <Variable> {
                new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
            });

            const int time  = 1500;
            var       timer = new Stopwatch();

            timer.Start();
            //IMPORTANT: test against an agent that doesn't exist.
            Assert.Throws <TimeoutException>(() => message.GetResponse(time, new IPEndPoint(IPAddress.Parse("8.8.8.8"), 161), socket));
            timer.Stop();

            long elapsedMilliseconds = timer.ElapsedMilliseconds;

            Console.WriteLine(@"elapsed: " + elapsedMilliseconds);
            Console.WriteLine(@"timeout: " + time);
            Assert.True(time <= elapsedMilliseconds);

            // FIXME: these values are valid on my machine openSUSE 11.2. (lex)
            // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms.
            if (SnmpMessageExtension.IsRunningOnMono)
            {
                Assert.True(elapsedMilliseconds <= time + 100);
            }
        }
        public void TestLargeMessage()
        {
            using (var engine = CreateEngine())
            {
                engine.Listener.ClearBindings();
                var serverEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);
                engine.Listener.AddBinding(serverEndPoint);

                engine.Start();

                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                var    list   = new List <Variable>();
                for (int i = 0; i < 1000; i++)
                {
                    list.Add(new Variable(new ObjectIdentifier("1.3.6.1.1.1.0")));
                }

                GetRequestMessage message = new GetRequestMessage(
                    0x4bed,
                    VersionCode.V2,
                    new OctetString("public"),
                    list);

                Assert.True(message.ToBytes().Length > 10000);

                var time = 1500;
                //IMPORTANT: test against an agent that doesn't exist.
                var result = message.GetResponse(time, serverEndPoint, socket);

                Assert.True(result.Scope.Pdu.ErrorStatus.ToErrorCode() == ErrorCode.NoError);
            }
        }
Beispiel #5
0
        public void TestResponse()
        {
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
            engine.Start();

            try
            {
                Socket            socket  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"),
                                                                  new List <Variable> {
                    new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
                });

                const int time     = 1500;
                var       response = message.GetResponse(time, serverEndPoint, socket);
                Assert.Equal(0x4bed, response.RequestId());
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
        internal override void Get(Variable variable)
        {
            if (string.IsNullOrEmpty(UserName))
            {
                Logger.Info("User name need to be specified for v3.");
                return;
            }

            Discovery         discovery = Messenger.NextDiscovery;
            ReportMessage     report    = discovery.GetResponse(Timeout, Agent);
            GetRequestMessage request   = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(UserName), new List <Variable> {
                variable
            }, _privacy, Messenger.MaxMessageSize, report);
            ISnmpMessage response = request.GetResponse(Timeout, Agent, _registry);

            if (response.Pdu().ErrorStatus.ToInt32() != 0)
            {
                throw ErrorException.Create(
                          "error in response",
                          Agent.Address,
                          response);
            }

            Logger.Info(response.Pdu().Variables[0].ToString(Objects));
        }
Beispiel #7
0
        static void Main(string[] args)
        {
            var community = new OctetString("public");
            var request   = new GetRequestMessage(2, VersionCode.V1, community, new List <Variable>
            {
                new Variable(new ObjectIdentifier("0.0"))
            });
            var registry = new UserRegistry();
            var socket   = new Socket(SocketType.Dgram, ProtocolType.Udp);
            var dest     = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 161);

            Console.WriteLine("snapshot 1");
            Console.ReadKey();
            Console.WriteLine("started");
            Task.Run(async() =>
            {
                for (int index = 0; index < 1000000; index++)
                {
                    var response = await request.GetResponseAsync(
                        dest,
                        registry,
                        socket);
                    Console.WriteLine(response.Scope.Pdu.ErrorStatus);
                }
            });

            Console.WriteLine("snapshot 2");
            Console.ReadKey();
        }
        public void TestGetRequestV3AuthPriv()
        {
            const string bytes = "30 81 80 02  01 03 30 0F  02 02 6C 99  02 03 00 FF" +
                                 "E3 04 01 07  02 01 03 04  38 30 36 04  0D 80 00 1F" +
                                 "88 80 E9 63  00 00 D6 1F  F4 49 02 01  14 02 01 35" +
                                 "04 07 6C 65  78 6D 61 72  6B 04 0C 80  50 D9 A1 E7" +
                                 "81 B6 19 80  4F 06 C0 04  08 00 00 00  01 44 2C A3" +
                                 "B5 04 30 4B  4F 10 3B 73  E1 E4 BD 91  32 1B CB 41" +
                                 "1B A1 C1 D1  1D 2D B7 84  16 CA 41 BF  B3 62 83 C4" +
                                 "29 C5 A4 BC  32 DA 2E C7  65 A5 3D 71  06 3C 5B 56" +
                                 "FB 04 A4";
            MD5AuthenticationProvider auth = new MD5AuthenticationProvider(new OctetString("testpass"));
            var registry = new UserRegistry();

            registry.Add(new OctetString("lexmark"), new DESPrivacyProvider(new OctetString("passtest"), auth));
            IList <ISnmpMessage> messages = MessageFactory.ParseMessages(bytes, registry);

            Assert.AreEqual(1, messages.Count);
            GetRequestMessage get = (GetRequestMessage)messages[0];

            Assert.AreEqual(27801, get.MessageId);
            //Assert.AreEqual(SecurityLevel.None | SecurityLevel.Reportable, get.Level);
            Assert.AreEqual("lexmark", get.Community.ToString());
            //OctetString digest = new MD5AuthenticationProvider(new OctetString("testpass")).ComputeHash(get);

            //Assert.AreEqual(digest, get.Parameters.AuthenticationParameters);
        }
Beispiel #9
0
        /// <summary>
        /// Returns a list of OID values as Variable's.
        /// </summary>
        /// <param name="requestedVariables"></param>
        /// <returns></returns>
        public List <Variable> GetOidValues(List <Variable> requestedVariables)
        {
            List <Variable> oidResults;

            try
            {
                // SNMPv2
                if (snmpVersion != VersionCode.V3)
                {
                    oidResults = new List <Variable>(Messenger.Get(snmpVersion, snmpEndpoint, snmpCommunity, requestedVariables, snmpTimeout));
                }
                // SNMPv3
                else
                {
                    Discovery         snmpDiscovery = Messenger.NextDiscovery;
                    ReportMessage     snmpRepMsg    = snmpDiscovery.GetResponse(snmpTimeout, snmpEndpoint);
                    GetRequestMessage snmpRequest   = new GetRequestMessage(snmpVersion, Messenger.NextMessageId, Messenger.NextRequestId, snmpUser, requestedVariables, snmpPriv, Messenger.MaxMessageSize, snmpRepMsg);
                    ISnmpMessage      snmpRespMsg   = snmpRequest.GetResponse(snmpTimeout, snmpEndpoint);
                    if (snmpRespMsg.Pdu().ErrorStatus.ToInt32() != 0)
                    {
                        throw Lextm.SharpSnmpLib.Messaging.ErrorException.Create("Error in SNMP Response, ", snmpEndpoint.Address, snmpRespMsg);
                    }
                    oidResults = new List <Variable>(snmpRespMsg.Pdu().Variables);
                }
            }
            catch (Exception)
            {
                throw;
            }
            return(oidResults);
        }
        public void TestTimeOut()
        {
            using (var engine = CreateEngine())
            {
                engine.Listener.ClearBindings();
                var serverEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);
                engine.Listener.AddBinding(serverEndPoint);

                engine.Start();

                Socket            socket  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"),
                                                                  new List <Variable> {
                    new Variable(new ObjectIdentifier("1.5.2"))
                });

                const int time  = 1500;
                var       timer = new Stopwatch();
                timer.Start();
                //IMPORTANT: test against an agent that doesn't exist.
                Assert.Throws <Messaging.TimeoutException>(() => message.GetResponse(time, serverEndPoint, socket));
                timer.Stop();

                long elapsedMilliseconds = timer.ElapsedMilliseconds;
                Assert.True(time <= elapsedMilliseconds);

                // FIXME: these values are valid on my machine openSUSE 11.2. (lex)
                // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms.
                if (SnmpMessageExtension.IsRunningOnMono)
                {
                    Assert.True(elapsedMilliseconds <= time + 100);
                }
            }
        }
Beispiel #11
0
        public void TestDiscoveryV3()
        {
            const string bytes = "30 3A 02 01 03 30 0F 02 02 6A 09 02 03 00 FF E3" +
                                 " 04 01 04 02 01 03 04 10 30 0E 04 00 02 01 00 02" +
                                 " 01 00 04 00 04 00 04 00 30 12 04 00 04 00 A0 0C" +
                                 " 02 02 2C 6B 02 01 00 02 01 00 30 00";
            GetRequestMessage request = new GetRequestMessage(
                VersionCode.V3,
                new Header(
                    new Integer32(0x6A09),
                    new Integer32(0xFFE3),
                    Levels.Reportable),
                new SecurityParameters(
                    OctetString.Empty,
                    Integer32.Zero,
                    Integer32.Zero,
                    OctetString.Empty,
                    OctetString.Empty,
                    OctetString.Empty),
                new Scope(
                    OctetString.Empty,
                    OctetString.Empty,
                    new GetRequestPdu(0x2C6B, new List <Variable>())),
                DefaultPrivacyProvider.DefaultPair,
                null
                );
            string test = ByteTool.Convert(request.ToBytes());

            Assert.Equal(bytes, test);
        }
        public void Test()
        {
            var message     = new GetRequestMessage(0, VersionCode.V1, new OctetString("public"), new List <Variable>());
            var bindingMock = new Mock <IListenerBinding>();

            bindingMock.Setup(foo => foo.SendResponse(It.IsAny <ISnmpMessage>(), It.IsAny <EndPoint>()));
            var context = new NormalSnmpContext(message, new IPEndPoint(IPAddress.Loopback, 0),
                                                new UserRegistry(), bindingMock.Object);

            context.GenerateResponse(new List <Variable>());
            Assert.IsNotNull(context.Response);
            context.SendResponse();
            Assert.IsFalse(context.HandleMembership());

            var list = new List <Variable>();

            for (int i = 0; i < 5000; i++)
            {
                list.Add(new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.4.0"), new OctetString("test")));
            }

            context.GenerateResponse(list);
            Assert.AreEqual(ErrorCode.TooBig, context.Response.Pdu().ErrorStatus.ToErrorCode());
            bindingMock.Verify(foo => foo.SendResponse(It.IsAny <ISnmpMessage>(), It.IsAny <EndPoint>()), Times.AtMostOnce);
        }
        //[Fact]
        //[Category("Default")]
        public void TestMemory2()
        {
            GC.Collect();

            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List <Variable> {
                new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
            });

            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                //IMPORTANT: test against an agent that doesn't exist.
                Assert.Throws <SocketException>(
                    () =>
                    message.BeginGetResponse(
                        new IPEndPoint(IPAddress.Loopback, 80),
                        new UserRegistry(),
                        socket,
                        ar =>
                {
                    var response = message.EndGetResponse(ar);
                },
                        null));

                socket.Close();
                socket = null;
            }

            GC.Collect();
            var memoryCheckPoint1 = dotMemory.Check();

            for (int i = 0; i < 100; i++)
            {
                //Thread.Sleep(100);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                Assert.Throws <SocketException>(
                    () =>
                    message.BeginGetResponse(
                        new IPEndPoint(IPAddress.Loopback, 80),
                        new UserRegistry(),
                        socket,
                        ar =>
                {
                    var response = message.EndGetResponse(ar);
                },
                        null));

                socket.Close();
                socket = null;
            }

            message = null;

            GC.Collect();
            dotMemory.Check(memory =>
            {
                Assert.True(memory.GetDifference(memoryCheckPoint1)
                            .GetNewObjects().ObjectsCount <= 31);
            });
        }
Beispiel #14
0
 public static ExtendedGetRequest GetGetRequest(this GetRequestMessage x)
 {
     return(new ExtendedGetRequest
     {
         Segment = x.Segment,
         Key = x.Key,
         SpecifiedVersion = GetVersion(x.SpecificVersion),
     });
 }
Beispiel #15
0
        public void TestTimeOut()
        {
            // IMPORTANT: this test case requires a local SNMP agent such as
            //   #SNMP Agent (snmpd),
            //   Windows SNMP agent service,
            //   Net-SNMP agent, or
            //   snmp4j agent.
            Socket            socket  = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List <Variable> {
                new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
            });

            const int time         = 1500;
            bool      hasException = false;

            try
            {
                message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 161), socket);
            }
            catch (TimeoutException)
            {
                hasException = true;
            }

            Assert.IsFalse(hasException);

            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();

            try
            {
                timer.Start();
                //IMPORTANT: test against an agent that doesn't exist.
// ReSharper disable AssignNullToNotNullAttribute
                message.GetResponse(time, new IPEndPoint(IPAddress.Parse("192.168.0.233"), 161), socket);
// ReSharper restore AssignNullToNotNullAttribute
            }
            catch (TimeoutException)
            {
                hasException = true;
            }

            timer.Stop();

            long elapsedMilliseconds = timer.ElapsedMilliseconds;

            Console.WriteLine(@"elapsed: " + elapsedMilliseconds);
            Console.WriteLine(@"timeout: " + time);
            Assert.LessOrEqual(time, elapsedMilliseconds);
            Assert.IsTrue(hasException);

            // FIXME: these values are valid on my machine openSUSE 11.2. (lex)
            // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms.
            if (SnmpMessageExtension.IsRunningOnMono)
            {
                Assert.LessOrEqual(elapsedMilliseconds, time + 100);
            }
        }
 public void TestConstructor()
 {
     List<Variable> list = new List<Variable>(1)
                               {
                                   new Variable(new ObjectIdentifier(new uint[] {1, 3, 6, 1, 2, 1, 1, 6, 0}),
                                                new Null())
                               };
     GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString("public"), list);
     Assert.GreaterOrEqual(Properties.Resources.get.Length, message.ToBytes().Length);
 }
Beispiel #17
0
        /// <summary>
        /// Get specifico per la V3
        /// ToDo: testare!
        /// </summary>
        /// <param name="objectId">Id oggetto</param>
        /// <returns>SNMP message</returns>
        private ISnmpMessage GetMessageV3(string objectId)
        {
            return(null);

            ErrorString = "";

            //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);
                return(null);
            }

            GetRequestMessage request = new GetRequestMessage(
                VersionCode,
                Messenger.NextMessageId,
                Messenger.NextRequestId,
                UName,
                new List <Variable>
            {
                new Variable(new ObjectIdentifier(objectId))
            },
                Priv,
                Messenger.MaxMessageSize,
                report);

            ISnmpMessage reply;

            try
            {
                reply = request.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);
                return(null);
            }

            //if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
            //{
            //    throw ErrorException.Create(
            //        "error in response",
            //        IpRequestManager,
            //        reply);
            //}

            return(reply);
        }
Beispiel #18
0
        public void TestConstructor()
        {
            List <Variable> list = new List <Variable>(1)
            {
                new Variable(new ObjectIdentifier(new uint[] { 1, 3, 6, 1, 2, 1, 1, 6, 0 }),
                             new Null())
            };
            GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString("public"), list);

            Assert.True(Properties.Resources.get.Length >= message.ToBytes().Length);
        }
Beispiel #19
0
        public void TestResponseVersion3()
        {
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
            engine.Start();

            try
            {
                IAuthenticationProvider auth = new MD5AuthenticationProvider(new OctetString("authentication"));
                IPrivacyProvider        priv = new DefaultPrivacyProvider(auth);

                var           ending    = new AutoResetEvent(false);
                var           timeout   = 3000;
                Discovery     discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
                ReportMessage report    = discovery.GetResponse(timeout, serverEndPoint);

                var expected = Messenger.NextRequestId;
                GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, expected, new OctetString("authen"), OctetString.Empty, new List <Variable> {
                    new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
                }, priv, Messenger.MaxMessageSize, report);

                var source = Observable.Defer(() =>
                {
                    ISnmpMessage reply = request.GetResponse(timeout, serverEndPoint);
                    return(Observable.Return(reply));
                })
                             .RetryWithBackoffStrategy(
                    retryCount: 4,
                    retryOnError: e => e is Messaging.TimeoutException
                    );

                source.Subscribe(reply =>
                {
                    ISnmpPdu snmpPdu = reply.Pdu();
                    Assert.Equal(SnmpType.ResponsePdu, snmpPdu.TypeCode);
                    Assert.Equal(expected, reply.RequestId());
                    Assert.Equal(ErrorCode.NoError, snmpPdu.ErrorStatus.ToErrorCode());
                    ending.Set();
                });
                Assert.True(ending.WaitOne(MaxTimeout));
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
        public void TestResponsesFromSingleSourceWithMultipleThreads(int count)
        {
            var start  = 0;
            var end    = start + count;
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
#if NET452
            // IMPORTANT: need to set min thread count so as to boost performance.
            int minWorker, minIOC;
            // Get the current settings.
            ThreadPool.GetMinThreads(out minWorker, out minIOC);
            var threads = engine.Listener.Bindings.Count;
            ThreadPool.SetMinThreads(threads + 1, minIOC);
#endif
            engine.Start();

            try
            {
                const int timeout = 10000;

                // Uncomment below to reveal wrong sequence number issue.
                // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                Parallel.For(start, end, index =>
                {
                    GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2,
                                                                      new OctetString("public"),
                                                                      new List <Variable> {
                        new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
                    });
                    // Comment below to reveal wrong sequence number issue.
                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    var response = message.GetResponse(timeout, serverEndPoint, socket);
                    watch.Stop();
                    Assert.Equal(index, response.RequestId());
                }
                             );
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
Beispiel #21
0
        public void TestResponsesFromSingleSourceWithMultipleThreads(int count)
        {
            var start  = 0;
            var end    = start + count;
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 17000));

            // IMPORTANT: need to set min thread count so as to boost performance.
            int minWorker, minIOC;

            // Get the current settings.
            ThreadPool.GetMinThreads(out minWorker, out minIOC);
            var threads = engine.Listener.Bindings.Count;

            ThreadPool.SetMinThreads(threads + 1, minIOC);

            var time = DateTime.Now;

            engine.Start();
            Console.WriteLine(DateTime.Now - time);

            const int timeout = 10000;

            // Uncomment below to reveal wrong sequence number issue.
            // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            //for (int index = start; index < end; index++)
            Parallel.For(start, end, index =>
            {
                GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2, new OctetString("public"), new List <Variable> {
                    new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
                });
                // Comment below to reveal wrong sequence number issue.
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                Stopwatch watch = new Stopwatch();
                watch.Start();
                Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow);
                var response = message.GetResponse(timeout, new IPEndPoint(IPAddress.Loopback, 17000), socket);
                //var response =
                //    await
                //        message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, 17000), new UserRegistry(), socket);
                Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow);
                watch.Stop();
                Console.WriteLine("manager {0}: {1}: port {2}", index, watch.Elapsed, ((IPEndPoint)socket.LocalEndPoint).Port);
                Assert.Equal(index, response.RequestId());
            }
                         );

            engine.Stop();
        }
Beispiel #22
0
        public async Task <OID> Handle(GetV3Query query)
        {
            var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
            var report    = discovery.GetResponse(10000, new IPEndPoint(query.IpAddress, query.Port));

            IPrivacyProvider provider;

            if (query.EncryptionType == EncryptionType.DES)
            {
                provider = new Security.DESPrivacyProvider(
                    new OctetString(query.Encryption),
                    new MD5AuthenticationProvider(new OctetString(query.Password)));
            }
            else
            {
                provider = new Security.AESPrivacyProvider(
                    new OctetString(query.Encryption),
                    new MD5AuthenticationProvider(new OctetString(query.Password)));
            }

            var request = new GetRequestMessage(
                Lextm.SharpSnmpLib.VersionCode.V3,
                Messenger.NextMessageId,
                Messenger.NextRequestId,
                new OctetString(query.UserName),
                new List <Variable> {
                new Variable(new ObjectIdentifier(query.OID_Id))
            },
                provider,
                Messenger.MaxMessageSize,
                report);

            var reply = await request.GetResponseAsync(new IPEndPoint(query.IpAddress, query.Port));

            var oid = reply
                      .Pdu().Variables
                      .FirstOrDefault(variable => variable.Id.ToString() == query.OID_Id);

            if (oid == null)
            {
                throw new KeyNotFoundException($"Cannot find variable with ID {query.OID_Id}");
            }

            if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
            {
                throw ErrorException.Create("error in response", query.IpAddress, reply);
            }

            return(new OID {
                Id = oid.Id.ToString(), Value = oid.Data.ToString()
            });
        }
Beispiel #23
0
        public void TestConstructorV3AuthMd5()
        {
            const string bytes = "30 73" +
                                 "02 01  03 " +
                                 "30 0F " +
                                 "02  02 35 41 " +
                                 "02  03 00 FF E3" +
                                 "04 01 05" +
                                 "02  01 03" +
                                 "04 2E  " +
                                 "30 2C" +
                                 "04 0D  80 00 1F 88 80 E9 63 00  00 D6 1F F4  49 " +
                                 "02 01 0D  " +
                                 "02 01 57 " +
                                 "04 05 6C 65 78  6C 69 " +
                                 "04 0C  1C 6D 67 BF  B2 38 ED 63 DF 0A 05 24  " +
                                 "04 00 " +
                                 "30 2D  " +
                                 "04 0D 80 00  1F 88 80 E9 63 00 00 D6  1F F4 49 " +
                                 "04  00 " +
                                 "A0 1A 02  02 01 AF 02 01 00 02 01  00 30 0E 30  0C 06 08 2B  06 01 02 01 01 03 00 05  00";
            IPrivacyProvider  pair    = new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("testpass")));
            GetRequestMessage request = new GetRequestMessage(
                VersionCode.V3,
                new Header(
                    new Integer32(13633),
                    new Integer32(0xFFE3),
                    new OctetString(new byte[] { 0x5 }),
                    new Integer32(3)),
                new SecurityParameters(
                    new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
                    new Integer32(0x0d),
                    new Integer32(0x57),
                    new OctetString("lexli"),
                    new OctetString(ByteTool.Convert("1C 6D 67 BF  B2 38 ED 63 DF 0A 05 24")),
                    OctetString.Empty),
                new Scope(
                    new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
                    OctetString.Empty,
                    new GetRequestPdu(
                        0x01AF,
                        ErrorCode.NoError,
                        0,
                        new List <Variable>(1)
            {
                new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), new Null())
            })),
                pair);

            Assert.AreEqual(Levels.Authentication, request.Level);
            Assert.AreEqual(ByteTool.Convert(bytes), request.ToBytes());
        }
Beispiel #24
0
        public void TestToBytes()
        {
            const string s = "30 27 02 01  01 04 06 70  75 62 6C 69  63 A0 1A 02" +
                             "02 4B ED 02  01 00 02 01  00 30 0E 30  0C 06 08 2B" +
                             "06 01 02 01  01 01 00 05  00                      ";

            byte[]            expected = ByteTool.Convert(s);
            GetRequestMessage message  = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List <Variable> {
                new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
            });

            Assert.Equal(expected, message.ToBytes());
        }
        public void TestString()
        {
            string bytes = "30 29 02 01 00 04 06 70 75 62 6c 69 63 a0 1c 02 04 4f 89 fb dd" + Environment.NewLine +
                           "02 01 00 02 01 00 30 0e 30 0c 06 08 2b 06 01 02 01 01 05 00 05 00";
            IList <ISnmpMessage> messages = MessageFactory.ParseMessages(bytes, new UserRegistry());

            Assert.Equal(1, messages.Count);
            GetRequestMessage m = (GetRequestMessage)messages[0];
            Variable          v = m.Variables()[0];
            string            i = v.Id.ToString();

            Assert.Equal("1.3.6.1.2.1.1.5.0", i);
        }
Beispiel #26
0
        public void Getv3Async(IPAddress ipAddress, string oid, SNMPV3Security security, string username, SNMPV3AuthenticationProvider authProvider, SecureString auth, SNMPV3PrivacyProvider privProvider, SecureString priv)
        {
            Task.Run(() =>
            {
                try
                {
                    var ipEndpoint = new IPEndPoint(ipAddress, Port);

                    // Discovery
                    var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
                    var report    = discovery.GetResponse(Timeout, ipEndpoint);

                    IPrivacyProvider privacy;

                    switch (security)
                    {
                    case SNMPV3Security.AuthPriv:
                        privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth), privProvider, SecureStringHelper.ConvertToString(priv));
                        break;

                    // noAuthNoPriv
                    case SNMPV3Security.AuthNoPriv:
                        privacy = GetPrivacy(authProvider, SecureStringHelper.ConvertToString(auth));
                        break;

                    default:
                        privacy = GetPrivacy();
                        break;
                    }

                    var request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(username), new List <Variable> {
                        new Variable(new ObjectIdentifier(oid))
                    }, privacy, Messenger.MaxMessageSize, report);
                    var reply = request.GetResponse(Timeout, ipEndpoint);

                    var result = reply.Pdu().Variables[0];

                    OnReceived(new SNMPReceivedArgs(result.Id, result.Data));

                    OnComplete();
                }
                catch (Lextm.SharpSnmpLib.Messaging.TimeoutException)
                {
                    OnTimeoutReached();
                }
                catch (ErrorException)
                {
                    OnError();
                }
            });
        }
Beispiel #27
0
        public async Task TestResponsesFromMultipleSources(int count)
        {
            var start  = 16102;
            var end    = start + count;
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            for (var index = start; index < end; index++)
            {
                engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, index));
            }

#if NET452
            // IMPORTANT: need to set min thread count so as to boost performance.
            int minWorker, minIOC;
            // Get the current settings.
            ThreadPool.GetMinThreads(out minWorker, out minIOC);
            var threads = engine.Listener.Bindings.Count;
            ThreadPool.SetMinThreads(threads + 1, minIOC);
#endif
            engine.Start();

            try
            {
                for (int index = start; index < end; index++)
                {
                    GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2, new OctetString("public"),
                                                                      new List <Variable> {
                        new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
                    });
                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    var response =
                        await
                        message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, index), new UserRegistry(),
                                                 socket);

                    watch.Stop();
                    Assert.Equal(index, response.RequestId());
                }
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
        public async Task TestResponsesFromSingleSource(int count)
        {
            var start  = 0;
            var end    = start + count;
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
            //// IMPORTANT: need to set min thread count so as to boost performance.
            //int minWorker, minIOC;
            //// Get the current settings.
            //ThreadPool.GetMinThreads(out minWorker, out minIOC);
            //var threads = engine.Listener.Bindings.Count;
            //ThreadPool.SetMinThreads(threads + 1, minIOC);

            engine.Start();

            try
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                for (int index = start; index < end; index++)
                {
                    GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString(communityPublic),
                                                                      new List <Variable> {
                        new Variable(new ObjectIdentifier(oidIdentifier))
                    });
                    Stopwatch watch = new Stopwatch();
                    watch.Start();
                    var response =
                        await
                        message.GetResponseAsync(serverEndPoint, new UserRegistry(), socket);

                    watch.Stop();
                    Assert.Equal(0, response.RequestId());
                }
            }
            catch (Exception)
            {
                Console.WriteLine(serverEndPoint.Port);
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
Beispiel #29
0
        public void TestLargeMessage()
        {
            var engine = CreateEngine();

            engine.Listener.ClearBindings();
            var serverEndPoint = new IPEndPoint(IPAddress.Loopback, Port.NextId);

            engine.Listener.AddBinding(serverEndPoint);
            engine.Start();

            try
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                var    list   = new List <Variable>();
                for (int i = 0; i < 1000; i++)
                {
                    list.Add(new Variable(new ObjectIdentifier("1.3.6.1.1.1.0")));
                }

                GetRequestMessage message = new GetRequestMessage(
                    0x4bed,
                    VersionCode.V2,
                    new OctetString("public"),
                    list);

                Assert.True(message.ToBytes().Length > 10000);

                var time = 3000;
                if (SnmpMessageExtension.IsRunningOnMac)
                {
                    var exception =
                        Assert.Throws <SocketException>(() => message.GetResponse(time, serverEndPoint, socket));
                    Assert.Equal(SocketError.MessageSize, exception.SocketErrorCode);
                }
                else
                {
                    // IMPORTANT: test against an agent that doesn't exist.
                    var result = message.GetResponse(time, serverEndPoint, socket);
                    Assert.True(result.Scope.Pdu.ErrorStatus.ToErrorCode() == ErrorCode.NoError);
                }
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
Beispiel #30
0
        public void Getv3Async(IPAddress ipAddress, string oid, SNMPv3Security security, string username, SNMPv3AuthenticationProvider authProvider, string auth, SNMPv3PrivacyProvider privProvider, string priv, SNMPOptions options)
        {
            Task.Run(() =>
            {
                try
                {
                    IPEndPoint ipEndpoint = new IPEndPoint(ipAddress, options.Port);

                    // Discovery
                    Discovery discovery  = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
                    ReportMessage report = discovery.GetResponse(options.Timeout, ipEndpoint);

                    IPrivacyProvider privacy;

                    if (security == SNMPv3Security.authPriv)
                    {
                        privacy = GetPrivacy(authProvider, auth, privProvider, priv);
                    }
                    else if (security == SNMPv3Security.authNoPriv)
                    {
                        privacy = GetPrivacy(authProvider, auth);
                    }
                    else // noAuthNoPriv
                    {
                        privacy = GetPrivacy();
                    }

                    GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(username), new List <Variable> {
                        new Variable(new ObjectIdentifier(oid))
                    }, privacy, Messenger.MaxMessageSize, report);
                    ISnmpMessage reply = request.GetResponse(options.Timeout, ipEndpoint);

                    Variable result = reply.Pdu().Variables[0];

                    OnReceived(new SNMPReceivedArgs(result.Id, result.Data));

                    OnComplete();
                }
                catch (Lextm.SharpSnmpLib.Messaging.TimeoutException)
                {
                    OnTimeout();
                }
                catch (ErrorException)
                {
                    OnError();
                }
            });
        }
Beispiel #31
0
        public void Get()
        {
            var version   = VersionCode.V2;
            var community = new OctetString("public");
            var vlist     = new List <Variable> {
                new Variable(
                    new ObjectIdentifier(".1.3.6.1.2.1.1.5.0") //sysname
                    )
            };
            var snmpMsg = new GetRequestMessage(Rand.Next(), version, community, vlist);

            var msg = Factory.ToForward(snmpMsg);

            Assert.IsTrue(msg.Data.All(x => x.Operation == Operation.Get));
            Assert.AreEqual(vlist.Count, msg.Data.Count);
        }
        public async Task TestResponseAsync()
        {
            var engine = CreateEngine();
            engine.Listener.ClearBindings();
            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 16100));
            engine.Start();

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
            
            var users1 = new UserRegistry();
            var response = await message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, 16100), users1, socket);

            engine.Stop();
            Assert.AreEqual(SnmpType.ResponsePdu, response.TypeCode());
        }
        public void TestResponse()
        {
            var engine = CreateEngine();
            engine.Listener.ClearBindings();
            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 16101));
            engine.Start();

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
            
            const int time = 1500;
            var response = message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 16101), socket);
            Assert.AreEqual(0x4bed, response.RequestId());

            engine.Stop();
        }
        public void TestResponsesFromSingleSourceWithMultipleThreads()
        {
            var start = 0;
            var end = start + 32;
            var engine = CreateEngine();
            engine.Listener.ClearBindings();
            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Loopback, 17000));

            // IMPORTANT: need to set min thread count so as to boost performance.
            int minWorker, minIOC;
            // Get the current settings.
            ThreadPool.GetMinThreads(out minWorker, out minIOC);
            var threads = engine.Listener.Bindings.Count;
            ThreadPool.SetMinThreads(threads + 1, minIOC);

            var time = DateTime.Now;
            engine.Start();
            Console.WriteLine(DateTime.Now - time);

            const int timeout = 10000;
            
            // Uncomment below to reveal wrong sequence number issue.
            // Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            
            //for (int index = start; index < end; index++)
            Parallel.For(start, end, index =>
            {
                GetRequestMessage message = new GetRequestMessage(index, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
                // Comment below to reveal wrong sequence number issue.
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                Stopwatch watch = new Stopwatch();
                watch.Start();
                Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow);
                var response = message.GetResponse(timeout, new IPEndPoint(IPAddress.Loopback, 17000), socket);
                //var response =
                //    await
                //        message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, 17000), new UserRegistry(), socket);
                Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow);
                watch.Stop();
                Console.WriteLine("manager {0}: {1}: port {2}", index, watch.Elapsed, ((IPEndPoint)socket.LocalEndPoint).Port);
                Assert.AreEqual(index, response.RequestId());
            }
            );

            engine.Stop();
        }
        public void TestTimeOut()
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });

            const int time = 1500;
            var timer = new Stopwatch();            
            timer.Start();
            //IMPORTANT: test against an agent that doesn't exist.
            Assert.Throws<TimeoutException>(() => message.GetResponse(time, new IPEndPoint(IPAddress.Parse("8.8.8.8"), 161), socket));
            timer.Stop();            
            
            long elapsedMilliseconds = timer.ElapsedMilliseconds;
            Console.WriteLine(@"elapsed: " + elapsedMilliseconds);
            Console.WriteLine(@"timeout: " + time);
            Assert.LessOrEqual(time, elapsedMilliseconds);

            // FIXME: these values are valid on my machine openSUSE 11.2. (lex)
            // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms.
            if (SnmpMessageExtension.IsRunningOnMono)
            {
                Assert.LessOrEqual(elapsedMilliseconds, time + 100);
            }
        }
        //[Test]
        //[Category("Default")]
        public void TestMemory2()
        {
            GC.Collect();
            
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
            {
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                //IMPORTANT: test against an agent that doesn't exist.
                Assert.Throws<SocketException>(
                    () =>
                    message.BeginGetResponse(
                        new IPEndPoint(IPAddress.Loopback, 80),
                        new UserRegistry(),
                        socket,
                        ar =>
                            {
                                var response = message.EndGetResponse(ar);
                                Console.WriteLine(response);
                            },
                        null));

                socket.Close();
                socket = null;
            }

            GC.Collect();
            var memoryCheckPoint1 = dotMemory.Check();

            for (int i = 0; i < 100; i++)
            {
                //Thread.Sleep(100);
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                Assert.Throws<SocketException>(
                    () =>
                    message.BeginGetResponse(
                        new IPEndPoint(IPAddress.Loopback, 80),
                        new UserRegistry(),
                        socket,
                        ar =>
                        {
                            var response = message.EndGetResponse(ar);
                            Console.WriteLine(response);
                        },
                        null));

                socket.Close();
                socket = null;
            }

            message = null;

            GC.Collect();
            dotMemory.Check(memory =>
            {
                Assert.That(memory.GetDifference(memoryCheckPoint1)
                    .GetNewObjects().ObjectsCount, Is.LessThanOrEqualTo(31));
            });
        }
 public void TestConstructorV3AuthSha()
 {
     const string bytes = "30 77 02 01  03 30 0F 02  02 47 21 02  03 00 FF E3" +
                          "04 01 05 02  01 03 04 32  30 30 04 0D  80 00 1F 88" +
                          "80 E9 63 00  00 D6 1F F4  49 02 01 15  02 02 01 5B" +
                          "04 08 6C 65  78 74 75 64  69 6F 04 0C  7B 62 65 AE" +
                          "D3 8F E3 7D  58 45 5C 6C  04 00 30 2D  04 0D 80 00" +
                          "1F 88 80 E9  63 00 00 D6  1F F4 49 04  00 A0 1A 02" +
                          "02 56 FF 02  01 00 02 01  00 30 0E 30  0C 06 08 2B" +
                          "06 01 02 01  01 03 00 05  00";
     IPrivacyProvider pair = new DefaultPrivacyProvider(new SHA1AuthenticationProvider(new OctetString("password")));
     GetRequestMessage request = new GetRequestMessage(
         VersionCode.V3,
         new Header(
             new Integer32(0x4721),
             new Integer32(0xFFE3),
             Levels.Authentication | Levels.Reportable),
         new SecurityParameters(
             new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
             new Integer32(0x15),
             new Integer32(0x015B),
             new OctetString("lextudio"),
             new OctetString(ByteTool.Convert("7B 62 65 AE D3 8F E3 7D  58 45 5C 6C")),
             OctetString.Empty),
         new Scope(
             new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
             OctetString.Empty,
             new GetRequestPdu(
                 0x56FF,
                 new List<Variable>(1) { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.3.0"), new Null()) })),
         pair,
         null);
     Assert.AreEqual(Levels.Authentication | Levels.Reportable, request.Header.SecurityLevel);
     Assert.AreEqual(ByteTool.Convert(bytes), request.ToBytes());
 }
 public void TestDiscoveryV3()
 {
     const string bytes = "30 3A 02 01 03 30 0F 02 02 6A 09 02 03 00 FF E3" +
                          " 04 01 04 02 01 03 04 10 30 0E 04 00 02 01 00 02" +
                          " 01 00 04 00 04 00 04 00 30 12 04 00 04 00 A0 0C" +
                          " 02 02 2C 6B 02 01 00 02 01 00 30 00";
     GetRequestMessage request = new GetRequestMessage(
         VersionCode.V3,
         new Header(
             new Integer32(0x6A09),
             new Integer32(0xFFE3),
             Levels.Reportable),
         new SecurityParameters(
             OctetString.Empty,
             Integer32.Zero,
             Integer32.Zero,
             OctetString.Empty,
             OctetString.Empty,
             OctetString.Empty),
         new Scope(
             OctetString.Empty,
             OctetString.Empty,
             new GetRequestPdu(0x2C6B, new List<Variable>())),
         DefaultPrivacyProvider.DefaultPair,
         null
        );
     string test = ByteTool.Convert(request.ToBytes());
     Assert.AreEqual(bytes, test);
 }
 public void TestToBytes()
 {
     const string s = "30 27 02 01  01 04 06 70  75 62 6C 69  63 A0 1A 02" +
                      "02 4B ED 02  01 00 02 01  00 30 0E 30  0C 06 08 2B" +
                      "06 01 02 01  01 01 00 05  00                      ";
     byte[] expected = ByteTool.Convert(s);
     GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
     Assert.AreEqual(expected, message.ToBytes());
 }
 public void TestTimeOutAsync()
 {
     // IMPORTANT: this test case requires a local SNMP agent such as 
     //   #SNMP Agent (snmpd), 
     //   Windows SNMP agent service, 
     //   Net-SNMP agent, or 
     //   snmp4j agent.
     Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
     GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
     
     var users = new UserRegistry();
     var ar2 = message.BeginGetResponse(new IPEndPoint(IPAddress.Loopback, 161), users, socket, null, null);
     var response = message.EndGetResponse(ar2);
     Assert.AreEqual(SnmpType.ResponsePdu, response.TypeCode());
 }
        public void TestTimeOut()
        {
            // IMPORTANT: this test case requires a local SNMP agent such as 
            //   #SNMP Agent (snmpd), 
            //   Windows SNMP agent service, 
            //   Net-SNMP agent, or 
            //   snmp4j agent.
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            GetRequestMessage message = new GetRequestMessage(0x4bed, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });
            
            const int time = 1500;
            bool hasException = false;
            try
            {
                message.GetResponse(time, new IPEndPoint(IPAddress.Loopback, 161), socket);
            }
            catch (TimeoutException)
            {
                hasException = true;
            }

            Assert.IsFalse(hasException);

            System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
            
            try
            {
                timer.Start();
                //IMPORTANT: test against an agent that doesn't exist.
// ReSharper disable AssignNullToNotNullAttribute
                message.GetResponse(time, new IPEndPoint(IPAddress.Parse("192.168.0.233"), 161), socket);
// ReSharper restore AssignNullToNotNullAttribute
            }
            catch (TimeoutException)
            {
                hasException = true;
            }

            timer.Stop();            
            
            long elapsedMilliseconds = timer.ElapsedMilliseconds;
            Console.WriteLine(@"elapsed: " + elapsedMilliseconds);
            Console.WriteLine(@"timeout: " + time);
            Assert.LessOrEqual(time, elapsedMilliseconds);
            Assert.IsTrue(hasException);

            // FIXME: these values are valid on my machine openSUSE 11.2. (lex)
            // This test case usually fails on Windows, as strangely WinSock API call adds an extra 500-ms.
            if (SnmpMessageExtension.IsRunningOnMono)
            {
                Assert.LessOrEqual(elapsedMilliseconds, time + 100);
            }
        }
 public void TestConstructorV2AuthMd5PrivDes()
 {
     const string bytes = "30 81 80 02  01 03 30 0F  02 02 6C 99  02 03 00 FF" +
                          "E3 04 01 07  02 01 03 04  38 30 36 04  0D 80 00 1F" +
                          "88 80 E9 63  00 00 D6 1F  F4 49 02 01  14 02 01 35" +
                          "04 07 6C 65  78 6D 61 72  6B 04 0C 80  50 D9 A1 E7" +
                          "81 B6 19 80  4F 06 C0 04  08 00 00 00  01 44 2C A3" +
                          "B5 04 30 4B  4F 10 3B 73  E1 E4 BD 91  32 1B CB 41" +
                          "1B A1 C1 D1  1D 2D B7 84  16 CA 41 BF  B3 62 83 C4" +
                          "29 C5 A4 BC  32 DA 2E C7  65 A5 3D 71  06 3C 5B 56" +
                          "FB 04 A4";
     MD5AuthenticationProvider auth = new MD5AuthenticationProvider(new OctetString("testpass"));
     IPrivacyProvider privacy = new DESPrivacyProvider(new OctetString("passtest"), auth);
     GetRequestMessage request = new GetRequestMessage(
         VersionCode.V3,
         new Header(
             new Integer32(0x6C99),
             new Integer32(0xFFE3),
             Levels.Authentication | Levels.Privacy | Levels.Reportable),
         new SecurityParameters(
             new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
             new Integer32(0x14),
             new Integer32(0x35),
             new OctetString("lexmark"),
             new OctetString(ByteTool.Convert("80  50 D9 A1 E7 81 B6 19 80  4F 06 C0")),
             new OctetString(ByteTool.Convert("00 00 00  01 44 2C A3 B5"))),
         new Scope(
             new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
             OctetString.Empty,
             new GetRequestPdu(
                 0x3A25,
                 new List<Variable>(1) { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")) })),
         privacy,
         null);
     Assert.AreEqual(Levels.Authentication | Levels.Privacy | Levels.Reportable, request.Header.SecurityLevel);
     Assert.AreEqual(ByteTool.Convert(bytes), request.ToBytes());
 }
 public void TestConstructorV3Auth1()
 {
     const string bytes = "30 73" +
                          "02 01  03 " +
                          "30 0F " +
                          "02  02 35 41 " +
                          "02  03 00 FF E3" +
                          "04 01 05" +
                          "02  01 03" +
                          "04 2E  " +
                          "30 2C" +
                          "04 0D  80 00 1F 88 80 E9 63 00  00 D6 1F F4  49 " +
                          "02 01 0D  " +
                          "02 01 57 " +
                          "04 05 6C 65 78  6C 69 " +
                          "04 0C  1C 6D 67 BF  B2 38 ED 63 DF 0A 05 24  " +
                          "04 00 " +
                          "30 2D  " +
                          "04 0D 80 00  1F 88 80 E9 63 00 00 D6  1F F4 49 " +
                          "04  00 " +
                          "A0 1A 02  02 01 AF 02 01 00 02 01  00 30 0E 30  0C 06 08 2B  06 01 02 01 01 03 00 05  00";
     ReportMessage report = new ReportMessage(
         VersionCode.V3,
         new Header(
             new Integer32(13633),
             new Integer32(0xFFE3),
             0),
         new SecurityParameters(
             new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
             new Integer32(0x0d),
             new Integer32(0x57),
             new OctetString("lexli"),
             new OctetString(new byte[12]),
             OctetString.Empty),
         new Scope(
             new OctetString(ByteTool.Convert("80 00 1F 88 80 E9 63 00  00 D6 1F F4  49")),
             OctetString.Empty,
             new ReportPdu(
                 0x01AF,
                 ErrorCode.NoError,
                 0,
                 new List<Variable>(1) { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")) })),
         DefaultPrivacyProvider.DefaultPair,
         null);
     
     IPrivacyProvider privacy = new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("testpass")));
     GetRequestMessage request = new GetRequestMessage(
         VersionCode.V3,
         13633,
         0x01AF,
         new OctetString("lexli"),
         new List<Variable>(1) { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.3.0")) },
         privacy,
         Messenger.MaxMessageSize,
         report);
     
     Assert.AreEqual(Levels.Authentication | Levels.Reportable, request.Header.SecurityLevel);
     Assert.AreEqual(ByteTool.Convert(bytes), request.ToBytes());
 }