digigrupp.com       Home  Downloads  Support  About  Contact  Search 

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

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

Application Demo

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

namespace DG
{
    public class Application
    {
        private static string Title = "Simple SNMP Command Line Query Tool, Toomas Kaljus, January 2007";
        private static string DefaultObjectID = "1.3.6.1.2.1.1"; // iso.org.dod.internet.mgmt.mib-2.system
        public static string TitleForMibs = "Simple SNMP Command Line Query Tool";
        public static string Url = "http://www.digigrupp.com/ssnmpq/";
        private static string RFCUrl = "http://www.ietf.org/rfc/rfc{n}.txt";
        private static int RFCFirstNumber = 1;
        private static int RFCLastNumber = 5000;
        private static int Timeout = 5;
        
        public static void ShowHelp()
        {
            System.Console.WriteLine(Title);
            System.Console.WriteLine();
            System.Console.WriteLine("Command Line Switches:");
            System.Console.WriteLine();
            System.Console.WriteLine(" /h:<Host> Host name or IP address (default is localhost)");
            System.Console.WriteLine(" /c:<Community> community name (default is public)");
            System.Console.WriteLine(" /o:<ObjectID> object ID (default is subkeys from " + DefaultObjectID + ")");
            System.Console.WriteLine(" /v[+|-] display values only (hide type and OID information)");
            System.Console.WriteLine(" /n[+|-] numeric form only (do not load any MIBs)");
            System.Console.WriteLine(" /s[+|-] surf subkeys");
            System.Console.WriteLine(" /w[+|-] load all Windows MIBs from ...\\system32\\*.mib");
            System.Console.WriteLine(" /r[+|-] load all RFC MIBs from ...\\mib\\*.mib (slow)");
            System.Console.WriteLine(" /m:<Path> Path to additional MIB-files (multiple allowed)");
            System.Console.WriteLine(" /d[+|-] download all missing RFCs and extract MIBs from them");
            System.Console.WriteLine(" /t:<Timeout> Socket timeout for SNMP queries (default is 5 seconds)");
            System.Console.WriteLine(" /x:<File> Export results to CSV file (requires /s)");
            System.Console.WriteLine();
        }

        public static int Main(string[] args)
        {
            string ApplicationPath = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath);
            string Host = "127.0.0.1";
            string Community = "public";
            string ObjectID = "";
            string ObjectName = null;
            string CustomMibs = "";
            string SaveCSV = "";
            bool ValuesOnly = false;
            bool DontLoadMibs = false;
            bool Subkeys = false;
            bool WinMibs = false;
            bool RfcMibs = false;
            bool Download = false;
            try {
                if (args.Length == 0) {
                    ShowHelp();
                    return 1;
                } else {
                    for (int i=0; i<args.Length; i++) {
                        if (args[i].StartsWith("/h:")) Host = args[i].Substring(3); else
                        if (args[i].StartsWith("/c:")) Community = args[i].Substring(3); else
                        if (args[i].StartsWith("/o:")) ObjectID = args[i].Substring(3); else
                        if (args[i].StartsWith("/m:")) CustomMibs += args[i].Substring(3) + "|"; else
                        if (args[i].StartsWith("/x:")) SaveCSV = args[i].Substring(3); else
                        if (args[i].StartsWith("/t:")) try {
                            Timeout = int.Parse(args[i].Substring(3));
                        } catch {
                            System.Console.Error.WriteLine("Invalid timeout value");
                            return 1;
                        } else
                        if (args[i].StartsWith("/v")) switch (args[i].Substring(2)) { case "+": ValuesOnly = true; break; case "-": ValuesOnly = false; break; case "": ValuesOnly = !ValuesOnly; break; } else
                        if (args[i].StartsWith("/n")) switch (args[i].Substring(2)) { case "+": DontLoadMibs = true; break; case "-": DontLoadMibs = false; break; case "": DontLoadMibs = !DontLoadMibs; break; } else
                        if (args[i].StartsWith("/s")) switch (args[i].Substring(2)) { case "+": Subkeys = true; break; case "-": Subkeys = false; break; case "": Subkeys = !Subkeys; break; } else
                        if (args[i].StartsWith("/w")) switch (args[i].Substring(2)) { case "+": WinMibs = true; break; case "-": WinMibs = false; break; case "": WinMibs = !WinMibs; break; } else
                        if (args[i].StartsWith("/r")) switch (args[i].Substring(2)) { case "+": RfcMibs = true; break; case "-": RfcMibs = false; break; case "": RfcMibs = !RfcMibs; break; } else
                        if (args[i].StartsWith("/d")) switch (args[i].Substring(2)) { case "+": Download = true; break; case "-": Download = false; break; case "": Download = !Download; break; } else
                        {
                            ShowHelp();
                            return 1;
                        }
                    }
                    if (!ValuesOnly) {
                        System.Console.WriteLine(Title);
                        System.Console.WriteLine();
                    }
                }
                if (ObjectID == "") {
                    ObjectID = DefaultObjectID;
                    Subkeys = true;
                }
                if (Download) {
                    Rfc2Mib Rfc2MibObject = new Rfc2Mib();
                    Rfc2MibObject.DownloadAndExtract(
                        ApplicationPath + "\\rfc",
                        ApplicationPath + "\\mib",
                        RFCUrl,
                        RFCFirstNumber,
                        RFCLastNumber,
                        false
                    );
                }

                MIB MibObject = new MIB();
                if (!DontLoadMibs) if (!ValuesOnly) {
                    bool MibsLoaded = false;
                    MibObject.LoadMibCache(ApplicationPath + "\\mibcache.txt");
                    if (RfcMibs) MibsLoaded = MibObject.Load(ApplicationPath + "\\mib") | MibsLoaded;
                    if (WinMibs) MibsLoaded = MibObject.Load(System.Environment.SystemDirectory) | MibsLoaded;
                    MibsLoaded = MibObject.Load(ApplicationPath) | MibsLoaded;
                    if (CustomMibs != "") {
                        string[] A = CustomMibs.Split('|');
                        for (int i=0; i<A.Length-1; i++) MibsLoaded = MibObject.Load(A[i]) | MibsLoaded;
                    }
                    if (MibsLoaded) MibObject.SaveMibCache(ApplicationPath + "\\mibcache.txt");
                }
                System.Console.Write(("").PadRight(79) + "\r");

                SNMPSocket Socket = new SNMPSocket();
                Socket.SocketTimeout = Timeout;
                SNMPPacket SNMP;

                string Response = "";
                string CurrentObjectID = ObjectID;
                if (Subkeys) {
                    System.IO.StreamWriter StreamWriter = null;
                    string Separator = "";
                    if (SaveCSV != "") {
                        StreamWriter = new System.IO.StreamWriter(SaveCSV);
                        Separator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator;
                        StreamWriter.WriteLine("OID" + Separator + "Path" + Separator + "Type" + Separator + "Value" + Separator + "ValuePath");
                    }
                    if (!ValuesOnly) {
                        if (!DontLoadMibs) ObjectName = MibObject.Oid2Name(ObjectID);
                        System.Console.WriteLine("Searching " + ObjectID + " ..." + ((ObjectName == null) ? "" : " (" + MibObject.Oid2Name(CurrentObjectID) + ")"));
                        System.Console.WriteLine();
                    }
                    while(true) {
                        string FirstObjectID = CurrentObjectID;
                        try {
                            try {
                                SNMP = new SNMPPacket();
                                SNMP.PacketType = SnmpType.GetNextRequestPDU;
                                SNMP.Community = Community;
                                SNMP.ObjectID = CurrentObjectID;
                                SNMP = Socket.Send(Host, SNMP);
                                Response = System.Convert.ToString(SNMP.Value);
                                CurrentObjectID = SNMP.ObjectID;
                            } catch {
                                throw new System.Exception("No response");
                            }
                            if (FirstObjectID == CurrentObjectID) break;
                            if (!CurrentObjectID.StartsWith(ObjectID)) break;
                            if (!ValuesOnly) {
                                if (!DontLoadMibs) ObjectName = MibObject.Oid2Name(CurrentObjectID);
                                System.Console.WriteLine("OID=" + CurrentObjectID);
                                if (ObjectName != null) System.Console.WriteLine(" Path=" + ObjectName);
                                string Type = SNMP.ValueType.ToString();
                                System.Console.WriteLine(" Type=" + Type);
                                System.Console.WriteLine(" Value='" + Response + "'");
                                string ValuePath = "";
                                if (!DontLoadMibs) if (Type == "ObjectIDentifier") {
                                    ValuePath = MibObject.Oid2Name(Response);
                                    System.Console.WriteLine(" ValuePath=" + ValuePath);
                                }
                                if (SaveCSV != "") StreamWriter.WriteLine(CurrentObjectID + Separator + ObjectName + Separator + Type + Separator + "\"" + Response + "\"" + Separator + ValuePath);
                            } else {
                                System.Console.WriteLine(Response);
                                if (SaveCSV != "") StreamWriter.WriteLine(CurrentObjectID + Separator + Response);
                            }
                        } catch {
                            if (!ValuesOnly) System.Console.WriteLine("OID=" + CurrentObjectID);
                            else System.Console.WriteLine(Response);
                            throw;
                        }
                    }
                    if (SaveCSV != "") StreamWriter.Close();
                } else {
                    try {
                        try {
                            SNMP = new SNMPPacket();
                            SNMP.PacketType = SnmpType.GetRequestPDU;
                            SNMP.Community = Community;
                            SNMP.ObjectID = CurrentObjectID;
                            SNMP = Socket.Send(Host, SNMP);
                            Response = System.Convert.ToString(SNMP.Value);
                            CurrentObjectID = SNMP.ObjectID;
                        } catch {
                            throw new System.Exception("No response");
                        }
                        if (!ValuesOnly) {
                            if (!DontLoadMibs) ObjectName = MibObject.Oid2Name(CurrentObjectID);
                            System.Console.WriteLine("OID=" + CurrentObjectID);
                            if (ObjectName != null) System.Console.WriteLine(" Path=" + ObjectName);
                            string Type = SNMP.ValueType.ToString();
                            System.Console.WriteLine(" Type=" + Type);
                            System.Console.WriteLine(" Value='" + Response + "'");
                            if (Type == "ObjectIDentifier") System.Console.WriteLine(" ValuePath=" + MibObject.Oid2Name(Response));
                        } else System.Console.WriteLine(Response);
                    } catch {
                        if (!ValuesOnly) System.Console.WriteLine("OID=" + CurrentObjectID);
                        else System.Console.WriteLine(Response);
                        throw;
                    }
                }
            } catch(System.Exception E) {
                System.Console.Error.WriteLine(E.Message);
                if (!ValuesOnly) System.Console.WriteLine();
                return 1;
            }
            if (!ValuesOnly) System.Console.WriteLine();
            return 0;
        }
    }
}