Skip to content
Snippets Groups Projects
  • Phil's avatar
    Merged with one-file scapy · db688383
    Phil authored
    --HG--
    rename : scapy.py => bin/scapy
    rename : scapy.py => scapy/__init__.py
    rename : scapy.py => scapy/ansmachine.py
    rename : scapy.py => scapy/arch.py
    rename : scapy.py => scapy/as_resolvers.py
    rename : scapy.py => scapy/asn1/asn1.py
    rename : scapy.py => scapy/asn1/ber.py
    rename : scapy.py => scapy/asn1/mib.py
    rename : scapy.py => scapy/asn1fields.py
    rename : scapy.py => scapy/asn1packet.py
    rename : scapy.py => scapy/automaton.py
    rename : scapy.py => scapy/autorun.py
    rename : scapy.py => scapy/config.py
    rename : scapy.py => scapy/dadict.py
    rename : scapy.py => scapy/data.py
    rename : scapy.py => scapy/error.py
    rename : scapy.py => scapy/fields.py
    rename : scapy.py => scapy/layers/__init__.py
    rename : scapy.py => scapy/layers/bluetooth.py
    rename : scapy.py => scapy/layers/dhcp.py
    rename : scapy.py => scapy/layers/dns.py
    rename : scapy.py => scapy/layers/dot11.py
    rename : scapy.py => scapy/layers/gprs.py
    rename : scapy.py => scapy/layers/hsrp.py
    rename : scapy.py => scapy/layers/inet.py
    rename : scapy.py => scapy/layers/ip6.py
    rename : scapy.py => scapy/layers/ir.py
    rename : scapy.py => scapy/layers/isakmp.py
    rename : scapy.py => scapy/layers/l2.py
    rename : scapy.py => scapy/layers/l2tp.py
    rename : scapy.py => scapy/layers/mgcp.py
    rename : scapy.py => scapy/layers/mobileip.py
    rename : scapy.py => scapy/layers/netbios.py
    rename : scapy.py => scapy/layers/netflow.py
    rename : scapy.py => scapy/layers/ntp.py
    rename : scapy.py => scapy/layers/ppp.py
    rename : scapy.py => scapy/layers/radius.py
    rename : scapy.py => scapy/layers/rip.py
    rename : scapy.py => scapy/layers/rtp.py
    rename : scapy.py => scapy/layers/sebek.py
    rename : scapy.py => scapy/layers/skinny.py
    rename : scapy.py => scapy/layers/smb.py
    rename : scapy.py => scapy/layers/snmp.py
    rename : scapy.py => scapy/layers/tftp.py
    rename : scapy.py => scapy/layers/x509.py
    rename : scapy.py => scapy/main.py
    rename : scapy.py => scapy/modules/geoip.py
    rename : scapy.py => scapy/modules/nmap.py
    rename : scapy.py => scapy/modules/p0f.py
    rename : scapy.py => scapy/modules/queso.py
    rename : scapy.py => scapy/modules/voip.py
    rename : scapy.py => scapy/packet.py
    rename : scapy.py => scapy/plist.py
    rename : scapy.py => scapy/route.py
    rename : scapy.py => scapy/sendrecv.py
    rename : scapy.py => scapy/supersocket.py
    rename : scapy.py => scapy/themes.py
    rename : scapy.py => scapy/utils.py
    rename : scapy.py => scapy/volatile.py
    db688383
mib.py 4.24 KiB
## This file is part of Scapy
## See http://www.secdev.org/projects/scapy for more informations
## Copyright (C) Philippe Biondi <phil@secdev.org>
## This program is published under a GPLv2 license

import re
from glob import glob
from scapy.dadict import DADict,fixname
from scapy.config import conf
from scapy.utils import do_graph

#################
## MIB parsing ##
#################

_mib_re_integer = re.compile("^[0-9]+$")
_mib_re_both = re.compile("^([a-zA-Z_][a-zA-Z0-9_-]*)\(([0-9]+)\)$")
_mib_re_oiddecl = re.compile("$\s*([a-zA-Z0-9_-]+)\s+OBJECT([^:\{\}]|\{[^:]+\})+::=\s*\{([^\}]+)\}",re.M)
_mib_re_strings = re.compile('"[^"]*"')
_mib_re_comments = re.compile('--.*(\r|\n)')

class MIBDict(DADict):
    def _findroot(self, x):
        if x.startswith("."):
            x = x[1:]
        if not x.endswith("."):
            x += "."
        max=0
        root="."
        for k in self.keys():
            if x.startswith(self[k]+"."):
                if max < len(self[k]):
                    max = len(self[k])
                    root = k
        return root, x[max:-1]
    def _oidname(self, x):
        root,remainder = self._findroot(x)
        return root+remainder
    def _oid(self, x):
        xl = x.strip(".").split(".")
        p = len(xl)-1
        while p >= 0 and _mib_re_integer.match(xl[p]):
            p -= 1
        if p != 0 or xl[p] not in self:
            return x
        xl[p] = self[xl[p]] 
        return ".".join(xl[p:])
    def _make_graph(self, other_keys=[], **kargs):
        nodes = [(k,self[k]) for k in self.keys()]
        oids = [self[k] for k in self.keys()]
        for k in other_keys:
            if k not in oids:
                nodes.append(self.oidname(k),k)
        s = 'digraph "mib" {\n\trankdir=LR;\n\n'
        for k,o in nodes:
            s += '\t"%s" [ label="%s"  ];\n' % (o,k)
        s += "\n"
        for k,o in nodes:
            parent,remainder = self._findroot(o[:-1])
            remainder = remainder[1:]+o[-1]
            if parent != ".":
                parent = self[parent]
            s += '\t"%s" -> "%s" [label="%s"];\n' % (parent, o,remainder)
        s += "}\n"
        do_graph(s, **kargs)


def mib_register(ident, value, the_mib, unresolved):
    if ident in the_mib or ident in unresolved:
        return ident in the_mib
    resval = []
    not_resolved = 0
    for v in value:
        if _mib_re_integer.match(v):
            resval.append(v)
        else:
            v = fixname(v)
            if v not in the_mib:
                not_resolved = 1
            if v in the_mib:
                v = the_mib[v]
            elif v in unresolved:
                v = unresolved[v]
            if type(v) is list:
                resval += v
            else:
                resval.append(v)
    if not_resolved:
        unresolved[ident] = resval
        return False
    else:
        the_mib[ident] = resval
        keys = unresolved.keys()
        i = 0
        while i < len(keys):
            k = keys[i]
            if mib_register(k,unresolved[k], the_mib, {}):
                del(unresolved[k])
                del(keys[i])
                i = 0
            else:
                i += 1
                    
        return True


def load_mib(filenames):
    the_mib = {'iso': ['1']}
    unresolved = {}
    for k in conf.mib.keys():
        mib_register(k, conf.mib[k].split("."), the_mib, unresolved)

    if type(filenames) is str:
        filenames = [filenames]
    for fnames in filenames:
        for fname in glob(fnames):
            f = open(fname)
            text = f.read()
            cleantext = " ".join(_mib_re_strings.split(" ".join(_mib_re_comments.split(text))))
            for m in _mib_re_oiddecl.finditer(cleantext):
                gr = m.groups()
                ident,oid = gr[0],gr[-1]
                ident=fixname(ident)
                oid = oid.split()
                for i in range(len(oid)):
                    m = _mib_re_both.match(oid[i])
                    if m:
                        oid[i] = m.groups()[1]
                mib_register(ident, oid, the_mib, unresolved)

    newmib = MIBDict(_name="MIB")
    for k,o in the_mib.iteritems():
        newmib[k]=".".join(o)
    for k,o in unresolved.iteritems():
        newmib[k]=".".join(o)

    conf.mib=newmib



conf.mib = MIBDict(_name="MIB")