def genNumericOid(self, oid): numericOid = () for part in oid: if isinstance(part, tuple): parent, module = part if parent == 'iso': numericOid += (1, ) continue if module not in self.symbolTable: # XXX do getname for possible future borrowed mibs raise error.PySmiSemanticError( 'no module "%s" in symbolTable' % module) if parent not in self.symbolTable[module]: raise error.PySmiSemanticError( 'no symbol "%s" in module "%s"' % (parent, module)) numericOid += self.genNumericOid( self.symbolTable[module][parent]['oid']) else: numericOid += (part, ) return numericOid
def getBaseType(self, symName, module): if module not in self.symbolTable: raise error.PySmiSemanticError('no module "%s" in symbolTable' % module) if symName not in self.symbolTable[module]: raise error.PySmiSemanticError('no symbol "%s" in module "%s"' % (symName, module)) symType, symSubtype = self.symbolTable[module][symName].get( 'syntax', (('', ''), '')) if not symType[0]: raise error.PySmiSemanticError('unknown type for symbol "%s"' % symName) if symType[0] in self.baseTypes: return symType, symSubtype else: baseSymType, baseSymSubtype = self.getBaseType(*symType) if isinstance(baseSymSubtype, list): if isinstance(symSubtype, list): symSubtype += baseSymSubtype else: symSubtype = baseSymSubtype return baseSymType, symSubtype
def regSym(self, symbol, outDict, parentOid=None, moduleIdentity=False, moduleCompliance=False): if symbol in self._seenSyms and symbol not in self._importMap: raise error.PySmiSemanticError('Duplicate symbol found: %s' % symbol) self.addToExports(symbol, moduleIdentity) self._out[symbol] = outDict if 'oid' in outDict: self._oids.add(outDict['oid']) if not self._enterpriseOid and outDict['oid'].startswith( '1.3.6.1.4.1.'): self._enterpriseOid = '.'.join(outDict['oid'].split('.')[:7]) if moduleIdentity: if self._moduleIdentityOid: raise error.PySmiSemanticError('Duplicate module identity') self._moduleIdentityOid = outDict['oid'] if moduleCompliance: self._complianceOids.append(outDict['oid'])
def genCode(self, ast, symbolTable, **kwargs): self.genRules['text'] = kwargs.get('genTexts', False) self._rows.clear() self._cols.clear() self._parentOids.clear() self._symsOrder = [] self._postponedSyms.clear() self._importMap.clear() self._out = {} # should be new object, do not use `clear` method self.moduleName[0], moduleOid, imports, declarations = ast out, importedModules = self.genImports(imports or {}) for declr in declarations or []: if declr: clausetype = declr[0] classmode = clausetype == 'typeDeclaration' self.handlersTable[declr[0]](self, self.prepData(declr[1:], classmode), classmode) if self._postponedSyms: raise error.PySmiSemanticError('Unknown parents for symbols: %s' % ', '.join(self._postponedSyms)) for sym in self._parentOids: if sym not in self._out and sym not in self._importMap: raise error.PySmiSemanticError('Unknown parent symbol: %s' % sym) self._out['_symtable_order'] = list(self._symsOrder) self._out['_symtable_cols'] = list(self._cols) self._out['_symtable_rows'] = list(self._rows) debug.logger & debug.flagCodegen and debug.logger( 'canonical MIB name %s (%s), imported MIB(s) %s, Symbol table size %s symbols' % ( self.moduleName[0], moduleOid, ','.join(importedModules) or '<none>', len(self._out))) return MibInfo(oid=None, name=self.moduleName[0], imported=tuple([x for x in importedModules])), self._out
def regSym(self, symbol, outStr, oidStr=None, moduleIdentity=False): if symbol in self._seenSyms and symbol not in self._importMap: raise error.PySmiSemanticError('Duplicate symbol found: %s' % symbol) self.addToExports(symbol, moduleIdentity) self._out[symbol] = outStr if moduleIdentity: if self._moduleIdentityOid: raise error.PySmiSemanticError('Duplicate module identity') # TODO: turning literal tuple into a string - hackerish self._moduleIdentityOid = '.'.join(oidStr.split(', '))[1:-1]
def str2int(self, s): if self.isBinary(s): if s[1:-2]: i = int(s[1:-2], 2) else: raise error.PySmiSemanticError( 'empty binary string to int conversion') elif self.isHex(s): if s[1:-2]: i = int(s[1:-2], 16) else: raise error.PySmiSemanticError( 'empty hex string to int conversion') else: i = int(s) return i
def regSym(self, symbol, outStr, parentOid=None, moduleIdentity=0): print('regSym') if symbol in self._presentedSyms and symbol not in self._importMap: raise error.PySmiSemanticError('Duplicate symbol found: %s' % symbol) self.addToExports(symbol, moduleIdentity) self._out[symbol] = outStr
def regSym(self, symbol, symProps, parents=[]): if symbol in self._out or symbol in self._postponedSyms: # add to strict mode - or symbol in self._importMap: raise error.PySmiSemanticError('Duplicate symbol found: %s' % symbol) if self.allParentsExists(parents): self._out[symbol] = symProps self._symsOrder.append(symbol) self.regPostponedSyms() else: self._postponedSyms[symbol] = (parents, symProps)
def genNumericOid(self, oid): print('genNumericOid') numericOid = () for part in oid: if isinstance(part, tuple): parent, module = part if parent == 'iso': numericOid += (1, ) continue if module not in self.symbolTable: raise error.PySmiSemanticError( 'no module "%s" in symbolTable' % module) continue if parent not in self.symbolTable[module]: raise error.PySmiSemanticError( 'no symbol "%s" in moduel "%s"' % (parent, module)) numericOid += self.genNumericOid( self.symbolTable[module][parent]['oid']) else: numericOid += (part, ) return numericOid
def genOid(self, data, classmode=0): out = () parent = '' for el in data[0]: if isinstance(el, (str, unicode)): parent = self.transOpers(el) out += ((parent, self._importMap.get(parent, self.moduleName[0])), ) elif isinstance(el, (int, long)): out += (el, ) elif isinstance(el, tuple): out += (el[1], ) # XXX Do we need to create a new object el[0]? else: raise error.PySmiSemanticError('unknown datatype for OID: %s' % el) return str(self.genNumericOid(out)), parent
def genDefVal(self, data, classmode=0, objname=None): if not data: return '' if not objname: return data defval = data[0] defvalType = self.getBaseType(objname, self.moduleName[0]) if isinstance(defval, (int, long)): # number val = str(defval) elif self.isHex(defval): # hex if defvalType[0][0] in ('Integer32', 'Integer'): # common bug in MIBs val = str(int(defval[1:-2], 16)) else: val = 'hexValue="' + defval[1:-2] + '"' elif self.isBinary(defval): # binary binval = defval[1:-2] if defvalType[0][0] in ('Integer32', 'Integer'): # common bug in MIBs val = str(int(binval and binval or '0', 2)) else: hexval = binval and hex(int(binval, 2))[2:] or '' val = 'hexValue="' + hexval + '"' elif defval[0] == defval[-1] and defval[0] == '"': # quoted string if defval[1:-1] == '' and defvalType != 'OctetString': # common bug # a warning should be here return False # we will set no default value val = dorepr(defval[1:-1]) else: # symbol (oid as defval) or name for enumeration member if defvalType[0][0] == 'ObjectIdentifier' and \ (defval in self.symbolTable[self.moduleName[0]] or \ defval in self._importMap): # oid module = self._importMap.get(defval, self.moduleName[0]) try: val = str( self.genNumericOid( self.symbolTable[module][defval]['oid'])) except: raise error.PySmiSemanticError( 'no symbol "%s" in module "%s"' % (defval, module) ) ### or no module if it will be borrowed later elif defvalType[0][0] in ('Integer32', 'Integer') and \ isinstance(defvalType[1], list) and \ defval in dict(defvalType[1]): # enumeration val = dorepr(defval) elif defvalType[0][0] == 'Bits': defvalBits = [] bits = dict(defvalType[1]) for bit in defval: bitValue = bits.get(bit, None) if bitValue is not None: defvalBits.append((bit, bitValue)) else: raise error.PySmiSemanticError( 'no such bit as "%s" for symbol "%s"' % (bit, objname)) return self.genBits([defvalBits])[1] else: raise error.PySmiSemanticError( 'unknown type "%s" for defval "%s" of symbol "%s"' % (defvalType, defval, objname)) return '.clone(' + val + ')'
def genDefVal(self, data, objname=None): if not data: return {} if not objname: return data outDict = OrderedDict() defval = data[0] defvalType = self.getBaseType(objname, self.moduleName[0]) if isinstance(defval, (int, long)): # number outDict.update(value=defval, format='decimal') elif self.isHex(defval): # hex if defvalType[0][0] in ('Integer32', 'Integer'): # common bug in MIBs outDict.update(value=str( int(len(defval) > 3 and defval[1:-2] or '0', 16)), format='hex') else: outDict.update(value=defval[1:-2], format='hex') elif self.isBinary(defval): # binary binval = defval[1:-2] if defvalType[0][0] in ('Integer32', 'Integer'): # common bug in MIBs outDict.update(value=str(int(binval or '0', 2)), format='bin') else: hexval = binval and hex(int(binval, 2))[2:] or '' outDict.update(value=hexval, format='hex') elif defval[0] == defval[-1] and defval[0] == '"': # quoted string if defval[1:-1] == '' and defvalType != 'OctetString': # common bug # a warning should be here return {} # we will set no default value outDict.update(value=defval[1:-1], format='string') else: # symbol (oid as defval) or name for enumeration member if (defvalType[0][0] == 'ObjectIdentifier' and (defval in self.symbolTable[self.moduleName[0]] or defval in self._importMap)): # oid module = self._importMap.get(defval, self.moduleName[0]) try: val = str( self.genNumericOid( self.symbolTable[module][defval]['oid'])) outDict.update(value=val, format='oid') except: # or no module if it will be borrowed later raise error.PySmiSemanticError( 'no symbol "%s" in module "%s"' % (defval, module)) # enumeration elif (defvalType[0][0] in ('Integer32', 'Integer') and isinstance(defvalType[1], list) and defval in dict(defvalType[1])): outDict.update(value=defval, format='enum') elif defvalType[0][0] == 'Bits': defvalBits = [] bits = dict(defvalType[1]) for bit in defval: bitValue = bits.get(bit, None) if bitValue is not None: defvalBits.append((bit, bitValue)) else: raise error.PySmiSemanticError( 'no such bit as "%s" for symbol "%s"' % (bit, objname)) outDict.update(value=self.genBits([defvalBits])[1], format='bits') return outDict else: raise error.PySmiSemanticError( 'unknown type "%s" for defval "%s" of symbol "%s"' % (defvalType, defval, objname)) return {'default': outDict}