1*b636d99dSDavid van Moolenbroek#!/bin/sh 2*b636d99dSDavid van Moolenbroek# 3*b636d99dSDavid van Moolenbroek# Copyright (c) 1990, 1996 4*b636d99dSDavid van Moolenbroek# John Robert LoVerso. All rights reserved. 5*b636d99dSDavid van Moolenbroek# SMIv2 parsing copyright (c) 1999 6*b636d99dSDavid van Moolenbroek# William C. Fenner. 7*b636d99dSDavid van Moolenbroek# 8*b636d99dSDavid van Moolenbroek# Redistribution and use in source and binary forms, with or without 9*b636d99dSDavid van Moolenbroek# modification, are permitted provided that the following conditions 10*b636d99dSDavid van Moolenbroek# are met: 11*b636d99dSDavid van Moolenbroek# 12*b636d99dSDavid van Moolenbroek# 1. Redistributions of source code must retain the above copyright 13*b636d99dSDavid van Moolenbroek# notices, this list of conditions and the following disclaimer. 14*b636d99dSDavid van Moolenbroek# 15*b636d99dSDavid van Moolenbroek# 2. Redistributions in binary form must reproduce the above copyright 16*b636d99dSDavid van Moolenbroek# notices, this list of conditions and the following disclaimer in the 17*b636d99dSDavid van Moolenbroek# documentation and/or other materials provided with the distribution. 18*b636d99dSDavid van Moolenbroek# 19*b636d99dSDavid van Moolenbroek# THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR 20*b636d99dSDavid van Moolenbroek# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21*b636d99dSDavid van Moolenbroek# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22*b636d99dSDavid van Moolenbroek# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 23*b636d99dSDavid van Moolenbroek# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24*b636d99dSDavid van Moolenbroek# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25*b636d99dSDavid van Moolenbroek# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26*b636d99dSDavid van Moolenbroek# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*b636d99dSDavid van Moolenbroek# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28*b636d99dSDavid van Moolenbroek# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*b636d99dSDavid van Moolenbroek 30*b636d99dSDavid van Moolenbroek# 31*b636d99dSDavid van Moolenbroek# This script will read either ASN.1-style MIB files or the ".defs" files 32*b636d99dSDavid van Moolenbroek# created by the ISODE "mosy" program on such files. 33*b636d99dSDavid van Moolenbroek# 34*b636d99dSDavid van Moolenbroek# The output of this script is the "mib.h" file used by tcpdumps' ASN.1/SNMP 35*b636d99dSDavid van Moolenbroek# decoding code. 36*b636d99dSDavid van Moolenbroek# 37*b636d99dSDavid van Moolenbroek# This script needs to be run by "gawk" (GNU awk). "nawk" will work, but 38*b636d99dSDavid van Moolenbroek# dump will get a recursion error if you process LARGE mibs. While it would 39*b636d99dSDavid van Moolenbroek# by farily easy to rewrite this not to use recursion (and also easy to 40*b636d99dSDavid van Moolenbroek# eliminate use of gsub and functions to use classic "awk"), you have to 41*b636d99dSDavid van Moolenbroek# order the structure declarations in defined-first order for the compiler 42*b636d99dSDavid van Moolenbroek# not to barf; too bad tsort doesn't take arguments. 43*b636d99dSDavid van Moolenbroek# 44*b636d99dSDavid van Moolenbroek 45*b636d99dSDavid van Moolenbroekcat << EOF 46*b636d99dSDavid van Moolenbroek/* 47*b636d99dSDavid van Moolenbroek * This file was generated by tcpdump/makemib on `date` 48*b636d99dSDavid van Moolenbroek * You probably don't want to edit this by hand! 49*b636d99dSDavid van Moolenbroek * 50*b636d99dSDavid van Moolenbroek * struct mib somename = { desc, oid-octet, type, child-pointer, next-pointer 51*b636d99dSDavid van Moolenbroek}; 52*b636d99dSDavid van Moolenbroek */ 53*b636d99dSDavid van Moolenbroek 54*b636d99dSDavid van MoolenbroekEOF 55*b636d99dSDavid van Moolenbroek 56*b636d99dSDavid van Moolenbroekawk ' 57*b636d99dSDavid van MoolenbroekBEGIN { 58*b636d99dSDavid van Moolenbroek debug=0; 59*b636d99dSDavid van Moolenbroek # for sanity, we prep the namespace with objects from RFC-1155 60*b636d99dSDavid van Moolenbroek # (we manually establish the root) 61*b636d99dSDavid van Moolenbroek oid["iso"]=1 62*b636d99dSDavid van Moolenbroek oidadd("org", "iso", 3) 63*b636d99dSDavid van Moolenbroek oidadd("dod", "org", 6) 64*b636d99dSDavid van Moolenbroek oidadd("internet", "dod", 1) 65*b636d99dSDavid van Moolenbroek oidadd("directory", "internet", 1) 66*b636d99dSDavid van Moolenbroek oidadd("mgmt", "internet", 2) 67*b636d99dSDavid van Moolenbroek#XXX oidadd("mib", "mgmt", 1) 68*b636d99dSDavid van Moolenbroek oidadd("mib-2", "mgmt", 1) 69*b636d99dSDavid van Moolenbroek oidadd("experimental", "internet", 3) 70*b636d99dSDavid van Moolenbroek oidadd("private", "internet", 4) 71*b636d99dSDavid van Moolenbroek oidadd("enterprises", "private", 1) 72*b636d99dSDavid van Moolenbroek oidadd("ip", "mib-2", 4) 73*b636d99dSDavid van Moolenbroek oidadd("transmission", "mib-2", 10) 74*b636d99dSDavid van Moolenbroek 75*b636d99dSDavid van Moolenbroek holddesc="none" 76*b636d99dSDavid van Moolenbroek} 77*b636d99dSDavid van Moolenbroek 78*b636d99dSDavid van Moolenbroek# 79*b636d99dSDavid van Moolenbroek# Read mosy "*.defs" file. mosy does all the parsing work; we just read 80*b636d99dSDavid van Moolenbroek# its simple and straightforward output. It would not be too hard to make 81*b636d99dSDavid van Moolenbroek# tcpdump directly read mosy output, but... 82*b636d99dSDavid van Moolenbroek# 83*b636d99dSDavid van Moolenbroek# Ignore these unless the current file is called something.defs; false 84*b636d99dSDavid van Moolenbroek# positives are too common in DESCRIPTIONs. 85*b636d99dSDavid van Moolenbroek 86*b636d99dSDavid van MoolenbroekNF > 1 && index($2,".")>0 && FILENAME ~ /\.defs/ { 87*b636d99dSDavid van Moolenbroek # currently ignore items of the form "{ iso.3.6.1 }" 88*b636d99dSDavid van Moolenbroek if (split($2, p, ".") == 2) { 89*b636d99dSDavid van Moolenbroek oidadd($1, p[1], p[2]) 90*b636d99dSDavid van Moolenbroek } 91*b636d99dSDavid van Moolenbroek next 92*b636d99dSDavid van Moolenbroek} 93*b636d99dSDavid van Moolenbroek 94*b636d99dSDavid van Moolenbroek# 95*b636d99dSDavid van Moolenbroek# Must be a MIB file 96*b636d99dSDavid van Moolenbroek# Make it easier to parse - used to be done by sed 97*b636d99dSDavid van Moolenbroek{ sub(/--\*.*\*--/, ""); sub(/--.*/, ""); gsub(/[{}]/, " & "); } 98*b636d99dSDavid van Moolenbroek 99*b636d99dSDavid van Moolenbroek# 100*b636d99dSDavid van Moolenbroek# this next section is simple and naive, but does the job ok 101*b636d99dSDavid van Moolenbroek# 102*b636d99dSDavid van Moolenbroek 103*b636d99dSDavid van Moolenbroek# foo OBJECT IDENTIFIER ::= { baz 17 } 104*b636d99dSDavid van Moolenbroek# or 105*b636d99dSDavid van Moolenbroek# foo OBJECT IDENTIFIER ::= 106*b636d99dSDavid van Moolenbroek# { baz 17 } 107*b636d99dSDavid van Moolenbroek$2$3$4 == "OBJECTIDENTIFIER::=" { 108*b636d99dSDavid van Moolenbroek holddesc="none" 109*b636d99dSDavid van Moolenbroek if (NF == 8) 110*b636d99dSDavid van Moolenbroek oidadd($1, $6, $7) 111*b636d99dSDavid van Moolenbroek if (NF == 4) 112*b636d99dSDavid van Moolenbroek holddesc=$1 113*b636d99dSDavid van Moolenbroek next 114*b636d99dSDavid van Moolenbroek} 115*b636d99dSDavid van Moolenbroek$1 == "{" && holddesc != "none" && NF == 4 { 116*b636d99dSDavid van Moolenbroek oidadd(holddesc, $2, $3) 117*b636d99dSDavid van Moolenbroek holddesc="none" 118*b636d99dSDavid van Moolenbroek} 119*b636d99dSDavid van Moolenbroek# 120*b636d99dSDavid van Moolenbroek# foo OBJECT IDENTIFIER 121*b636d99dSDavid van Moolenbroek# ::= { bar 1 } 122*b636d99dSDavid van Moolenbroek$2$3 == "OBJECTIDENTIFIER" && $1 != "SYNTAX" && NF == 3 { 123*b636d99dSDavid van Moolenbroek holddesc=$1 124*b636d99dSDavid van Moolenbroek} 125*b636d99dSDavid van Moolenbroek# 126*b636d99dSDavid van Moolenbroek# foo 127*b636d99dSDavid van Moolenbroek# OBJECT IDENTIFIER ::= { bar 1 } 128*b636d99dSDavid van Moolenbroek# a couple of heuristics to exclude single words in e.g. long 129*b636d99dSDavid van Moolenbroek# DESCRIPTION clauses 130*b636d99dSDavid van MoolenbroekNF == 1 && $1 ~ "[a-z][a-z]*[A-Z]" && $1 !~ /[(){}.,]/ && holddesc == "none" { 131*b636d99dSDavid van Moolenbroek holddesc=$1 132*b636d99dSDavid van Moolenbroek} 133*b636d99dSDavid van Moolenbroek$1$2$3 == "OBJECTIDENTIFIER::=" && holddesc != "none" { 134*b636d99dSDavid van Moolenbroek oidadd(holddesc, $5, $6) 135*b636d99dSDavid van Moolenbroek holddesc="none" 136*b636d99dSDavid van Moolenbroek} 137*b636d99dSDavid van Moolenbroek# 138*b636d99dSDavid van Moolenbroek# "normal" style 139*b636d99dSDavid van Moolenbroek# foo OBJECT-TYPE ... 140*b636d99dSDavid van Moolenbroek# ... 141*b636d99dSDavid van Moolenbroek# ::= { baz 5 } 142*b636d99dSDavid van Moolenbroek$2 == "MODULE-IDENTITY" || $2 == "MODULE-COMPLIANCE" || 143*b636d99dSDavid van Moolenbroek $2 == "OBJECT-IDENTITY" || $2 == "OBJECT-TYPE" || 144*b636d99dSDavid van Moolenbroek $2 == "OBJECT-GROUP" || 145*b636d99dSDavid van Moolenbroek $2 == "NOTIFICATION-TYPE" || $2 == "NOTIFICATION-GROUP" { 146*b636d99dSDavid van Moolenbroek holddesc=$1 147*b636d99dSDavid van Moolenbroek} 148*b636d99dSDavid van Moolenbroek$1 == "::=" && holddesc != "none" && NF == 5 { 149*b636d99dSDavid van Moolenbroek oidadd(holddesc, $3, $4) 150*b636d99dSDavid van Moolenbroek holddesc="none" 151*b636d99dSDavid van Moolenbroek} 152*b636d99dSDavid van Moolenbroek# 153*b636d99dSDavid van Moolenbroek# foo ::= { baz 17 } 154*b636d99dSDavid van Moolenbroek$2$3 == "::={" { 155*b636d99dSDavid van Moolenbroek oidadd($1,$4,$5) 156*b636d99dSDavid van Moolenbroek holddesc="none" 157*b636d99dSDavid van Moolenbroek} 158*b636d99dSDavid van Moolenbroek 159*b636d99dSDavid van Moolenbroek 160*b636d99dSDavid van Moolenbroek# 161*b636d99dSDavid van Moolenbroek# End of the road - output the data. 162*b636d99dSDavid van Moolenbroek# 163*b636d99dSDavid van Moolenbroek 164*b636d99dSDavid van MoolenbroekEND { 165*b636d99dSDavid van Moolenbroek print "struct obj" 166*b636d99dSDavid van Moolenbroek dump("iso") 167*b636d99dSDavid van Moolenbroek print "*mibroot = &_iso_obj;" 168*b636d99dSDavid van Moolenbroek} 169*b636d99dSDavid van Moolenbroek 170*b636d99dSDavid van Moolenbroekfunction inn(file) { 171*b636d99dSDavid van Moolenbroek if (file == "" || file == "-") 172*b636d99dSDavid van Moolenbroek return "" 173*b636d99dSDavid van Moolenbroek return " in " file 174*b636d99dSDavid van Moolenbroek} 175*b636d99dSDavid van Moolenbroek 176*b636d99dSDavid van Moolenbroek# 177*b636d99dSDavid van Moolenbroek# add a new object to the tree 178*b636d99dSDavid van Moolenbroek# 179*b636d99dSDavid van Moolenbroek# new OBJECT IDENTIFIER ::= { parent value } 180*b636d99dSDavid van Moolenbroek# 181*b636d99dSDavid van Moolenbroek 182*b636d99dSDavid van Moolenbroekfunction oidadd(new, parent, value) { 183*b636d99dSDavid van Moolenbroek # Ignore 0.0 184*b636d99dSDavid van Moolenbroek if (parent == "0" && value == 0) 185*b636d99dSDavid van Moolenbroek return 186*b636d99dSDavid van Moolenbroek if (debug) 187*b636d99dSDavid van Moolenbroek print "/* oidadd" inn(FILENAME) ":", new, "in", parent, "as", value, "line", $0, "*/" 188*b636d99dSDavid van Moolenbroek # use safe C identifiers 189*b636d99dSDavid van Moolenbroek gsub(/[-&\/]/,"",new) 190*b636d99dSDavid van Moolenbroek gsub(/[-&\/]/,"",parent) 191*b636d99dSDavid van Moolenbroek # check if parent missing 192*b636d99dSDavid van Moolenbroek if (oid[parent] == "") { 193*b636d99dSDavid van Moolenbroek printf "/* parse problem%s: no parent for %s.%s(%d) */\n", \ 194*b636d99dSDavid van Moolenbroek inn(FILENAME), parent, new, value 195*b636d99dSDavid van Moolenbroek return 196*b636d99dSDavid van Moolenbroek } 197*b636d99dSDavid van Moolenbroek # check if parent.value already exists 198*b636d99dSDavid van Moolenbroek if (oid[new] > 0 && oid[new] != value) { 199*b636d99dSDavid van Moolenbroek printf "/* parse problem%s: dup %s.%s(%d) != old (%d) */\n", \ 200*b636d99dSDavid van Moolenbroek inn(FILENAME), parent, new, value, oid[new] 201*b636d99dSDavid van Moolenbroek return 202*b636d99dSDavid van Moolenbroek } 203*b636d99dSDavid van Moolenbroek # check for new name for parent.value 204*b636d99dSDavid van Moolenbroek if (child[parent] != "") { 205*b636d99dSDavid van Moolenbroek for (sib = child[parent]; sib != ""; sib = sibling[sib]) 206*b636d99dSDavid van Moolenbroek if (oid[sib] == value) { 207*b636d99dSDavid van Moolenbroek if (new != sib) 208*b636d99dSDavid van Moolenbroek printf "/* parse problem%s: new name" \ 209*b636d99dSDavid van Moolenbroek " \"%s\"" \ 210*b636d99dSDavid van Moolenbroek " for %s.%s(%d) ignored */\n", \ 211*b636d99dSDavid van Moolenbroek inn(FILENAME), new, parent, \ 212*b636d99dSDavid van Moolenbroek sib, value 213*b636d99dSDavid van Moolenbroek return 214*b636d99dSDavid van Moolenbroek } 215*b636d99dSDavid van Moolenbroek } 216*b636d99dSDavid van Moolenbroek 217*b636d99dSDavid van Moolenbroek oid[new]=value 218*b636d99dSDavid van Moolenbroek if (child[parent] == "") { 219*b636d99dSDavid van Moolenbroek child[parent] = new 220*b636d99dSDavid van Moolenbroek } else { 221*b636d99dSDavid van Moolenbroek sibling[new] = child[parent] 222*b636d99dSDavid van Moolenbroek child[parent] = new 223*b636d99dSDavid van Moolenbroek } 224*b636d99dSDavid van Moolenbroek} 225*b636d99dSDavid van Moolenbroek 226*b636d99dSDavid van Moolenbroek# 227*b636d99dSDavid van Moolenbroek# old(?) routine to recurse down the tree (in postfix order for convenience) 228*b636d99dSDavid van Moolenbroek# 229*b636d99dSDavid van Moolenbroek 230*b636d99dSDavid van Moolenbroekfunction dump(item, c, s) { 231*b636d99dSDavid van Moolenbroek# newitem=sofar"."item"("oid[item]")" 232*b636d99dSDavid van Moolenbroek# printf "/* %s c=%s s=%s */\n", newitem, child[item], sibling[item] 233*b636d99dSDavid van Moolenbroek c="NULL" 234*b636d99dSDavid van Moolenbroek if (child[item] != "") { 235*b636d99dSDavid van Moolenbroek dump(child[item]) 236*b636d99dSDavid van Moolenbroek c = "&_"child[item]"_obj" 237*b636d99dSDavid van Moolenbroek } 238*b636d99dSDavid van Moolenbroek s="NULL" 239*b636d99dSDavid van Moolenbroek if (sibling[item] != "") { 240*b636d99dSDavid van Moolenbroek dump(sibling[item]) 241*b636d99dSDavid van Moolenbroek s = "&_"sibling[item]"_obj" 242*b636d99dSDavid van Moolenbroek } 243*b636d99dSDavid van Moolenbroek printf "_%s_obj = {\n\t\"%s\", %d, 0,\n\t%s, %s\n},\n", \ 244*b636d99dSDavid van Moolenbroek item, item, oid[item], c, s 245*b636d99dSDavid van Moolenbroek} 246*b636d99dSDavid van Moolenbroek' $@ 247*b636d99dSDavid van Moolenbroekexit 0 248