Exemplo n.º 1
0
        private SnmpEngine CreateSnmpEngine(RavenDBOptions serverOptions, ObjectStore store)
        {
            var configuration = serverOptions.SystemDatabase.Configuration;

            var v2MembershipProvider = new Version2MembershipProvider(new OctetString(configuration.Monitoring.Snmp.Community), new OctetString(configuration.Monitoring.Snmp.Community));
            var v3MembershipProvider = new Version3MembershipProvider();
            var membershipProvider   = new ComposedMembershipProvider(new IMembershipProvider[] { v2MembershipProvider, v3MembershipProvider });

            var handlers = new[]
            {
                new HandlerMapping("V2,V3", "GET", new GetMessageHandler()),
                new HandlerMapping("V2,V3", "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping("V2,V3", "GETBULK", new GetBulkMessageHandler())
            };

            var messageHandlerFactory = new MessageHandlerFactory(handlers);

            var factory = new SnmpApplicationFactory(new Logger(log), store, membershipProvider, messageHandlerFactory);

            var listener    = new Listener();
            var engineGroup = new EngineGroup();

            var engine = new SnmpEngine(factory, listener, engineGroup);

            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, configuration.Monitoring.Snmp.Port));
            engine.Listener.ExceptionRaised += (sender, e) => log.ErrorException("SNMP error: " + e.Exception.Message, e.Exception);

            return(engine);
        }
        public void TestIsInTime()
        {
            Assert.True(EngineGroup.IsInTime(new[] { 0, 0 }, 0, -4));
            Assert.False(EngineGroup.IsInTime(new[] { 0, 0 }, 0, -151));

            Assert.True(EngineGroup.IsInTime(new[] { 0, int.MinValue + 1 }, 0, int.MaxValue - 1));
            Assert.False(EngineGroup.IsInTime(new[] { 0, int.MinValue + 152 }, 0, int.MaxValue));
        }
        public void TestIsInTime()
        {
            Assert.IsTrue(EngineGroup.IsInTime(new[] { 0, 0 }, 0, -499));
            Assert.IsFalse(EngineGroup.IsInTime(new[] { 0, 0 }, 0, -150001));

            Assert.IsTrue(EngineGroup.IsInTime(new[] { 0, int.MinValue + 1, }, 0, int.MaxValue - 1));
            Assert.IsFalse(EngineGroup.IsInTime(new[] { 0, int.MinValue + 150002 }, 0, int.MaxValue));
        }
        public void InstantiateWithEngineBootsOnly_Should_UseEngineBootsButDefaultEngineId()
        {
            var eg = new EngineGroup(42);

            Assert.True(eg.EngineId.GetRaw().SequenceEqual(EngineGroup.EngineIdDefault.GetRaw()));
            Assert.Equal(OctetString.Empty, eg.ContextName);
            Assert.Equal(42, eg.EngineTimeData[0]);
        }
        public void InstantiateWithoutArguments_Should_ShowDefaultBehavior()
        {
            var eg = new EngineGroup();

            Assert.True(eg.EngineId.GetRaw().SequenceEqual(EngineGroup.EngineIdDefault.GetRaw()));
            Assert.True(eg.ContextName.Equals(OctetString.Empty));
            Assert.Equal(0, eg.EngineTimeData[0]);
        }
Exemplo n.º 6
0
        public void TestIsInTime()
        {
            Assert.IsTrue(EngineGroup.IsInTime(0, -499));
            Assert.IsFalse(EngineGroup.IsInTime(0, -501));

            Assert.IsTrue(EngineGroup.IsInTime(Int32.MinValue + 1, Int32.MaxValue - 1));
            Assert.IsFalse(EngineGroup.IsInTime(Int32.MinValue + 502, Int32.MaxValue));
        }
        public void InstantiateWithEngineIdAndEngineBoots_Should_UseValues()
        {
            var engineId = new byte[] { 0x80, 0x00, 0x1f, 0x88, 0x80, 0xaf, 0xbc, 0x29, 0x10, 0xfc, 0x64, 0x12, 0x56, 0x00, 0x00, 0x00, 0x00 };
            var eg       = new EngineGroup(new OctetString(engineId), new OctetString("TheContext"), 42);

            Assert.True(eg.EngineId.GetRaw().SequenceEqual(engineId));
            Assert.Equal(new OctetString("TheContext"), eg.ContextName);
            Assert.Equal(42, eg.EngineTimeData[0]);
        }
Exemplo n.º 8
0
        private static SnmpEngine CreateSnmpEngine(RavenServer server, ObjectStore objectStore)
        {
            var v2MembershipProvider = new Version2MembershipProvider(new OctetString(server.Configuration.Monitoring.Snmp.Community), new OctetString(server.Configuration.Monitoring.Snmp.Community));
            var v3MembershipProvider = new Version3MembershipProvider();
            var membershipProvider   = new ComposedMembershipProvider(new IMembershipProvider[] { v2MembershipProvider, v3MembershipProvider });

            var handlers = new[]
            {
                new HandlerMapping("V2,V3", "GET", new GetMessageHandler()),
                new HandlerMapping("V2,V3", "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping("V2,V3", "GETBULK", new GetBulkMessageHandler())
            };

            var messageHandlerFactory = new MessageHandlerFactory(handlers);

            var factory = new SnmpApplicationFactory(new SnmpLogger(Logger), objectStore, membershipProvider, messageHandlerFactory);

            var listener = new Listener();

            listener.Users.Add(new OctetString("ravendb"), new DefaultPrivacyProvider(new SHA1AuthenticationProvider(new OctetString(server.Configuration.Monitoring.Snmp.Community))));

            var engineGroup = new EngineGroup();

            var engine = new SnmpEngine(factory, listener, engineGroup);

            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, server.Configuration.Monitoring.Snmp.Port));
            engine.Listener.ExceptionRaised += (sender, e) =>
            {
                if (Logger.IsOperationsEnabled)
                {
                    Logger.Operations("SNMP error: " + e.Exception.Message, e.Exception);
                }
            };

            return(engine);
        }
Exemplo n.º 9
0
        private static SnmpEngine CreateSnmpEngine(RavenServer server, ObjectStore objectStore)
        {
            (HashSet <SnmpVersion> versions, string handlerVersion) = GetVersions(server);
            var membershipProvider = CreateMembershipProvider(server, versions);

            var handlers = new[]
            {
                new HandlerMapping(handlerVersion, "GET", new GetMessageHandler()),
                new HandlerMapping(handlerVersion, "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping(handlerVersion, "GETBULK", new GetBulkMessageHandler())
            };

            var messageHandlerFactory = new MessageHandlerFactory(handlers);

            var factory = new SnmpApplicationFactory(new SnmpLogger(Logger), objectStore, membershipProvider, messageHandlerFactory);

            var listener = new Listener();

            if (versions.Contains(SnmpVersion.V3))
            {
                var authenticationUser = server.Configuration.Monitoring.Snmp.AuthenticationUser;

                var authenticationProtocol = server.Configuration.Monitoring.Snmp.AuthenticationProtocol;
                var authenticationPassword = server.Configuration.Monitoring.Snmp.AuthenticationPassword ?? server.Configuration.Monitoring.Snmp.Community;

                var privacyProtocol = server.Configuration.Monitoring.Snmp.PrivacyProtocol;
                var privacyPassword = server.Configuration.Monitoring.Snmp.PrivacyPassword;

                var privacyProvider = CreatePrivacyProvider(authenticationUser, authenticationProtocol, authenticationPassword, privacyProtocol, privacyPassword);

                listener.Users.Add(new OctetString(authenticationUser), privacyProvider);

                var authenticationUserSecondary = server.Configuration.Monitoring.Snmp.AuthenticationUserSecondary;
                if (string.IsNullOrWhiteSpace(authenticationUserSecondary) == false)
                {
                    var authenticationProtocolSecondary = server.Configuration.Monitoring.Snmp.AuthenticationProtocolSecondary;
                    var authenticationPasswordSecondary = server.Configuration.Monitoring.Snmp.AuthenticationPasswordSecondary;

                    var privacyProtocolSecondary = server.Configuration.Monitoring.Snmp.PrivacyProtocolSecondary;
                    var privacyPasswordSecondary = server.Configuration.Monitoring.Snmp.PrivacyPasswordSecondary;

                    var privacyProviderSecondary = CreatePrivacyProvider(authenticationUserSecondary, authenticationProtocolSecondary, authenticationPasswordSecondary, privacyProtocolSecondary, privacyPasswordSecondary);

                    listener.Users.Add(new OctetString(authenticationUserSecondary), privacyProviderSecondary);
                }
            }

            int engineBoots;

            using (server.ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                using (var tx = context.OpenWriteTransaction())
                {
                    var tree = tx.InnerTransaction.CreateTree(nameof(SnmpWatcher));
                    engineBoots = (int)tree.Increment("EngineBoots", 1);

                    tx.Commit();
                }

            var engineGroup = new EngineGroup(engineBoots, GetIsInTime(server.Configuration.Monitoring))
            {
                EngineId = new OctetString(server.ServerStore.GetServerId().ToString("N"))
            };

            var engine = new SnmpEngine(factory, listener, engineGroup);

            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, server.Configuration.Monitoring.Snmp.Port));
            engine.Listener.ExceptionRaised += (sender, e) =>
            {
                if (Logger.IsOperationsEnabled)
                {
                    Logger.Operations("SNMP error: " + e.Exception.Message, e.Exception);
                }
            };

            return(engine);
Exemplo n.º 10
0
        private static SnmpEngine CreateSnmpEngine(RavenServer server, ObjectStore objectStore)
        {
            (HashSet <SnmpVersion> versions, string handlerVersion) = GetVersions(server);
            var membershipProvider = CreateMembershipProvider(server, versions);

            var handlers = new[]
            {
                new HandlerMapping(handlerVersion, "GET", new GetMessageHandler()),
                new HandlerMapping(handlerVersion, "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping(handlerVersion, "GETBULK", new GetBulkMessageHandler())
            };

            var messageHandlerFactory = new MessageHandlerFactory(handlers);

            var factory = new SnmpApplicationFactory(new SnmpLogger(Logger), objectStore, membershipProvider, messageHandlerFactory);

            var listener = new Listener();

            if (versions.Contains(SnmpVersion.V3))
            {
                var authenticationPassword = server.Configuration.Monitoring.Snmp.AuthenticationPassword ?? server.Configuration.Monitoring.Snmp.Community;

                IAuthenticationProvider authenticationProvider;
                switch (server.Configuration.Monitoring.Snmp.AuthenticationProtocol)
                {
                case SnmpAuthenticationProtocol.SHA1:
                    authenticationProvider = new SHA1AuthenticationProvider(new OctetString(authenticationPassword));
                    break;

                case SnmpAuthenticationProtocol.MD5:
                    authenticationProvider = new MD5AuthenticationProvider(new OctetString(authenticationPassword));
                    break;

                default:
                    throw new InvalidOperationException($"Unknown authentication protocol '{server.Configuration.Monitoring.Snmp.AuthenticationProtocol}'.");
                }

                var privacyPassword = server.Configuration.Monitoring.Snmp.PrivacyPassword;

                IPrivacyProvider privacyProvider;
                switch (server.Configuration.Monitoring.Snmp.PrivacyProtocol)
                {
                case SnmpPrivacyProtocol.None:
                    privacyProvider = new DefaultPrivacyProvider(authenticationProvider);
                    break;

                case SnmpPrivacyProtocol.DES:
                    privacyProvider = new BouncyCastleDESPrivacyProvider(new OctetString(privacyPassword), authenticationProvider);
                    break;

                case SnmpPrivacyProtocol.AES:
                    privacyProvider = new BouncyCastleAESPrivacyProvider(new OctetString(privacyPassword), authenticationProvider);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown privacy protocol '{server.Configuration.Monitoring.Snmp.AuthenticationProtocol}'.");
                }

                listener.Users.Add(new OctetString(server.Configuration.Monitoring.Snmp.AuthenticationUser), privacyProvider);
            }

            int engineBoots;

            using (server.ServerStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                using (var tx = context.OpenWriteTransaction())
                {
                    var tree = tx.InnerTransaction.CreateTree(nameof(SnmpWatcher));
                    engineBoots = (int)tree.Increment("EngineBoots", 1);

                    tx.Commit();
                }

            var engineGroup = new EngineGroup(engineBoots, GetIsInTime(server.Configuration.Monitoring))
            {
                EngineId = new OctetString(server.ServerStore.GetServerId().ToString("N"))
            };

            var engine = new SnmpEngine(factory, listener, engineGroup);

            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, server.Configuration.Monitoring.Snmp.Port));
            engine.Listener.ExceptionRaised += (sender, e) =>
            {
                if (Logger.IsOperationsEnabled)
                {
                    Logger.Operations("SNMP error: " + e.Exception.Message, e.Exception);
                }
            };

            return(engine);
        }
Exemplo n.º 11
0
        private static SnmpEngine CreateSnmpEngine(RavenServer server, ObjectStore objectStore)
        {
            (HashSet <SnmpVersion> versions, string handlerVersion) = GetVersions(server);
            var membershipProvider = CreateMembershipProvider(server, versions);

            var handlers = new[]
            {
                new HandlerMapping(handlerVersion, "GET", new GetMessageHandler()),
                new HandlerMapping(handlerVersion, "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping(handlerVersion, "GETBULK", new GetBulkMessageHandler())
            };

            var messageHandlerFactory = new MessageHandlerFactory(handlers);

            var factory = new SnmpApplicationFactory(new SnmpLogger(Logger), objectStore, membershipProvider, messageHandlerFactory);

            var listener = new Listener();

            if (versions.Contains(SnmpVersion.V3))
            {
                var authenticationPassword = server.Configuration.Monitoring.Snmp.AuthenticationPassword ?? server.Configuration.Monitoring.Snmp.Community;

                IAuthenticationProvider authenticationProvider;
                switch (server.Configuration.Monitoring.Snmp.AuthenticationProtocol)
                {
                case SnmpAuthenticationProtocol.SHA1:
                    authenticationProvider = new SHA1AuthenticationProvider(new OctetString(authenticationPassword));
                    break;

                case SnmpAuthenticationProtocol.MD5:
                    authenticationProvider = new MD5AuthenticationProvider(new OctetString(authenticationPassword));
                    break;

                default:
                    throw new InvalidOperationException($"Unknown authentication protocol '{server.Configuration.Monitoring.Snmp.AuthenticationProtocol}'.");
                }

                var privacyPassword = server.Configuration.Monitoring.Snmp.PrivacyPassword;

                IPrivacyProvider privacyProvider;
                switch (server.Configuration.Monitoring.Snmp.PrivacyProtocol)
                {
                case SnmpPrivacyProtocol.None:
                    privacyProvider = new DefaultPrivacyProvider(authenticationProvider);
                    break;

                case SnmpPrivacyProtocol.DES:
                    privacyProvider = new BouncyCastleDESPrivacyProvider(new OctetString(privacyPassword), authenticationProvider);
                    break;

                case SnmpPrivacyProtocol.AES:
                    privacyProvider = new BouncyCastleAESPrivacyProvider(new OctetString(privacyPassword), authenticationProvider);
                    break;

                default:
                    throw new InvalidOperationException($"Unknown privacy protocol '{server.Configuration.Monitoring.Snmp.AuthenticationProtocol}'.");
                }

                listener.Users.Add(new OctetString(server.Configuration.Monitoring.Snmp.AuthenticationUser), privacyProvider);
            }

            var engineGroup   = new EngineGroup();
            var engineIdField = engineGroup.GetType().GetField("_engineId", BindingFlags.Instance | BindingFlags.NonPublic);

            engineIdField.SetValue(engineGroup, new OctetString(Guid.NewGuid().ToString("N")));

            var engine = new SnmpEngine(factory, listener, engineGroup);

            engine.Listener.AddBinding(new IPEndPoint(IPAddress.Any, server.Configuration.Monitoring.Snmp.Port));
            engine.Listener.ExceptionRaised += (sender, e) =>
            {
                if (Logger.IsOperationsEnabled)
                {
                    Logger.Operations("SNMP error: " + e.Exception.Message, e.Exception);
                }
            };

            return(engine);
        }
Exemplo n.º 12
0
        public static void Init(string ip, string trapMcastIp, int port, int trap)
        {
            SnmpLogger  logger      = new SnmpLogger();
            ObjectStore objectStore = new ObjectStore();

            OctetString getCommunity = new OctetString("public");
            OctetString setCommunity = new OctetString("public");

            IMembershipProvider[] membershipProviders = new IMembershipProvider[]
            {
                new Version1MembershipProvider(getCommunity, setCommunity),
                new Version2MembershipProvider(getCommunity, setCommunity),
                new Version3MembershipProvider()
            };
            IMembershipProvider composedMembershipProvider = new ComposedMembershipProvider(membershipProviders);

            TrapV1MessageHandler        trapv1 = new TrapV1MessageHandler();
            TrapV2MessageHandler        trapv2 = new TrapV2MessageHandler();
            InformRequestMessageHandler inform = new InformRequestMessageHandler();

            HandlerMapping[] handlerMappings = new HandlerMapping[]
            {
                new HandlerMapping("v1", "GET", new GetV1MessageHandler()),
                new HandlerMapping("v2,v3", "GET", new GetMessageHandler()),
                new HandlerMapping("v1", "SET", new SetV1MessageHandler()),
                new HandlerMapping("v2,v3", "SET", new SetMessageHandler()),
                new HandlerMapping("v1", "GETNEXT", new GetNextV1MessageHandler()),
                new HandlerMapping("v2,v3", "GETNEXT", new GetNextMessageHandler()),
                new HandlerMapping("v2,v3", "GETBULK", new GetBulkMessageHandler()),
                new HandlerMapping("v1", "TRAPV1", trapv1),
                new HandlerMapping("v2,v3", "TRAPV2", trapv2),
                new HandlerMapping("v2,v3", "INFORM", inform)                /*,
                                                                              * new HandlerMapping("*", "*", new NullMessageHandler())*/
            };
            MessageHandlerFactory messageHandlerFactory = new MessageHandlerFactory(handlerMappings);

            User[] users = new User[]
            {
                new User(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair),
                new User(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")))),
                new User(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"), new MD5AuthenticationProvider(new OctetString("authentication"))))
            };
            UserRegistry userRegistry = new UserRegistry(users);

            EngineGroup engineGroup = new EngineGroup();
            Listener    listener    = new Listener()
            {
                Users = userRegistry
            };
            SnmpApplicationFactory factory = new SnmpApplicationFactory(logger, objectStore, composedMembershipProvider, messageHandlerFactory);

            _engine = new SnmpEngine(factory, listener, engineGroup);
            _engine.Listener.AddBinding(new IPEndPoint(IPAddress.Parse(ip), port));
            _engine.Listener.AddBinding(new IPEndPoint(IPAddress.Parse(ip), trap));
            //			_engine.Listener.AddBinding(new IPEndPoint(IPAddress.Parse(ip), trap), trapMcastIp != null ? IPAddress.Parse(trapMcastIp) : null);
            _engine.ExceptionRaised += (sender, e) => _logger.Error(e.Exception, "ERROR Snmp");

            _closed  = false;
            _store   = objectStore;
            _context = SynchronizationContext.Current ?? new SynchronizationContext();

            trapv1.MessageReceived += TrapV1Received;
            trapv2.MessageReceived += TrapV2Received;
            inform.MessageReceived += InformRequestReceived;

            /*(new IPEndPoint(IPAddress.Parse(ip), 0)).SetAsDefault();*/
        }
Exemplo n.º 13
0
        public async Task TestTrapV2HandlerWithV3MessageAndWrongEngineId()
        {
            var manualEvent = new ManualResetEventSlim();
            // TODO: this is a hack. review it later.
            var engineId = new OctetString(ByteTool.Convert("80001F8880E9630000D61FF449"));
            var users    = new UserRegistry();

            users.Add(new OctetString("neither"), DefaultPrivacyProvider.DefaultPair);
            users.Add(new OctetString("authen"), new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")))
            {
                EngineId = engineId
            });
#if !NETSTANDARD
            users.Add(new OctetString("privacy"), new DESPrivacyProvider(new OctetString("privacyphrase"),
                                                                         new MD5AuthenticationProvider(new OctetString("authentication"))));
#endif
            var count = 0;

            var trapv1        = new TrapV1MessageHandler();
            var trapv1Mapping = new HandlerMapping("v1", "TRAPV1", trapv1);

            var trapv2 = new TrapV2MessageHandler();
            trapv2.MessageReceived += (sender, args) => { count++; };
            var trapv2Mapping = new HandlerMapping("v2,v3", "TRAPV2", trapv2);

            var inform        = new InformRequestMessageHandler();
            var informMapping = new HandlerMapping("v2,v3", "INFORM", inform);

            var store          = new ObjectStore();
            var v1             = new Version1MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v2             = new Version2MembershipProvider(new OctetString("public"), new OctetString("public"));
            var v3             = new Version3MembershipProvider();
            var membership     = new ComposedMembershipProvider(new IMembershipProvider[] { v1, v2, v3 });
            var handlerFactory = new MessageHandlerFactory(new[] { trapv1Mapping, trapv2Mapping, informMapping });

            var logger = new TestLogger();
            logger.Handler = (obj, args) => { manualEvent.Set(); };

            var pipelineFactory = new SnmpApplicationFactory(logger, store, membership, handlerFactory);
            var group           = new EngineGroup();
            using (var engine = new SnmpEngine(pipelineFactory, new Listener {
                Users = users
            }, group))
            {
                var daemonEndPoint = new IPEndPoint(IPAddress.Loopback, port.NextId);
                engine.Listener.AddBinding(daemonEndPoint);
                engine.Start();

                var privacy = new DefaultPrivacyProvider(new MD5AuthenticationProvider(new OctetString("authentication")));
                var trap    = new TrapV2Message(
                    VersionCode.V3,
                    1004947569,
                    234419641,
                    new OctetString("authen"),
                    new ObjectIdentifier("1.3.6"),
                    0,
                    new List <Variable>(),
                    privacy,
                    0x10000,
                    new OctetString(ByteTool.Convert("80001F8880E9630000D61FF450")),
                    0,
                    0);
                await trap.SendAsync(daemonEndPoint);

                manualEvent.Wait();

                Assert.Equal(0, count);
                Assert.Equal(new Counter32(1), group.UnknownEngineId.Data);

                engine.Stop();
            }
        }
 public void InstantiateWithNegativeEngineBoots_Should_ThrowArgumentOutOfRangeException()
 {
     Assert.Throws <ArgumentOutOfRangeException>(() => { var eg = new EngineGroup(-1); });
 }