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

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