예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
파일: jsondoc.py 프로젝트: emetens/tensor
    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'])
예제 #4
0
파일: symtable.py 프로젝트: kazzyx/pysmi
    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
예제 #5
0
파일: pysnmp.py 프로젝트: emetens/tensor
    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]
예제 #6
0
 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
예제 #7
0
 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
예제 #8
0
 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)
예제 #9
0
 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
예제 #10
0
 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
예제 #11
0
 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 + ')'
예제 #12
0
파일: jsondoc.py 프로젝트: emetens/tensor
    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}