34 using System.Collections.Generic;
37 using System.Text.RegularExpressions;
48 private static readonly Regex _alphaNumericRegex =
new Regex(
"[^a-zA-Z0-9]");
50 static void Main(
string[] args)
52 Console.WriteLine(
"lwIP MIB Compiler");
53 Console.WriteLine(
"");
56 if ((args.Length < 2) || String.IsNullOrWhiteSpace(args[0]) || String.IsNullOrWhiteSpace(args[1]))
62 string mibFile = args[0];
63 if (!File.Exists(mibFile))
65 Console.WriteLine(String.Format(
"Unable to find file '{0}'!", mibFile));
68 string destFile = args[1];
69 string destHeaderFile;
71 if (Directory.Exists(destFile))
74 string mibFileName = Path.GetFileNameWithoutExtension(mibFile).ToLowerInvariant();
75 destFile = Path.Combine(destFile, mibFileName +
".c");
78 string destFileExt = Path.GetExtension(destFile);
79 if (!String.IsNullOrEmpty(destFileExt))
81 destHeaderFile = destFile.Substring(0, destFile.Length - destFileExt.Length);
85 destHeaderFile = destFile;
87 destHeaderFile +=
".h";
89 for (
int i=2; i<args.Length; i++)
91 if (!String.IsNullOrWhiteSpace(args[i]) && Directory.Exists(args[i]))
99 Console.WriteLine(
" Reading MIB file...");
102 MibTypesResolver.ResolveTypes(md.
Modules[0]);
105 if (mt.
Root.Count == 0)
107 Console.WriteLine(
"No root element found inside MIB!");
117 Console.WriteLine(
" Creating lwIP object tree " + mibTreeNode.
Entity.
Name);
121 snmpMib.
BaseOid = MibTypesResolver.ResolveOid(mibTreeNode.
Entity).GetOidValues();
124 ProcessMibTreeNode(mibTreeNode, snmpMib);
130 Console.WriteLine(
" Generating code " + snmpMib.
Name);
131 snmpMib.
Generate(generatedFile, generatedHeaderFile);
135 if (!
string.IsNullOrEmpty(preservedCode))
137 generatedFile.PreservedCode.Add(
new PlainText(preservedCode));
141 generatedFile.PreservedCode.AddRange(generatedFile.Implementation);
143 generatedFile.Implementation.Clear();
146 using (StreamWriter fileWriter =
new StreamWriter(destHeaderFile))
148 CGenerator cGenerator =
new CGenerator(fileWriter, destHeaderFile, 3,
" ", Environment.NewLine);
149 generatedHeaderFile.Save(cGenerator);
151 using (StreamWriter fileWriter =
new StreamWriter(destFile))
154 generatedFile.Save(cGenerator);
157 Console.WriteLine(
" Done");
160 private static void PrintUsage()
162 string codeBase = Assembly.GetExecutingAssembly().CodeBase;
163 string appName = Path.GetFileName(codeBase);
165 Console.WriteLine(
"Usage:");
166 Console.WriteLine(String.Format(
" {0} <source MIB file> <dest C file> [<search path 1 for referred MIB's> <search path 2 for referred MIB's> ...]", appName));
167 Console.WriteLine(
"");
168 Console.WriteLine(
" <source MIB file>");
169 Console.WriteLine(
" Path and filename of MIB file to convert.");
170 Console.WriteLine(
"");
171 Console.WriteLine(
" <dest C file>");
172 Console.WriteLine(
" Destination path and file. If a path is passed only, filename is auto");
173 Console.WriteLine(
" generated from MIB file name.");
174 Console.WriteLine(
"");
175 Console.WriteLine(
" <search path X for referred MIB's>");
176 Console.WriteLine(
" It's important to provide all referred MIB's in order to correctly ");
177 Console.WriteLine(
" resolve all used types.");
178 Console.WriteLine(
"");
182 #region Generation of LWIP Object Tree 191 SnmpTreeNode snmpTreeNode = GenerateSnmpTreeNode(mtn, assignedSnmpNode);
192 assignedSnmpNode.
ChildNodes.Add(snmpTreeNode);
194 ProcessMibTreeNode(mtn, snmpTreeNode);
198 SnmpScalarNode snmpScalarNode = GenerateSnmpScalarNode(mtn, assignedSnmpNode);
199 if (snmpScalarNode != null)
201 assignedSnmpNode.
ChildNodes.Add(snmpScalarNode);
206 SnmpTableNode snmpTableNode = GenerateSnmpTableNode(mtn, assignedSnmpNode);
207 if (snmpTableNode != null)
209 assignedSnmpNode.
ChildNodes.Add(snmpTableNode);
218 result.
Name = _alphaNumericRegex.Replace(mibTreeNode.
Entity.
Name,
"").ToLowerInvariant();
220 result.
FullOid = MibTypesResolver.ResolveOid(mibTreeNode.
Entity).GetOidString();
230 return GenerateSnmpScalarNode(ote, parentNode, ignoreAccessibleFlag);
254 Console.WriteLine(String.Format(
"Unsupported IntegerType '{0}'!", it.
Type));
289 Console.WriteLine(String.Format(
"Generation of ranges is not supported for Counter64 type!"));
295 Console.WriteLine(String.Format(
"Unsupported UnsignedType '{0}'!", ut.
Type));
313 result.
Restrictions.AddRange(CreateRestrictions((mibType as OctetStringType).Size));
321 result =
new SnmpScalarNodeBits(parentNode, (uint)((mibType as BitsType).Map.GetHighestValue() + 1));
322 result.
Restrictions.AddRange(CreateRestrictions(mibType as BitsType));
329 Console.WriteLine(String.Format(
"Unsupported BaseType: Module='{0}', Name='{1}', Type='{2}'!", ta.
Module.
Name, ta.
Name, ta.
Type));
333 Console.WriteLine(String.Format(
"Unsupported BaseType: Module='{0}', Name='{1}'!", mibType.
Module, mibType.
Name));
340 result.
Name = _alphaNumericRegex.Replace(ote.
Name,
"").ToLowerInvariant();
355 else if (ignoreAccessibleFlag && (ote.
Access ==
MaxAccess.notAccessible))
368 private static IEnumerable<IRestriction> CreateRestrictions(
ValueRanges ranges)
370 List<IRestriction> result =
new List<IRestriction>();
376 if (!range.
End.HasValue)
390 private static IEnumerable<IRestriction> CreateRestrictions(
ValueMap map)
392 if ((map != null) && (map.Count > 0))
397 return new List<IRestriction>();
400 private static IEnumerable<IRestriction> CreateRestrictions(
BitsType bt)
402 List<IRestriction> result =
new List<IRestriction>();
404 if ((bt != null) && (bt.
Map != null))
421 Console.WriteLine(
"Found table with unsupported properties! Table needs exactly one (fixed) TableRow with OID=1 ! (" + mibTreeNode.
Entity.
Name +
")");
430 if (!String.IsNullOrWhiteSpace(rot.
Augments))
435 rot = MibTypesResolver.ResolveDeclaration(rot.
Module, rot.
Augments) as ObjectType;
440 foreach (
string index
in rot.
Indices)
442 ObjectType indexEntity = MibTypesResolver.ResolveDeclaration(rot.
Module, index) as ObjectType;
443 if (indexEntity == null)
445 Console.WriteLine(String.Format(
"Could not resolve index '{0}' for table '{1}'! Table omitted!", index, result.
Name));
449 result.
IndexNodes.Add(GenerateSnmpScalarNode(indexEntity, parentNode, ignoreAccessibleFlag:
true));
457 Console.WriteLine(
"Found table without any index column ! (" + mibTreeNode.
Entity.
Name +
")");
464 SnmpScalarNode ssn = GenerateSnmpScalarNode(cellNode, parentNode);
467 result.CellNodes.Add(ssn);
ValueRanges GetContinousRanges()
Returns the values of the map as continous range. At best as one range.
List< IRestriction > Restrictions
List< MibTreeNode > ChildNodes
ITypeAssignment ReferredType
IList< IModule > Modules
MibModule containing in this document.
override void Generate(MibCFile generatedFile, MibHeaderFile generatedHeaderFile)
IModule Module
Containing module.
IList< MibTreeNode > Root
static string GetPreservedCode(string file)
Builds up a tree from a single MIB
SnmpAccessMode AccessMode
The INTEGER type represents a list of alternatives, or a range of numbers.. Includes Integer32 as it'...
UInt32 GetBitMask()
Interprets the single values as bit positions and creates a mask of it.
List< SnmpScalarNode > IndexNodes
override void Analyze()
Called after node structure creation is completed and before code is created. Offers the possibility ...
static readonly Symbol TruthValue
List< SnmpNode > ChildNodes
override string ToString()
Returns a String that represents this Symbol.