diff --git a/daemon/examples/emanemanifest2core.py b/daemon/examples/emanemanifest2core.py deleted file mode 100755 index a33da0af..00000000 --- a/daemon/examples/emanemanifest2core.py +++ /dev/null @@ -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() diff --git a/daemon/examples/emanemodel2core.py b/daemon/examples/emanemodel2core.py deleted file mode 100755 index bc48fda2..00000000 --- a/daemon/examples/emanemodel2core.py +++ /dev/null @@ -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] -- ..." - 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() diff --git a/daemon/examples/findcore.py b/daemon/examples/findcore.py deleted file mode 100755 index 5c45d52e..00000000 --- a/daemon/examples/findcore.py +++ /dev/null @@ -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() -