private static bool BulkHasNext( VersionCode version, IPEndPoint receiver, OctetString community, Variable seed, int timeout, int maxRepetitions, out IList <Variable> next, IPrivacyProvider privacy, ref ISnmpMessage report) { if (version == VersionCode.V1) { throw new ArgumentException("v1 is not supported", "version"); } var variables = new List <Variable> { new Variable(seed.Id) }; var request = version == VersionCode.V3 ? new GetBulkRequestMessage(version, MessageCounter.NextId, RequestCounter.NextId, community, 0, maxRepetitions, variables, privacy, MaxMessageSize, report) : new GetBulkRequestMessage(RequestCounter.NextId, version, community, 0, maxRepetitions, variables); var reply = request.GetResponse(timeout, receiver); if (reply is ReportMessage) { if (reply.Pdu().Variables.Count == 0) { // TODO: whether it is good to return? next = new List <Variable> (0); return(false); } var id = reply.Pdu().Variables[0].Id; if (id != IdNotInTimeWindow) { // var error = id.GetErrorMessage(); // TODO: whether it is good to return? next = new List <Variable> (0); return(false); } // according to RFC 3414, send a second request to sync time. request = new GetBulkRequestMessage(version, MessageCounter.NextId, RequestCounter.NextId, community, 0, maxRepetitions, variables, privacy, MaxMessageSize, reply); reply = request.GetResponse(timeout, receiver); } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw ErrorException.Create("error in response", receiver.Address, reply); } next = reply.Pdu().Variables; report = request; return(next.Count != 0); }
private static bool BulkHasNext(VersionCode version, IPEndPoint endpoint, OctetString community, Variable seed, int timeout, int maxRepetitions, out IList <Variable> next, IPrivacyProvider privacy, ref ISnmpMessage report) { if (version == VersionCode.V1) { throw new ArgumentException("v1 is not supported", "version"); } List <Variable> variables = new List <Variable> { new Variable(seed.Id) }; var requestId = RequestCounter.NextId; GetBulkRequestMessage message = version == VersionCode.V3 ? new GetBulkRequestMessage( version, MessageCounter.NextId, requestId, community, 0, maxRepetitions, variables, privacy, MaxMessageSize, report) : new GetBulkRequestMessage( requestId, version, community, 0, maxRepetitions, variables); ISnmpMessage response = message.GetResponse(timeout, endpoint); var pdu = response.Pdu(); if (pdu.ErrorStatus.ToInt32() != 0) { throw Error.Create( "error in response", endpoint.Address, response); } next = pdu.Variables; report = message; return(next.Count != 0); }
//---------------------------------------------------------------------------- //SNMPGETBULK public void SnmpGetBulk(string oidKey) { GetBulkRequestMessage message = new GetBulkRequestMessage(0, VersionCode.V2, community, 0, 10, new List<Variable> { new Variable(new ObjectIdentifier(oidKey)) }); ISnmpMessage response = message.GetResponse(6000, server); if (response.Pdu().ErrorStatus.ToInt32() != 0) { throw ErrorException.Create( "Error in response", server.Address, response); } var result = response.Pdu().Variables; variableList = result.ToList(); }
public void SnmpGetBulk(string community, string ipAddress, string oidKey) { GetBulkRequestMessage message = new GetBulkRequestMessage(0, VersionCode.V2, new OctetString(community), 0, 10, new List<Variable> { new Variable(new ObjectIdentifier(oidKey)) }); ISnmpMessage response = message.GetResponse(6000, new IPEndPoint(IPAddress.Parse(ipAddress), 161)); if (response.Pdu().ErrorStatus.ToInt32() != 0) { throw ErrorException.Create( "Error in response!", IPAddress.Parse(ipAddress), response); } var result = response.Pdu().Variables; variableList = result.ToList(); }
private static bool BulkHasNext(VersionCode version, IPEndPoint receiver, OctetString community, Variable seed, int timeout, int maxRepetitions, out IList<Variable> next, IPrivacyProvider privacy, ref ISnmpMessage report) { if (version == VersionCode.V1) { throw new ArgumentException("v1 is not supported", "version"); } var variables = new List<Variable> { new Variable(seed.Id) }; var request = version == VersionCode.V3 ? new GetBulkRequestMessage( version, MessageCounter.NextId, RequestCounter.NextId, community, 0, maxRepetitions, variables, privacy, MaxMessageSize, report) : new GetBulkRequestMessage( RequestCounter.NextId, version, community, 0, maxRepetitions, variables); var reply = request.GetResponse(timeout, receiver); if (reply is ReportMessage) { if (reply.Pdu().Variables.Count == 0) { // TODO: whether it is good to return? next = new List<Variable>(0); return false; } var id = reply.Pdu().Variables[0].Id; if (id != IdNotInTimeWindow) { // var error = id.GetErrorMessage(); // TODO: whether it is good to return? next = new List<Variable>(0); return false; } // according to RFC 3414, send a second request to sync time. request = new GetBulkRequestMessage( version, MessageCounter.NextId, RequestCounter.NextId, community, 0, maxRepetitions, variables, privacy, MaxMessageSize, reply); reply = request.GetResponse(timeout, receiver); } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) { throw ErrorException.Create( "error in response", receiver.Address, reply); } next = reply.Pdu().Variables; report = request; return next.Count != 0; }
public static void Main(string[] args) { string community = "public"; bool showHelp = false; bool showVersion = false; VersionCode version = VersionCode.V2; // GET BULK is available in SNMP v2 and above. int timeout = 1000; int retry = 0; Levels level = Levels.Reportable; string user = string.Empty; string contextName = string.Empty; string authentication = string.Empty; string authPhrase = string.Empty; string privacy = string.Empty; string privPhrase = string.Empty; int maxRepetitions = 10; int nonRepeaters = 0; bool dump = false; OptionSet p = new OptionSet() .Add("c:", "Community name, (default is public)", delegate (string v) { if (v != null) community = v; }) .Add("l:", "Security level, (default is noAuthNoPriv)", delegate(string v) { if (v.ToUpperInvariant() == "NOAUTHNOPRIV") { level = Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHNOPRIV") { level = Levels.Authentication | Levels.Reportable; } else if (v.ToUpperInvariant() == "AUTHPRIV") { level = Levels.Authentication | Levels.Privacy | Levels.Reportable; } else { throw new ArgumentException("no such security mode: " + v); } }) .Add("Cn:", "Non-repeaters (default is 0)", delegate(string v) { nonRepeaters = int.Parse(v); }) .Add("Cr:", "Max-repetitions (default is 10)", delegate(string v) { maxRepetitions = int.Parse(v); }) .Add("a:", "Authentication method (MD5 or SHA)", delegate(string v) { authentication = v; }) .Add("A:", "Authentication passphrase", delegate(string v) { authPhrase = v; }) .Add("x:", "Privacy method", delegate(string v) { privacy = v; }) .Add("X:", "Privacy passphrase", delegate(string v) { privPhrase = v; }) .Add("u:", "Security name", delegate(string v) { user = v; }) .Add("n:", "Context name", delegate(string v) { contextName = v; }) .Add("h|?|help", "Print this help information.", delegate(string v) { showHelp = v != null; }) .Add("V", "Display version number of this application.", delegate (string v) { showVersion = v != null; }) .Add("d", "Display message dump", delegate(string v) { dump = true; }) .Add("t:", "Timeout value (unit is second).", delegate (string v) { timeout = int.Parse(v) * 1000; }) .Add("r:", "Retry count (default is 0)", delegate (string v) { retry = int.Parse(v); }) .Add("v:", "SNMP version (2 and 3 are currently supported)", delegate (string v) { switch (int.Parse(v)) { case 2: version = VersionCode.V2; break; case 3: version = VersionCode.V3; break; default: throw new ArgumentException("no such version: " + v); } }); if (args.Length == 0) { ShowHelp(p); return; } List<string> extra; try { extra = p.Parse(args); } catch(OptionException ex) { Console.WriteLine(ex.Message); return; } if (showHelp) { ShowHelp(p); return; } if (extra.Count < 2) { Console.WriteLine("invalid variable number: " + extra.Count); return; } if (showVersion) { Console.WriteLine(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version); return; } IPAddress ip; bool parsed = IPAddress.TryParse(extra[0], out ip); if (!parsed) { foreach (IPAddress address in Dns.GetHostAddresses(extra[0]).Where(address => address.AddressFamily == AddressFamily.InterNetwork)) { ip = address; break; } if (ip == null) { Console.WriteLine("invalid host or wrong IP address found: " + extra[0]); return; } } try { List<Variable> vList = new List<Variable>(); for (int i = 1; i < extra.Count; i++) { Variable test = new Variable(new ObjectIdentifier(extra[i])); vList.Add(test); } IPEndPoint receiver = new IPEndPoint(ip, 161); if (version != VersionCode.V3) { GetBulkRequestMessage message = new GetBulkRequestMessage(0, version, new OctetString(community), nonRepeaters, maxRepetitions, vList); ISnmpMessage response = message.GetResponse(timeout, receiver); if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, response); } foreach (Variable variable in response.Pdu().Variables) { Console.WriteLine(variable); } return; } if (string.IsNullOrEmpty(user)) { Console.WriteLine("User name need to be specified for v3."); return; } IAuthenticationProvider auth = (level & Levels.Authentication) == Levels.Authentication ? GetAuthenticationProviderByName(authentication, authPhrase) : DefaultAuthenticationProvider.Instance; IPrivacyProvider priv; if ((level & Levels.Privacy) == Levels.Privacy) { priv = new DESPrivacyProvider(new OctetString(privPhrase), auth); } else { priv = new DefaultPrivacyProvider(auth); } Discovery discovery = Messenger.GetNextDiscovery(SnmpType.GetBulkRequestPdu); ReportMessage report = discovery.GetResponse(timeout, receiver); GetBulkRequestMessage request = string.IsNullOrEmpty(contextName) ? new GetBulkRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), nonRepeaters, maxRepetitions, vList, priv, Messenger.MaxMessageSize, report) : new GetBulkRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), new OctetString(contextName), nonRepeaters, maxRepetitions, vList, priv, Messenger.MaxMessageSize, report); ISnmpMessage reply = request.GetResponse(timeout, receiver); if (dump) { Console.WriteLine("Request message bytes:"); Console.WriteLine(ByteTool.Convert(request.ToBytes())); Console.WriteLine("Response message bytes:"); Console.WriteLine(ByteTool.Convert(reply.ToBytes())); } if (reply is ReportMessage) { if (reply.Pdu().Variables.Count == 0) { Console.WriteLine("wrong report message received"); return; } var id = reply.Pdu().Variables[0].Id; if (id != Messenger.NotInTimeWindow) { var error = id.GetErrorMessage(); Console.WriteLine(error); return; } // according to RFC 3414, send a second request to sync time. request = string.IsNullOrEmpty(contextName) ? new GetBulkRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), nonRepeaters, maxRepetitions, vList, priv, Messenger.MaxMessageSize, reply) : new GetBulkRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), new OctetString(contextName), nonRepeaters, maxRepetitions, vList, priv, Messenger.MaxMessageSize, reply); reply = request.GetResponse(timeout, receiver); } else if (reply.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError { throw ErrorException.Create( "error in response", receiver.Address, reply); } foreach (Variable v in reply.Pdu().Variables) { Console.WriteLine(v); } } catch (SnmpException ex) { Console.WriteLine(ex); } catch (SocketException ex) { Console.WriteLine(ex); } }
private IEnumerable<SnmpResult> GetBulkOperation(SnmpVersion version, IPAddress ipAddress, int maxBulkRepetiotions, string octetString, Oid oid) { _log.Info("SnmpEngine.GetNextOperation() : Started oid: " + oid.Value); List<SnmpResult> results; var variable = new List<Variable> { new Variable(new ObjectIdentifier(oid.Value)) }; try { var getNextRequest = new GetBulkRequestMessage(0, _converter.ToVersionCodeConverter(version), new OctetString(octetString), 0, maxBulkRepetiotions, variable); var responce = getNextRequest.GetResponse(SnmpHelper.DefaultTimeOut, new IPEndPoint(ipAddress, SnmpHelper.SnmpServerPort)); if (responce.Pdu().ErrorStatus.ToInt32() != 0) { throw new SnmpEngineException("SnmpEngine.GetNextOperation() error status = 0; oid = " + oid.Value); } results = responce.Pdu().Variables.Select(var => new SnmpResult(new Oid(var.Id.ToString()), var.Data, _converter.ToSnmpDataType(var.Data.TypeCode))).ToList(); } catch (Exception e) { if (e is TimeoutException) { _log.Error("SnmpEngine.GetOperation():Timeout Exception caught:", e); throw new SnmpTimeOutException(e.Message, _timeOut); } else if (e is ArgumentOutOfRangeException) { _log.Error("SnmpEngine.GetOperation():Argument Out Of Range Exception caught:", e); throw new SnmpEngineConvertorException((ArgumentOutOfRangeException)e); } else { _log.Error("SnmpEngine.GetOperation():Exception caught:", e); throw new SnmpEngineException(e.Message); } } finally { _log.Info("SnmpEngine.GetNextOperation(): Finished"); } return results; }
private void SNMP_GET_BULK() { string adres = addressBox.Text; GetBulkRequestMessage message = new GetBulkRequestMessage(0, VersionCode.V2, new OctetString("public"), 0, 10, new List<Variable> { new Variable(new ObjectIdentifier(adres)) }); ISnmpMessage response = message.GetResponse(60000, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 161)); if (response.Pdu().ErrorStatus.ToInt32() != 0) { throw new Exception(); } var result = response.Pdu().Variables; foreach (var v in result) { consoleBox.Items.Add(v.ToString()); } }