異世界


2013年4月21日 星期日

C# Based Open Source SNMP for .NET and Mono

資料來源 :

 CodePlexProject Hosting for Open Source Software

lextm / sharpsnmplib : https://github.com/lextm/sharpsnmplib

 

 

C# Based Open Source SNMP for .NET and Mono

snmpget  範例:

   1: // typical usage
   2: // snmpget -c=public -v=1 localhost 1.3.6.1.2.1.1.1.0
   3: // snmpget -v=3 -l=authPriv -a=MD5 -A=authentication -x=DES -X=privacy -u=user localhost 1.3.6.1.2.1.1.1.0
   4: using System;
   5: using System.Collections.Generic;
   6: using System.Linq;
   7: using System.Net;
   8: using System.Net.Sockets;
   9: using Lextm.SharpSnmpLib;
  10: using Lextm.SharpSnmpLib.Security;
  11: using Lextm.SharpSnmpLib.Messaging;
  12: using Mono.Options;
  13:  
  14: namespace SnmpGet
  15: {
  16:     internal static class Program
  17:     {
  18:         public static void Main(string[] args)
  19:         {
  20:             string community = "public";
  21:             bool showHelp   = false;
  22:             bool showVersion = false;
  23:             VersionCode version = VersionCode.V1;
  24:             int timeout = 1000;
  25:             int retry = 0;
  26:             Levels level = Levels.Reportable;
  27:             string user = string.Empty;
  28:             string authentication = string.Empty;
  29:             string authPhrase = string.Empty;
  30:             string privacy = string.Empty;
  31:             string privPhrase = string.Empty;
  32:             bool dump = false;
  33:  
  34:             OptionSet p = new OptionSet()
  35:                 .Add("c:", "Community name, (default is public)", delegate (string v) { if (v != null) community = v; })
  36:                 .Add("l:", "Security level, (default is noAuthNoPriv)", delegate (string v)
  37:                                                                                    {
  38:                                                                                        if (v.ToUpperInvariant() == "NOAUTHNOPRIV")
  39:                                                                                        {
  40:                                                                                            level = Levels.Reportable;
  41:                                                                                        }
  42:                                                                                        else if (v.ToUpperInvariant() == "AUTHNOPRIV")
  43:                                                                                        {
  44:                                                                                            level = Levels.Authentication | Levels.Reportable;
  45:                                                                                        }
  46:                                                                                        else if (v.ToUpperInvariant() == "AUTHPRIV")
  47:                                                                                        {
  48:                                                                                            level = Levels.Authentication | Levels.Privacy | Levels.Reportable;
  49:                                                                                        }
  50:                                                                                        else
  51:                                                                                        {
  52:                                                                                            throw new ArgumentException("no such security mode: " + v);
  53:                                                                                        }
  54:                                                                                    })
  55:                 .Add("a:", "Authentication method (MD5 or SHA)", delegate (string v) { authentication = v; })
  56:                 .Add("A:", "Authentication passphrase", delegate(string v) { authPhrase = v; })
  57:                 .Add("x:", "Privacy method", delegate (string v) { privacy = v; })
  58:                 .Add("X:", "Privacy passphrase", delegate (string v) { privPhrase = v; })
  59:                 .Add("u:", "Security name", delegate(string v) { user = v; })
  60:                 .Add("h|?|help", "Print this help information.", delegate (string v) { showHelp = v != null; })
  61:                 .Add("V", "Display version number of this application.", delegate (string v) { showVersion = v != null; })
  62:                 .Add("d", "Display message dump", delegate(string v) { dump = true; })
  63:                 .Add("t:", "Timeout value (unit is second).", delegate (string v) { timeout = int.Parse(v) * 1000; })
  64:                 .Add("r:", "Retry count (default is 0)", delegate (string v) { retry = int.Parse(v); })
  65:                 .Add("v|version:", "SNMP version (1, 2, and 3 are currently supported)", delegate (string v)
  66:                                                                                                {
  67:                                                                                                    switch (int.Parse(v))
  68:                                                                                                    {
  69:                                                                                                        case 1:
  70:                                                                                                            version = VersionCode.V1;
  71:                                                                                                            break;
  72:                                                                                                        case 2:
  73:                                                                                                            version = VersionCode.V2;
  74:                                                                                                            break;
  75:                                                                                                        case 3:
  76:                                                                                                            version = VersionCode.V3;
  77:                                                                                                            break;
  78:                                                                                                        default:
  79:                                                                                                            throw new ArgumentException("no such version: " + v);
  80:                                                                                                    }
  81:                                                                                                });
  82:  
  83:             if (args.Length == 0)
  84:             {
  85:                 ShowHelp(p);
  86:                 return;
  87:             }
  88:  
  89:             List<string> extra;
  90:             try
  91:             {
  92:                 extra = p.Parse(args);
  93:             }
  94:             catch (OptionException ex)
  95:             {
  96:                 Console.WriteLine(ex.Message);
  97:                 return;
  98:             }
  99:  
 100:             if (showHelp)
 101:             {
 102:                 ShowHelp(p);
 103:                 return;
 104:             }
 105:  
 106:             if (extra.Count < 2)
 107:             {
 108:                 Console.WriteLine("invalid variable number: " + extra.Count);
 109:                 return;
 110:             }  
 111:             
 112:             if (showVersion)
 113:             {
 114:                 Console.WriteLine(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
 115:                 return;
 116:             }
 117:             
 118:             IPAddress ip;
 119:             bool parsed = IPAddress.TryParse(extra[0], out ip);
 120:             if (!parsed)
 121:             {
 122:                 foreach (IPAddress address in
 123:                     Dns.GetHostAddresses(extra[0]).Where(address => address.AddressFamily == AddressFamily.InterNetwork))
 124:                 {
 125:                     ip = address;
 126:                     break;
 127:                 }
 128:  
 129:                 if (ip == null)
 130:                 {
 131:                     Console.WriteLine("invalid host or wrong IP address found: " + extra[0]);
 132:                     return;
 133:                 }
 134:             }
 135:  
 136:             try
 137:             {
 138:                 List<Variable> vList = new List<Variable>();
 139:                 for (int i = 1; i < extra.Count; i++)
 140:                 {
 141:                     Variable test = new Variable(new ObjectIdentifier(extra[i]));
 142:                     vList.Add(test);
 143:                 }
 144:  
 145:                 IPEndPoint receiver = new IPEndPoint(ip, 161);
 146:                 if (version != VersionCode.V3)
 147:                 {
 148:                     foreach (
 149:                         Variable variable in
 150:                             Messenger.Get(version, receiver, new OctetString(community), vList, timeout))
 151:                     {
 152:                         Console.WriteLine(variable);
 153:                     }
 154:  
 155:                     return;
 156:                 }
 157:                 
 158:                 if (string.IsNullOrEmpty(user))
 159:                 {
 160:                     Console.WriteLine("User name need to be specified for v3.");
 161:                     return;
 162:                 }
 163:  
 164:                 IAuthenticationProvider auth = (level & Levels.Authentication) == Levels.Authentication
 165:                                                    ? GetAuthenticationProviderByName(authentication, authPhrase)
 166:                                                    : DefaultAuthenticationProvider.Instance;
 167:  
 168:                 IPrivacyProvider priv;
 169:                 if ((level & Levels.Privacy) == Levels.Privacy)
 170:                 {
 171:                     priv = new DESPrivacyProvider(new OctetString(privPhrase), auth);
 172:                 }
 173:                 else
 174:                 {
 175:                     priv = new DefaultPrivacyProvider(auth);
 176:                 }
 177:  
 178:                 Discovery discovery = Messenger.NextDiscovery;
 179:                 ReportMessage report = discovery.GetResponse(timeout, receiver);
 180:  
 181:                 GetRequestMessage request = new GetRequestMessage(VersionCode.V3, Messenger.NextMessageId, Messenger.NextRequestId, new OctetString(user), vList, priv, Messenger.MaxMessageSize, report);
 182:  
 183:                 ISnmpMessage response = request.GetResponse(timeout, receiver);
 184:                 if (dump)
 185:                 {
 186:                     Console.WriteLine(ByteTool.Convert(request.ToBytes()));
 187:                 }
 188:  
 189:                 if (response.Pdu().ErrorStatus.ToInt32() != 0) // != ErrorCode.NoError
 190:                 {
 191:                     throw ErrorException.Create(
 192:                         "error in response",
 193:                         receiver.Address,
 194:                         response);
 195:                 }
 196:  
 197:                 foreach (Variable v in response.Pdu().Variables)
 198:                 {
 199:                     Console.WriteLine(v);
 200:                 }
 201:             }
 202:             catch (SnmpException ex)
 203:             {
 204:                 Console.WriteLine(ex);
 205:             }
 206:             catch (SocketException ex)
 207:             {
 208:                 Console.WriteLine(ex);
 209:             }
 210:         }
 211:  
 212:         private static void ShowHelp(OptionSet optionSet)
 213:         {
 214:             Console.WriteLine("#SNMP is available at http://sharpsnmplib.codeplex.com");
 215:             Console.WriteLine("snmpget [Options] IP-address|host-name OID [OID] ...");
 216:             Console.WriteLine("Options:");
 217:             optionSet.WriteOptionDescriptions(Console.Out);
 218:         }
 219:  
 220:         private static IAuthenticationProvider GetAuthenticationProviderByName(string authentication, string phrase)
 221:         {
 222:             if (authentication.ToUpperInvariant() == "MD5")
 223:             {
 224:                 return new MD5AuthenticationProvider(new OctetString(phrase));
 225:             }
 226:             
 227:             if (authentication.ToUpperInvariant() == "SHA")
 228:             {
 229:                 return new SHA1AuthenticationProvider(new OctetString(phrase));
 230:             }
 231:  
 232:             throw new ArgumentException("unknown name", "authentication");
 233:         }
 234:     }
 235: }

沒有留言:

張貼留言