예제 #1
0
        private IPrivacyProvider CreateKeys()
        {
            IAuthenticationProvider auth = null;
            IPrivacyProvider        priv = null;

            switch (ConnectionOptions.Authentication)
            {
            case Authentication.MD5:
                auth = new MD5AuthenticationProvider(new OctetString(ConnectionOptions.SNMPPass));
                break;

            case Authentication.SHA:
                auth = new SHA1AuthenticationProvider(new OctetString(ConnectionOptions.SNMPPass));
                break;
            }
            switch (ConnectionOptions.Encryption)
            {
            case Encryption.AES:
                priv = new AESPrivacyProvider(new OctetString(ConnectionOptions.SNMPEncryptionKey), auth);
                break;

            case Encryption.DES:
                priv = new DESPrivacyProvider(new OctetString(ConnectionOptions.SNMPEncryptionKey), auth);
                break;
            }
            return(priv);
        }
예제 #2
0
        private static IPrivacyProvider GetPrivacyProvider(string password, PasswordType passwordType,
                                                           string encryption, EncryptionType encryptionType)
        {
            IPrivacyProvider        provider;
            IAuthenticationProvider auth;

            if (passwordType == PasswordType.SHA)
            {
                auth = new SHA1AuthenticationProvider(new OctetString(password));
            }
            else
            {
                auth = new MD5AuthenticationProvider(new OctetString(password));
            }

            if (encryptionType == EncryptionType.DES)
            {
                provider = new Security.DESPrivacyProvider(new OctetString(encryption), auth);
            }
            else
            {
                provider = new Security.AESPrivacyProvider(new OctetString(encryption), auth);
            }

            return(provider);
        }
        public void TestTrapV3AuthBytes()
        {
            byte[]       bytes                = File.ReadAllBytes(Path.Combine("Resources", "v3authNoPriv_BER_Issue"));
            UserRegistry registry             = new UserRegistry();
            SHA1AuthenticationProvider authen = new SHA1AuthenticationProvider(new OctetString("testpass"));

            registry.Add(new OctetString("test"), new DefaultPrivacyProvider(authen));
            IList <ISnmpMessage> messages = MessageFactory.ParseMessages(bytes, registry);

            Assert.Equal(1, messages.Count);
            ISnmpMessage message = messages[0];

            Assert.Equal("80001299030005B706CF69", message.Parameters.EngineId.ToHexString());
            Assert.Equal(41, message.Parameters.EngineBoots.ToInt32());
            Assert.Equal(877, message.Parameters.EngineTime.ToInt32());
            Assert.Equal("test", message.Parameters.UserName.ToString());
            Assert.Equal("C107F9DAA3FC552960E38936", message.Parameters.AuthenticationParameters.ToHexString());
            Assert.Equal("", message.Parameters.PrivacyParameters.ToHexString());
            Assert.Equal("80001299030005B706CF69", message.Scope.ContextEngineId.ToHexString()); // SNMP#NET returns string.Empty here.
            Assert.Equal("", message.Scope.ContextName.ToHexString());
            Assert.Equal(681323585, message.MessageId());
            Assert.Equal(681323584, message.RequestId());

            Assert.Equal(bytes, message.ToBytes());
        }
        public void Test()
        {
            var provider = new SHA1AuthenticationProvider(new OctetString("longlongago"));

            Assert.Equal("SHA-1 authentication provider", provider.ToString());
            Assert.Throws <ArgumentNullException>(() => new SHA1AuthenticationProvider(null));
            Assert.Throws <ArgumentNullException>(() => provider.PasswordToKey(null, null));
            Assert.Throws <ArgumentNullException>(() => provider.PasswordToKey(new byte[0], null));
            Assert.Throws <ArgumentException>(() => provider.PasswordToKey(new byte[0], new byte[0]));
        }
예제 #5
0
            static IPrivacyProvider CreatePrivacyProvider(string authenticationUser, SnmpAuthenticationProtocol authenticationProtocol, string authenticationPassword, SnmpPrivacyProtocol privacyProtocol, string privacyPassword)
            {
                try
                {
                    if (authenticationPassword == null)
                    {
                        throw new ArgumentNullException(nameof(authenticationPassword));
                    }

                    IAuthenticationProvider authenticationProvider;
                    switch (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 '{authenticationProtocol}'.");
                    }

                    switch (privacyProtocol)
                    {
                    case SnmpPrivacyProtocol.None:
                        return(new DefaultPrivacyProvider(authenticationProvider));

                    case SnmpPrivacyProtocol.DES:
                        if (privacyPassword == null)
                        {
                            throw new ArgumentNullException(nameof(privacyPassword));
                        }

                        return(new BouncyCastleDESPrivacyProvider(new OctetString(privacyPassword), authenticationProvider));

                    case SnmpPrivacyProtocol.AES:
                        if (privacyPassword == null)
                        {
                            throw new ArgumentNullException(nameof(privacyPassword));
                        }

                        return(new BouncyCastleAESPrivacyProvider(new OctetString(privacyPassword), authenticationProvider));

                    default:
                        throw new InvalidOperationException($"Unknown privacy protocol '{privacyProtocol}'.");
                    }
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException($"Could not create SNMP user '{authenticationUser}'.", e);
                }
            }
 public void Test()
 {
     var provider = new SHA1AuthenticationProvider(new OctetString("longlongago"));
     Assert.AreEqual("SHA-1 authentication provider", provider.ToString());
     Assert.Throws<ArgumentNullException>(() => new SHA1AuthenticationProvider(null));
     Assert.Throws<ArgumentNullException>(() => provider.PasswordToKey(null, null));
     Assert.Throws<ArgumentNullException>(() => provider.PasswordToKey(new byte[0], null));
     Assert.Throws<ArgumentException>(() => provider.PasswordToKey(new byte[0], new byte[0]));
     
     Assert.Throws<ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, null, null, null, null));
     Assert.Throws<ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, Header.Empty, null, null, null));
     Assert.Throws<ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, Header.Empty, SecurityParameters.Create(new OctetString("test")), null, null));
    // Assert.Throws<ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, Header.Empty, SecurityParameters.Create(new OctetString("test")), OctetString.Empty, null));
 }
        public void Test()
        {
            var provider = new SHA1AuthenticationProvider(new OctetString("longlongago"));

            Assert.AreEqual("SHA-1 authentication provider", provider.ToString());
            Assert.Throws <ArgumentNullException>(() => new SHA1AuthenticationProvider(null));
            Assert.Throws <ArgumentNullException>(() => provider.PasswordToKey(null, null));
            Assert.Throws <ArgumentNullException>(() => provider.PasswordToKey(new byte[0], null));
            Assert.Throws <ArgumentException>(() => provider.PasswordToKey(new byte[0], new byte[0]));

            Assert.Throws <ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, null, null, null, null));
            Assert.Throws <ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, Header.Empty, null, null, null));
            Assert.Throws <ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, Header.Empty, SecurityParameters.Create(new OctetString("test")), null, null));
            // Assert.Throws<ArgumentNullException>(() => provider.ComputeHash(VersionCode.V1, Header.Empty, SecurityParameters.Create(new OctetString("test")), OctetString.Empty, null));
        }
예제 #8
0
        // authNoPriv
        private IPrivacyProvider GetPrivacy(SNMPv3AuthenticationProvider authProvider, string auth)
        {
            IAuthenticationProvider authenticationProvider;

            if (authProvider == SNMPv3AuthenticationProvider.MD5)
            {
                authenticationProvider = new MD5AuthenticationProvider(new OctetString(auth));
            }
            else
            {
                authenticationProvider = new SHA1AuthenticationProvider(new OctetString(auth));
            }

            return(new DefaultPrivacyProvider(authenticationProvider));
        }
예제 #9
0
        private void txtBytes_TextChanged(object sender, EventArgs e)
        {
            tvMessage.Nodes.Clear();
            var users = new UserRegistry();
            IAuthenticationProvider authen;

            if (tscbAuthentication.SelectedIndex == 0)
            {
                authen = DefaultAuthenticationProvider.Instance;
            }
            else if (tscbAuthentication.SelectedIndex == 1)
            {
                authen = new MD5AuthenticationProvider(new OctetString(tstxtAuthentication.Text));
            }
            else
            {
                authen = new SHA1AuthenticationProvider(new OctetString(tstxtAuthentication.Text));
            }

            IPrivacyProvider privacy;

            if (tscbPrivacy.SelectedIndex == 0)
            {
                privacy = new DefaultPrivacyProvider(authen);
            }
            else if (tscbPrivacy.SelectedIndex == 1)
            {
                privacy = new DESPrivacyProvider(new OctetString(tstxtPrivacy.Text), authen);
            }
            else
            {
                privacy = new AESPrivacyProvider(new OctetString(tstxtPrivacy.Text), authen);
            }

            users.Add(new User(new OctetString(tstxtUser.Text), privacy));

            try
            {
                var messages = MessageFactory.ParseMessages(ByteTool.Convert(txtBytes.Text.Replace("\"", null).Replace("+", null)), users);
                messages.Fill(tvMessage);
            }
            catch (Exception ex)
            {
                tvMessage.Nodes.Add(ex.Message);
            }
        }
예제 #10
0
        // authPriv
        private static IPrivacyProvider GetPrivacy(SNMPV3AuthenticationProvider authProvider, string auth, SNMPV3PrivacyProvider privProvider, string priv)
        {
            IAuthenticationProvider authenticationProvider;

            if (authProvider == SNMPV3AuthenticationProvider.MD5)
            {
                authenticationProvider = new MD5AuthenticationProvider(new OctetString(auth));
            }
            else
            {
                authenticationProvider = new SHA1AuthenticationProvider(new OctetString(auth));
            }

            if (privProvider == SNMPV3PrivacyProvider.DES)
            {
                return(new DESPrivacyProvider(new OctetString(priv), authenticationProvider));
            }

            return(new AESPrivacyProvider(new OctetString(priv), authenticationProvider));
        }
예제 #11
0
        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());
        }
예제 #12
0
        public async Task <(int bulkwalkResult, IList <Variable> results)> GetSubtreeV3UsmAsync(IPAddress ip, string oid, string community, int port, int?maxRepetitions,
                                                                                                int?retries, TimeSpan?timeout, string authPassword, string privPassword)
        {
            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());
            }

            var maxRepetitionsValue = maxRepetitions ?? 10;

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

            var retriesValue = retries ?? 2;

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

            var timeoutMs = timeout ?? TimeSpan.FromSeconds(5);

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

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

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

            var discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
            var report    = await discovery.GetResponseAsync(new IPEndPoint(ip, 161)).ConfigureAwait(false);

            var auth = new SHA1AuthenticationProvider(new OctetString(authPassword)); // AuthenticationPassword
            var priv = new DESPrivacyProvider(new OctetString(privPassword), auth);   //PrivacyPassword

            var results        = new List <Variable>();
            var bulkwalkResult = await MyMessenger.BulkWalkV3UsmAsync(
                new IPEndPoint(ip, port),
                community == null?OctetString.Empty : new OctetString(community),
                new ObjectIdentifier(oid),
                results,
                maxRepetitionsValue,
                retriesValue,
                timeoutMs,
                WalkMode.WithinSubtree,
                priv,
                report
                ).ConfigureAwait(false);

            return(bulkwalkResult, results);
        }
예제 #13
0
        public List <MIBObject> Get(RSU rsu, Core.Entities.User user, string OID)
        {
            List <MIBObject> mibObjects;

            try
            {
                IPEndPoint receiver = new IPEndPoint(rsu.IP, rsu.Port);
                int        timeout  = _managerSettings.Timeout;

                Discovery     discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
                ReportMessage report    = discovery.GetResponse(timeout, receiver);

                var auth = new SHA1AuthenticationProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Auth));
                var priv = new DESPrivacyProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Priv), auth);

                GetRequestMessage request = new GetRequestMessage(VersionCode.V3
                                                                  , Messenger.NextMessageId
                                                                  , Messenger.NextRequestId
                                                                  , new OctetString(user.UserName)
                                                                  , new OctetString(String.Empty)
                                                                  , new List <Variable> {
                    new Variable(new ObjectIdentifier(OID))
                }
                                                                  , priv
                                                                  , Messenger.MaxMessageSize
                                                                  , report);

                ISnmpMessage reply = request.GetResponse(timeout, receiver);

                // Need to send again (RFC 3414)???
                if (reply is ReportMessage)
                {
                    //throw new ReplyIsReportMessage();
                    request = new GetRequestMessage(VersionCode.V3
                                                    , Messenger.NextMessageId
                                                    , Messenger.NextRequestId
                                                    , new OctetString(user.UserName)
                                                    , new OctetString(String.Empty)
                                                    , new List <Variable> {
                        new Variable(new ObjectIdentifier(OID))
                    }
                                                    , priv
                                                    , Messenger.MaxMessageSize
                                                    , reply);

                    reply = request.GetResponse(timeout, receiver);
                    if (reply.Pdu().ErrorStatus.ToInt32() != 0)
                    {
                        throw new SnmpGetError();
                    }
                }
                else if (reply.Pdu().ErrorStatus.ToInt32() != 0)
                {
                    throw new SnmpGetError();
                }

                mibObjects = SNMPVariables2MIBObjects(reply.Pdu().Variables);

                return(mibObjects);
            }
            catch (Lextm.SharpSnmpLib.Messaging.TimeoutException ex)
            {
                mibObjects = new List <MIBObject>();
                mibObjects.Add(new MIBObject("0", SnmpType.OctetString, "Timeout"));
                return(mibObjects);
            }
        }
예제 #14
0
        /// <summary>
        /// Inizializzatore
        /// </summary>
        /// <param name="authPwd">Password autenticazione</param>
        /// <param name="privPwd">Password privata</param>
        /// <param name="userName">Nome utente</param>
        /// <param name="senderIp">Ip di invio</param>
        /// <param name="receiverIp">Ip destinatario</param>
        /// <param name="receiverPort">Porta destinatario</param>
        /// <param name="version">Versione SNMP</param>
        /// <param name="encoding">Cosifica stringa inviata</param>
        public LextConnector(
            string authPwd,
            string privPwd,
            string userName,
            string senderIp,
            string receiverIp,
            string receiverPort,
            string version,
            string encoding)
        {
            myVersion = version;

            switch (encoding)
            {
            case "UTF7":
                Encoding = Encoding.UTF7;
                break;

            case "BigEndianUnicode":
                Encoding = Encoding.BigEndianUnicode;
                break;

            case "Unicode":
                Encoding = Encoding.Unicode;
                break;

            case "ASCII":
                Encoding = Encoding.ASCII;
                break;

            case "UTF8":
                Encoding = Encoding.UTF8;
                break;

            case "UTF32":
                Encoding = Encoding.UTF32;
                break;

            default:
                Encoding = Encoding.Default;
                break;
            }

            try
            {
                IpRequestPORT = System.Convert.ToInt32(receiverPort);
            }
            catch (Exception)
            {
                IpRequestPORT = 161;
            }


            ErrorString = "";

            Auth  = new SHA1AuthenticationProvider(new OctetString(authPwd, Encoding));
            Priv  = new DESPrivacyProvider(new OctetString(privPwd, Encoding), Auth);
            UName = new OctetString(userName, Encoding);

            try
            {
                IpRequestSender = IPAddress.Parse(senderIp);
            }
            catch (Exception ex)
            {
                ErrorString = String.Format("{0}\r\n{1}", ErrorString, ex.ToString());
            }

            try
            {
                IpRequestManager = IPAddress.Parse(receiverIp);
            }
            catch (Exception ex)
            {
                ErrorString = String.Format("{0}\r\n{1}", ErrorString, ex.ToString());
            }

            switch (version)
            {
            case "V1":
                VersionCode = VersionCode.V1;
                break;

            case "V2":
                VersionCode = VersionCode.V2;
                break;

            case "V3":
                VersionCode = VersionCode.V3;
                break;
            }
        }
예제 #15
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);
        }
예제 #16
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);
        }
예제 #17
0
        public async Task <ISnmpMessage?> SetV3UsmAsync <T>(IPAddress ip, string oid, string community, int retries, int port, TimeSpan timeout,
                                                            string authPass, string privPass, T setValue)
        {
            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 (string.IsNullOrWhiteSpace(community))
            {
                throw new ArgumentNullException(nameof(community));
            }

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

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

            var          attempt  = 0;
            ISnmpMessage?response = null;

            while (attempt < retries)
            {
                var setValueByType = setValue switch
                {
                    int x => new Variable(new ObjectIdentifier(oid), new Integer32(x)),
                    string x => new Variable(new ObjectIdentifier(oid), new OctetString(x)),
                    IPAddress x => new Variable(new ObjectIdentifier(oid), new IP(x.ToString())),
                    uint x => new Variable(new ObjectIdentifier(oid), new Gauge32(x)),
                    byte[] x => new Variable(new ObjectIdentifier(oid), new OctetString(x)),
                    _ => throw new ArgumentOutOfRangeException(nameof(setValue)),
                };

                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>()
                    {
                        setValueByType
                    };

                    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 SetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(community), vList, priv, report);

                    using var cts = new CancellationTokenSource(timeout);
                    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}");
                        }
                    }

                    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, null, snmpType, snmpVersion, ex.GetType().ToString(), ex.Message).ConfigureAwait(false);

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

            if (response is null)
            {
                await _SnmpLog.LogTransactionAsync(startDate, ip.ToString(), oid, community, snmpType, snmpVersion, SnmpType.Null.ToString(), null).ConfigureAwait(false);

                return(response);
            }

            var type = response.Pdu().TypeCode;
            var data = response.Pdu().ErrorStatus;

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

            return(response);
        }
예제 #18
0
        public bool Set(RSU rsu, Core.Entities.User user, string OID, SnmpType type, string value)
        {
            IPEndPoint receiver = new IPEndPoint(rsu.IP, rsu.Port);
            int        timeout  = _managerSettings.Timeout;

            Discovery     discovery = Messenger.GetNextDiscovery(SnmpType.GetRequestPdu);
            ReportMessage report    = discovery.GetResponse(timeout, receiver);

            var auth = new SHA1AuthenticationProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Auth));
            var priv = new DESPrivacyProvider(new Lextm.SharpSnmpLib.OctetString(user.SNMPv3Priv), auth);

            ISnmpData data;

            try
            {
                data = ConvertStringValue2SnmpData(type, value);
            }
            catch (InvalidDataType invalidDataType) { throw invalidDataType; }
            catch (FormatException formatException) { throw formatException; }

            List <Variable> variables = new List <Variable>()
            {
                new Variable(new ObjectIdentifier(OID), data)
            };

            SetRequestMessage request = new SetRequestMessage(VersionCode.V3
                                                              , Messenger.NextMessageId
                                                              , Messenger.NextRequestId
                                                              , new OctetString(user.UserName)
                                                              , new OctetString(String.Empty)
                                                              , variables
                                                              , priv
                                                              , Messenger.MaxMessageSize
                                                              , report);

            ISnmpMessage reply = request.GetResponse(timeout, receiver);

            // Need to send again (RFC 3414)
            if (reply is ReportMessage)
            {
                //throw new ReplyIsReportMessage();
                request = new SetRequestMessage(VersionCode.V3
                                                , Messenger.NextMessageId
                                                , Messenger.NextRequestId
                                                , new OctetString(user.UserName)
                                                , new OctetString(String.Empty)
                                                , variables
                                                , priv
                                                , Messenger.MaxMessageSize
                                                , reply);

                reply = request.GetResponse(timeout, receiver);
                if (reply.Pdu().ErrorStatus.ToInt32() != 0)
                {
                    throw new InvalidDataType();
                }
            }
            else if (reply.Pdu().ErrorStatus.ToInt32() != 0)
            {
                throw new InvalidDataType();
            }

            return(true);
        }