remove old utility examples for now

This commit is contained in:
Blake J. Harnden 2018-04-16 14:00:04 -07:00
parent 2662a36f09
commit 7e03202ba4
3 changed files with 0 additions and 465 deletions

View file

@ -1,214 +0,0 @@
#!/usr/bin/env python
from emanesh import manifest
import os.path
import re
import textwrap
class EmaneManifest2Model(object):
class EmaneModel(object):
class EmaneModelParameter(object):
intfloat_regex = re.compile(r'^([0-9]+)\.(0*)$')
indent = ' ' * 16
def __init__(self, name, apitype, default, caption,
possible_values = ()):
self.name = name
self.apitype = apitype
self.default = self.intfloat_regex.sub(r'\1.0', default)
self.possible_values = possible_values
self.caption = caption
def __str__(self):
return '''%s('%s', %s,\n%s '%s', '%s', '%s')''' % \
(self.indent, self.name, self.apitype,
self.indent, self.default,
','.join(self.possible_values), self.caption)
def __init__(self, name):
self.name = name
self.parameters = []
def add_parameter(self, name, apitype, default, caption,
possible_values = ()):
p = self.EmaneModelParameter(name, apitype, default, caption,
possible_values)
self.parameters.append(p)
mac_xml_path = '/usr/share/emane/xml/models/mac'
# map emane parameter types to CORE api data types
core_api_type = {
'uint8': 'coreapi.CONF_DATA_TYPE_UINT8',
'uint16': 'coreapi.CONF_DATA_TYPE_UINT16',
'uint32': 'coreapi.CONF_DATA_TYPE_UINT32',
'uint64': 'coreapi.CONF_DATA_TYPE_UINT64',
'int8': 'coreapi.CONF_DATA_TYPE_INT8',
'int16': 'coreapi.CONF_DATA_TYPE_INT16',
'int32': 'coreapi.CONF_DATA_TYPE_INT32',
'int64': 'coreapi.CONF_DATA_TYPE_INT64',
'float': 'coreapi.CONF_DATA_TYPE_FLOAT',
'double': 'coreapi.CONF_DATA_TYPE_FLOAT',
'bool': 'coreapi.CONF_DATA_TYPE_BOOL',
'string': 'coreapi.CONF_DATA_TYPE_STRING',
}
parameter_regex = re.compile(r'^\^\(([\|\-\w]+)\)\$$')
@classmethod
def emane_model(cls, xmlfile):
m = manifest.Manifest(xmlfile)
model = cls.EmaneModel(m.getName())
for name in m.getAllConfiguration():
info = m.getConfigurationInfo(name)
apitype = None
for t in 'numeric', 'nonnumeric':
if t in info:
apitype = cls.core_api_type[info[t]['type']]
break
default = ''
if info['default']:
values = info['values']
if values:
default = values[0]
caption = name
possible_values = []
if apitype == 'coreapi.CONF_DATA_TYPE_BOOL':
possible_values = ['On,Off']
elif apitype == 'coreapi.CONF_DATA_TYPE_STRING':
if name == 'pcrcurveuri':
default = os.path.join(cls.mac_xml_path,
model.name, model.name + 'pcr.xml')
else:
regex = info['regex']
if regex:
match = cls.parameter_regex.match(regex)
if match:
possible_values = match.group(1).split('|')
model.add_parameter(name, apitype, default,
caption, possible_values)
model.parameters.sort(key = lambda x: x.name)
return model
@classmethod
def core_emane_model(cls, class_name, macmanifest_filename,
phymanifest_filename):
template = '''\
from core.emane.emane import EmaneModel
from core.api import coreapi
class BaseEmaneModel(EmaneModel):
def __init__(self, session, objid = None, verbose = False):
EmaneModel.__init__(self, session, objid, verbose)
def buildnemxmlfiles(self, e, ifc):
\'\'\'\\
Build the necessary nem, mac, and phy XMLs in the given path.
If an individual NEM has a nonstandard config, we need to
build that file also. Otherwise the WLAN-wide
nXXemane_*nem.xml, nXXemane_*mac.xml, nXXemane_*phy.xml are
used.
\'\'\'
values = e.getifcconfig(self.objid, self._name,
self.getdefaultvalues(), ifc)
if values is None:
return
nemdoc = e.xmldoc('nem')
nem = nemdoc.getElementsByTagName('nem').pop()
e.appendtransporttonem(nemdoc, nem, self.objid, ifc)
def append_definition(tag, name, xmlname, doc):
el = doc.createElement(name)
el.setAttribute('definition', xmlname)
tag.appendChild(el)
append_definition(nem, 'mac', self.macxmlname(ifc), nemdoc)
append_definition(nem, 'phy', self.phyxmlname(ifc), nemdoc)
e.xmlwrite(nemdoc, self.nemxmlname(ifc))
names = list(self.getnames())
def append_options(tag, optnames, doc):
for name in optnames:
value = self.valueof(name, values).strip()
if value:
tag.appendChild(e.xmlparam(doc, name, value))
macdoc = e.xmldoc('mac')
mac = macdoc.getElementsByTagName('mac').pop()
mac.setAttribute('library', '%(modelLibrary)s')
# append MAC options to macdoc
append_options(mac, names[:len(self._confmatrix_mac)], macdoc)
e.xmlwrite(macdoc, self.macxmlname(ifc))
phydoc = e.xmldoc('phy')
phy = phydoc.getElementsByTagName('phy').pop()
# append PHY options to phydoc
append_options(phy, names[len(self._confmatrix_mac):], phydoc)
e.xmlwrite(phydoc, self.phyxmlname(ifc))
class %(modelClass)s(BaseEmaneModel):
# model name
_name = 'emane_%(modelName)s'
# configuration parameters are
# ( 'name', 'type', 'default', 'possible-value-list', 'caption')
# MAC parameters
_confmatrix_mac = [\n%(confMatrixMac)s
]
# PHY parameters
_confmatrix_phy = [\n%(confMatrixPhy)s
]
_confmatrix = _confmatrix_mac + _confmatrix_phy
# value groupings
_confgroups = 'MAC Parameters:1-%%s|PHY Parameters:%%s-%%s' %% \\
(len(_confmatrix_mac), \\
len(_confmatrix_mac) + 1, len(_confmatrix))
'''
macmodel = cls.emane_model(macmanifest_filename)
phymodel = cls.emane_model(phymanifest_filename)
d = {
'modelClass': 'Emane%sModel' % (class_name),
'modelName': macmodel.name,
'confMatrixMac': ',\n'.join(map(str, macmodel.parameters)) + ',',
'confMatrixPhy': ',\n'.join(map(str, phymodel.parameters)) + ',',
'modelLibrary': macmodel.name,
}
return textwrap.dedent(template % d)
def main():
import argparse
import sys
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description = 'Create skeleton CORE bindings from ' \
'EMANE model manifest files.',
epilog = 'example:\n' \
' %(prog)s -c RadioX \\\n' \
' -m /usr/share/emane/manifest/radiox.xml \\\n' \
' -p /usr/share/emane/manifest/emanephy.xml')
parser.add_argument('-c', '--class-name', dest = 'classname',
required = True, help = 'corresponding python '
'class name: RadioX -> EmaneRadioXModel')
parser.add_argument('-m', '--mac-xmlfile', dest = 'macxmlfilename',
required = True,
help = 'MAC model manifest XML filename')
parser.add_argument('-p', '--phy-xmlfile', dest = 'phyxmlfilename',
required = True,
help = 'PHY model manifest XML filename')
args = parser.parse_args()
model = EmaneManifest2Model.core_emane_model(args.classname,
args.macxmlfilename,
args.phyxmlfilename)
sys.stdout.write(model)
if __name__ == "__main__":
main()

View file

@ -1,173 +0,0 @@
#!/usr/bin/env python
'''
emanemodel2core.py: scans an EMANE model source file
(e.g. emane/models/rfpipe/maclayer/rfpipemaclayer.cc) and outputs Python
bindings that allow the model to be used in CORE.
When using this conversion utility, you should replace XYZ, Xyz, and xyz with
the actual model name. Note the capitalization convention.
'''
import os, sys, optparse
MODEL_TEMPLATE_PART1 = """
'''
xyz.py: EMANE XYZ model bindings for CORE
'''
from core.api import coreapi
from emane import EmaneModel
from universal import EmaneUniversalModel
class EmaneXyzModel(EmaneModel):
def __init__(self, session, objid = None, verbose = False):
EmaneModel.__init__(self, session, objid, verbose)
# model name
_name = "emane_xyz"
# MAC parameters
_confmatrix_mac = [
"""
MODEL_TEMPLATE_PART2 = """
]
# PHY parameters from Universal PHY
_confmatrix_phy = EmaneUniversalModel._confmatrix
_confmatrix = _confmatrix_mac + _confmatrix_phy
# value groupings
_confgroups = "XYZ MAC Parameters:1-%d|Universal PHY Parameters:%d-%d" \
% ( len(_confmatrix_mac), len(_confmatrix_mac) + 1, len(_confmatrix))
def buildnemxmlfiles(self, e, ifc):
''' Build the necessary nem, mac, and phy XMLs in the given path.
If an individual NEM has a nonstandard config, we need to build
that file also. Otherwise the WLAN-wide nXXemane_xyznem.xml,
nXXemane_xyzmac.xml, nXXemane_xyzphy.xml are used.
'''
values = e.getifcconfig(self.objid, self._name,
self.getdefaultvalues(), ifc)
if values is None:
return
nemdoc = e.xmldoc("nem")
nem = nemdoc.getElementsByTagName("nem").pop()
nem.setAttribute("name", "XYZ NEM")
mactag = nemdoc.createElement("mac")
mactag.setAttribute("definition", self.macxmlname(ifc))
nem.appendChild(mactag)
phytag = nemdoc.createElement("phy")
phytag.setAttribute("definition", self.phyxmlname(ifc))
nem.appendChild(phytag)
e.xmlwrite(nemdoc, self.nemxmlname(ifc))
names = list(self.getnames())
macnames = names[:len(self._confmatrix_mac)]
phynames = names[len(self._confmatrix_mac):]
# make any changes to the mac/phy names here to e.g. exclude them from
# the XML output
macdoc = e.xmldoc("mac")
mac = macdoc.getElementsByTagName("mac").pop()
mac.setAttribute("name", "XYZ MAC")
mac.setAttribute("library", "xyzmaclayer")
# append MAC options to macdoc
map( lambda n: mac.appendChild(e.xmlparam(macdoc, n, \
self.valueof(n, values))), macnames)
e.xmlwrite(macdoc, self.macxmlname(ifc))
phydoc = EmaneUniversalModel.getphydoc(e, self, values, phynames)
e.xmlwrite(phydoc, self.phyxmlname(ifc))
"""
def emane_model_source_to_core(infile, outfile):
do_parse_line = False
output = MODEL_TEMPLATE_PART1
with open(infile, 'r') as f:
for line in f:
# begin marker
if "EMANE::ConfigurationDefinition" in line:
do_parse_line = True
# end marker -- all done
if "{0, 0, 0, 0, 0, 0" in line:
break
if do_parse_line:
outstr = convert_line(line)
if outstr is not None:
output += outstr
continue
output += MODEL_TEMPLATE_PART2
if outfile == sys.stdout:
sys.stdout.write(output)
else:
with open(outfile, 'w') as f:
f.write(output)
def convert_line(line):
line = line.strip()
# skip comments
if line.startswith(('/*', '//')):
return None
items = line.strip('{},').split(',')
if len(items) != 7:
#print "continuning on line=", len(items), items
return None
return convert_items_to_line(items)
def convert_items_to_line(items):
fields = ('required', 'default', 'count', 'name', 'value', 'type',
'description')
getfield = lambda(x): items[fields.index(x)].strip()
output = " ("
output += "%s, " % getfield('name')
value = getfield('value')
if value == '"off"':
type = "coreapi.CONF_DATA_TYPE_BOOL"
value = "0"
defaults = '"On,Off"'
elif value == '"on"':
type = "coreapi.CONF_DATA_TYPE_BOOL"
value = '"1"'
defaults = '"On,Off"'
else:
type = "coreapi.CONF_DATA_TYPE_STRING"
defaults = '""'
output += "%s, %s, %s, " % (type, value, defaults)
output += getfield('description')
output += "),\n"
return output
def main():
usagestr = "usage: %prog [-h] [options] -- <command> ..."
parser = optparse.OptionParser(usage = usagestr)
parser.set_defaults(infile = None, outfile = sys.stdout)
parser.add_option("-i", "--infile", dest = "infile",
help = "file to read (usually '*mac.cc')")
parser.add_option("-o", "--outfile", dest = "outfile",
help = "file to write (stdout is default)")
def usage(msg = None, err = 0):
sys.stdout.write("\n")
if msg:
sys.stdout.write(msg + "\n\n")
parser.print_help()
sys.exit(err)
# parse command line options
(options, args) = parser.parse_args()
if options.infile is None:
usage("please specify input file with the '-i' option", err=1)
emane_model_source_to_core(options.infile, options.outfile)
if __name__ == "__main__":
main()

View file

@ -1,78 +0,0 @@
#!/usr/bin/env python
#
# Search for installed CORE library files and Python bindings.
#
import os, glob
pythondirs = [
"/usr/lib/python2.7/site-packages",
"/usr/lib/python2.7/dist-packages",
"/usr/lib64/python2.7/site-packages",
"/usr/lib64/python2.7/dist-packages",
"/usr/local/lib/python2.7/site-packages",
"/usr/local/lib/python2.7/dist-packages",
"/usr/local/lib64/python2.7/site-packages",
"/usr/local/lib64/python2.7/dist-packages",
"/usr/lib/python2.6/site-packages",
"/usr/lib/python2.6/dist-packages",
"/usr/lib64/python2.6/site-packages",
"/usr/lib64/python2.6/dist-packages",
"/usr/local/lib/python2.6/site-packages",
"/usr/local/lib/python2.6/dist-packages",
"/usr/local/lib64/python2.6/site-packages",
"/usr/local/lib64/python2.6/dist-packages",
]
tcldirs = [
"/usr/lib/core",
"/usr/local/lib/core",
]
def find_in_file(fn, search, column=None):
''' Find a line starting with 'search' in the file given by the filename
'fn'. Return True if found, False if not found, or the column text if
column is specified.
'''
r = False
if not os.path.exists(fn):
return r
f = open(fn, "r")
for line in f:
if line[:len(search)] != search:
continue
r = True
if column is not None:
r = line.split()[column]
break
f.close()
return r
def main():
versions = []
for d in pythondirs:
fn = "%s/core/constants.py" % d
ver = find_in_file(fn, 'COREDPY_VERSION', 2)
if ver:
ver = ver.strip('"')
versions.append((d, ver))
for e in glob.iglob("%s/core_python*egg-info" % d):
ver = find_in_file(e, 'Version:', 1)
if ver:
versions.append((e, ver))
for e in glob.iglob("%s/netns*egg-info" % d):
ver = find_in_file(e, 'Version:', 1)
if ver:
versions.append((e, ver))
for d in tcldirs:
fn = "%s/version.tcl" % d
ver = find_in_file(fn, 'set CORE_VERSION', 2)
if ver:
versions.append((d, ver))
for (d, ver) in versions:
print "%8s %s" % (ver, d)
if __name__ == "__main__":
main()