Source code for mbsim.mbsim

"""
A Modbus Simulator
"""
import argparse
import logging

try:
    from importlib.metadata import entry_points
except ImportError:
    from importlib_metadata import entry_points

log = logging.getLogger(__name__)


[docs]class EntryPoints(object): """ A wrapper for entry point for when it returns a dict """ def __init__(self, eps): """ Init wrapper """ self.eps = eps
[docs] def select(self, name=None, group=None): """ If entry_points return a dict this will wrap the dict """ if name: for vals in self.eps.values(): for val in vals: if val.name == name: return val elif group: return self.eps.get(group, {}) return self.eps
[docs]def main(pargs=None): """ The main function to start the mbsim """ log.debug("mbsim is Starting") parser = argparse.ArgumentParser(prog="mbsim", description="A simple Modbus Slave Simulator") parser.add_argument( "-l", "--log", action="store", dest="log", help="set log level", default="INFO", choices=["DEBUG", "INFO", "ERROR", "WARNING", "CRITICAL"], ) entrys = entry_points() if isinstance(entrys, dict): entrys = EntryPoints(entrys) cmds = {ep.name: ep for ep in entrys.select(group="mbsim_command")} cmdparser = parser.add_subparsers( title="Commands", description="Command for mbsim to execute, if omitted tcp modbus server will be started on port 502", dest="cmd", ) mods = {} for name, ep in cmds.items(): log.debug("Loading %s argparser", name) mods[name] = ep.load()(cmdparser.add_parser) log.debug("Loaded argparser for %s", name) log.debug("Reading command line arguments") args = parser.parse_args(pargs) logging.basicConfig(level=getattr(logging, args.log)) log.setLevel(getattr(logging, args.log)) log.debug("Changed log level: %s", args.log) log.debug("Loading addon %s", getattr(args, "cmd", "sim")) mods.get(args.cmd)(args)
if __name__ == "__main__": main()