コード例 #1
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();
        }
コード例 #2
0
        public async Task TestResponseAsync()
        {
            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"))
                });

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

                Assert.Equal(SnmpType.ResponsePdu, response.TypeCode());
            }
            finally
            {
                if (SnmpMessageExtension.IsRunningOnWindows)
                {
                    engine.Stop();
                }
            }
        }
コード例 #3
0
        public async void TestResponsesFromMultipleSources()
        {
            var start  = 16102;
            var end    = start + 512;
            var engine = CreateEngine();

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

            // 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 = 100000;

            for (int index = start; index < end; index++)
            //Parallel.For(start, end, async 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();
                Console.WriteLine("manager [{0}]{1}", Thread.CurrentThread.ManagedThreadId, DateTime.UtcNow);
                //var response = message.GetResponse(timeout, new IPEndPoint(IPAddress.Loopback, index), socket);
                var response =
                    await
                    message.GetResponseAsync(new IPEndPoint(IPAddress.Loopback, index), 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();
        }
コード例 #4
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()
            });
        }
コード例 #5
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();
                }
            }
        }
コード例 #6
0
        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();
                }
            }
        }
コード例 #7
0
        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);

            var time = DateTime.Now;

            engine.Start();

            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("public"), new List <Variable> {
                    new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0"))
                });
                Stopwatch watch = new Stopwatch();
                watch.Start();
                var response =
                    await
                    message.GetResponseAsync(serverEndPoint, new UserRegistry(), socket);

                watch.Stop();
                Assert.Equal(0, response.RequestId());
            }

            engine.Stop();
        }
コード例 #8
0
        public async void TestResponsesFromSingleSource()
        {
            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 = 100000;
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            for (int index = start; index < end; index++)
            //Parallel.For(start, end, async index =>
            {
                GetRequestMessage message = new GetRequestMessage(0, VersionCode.V2, new OctetString("public"), new List<Variable> { new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.1.0")) });

                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(0, response.RequestId());
            }
            // );

            engine.Stop();
        }
コード例 #9
0
        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());
        }
コード例 #10
0
ファイル: CustomSnmp.cs プロジェクト: kdurkin77/KM.Snmp
        public async Task <Variable?> GetV3UsmAsync(IPAddress ip, string oid, string community, int retries, int port, TimeSpan timeout,
                                                    string authPass, string privPass)
        {
            if (ip == null)
            {
                throw new ArgumentNullException(nameof(ip));
            }

            if (string.IsNullOrWhiteSpace(oid))
            {
                throw new ArgumentNullException(nameof(oid));
            }

            if (!Regex.IsMatch(oid, @"^(([0-9]+)\.)+[0-9]+$"))
            {
                throw new ArgumentException(oid, nameof(oid));
            }

            if (port <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(port), port.ToString());
            }

            if (retries <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(retries), retries.ToString());
            }

            if (timeout <= TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException(nameof(timeout), timeout.ToString());
            }

            if (string.IsNullOrWhiteSpace(authPass))
            {
                throw new ArgumentNullException(nameof(authPass));
            }

            if (string.IsNullOrWhiteSpace(privPass))
            {
                throw new ArgumentNullException(nameof(privPass));
            }

            var startDate   = DateTime.Now;
            var snmpType    = "GET";
            var snmpVersion = $"3 {SecurityModel.Usm}";

            var attempt = 0;
            IEnumerable <Variable> reply = new List <Variable>();

            while (attempt < retries)
            {
                try
                {
                    var receiver       = new IPEndPoint(ip, port);
                    var clientEndPoint = ip.AddressFamily == AddressFamily.InterNetwork
                        ? new IPEndPoint(IPAddress.Any, 0) : new IPEndPoint(IPAddress.IPv6Any, 0);
                    var vList = new List <Variable>()
                    {
                        new Variable(new ObjectIdentifier(oid))
                    };

                    using var cts = new CancellationTokenSource(timeout);
                    var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
                    var report    = await discovery.GetResponseAsync(receiver).ConfigureAwait(false);

                    var          auth     = new SHA1AuthenticationProvider(new OctetString(authPass)); // AuthenticationPassword
                    var          priv     = new DESPrivacyProvider(new OctetString(privPass), auth);   //PrivacyPassword
                    var          request  = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(community), vList, priv, Messenger.MaxMessageSize, report);
                    ISnmpMessage response = await request.GetResponseAsync(receiver, cts.Token).ConfigureAwait(false);

                    if (response is ReportMessage)
                    {
                        if (response.Pdu().Variables.Count == 0)
                        {
                            throw new Exception("wrong report message received");
                        }

                        var id = response.Pdu().Variables[0].Id;
                        if (id != Messenger.NotInTimeWindow)
                        {
                            var error = id.GetErrorMessage();
                            throw new Exception($"ERROR: {error}");
                        }
                    }
                    else if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
                    {
                        throw ErrorException.Create(
                                  "error in response",
                                  receiver.Address,
                                  response);
                    }

                    reply = response.Pdu().Variables;
                    break;
                }
                catch (Exception ex) when(ex is SnmpException || ex is SocketException || ex is OperationCanceledException || ex is System.TimeoutException)
                {
                    if (ex is System.TimeoutException && ex.Message == "Could Not Connect To Server")
                    {
                        _Logger.LogInformation($"{ip} - DTLS failed {attempt + 1} time(s)");
                    }

                    await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, ex.GetType().ToString(), ex.Message).ConfigureAwait(false);

                    ++attempt;
                    if (attempt >= retries)
                    {
                        throw;
                    }
                }
            }

            var type = string.Empty;
            var data = string.Empty;

            foreach (var res in reply)
            {
                type += res.Data.TypeCode;
                data += res.Data.ToString();
            }

            await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, type, data).ConfigureAwait(false);

            return(reply.FirstOrDefault());
        }