/// <summary> /// Retrieves (or tries to retrieve) the remote peer's MAC address. /// </summary> private bool RetrieveAllAvailableValues() { if (this.allValuesRetrieved) { return(true); } var valueToQuery = RetrievableValuesEnum.RxSignalStrengthApAppendMacAndInterfaceId; DeviceSpecificOid rxStrengthRootOid; if (!this.OidLookup.TryGetValue(valueToQuery, out rxStrengthRootOid)) { log.Warn($"Failed to obtain OID for '{valueToQuery}' ==> Cannot obtain any peer data for device '{this.DeviceAddress}'"); this.allValuesRetrieved = true; this.isApBacking = null; this.peerMacBacking = null; this.RxSignalStrengthBacking = double.NaN; return(true); } Vb rxSignalStrengthEntry = this.walkCollection.SingleOrDefault(v => rxStrengthRootOid.Oid.IsRootOf(v.Oid)); if (rxSignalStrengthEntry == null) { log.Warn($"Failed to obtain SNMP response entry for '{valueToQuery}' ==> Cannot obtain any peer data for device '{this.DeviceAddress}'"); this.allValuesRetrieved = true; this.isApBacking = null; this.peerMacBacking = null; this.RxSignalStrengthBacking = double.NaN; return(true); } var macOidFragments = rxSignalStrengthEntry.Oid.Skip(rxStrengthRootOid.Oid.Length).Take(6); this.peerMacBacking = macOidFragments.ToHexString(); this.RxSignalStrengthBacking = rxSignalStrengthEntry.Value.ToInt(); this.RecordCachableOid(CachableValueMeanings.WirelessRxSignalStrength, rxSignalStrengthEntry.Oid); valueToQuery = RetrievableValuesEnum.WlanRemoteMacAddressAppendInterfaceId; DeviceSpecificOid wlanRemoteMacAddressRootOid; if (!this.OidLookup.TryGetValue(valueToQuery, out wlanRemoteMacAddressRootOid)) { log.Warn($"Failed to obtain OID for '{valueToQuery}' ==> Cannot obtain IsAccessPoint for device '{this.DeviceAddress}'"); this.allValuesRetrieved = true; this.isApBacking = null; return(true); } Oid macPeerMacFieldOid = wlanRemoteMacAddressRootOid.Oid + rxSignalStrengthEntry.Oid.Last(); this.isApBacking = this.walkCollection.ContainsOid(macPeerMacFieldOid); this.allValuesRetrieved = true; return(true); }
private static Vb[] CreateNullVbs(Oid[] oids, Vb[] arrayToReuse) { if (arrayToReuse == null || arrayToReuse.Length != oids.Length) { arrayToReuse = new Vb[oids.Length]; } for (int i = 0; i < arrayToReuse.Length; i++) { arrayToReuse[i] = new Vb(oids[i]); } return(arrayToReuse); }
private static Vb[][] ExtractRows(Hashtable rows) { Oid[] keys = new Oid[rows.Count]; rows.Keys.CopyTo(keys, 0); Array.Sort(keys); Vb[][] vbRows = new Vb[keys.Length][]; for (int i = 0; i < vbRows.Length; i++) { vbRows[i] = (Vb[])rows[keys[i]]; } return(vbRows); }
public void Dispose() { Vb.Dispose(); Ib.Dispose(); if (Tex != null) { Tex.Dispose(); } if (Blen != null) { Blen.Dispose(); } //if (Rast != null) Rast.Dispose(); }
private static Vb[] CreateNullVbs(Oid[] columnOids, Oid startRowIndex) { Vb[] vbs = new Vb[columnOids.Length]; for (int i = 0; i < vbs.Length; i++) { Oid oid = columnOids[i]; if (startRowIndex != null) { oid = oid.Append(startRowIndex); } vbs[i] = new Vb(oid); } return(vbs); }
public static IList Walk(Snmp snmp, SnmpTarget target, Pdu pdu, IList list) { if (!(pdu.Type == PduType.GetNext || pdu.Type == PduType.GetBulk)) { throw new ArgumentException("Invalid Pdu type", "pdu"); } if (pdu.Count != 1) { throw new ArgumentException("Expected a single Vb", "pdu"); } try { Oid subtree = pdu[0].Oid; while (true) { pdu = snmp.Invoke(pdu, target); Vb lastVb = null; foreach (Vb vb in pdu) { Oid oid = vb.Oid; if (!oid.StartsWith(subtree) || vb.Value.SmiSyntax == SmiSyntax.EndOfMibView) { return(list); } lastVb = vb; list.Add(vb); } pdu = pdu.Clone(lastVb); } } catch (SnmpException e) { // SNMPv1 and NoSuchName? if (e.ErrorStatus != SnmpError.NoSuchName) { throw; } } return(list); }
private static void GotTrap(Snmp snmp, Pdu pdu, SnmpTarget target, object cbData) { if ((int)cbData != CB_DATA_) { Console.Error.WriteLine("*** Invalid callback data!"); } if (threadId_ == null) { threadId_ = Interlocked.Increment(ref nextId_); } // Use a lock if you want do not want messages from various threads // to be interleaved ManagerUtilities.PrintPdu(Console.Out, Now() + ": " + pdu.Type + " received from " + target, pdu, true, threadId_); Console.Out.WriteLine( "Enterprise: " + pdu.NotifyEnterprise + "\nNotify OID : " + pdu.NotifyId + "\nV1 generic-trap : " + pdu.V1GenericTrap + "\nV1 specific-trap: " + pdu.V1SpecificTrap + "\nTimestamp : " + pdu.NotifyTimestamp); if (pdu.Type == PduType.V1Trap) { Console.Out.WriteLine("v1TrapAddr: " + pdu.V1TrapAddress); } if (pdu.Type == PduType.Inform) { Vb vb = new Vb("1.3.6.1", new OctetStr("this is the response")); pdu = new Pdu(PduType.Response, vb); snmp.Invoke(pdu, target); ManagerUtilities.PrintPdu(Console.Out, "Response sent to " + target, pdu, true, threadId_); } // Long trap processing follows... Thread.Sleep(5000); }
private static void Walk(Snmp snmp, Pdu pdu, SnmpTarget target, bool asyncSync, bool show, bool debug, ref int ncalls) { Console.WriteLine("Rentre dans le Walk"); string thName = Thread.CurrentThread.Name; Oid rootOid = pdu[0].Oid; while (true) { if (debug) { PrintPdu(Console.Out, "Sending PDU to target " + target, pdu, debug); } Pdu resp = Invoke(snmp, pdu, target, asyncSync); ncalls++; Vb nextVb = resp[0]; Oid nextOid = nextVb.Oid; if (!nextOid.StartsWith(rootOid)) { break; } if (debug) { PrintPdu(Console.Out, "Received PDU:", resp, debug); } else if (show) { SnmpSyntax val = nextVb.Value; SmiSyntax type = val != null ? val.SmiSyntax : SmiSyntax.Null; Console.WriteLine("[{0}]: {1},{2},{3}", thName, nextOid, val, type); } pdu = pdu.Clone(new Vb(nextOid)); } }
/// <summary> /// 设置snmp vb的值 /// </summary> /// <param name="vb"></param> /// <param name="syntaxType"></param> /// <param name="value"></param> /// <returns></returns> public int SetVbValue(ref Vb vb, SNMP_SYNTAX_TYPE syntaxType, string value) { if (vb == null) { return(-1); } try { switch (syntaxType) { case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_INT: vb.Value = new Integer32(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_BITS: case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_OCTETS: if (value == null) { vb.Value = new OctetString("null"); } else { vb.Value = new OctetString(value); } break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_NULL: break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_OID: // TODO: vb.Value = new Oid(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_IPADDR: vb.Value = new IpAddress(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_CNTR32: vb.Value = new UInteger32(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_GAUGE32: vb.Value = new UInteger32(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_TIMETICKS: vb.Value = new TimeTicks(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_OPAQUE: vb.Value = new Opaque(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_CNTR64: // TODO vb.Value = new Counter64(value); break; case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_NOSUCHOBJECT: case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_NOSUCHINSTANCE: case SNMP_SYNTAX_TYPE.SNMP_SYNTAX_ENDOFMIBVIEW: // do nothing break; default: // do nothing break; } } catch (Exception e) { Log.Error(e.Message.ToString()); throw e; } return(0); }
/// <summary> /// 将LmtPdu转换为snmpPdu /// </summary> /// <param name="pdu"></param> /// <param name="lmtPdu"></param> /// <param name="strRemoteIp"></param> /// <returns></returns> private bool LmtPdu2SnmpPdu(out Pdu pdu, CDTLmtbPdu lmtPdu, string strRemoteIp) { pdu = new Pdu(); string strMibPreFix = ""; string strOid; string strTmpOid; string strValue; SNMP_SYNTAX_TYPE strSyntaxType; int lmtVbCount = lmtPdu.VbCount(); for (int i = 0; i < lmtVbCount; i++) { CDTLmtbVb cDTLmtbVb = lmtPdu.GetVbByIndexEx(i); strTmpOid = cDTLmtbVb.get_Oid(); strSyntaxType = cDTLmtbVb.get_Syntax(); strValue = cDTLmtbVb.get_Value(); if (SNMP_SYNTAX_TYPE.SNMP_SYNTAX_OCTETS == strSyntaxType) { /*对于像inetipAddress和DateandTime需要做一下特殊处理,把内存值转换为显示文本*/ // CString strNodeType = GetNodeTypeByOIDInCache(csIpAddr, strOID, strMIBPrefix); string strNodeType = ""; if ("DateandTime".Equals(strNodeType)) { // TODO // strValue = strValue; } else if ("inetaddress".Equals(strNodeType)) { } else if ("MacAddress".Equals(strNodeType)) { } else if ("Unsigned32Array".Equals(strNodeType)) { } else if ("Integer32Array".Equals(strNodeType) || "".Equals(strNodeType)) { } else if ("MncMccType".Equals(strNodeType)) { } } // TODO Vb vb = new Vb(new Oid(strTmpOid)); SetVbValue(ref vb, strSyntaxType, strValue); pdu.VbList.Add(vb); } // end for return(true); }
private void ResponseCallback(IAsyncResult ar) { if (ar.AsyncState != this) { throw new ArgumentException( "Fatal: invalid data passed to callback"); } using (MemoryManager.GetMemoryManager()) { Pdu pdu; try { pdu = snmp_.EndInvoke(ar); } catch (Exception e) { Console.Error.WriteLine(e); barrier_.Enter(); return; } bool show = (nRepd_ % 1000) == 0; if (show || debug_) { ManagerUtilities.PrintPdu(Console.Out, "Callback PDU:", pdu, true, id_.ToString()); } Pdu nextPdu = pdu_; if (operType_ == OperType.Walk) { Vb nextVb = pdu[0]; Oid nextOid = nextVb.Oid; Oid rootOid = pdu_[0].Oid; if (nextOid.StartsWith(rootOid)) { if (show) { SnmpSyntax val = nextVb.Value; SmiSyntax type = val != null ? val.SmiSyntax : SmiSyntax.Null; Console.WriteLine("[{0}]: {1},{2},{3}", id_, nextOid, val, type); } nRepd_--; nextPdu = pdu_.Clone(new Vb(nextOid)); } } nCalls_++; nRepd_++; if (nRepd_ < nRepeats_) { AsyncDoSnmp(snmp_, target_, nextPdu, new AsyncCallback(ResponseCallback), this); } else { barrier_.Enter(); } } }
//テーブルデータの取得 private void getForTable(Vb data, ref int flg) { int index = 0; List <string> recordList = new List <string>(); //mib-2 if (data.Oid.ToString().IndexOf("1.3.6.1.2.1.") >= 0) { //ifindexか判定 if (data.Oid.ToString().IndexOf("1.3.6.1.2.1.2.2.1.1.") >= 0) { string str = ""; str = data.Oid.ToString(); index = data.Oid.ToString().LastIndexOf("."); //ヘッダなので1回目のみ実行 if (flg == 0) { //ヘッダのリストに取得 string ss = ""; ss = Class_headerConv.headerConvert(str.Substring(0, index + 1)); _headerList.Add(ss); flg = 1; } //ifindexを多次元リストに格納 recordList = new List <string>(new string[22]); //recordList = new List<string>(); List <string> tmpAry = recordList.CloneDeep(); tmpAry[0] = str.Substring(index + 1); tablearray.Add(str.Substring(index + 1), tmpAry); } //ifEntry else if (data.Oid.ToString().IndexOf("1.3.6.1.2.1.2.2.1.") >= 0) { string str = ""; str = data.Oid.ToString(); index = data.Oid.ToString().LastIndexOf("."); if (str.EndsWith("." + "1")) { //ヘッダのリストに取得 string ss = ""; ss = Class_headerConv.headerConvert(str.Substring(0, index + 1)); _headerList.Add(ss); } //値をリストに格納 string valdata = (data.Value.ToString() == null) ? "" : data.Value.ToString(); //日本語を変換 if (0 <= data.Oid.ToString().IndexOf("1.3.6.1.2.1.2.2.1.2.") | 0 <= data.Oid.ToString().IndexOf("1.3.6.1.2.1.25.3.2.1.3.")) { valdata = convertJP(valdata); } else if (0 <= data.Oid.ToString().IndexOf("1.3.6.1.2.1.2.2.1.3.")) { valdata = Util.ifTypeConv(valdata); } else if (0 <= data.Oid.ToString().IndexOf("1.3.6.1.2.1.2.2.1.7.") | 0 <= data.Oid.ToString().IndexOf("1.3.6.1.2.1.2.2.1.8.")) { valdata = Util.convIfStatus(valdata); } //テーブルの指定された項目にデータを挿入 //インデックス(横)の取得 int idx = Util.getTableYokoIndex(data.Oid.ToString()); ((List <string>)tablearray[str.Substring(index + 1)])[idx] = valdata; } } }
public static void Main(string[] args) { if (args.Length < 2) { Console.Error.WriteLine( "SNMP++.NET {0} built on {1}; SNMP++ v. {2}\n\n" + "Usage: {3} <ip> <readCommunity> [<debugMark>]", Assembly.GetAssembly(typeof(Snmp)), Snmp.BuildTime, Snmp.Snmp_ppVersion, Environment.GetCommandLineArgs()[0]); Environment.Exit(1); } string ip = args[0], community = args[1]; bool debug = args.Length > 2 && args[2].Length > 0; try { SnmpTarget.DefaultTimeout = 10000; SnmpTarget.DefaultRetries = 2; using (Snmp snmp = new Snmp(false)) { UdpAddress udp = new UdpAddress(ip); SnmpVersion ver = SnmpVersion.SNMPv1; CTarget target = new CTarget(udp, ver, community, community); Oid systemOid = (Oid)SYSOID2NAME_["system"]; Vb vb = new Vb(systemOid); Pdu pdu = new Pdu(PduType.GetNext, vb); while (true) { if (debug) { Console.WriteLine("Sending : " + pdu + " to " + target); } Pdu resp = snmp.Invoke(pdu, target); if (debug) { Console.WriteLine("Received: " + resp); } vb = resp[0]; Oid oid = vb.Oid; if (!oid.StartsWith(systemOid)) { break; } SnmpSyntax val = vb.Value; Console.WriteLine("{0}({1}): {2} ({3})", oid, SYSOID2NAME_[oid], val, val.SmiSyntax); pdu = pdu.Clone(vb); } } } catch (SnmpException e) { Console.WriteLine("SnmpException:" + "\nstatus : " + e.ErrorStatus + "\nindex : " + e.ErrorIndex + "\nmessage: " + e.Message); } catch (Exception e) { Console.WriteLine(e); } }
public GetSetEventArgs(Vb value, IPEndPoint inEndPoint) { this.value = value; this.inEndPoint = inEndPoint; }
/// <summary> /// 下发添加命令 /// </summary> /// <param name="peerAddresss"></param> /// <param name="nIndex"></param> /// <returns></returns> public bool AddTraceTask(string peerAddresss, int nIndex) { SnmpAgentInfo snmpAgent = GetSnmpAgent(peerAddresss, 2, 2000); string index = string.Format(".{0}", nIndex); int count = ListAddTrace.Count; Vb[] vbs = new Vb[count]; int curNum = 0; TraceItem inter = new TraceItem(); foreach (TraceItem item in ListAddTrace) { if ("跟踪任务类型" == item.DisplayName) { inter = item; } if ("跟踪管理对象OID" == item.DisplayName) { if (null != inter) { if ("" == item.Value) { item.Value = "0"; } string curValue = CommonOid + SpcialDeal(inter.Value) + item.Value; vbs[curNum] = new Vb(new Oid(CommonOid + item.Oid + index), new Oid(curValue)); } else { } } else { if ("行状态" == item.DisplayName) { vbs[curNum] = new Vb(new Oid(CommonOid + item.Oid + index), new Integer32(4)); } else { vbs[curNum] = new Vb(new Oid(CommonOid + item.Oid + index), item.GetValue()); } } curNum++; } IEnumerator <Vb> getRes = null; try { getRes = SnmpSessionHelper.Instance.Set(snmpAgent, vbs); return(true); } catch (SnmpErrorStatusException snmpex) { log.Error(string.Format("启动网元{0}的删除命令失败!, 原因为:{1}", snmpAgent.PeerAddress, snmpex.Message)); } catch (System.Exception ex) { log.Error(string.Format("启动网元{0}的删除命令失败!, 原因为:{1}", snmpAgent.PeerAddress, ex.Message)); } return(false); }
// Processes the next response to GET NEXT/GET BULK request. Map 'rows' // contains already received rows (possibly only partially filled with // variable bindings). The method returns new OIDs which are to be used // in the subsequent requests. If this is the last response, this array // will be empty. Note that 'columnOids' is also modified and nulls are // set for columns that have been finished. private static Oid[] ProcessResponse( Oid[] columnOids, Vb[] vbs, Oid endRowIndex, Hashtable rows) { int nNonNulls = GetNonNullCount(columnOids); Oid[] oids = new Oid[columnOids.Length]; Oid rowIndex = null; Vb[] row = null; for (int i = 0, o = 0; i < vbs.Length && nNonNulls > 0; i++, o = ++o % columnOids.Length) { while (columnOids[o] == null) { o = ++o % columnOids.Length; } Oid columnOid = columnOids[o]; Vb vb = vbs[i]; Oid oid = vb.Oid; SnmpSyntax val = vb.Value; // Check whether this Vb should be included in the results // and whether this column has been finished. 'val' should // never be NULL but some faulty agents send NULLs. bool endOfColumn = !oid.StartsWith(columnOid) || (val != null && val.SmiSyntax == SmiSyntax.EndOfMibView); bool includeVb = !endOfColumn; Oid rowIdx = null; if (!endOfColumn) { rowIdx = oid.TrimLeft(columnOid.Length); if (endRowIndex != null) { int res = rowIdx.CompareTo(endRowIndex); endOfColumn = res >= 0; includeVb = res <= 0; } } // if a valid value has been returned, store it in the hash // table and store its OID for a subsequent request if (includeVb) { oids[o] = oid; if (rowIndex == null || !rowIdx.Equals(rowIndex)) { rowIndex = rowIdx; row = (Vb[])rows[rowIndex]; if (row == null) { row = new Vb[columnOids.Length]; rows.Add(rowIndex, row); } } row[o] = vb; } // if the column has been finished, remove it from further // processing if (endOfColumn) { if (val != null && val.SmiSyntax == SmiSyntax.EndOfMibView) { columnOids[o] = null; nNonNulls--; } oids[o] = null; } } // set finished columns of 'columnOids' to null // and remove nulls from 'oids' int noids = 0; for (int i = 0; i < oids.Length; i++) { if (oids[i] == null) { columnOids[i] = null; } else { oids[noids++] = oids[i]; } } // shrink 'oids', if necessary if (noids < oids.Length) { Oid[] o = new Oid[noids]; Array.Copy(oids, 0, o, 0, noids); oids = o; } return(oids); }
/// <summary> /// Faz o logging do resultado de um SNMPRequest /// </summary> internal void Log(Vb item) { this.Log(item.Value.ToString(), LogType.RESPONSE); }
/// <summary> /// Process a received SNMP SetRequest /// </summary> /// <param name="Ooid"></param> /// <param name="valuePair"></param> public void ProcessSetRequest(Oid Ooid, Vb valuePair) { switch (Ooid.ToString()) { case "1.3.2.5.1": Debug.Log("SysUp set request -- error read only"); break; case "1.3.2.5.2": Debug.Log("location set request -- error read only"); break; case "1.3.2.5.3": metalGear.moveToX = int.Parse(valuePair.Value.ToString()); Debug.Log("moveX set request"); break; case "1.3.2.5.4": metalGear.moveToY = int.Parse(valuePair.Value.ToString()); Debug.Log("moveY set request"); break; case "1.3.2.5.5": metalGear.lookAt = (uint)int.Parse(valuePair.Value.ToString()); Debug.Log("LookAt set request"); break; /*case "1.3.2.5.6": * Debug.Log("weapontable request"); * break; */ case "1.3.2.5.7": Debug.Log("nukeState set request --read only"); break; case "1.3.2.5.8": Debug.Log("nukeLaunch set request --read only"); break; case "1.3.2.5.9": Debug.Log("radarTable request"); break; case "1.3.2.5.10": Debug.Log("radarState set request --read only"); break; case "1.3.2.5.11": Debug.Log("cameraTable request"); break; case "1.3.2.5.12": metalGear.selectedCamera = (uint)int.Parse(valuePair.Value.ToString()); Debug.Log("selectedCamera request"); break; case "1.3.2.5.13": Debug.Log("bodyTable request"); break; case "1.3.2.5.14": metalGear.selectedTarget = int.Parse(valuePair.Value.ToString()); Debug.Log("selectedTarget set request"); break; case "1.3.2.5.15": metalGear.selectdGun = int.Parse(valuePair.Value.ToString()); Debug.Log("selectedGun set request"); break; case "1.3.2.5.16": metalGear.attacking = int.Parse(valuePair.Value.ToString()); Debug.Log("attacking request"); break; case "1.3.2.5.17": Debug.Log("under attacking set request error - read only"); break; default: Debug.Log("Wroing OID"); responsePacket.Pdu.ErrorStatus = 1; // no error break; } }