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