digigrupp.com       Home  Downloads  Support  About  Contact  Search 

Simple SNMP Query Tool - Open Source - C# (C-sharp)

Downloadmain.cssnmp.cssnmpsocket.csmib.csrfc2mib.cscompile.cmd  

MIB tree module

// Author: Toomas Kaljus
// http://www.digigrupp.com

namespace DG
{
    public class MIB
    {
        private System.Collections.SortedList MIBTree = new System.Collections.SortedList();

        // translate OID to full path of MIB names
        public string Oid2Name(string S)
        {
            string Result = "";
            string[] OID = S.Split('.');
            string CurrentKey = "root";
            bool EndOfPath = false;
            for (int i=0; i<OID.Length; i++) {
                if (!EndOfPath) {
                    System.Collections.SortedList SubTree = MIBTree[CurrentKey] as System.Collections.SortedList;
                    if (SubTree != null) {
                        CurrentKey = SubTree[OID[i].ToString()] as string;
                        if (CurrentKey == null) EndOfPath = true;
                    } else {
                        EndOfPath = true; // following numbers are left in numeric form as they are not found in current MIB base
                    }
                }
                if (EndOfPath) CurrentKey = OID[i].ToString();
                if (Result != "") Result += ".";
                Result += CurrentKey;
            }
            return Result;
        }

        // load mib-files
        public bool Load(string Path)
        {
            // initialize MIBTree root (this does not have to come from mib-file)
            System.Collections.SortedList RootTree = new System.Collections.SortedList();
            MIBTree["root"] = RootTree;
            RootTree["0"] = "ccitt";
            RootTree["1"] = "iso";
            RootTree["2"] = "joint-iso-ccitt";
            bool Result = false;
            string[] MibFiles = System.IO.Directory.GetFiles(Path, "*.mib");
            for (int f=0; f<MibFiles.Length; f++) {
                string Buffer;
                string FileCacheDate = MIBTree[System.IO.Path.GetFileName(MibFiles[f])] as string;
                if (FileCacheDate != System.IO.File.GetLastWriteTime(MibFiles[f]).ToString("yyyy-MM-dd HH:mm:ss")) {
                    using (System.IO.StreamReader StreamReader = new System.IO.StreamReader(MibFiles[f])) Buffer = StreamReader.ReadToEnd();

                    // remove comments
                    string[] CleanItUp = Buffer.Split('\n');
                    for (int l=0; l<CleanItUp.Length; l++) {
                        int ll = CleanItUp[l].IndexOf("--");
                        if (ll >= 0) CleanItUp[l] = CleanItUp[l].Substring(0, ll);
                    }
                    Buffer = string.Join("\n", CleanItUp);

                    System.Console.Write(("Loading " + System.IO.Path.GetFileName(MibFiles[f])).PadRight(79) + "\r");
                    int ObjectCount = 0;
                    ObjectCount += SearchFor(Buffer, "MODULE-IDENTITY");
                    ObjectCount += SearchFor(Buffer, "OBJECT IDENTIFIER");
                    ObjectCount += SearchFor(Buffer, "OBJECT-TYPE");

                    FileCacheDate = System.IO.File.GetLastWriteTime(MibFiles[f]).ToString("yyyy-MM-dd HH:mm:ss");
                    MIBTree[System.IO.Path.GetFileName(MibFiles[f])] = FileCacheDate;
                    Result = true;
                }
            }
            return Result;
        }

        // Load cached MIB base
        public void LoadMibCache(string Path)
        {
            if (System.IO.File.Exists(Path)) using (System.IO.StreamReader StreamReader = new System.IO.StreamReader(Path)) {
                string Name = "";
                System.Collections.SortedList SubTree = null;
                string Line;
                while ((Line = StreamReader.ReadLine()) != null) {
                    if (Line.StartsWith("@")) {
                        string[] Pair = Line.Substring(1).Split('=');
                        MIBTree[Pair[0]] = Pair[1];
                    } else {
                        if (Line.StartsWith(" ")) {
                            string[] Pair = Line.Substring(1).Split('=');
                            SubTree[Pair[0]] = Pair[1];
                        } else {
                            Name = Line;
                            SubTree = new System.Collections.SortedList();
                            MIBTree[Name] = SubTree;
                        }
                    }
                }
            }
        }

        // Cache MIB base
        public void SaveMibCache(string Path)
        {
            using (System.IO.StreamWriter StreamWriter = new System.IO.StreamWriter(Path)) {
                string[] Keys = new string[MIBTree.Count];
                MIBTree.Keys.CopyTo(Keys, 0);
                for (int i=0; i<Keys.Length; i++) {
                    if (MIBTree[Keys[i]] is System.Collections.SortedList) {
                        StreamWriter.WriteLine(Keys[i]);
                        System.Collections.SortedList SubTree = MIBTree[Keys[i]] as System.Collections.SortedList;
                        string[] SubKeys = new string[SubTree.Count];
                        SubTree.Keys.CopyTo(SubKeys, 0);
                        for (int j=0; j<SubKeys.Length; j++) {
                            StreamWriter.WriteLine(" " + SubKeys[j] + "=" + (SubTree[SubKeys[j]] as string));
                        }
                    } else {
                        StreamWriter.WriteLine("@" + Keys[i] + "=" + MIBTree[Keys[i]]);
                    }
                }
            }
        }

        // search for identifiers, extract their names and addresses, build MIBTree
        private int SearchFor(string S, string Identifier)
        {
            int Result = 0;
            string Name = "";
            string Adr = "";
            int i = S.IndexOf(Identifier);
            while (i > 0) {
                i--;
                for (int x=i; x>=0; x--) if ((x == 0) || (S[x - 1] != ' ') || (S[x - 1] <= '\r') || (S[x - 1] <= '\n')) {
                    for (int y=x; y>=0; y--) if ((y == 0) || ((S[y - 1] <= '@') && (S[y - 1] != '-') && ((S[y - 1] < '0') || (S[y - 1] > '9')))) try {
                        Name = S.Substring(y, x - y).Trim();
                        int j = S.IndexOf("::=", i + 2);
                        int k = S.IndexOf("{", j + 3);
                        int l = S.IndexOf("}", j + 3);
                        Adr = S.Substring(k + 1, l - k - 1).Trim().Replace("\t", " ");
                        while (Adr.IndexOf(" ") >= 0) Adr = Adr.Replace(" ", " ");
                        if (Name != "") if (Name != "SYNTAX") {
                            string[] A = Adr.Split(' ');
                            if (Adr.StartsWith("1.3.")) {
                                string[] AN = Oid2Name(Adr).Split('.');
                                string AA = "";
                                for (int an=0; an<AN.Length-1; an++) if (char.IsNumber(AN[an], 0)) AA += AN[an] + "(" + AN[an] + ") ";
                                AA += AN[AN.Length - 1];
                                A = AA.Split(' ');
                            }
                            string Parent = A[A.Length - 2].Split('(')[0].Trim();
                            string Value = A[A.Length - 1].Trim();
                            for (int a=0; a<A.Length-2; a++) {
                                string RootParent = A[a].Split(new char[] {'(', ')'})[0].Trim();
                                string[] A0 = A[a + 1].Split(new char[] {'(', ')'});
                                string RootName = A0[0].Trim();
                                string RootValue = A0[1].Trim();
                                System.Collections.SortedList ParentTree = MIBTree[RootParent] as System.Collections.SortedList;
                                if (ParentTree == null) {
                                    ParentTree = new System.Collections.SortedList();
                                    MIBTree[RootParent] = ParentTree;
                                }
                                if (RootValue.IndexOf("(") > 0) RootValue = RootValue.Split(new char[] {'(', ')'})[1].Trim();
                                ParentTree[RootValue] = RootName;
                            }
                            System.Collections.SortedList SubTree = MIBTree[Parent] as System.Collections.SortedList;
                            if (SubTree == null) {
                                SubTree = new System.Collections.SortedList();
                                MIBTree[Parent] = SubTree;
                            }
                            if (Value.IndexOf("(") > 0) Value = Value.Split(new char[] {'(', ')'})[1].Trim();
                            SubTree[Value] = Name;
                            Result++;
                        }
                        break;
                    } catch { }
                    break;
                }
                i = S.IndexOf(Identifier, i + 2);
            }
            return Result;
        }
    }
}