import asyncio
import os
import sys
import aiocan.cli_utils
import click
import caspia.toolbox.cli
from caspia.node.cli import utils
cmd_folder = os.path.abspath(os.path.dirname(__file__))
[docs]class CaspiaNodeCLI(click.MultiCommand):
[docs] def list_commands(self, ctx):
rv = []
for filename in os.listdir(cmd_folder):
if filename.endswith('.py') and \
filename.startswith('cmd_'):
name = filename[4:-3].replace('_', '-')
rv.append(name)
rv.sort()
return rv
[docs] def get_command(self, ctx, cmd_name):
try:
if sys.version_info[0] == 2:
cmd_name = cmd_name.encode('ascii', 'replace')
cmd_name = cmd_name.replace('-', '_')
mod = __import__('caspia.node.cli.commands.cmd_' + cmd_name, None, None, [cmd_name])
except ImportError:
return None
return getattr(mod, cmd_name)
@click.command(cls=CaspiaNodeCLI)
@click.option('--local-can-id', type=utils.canid_input(), envvar='LOCAL_CAN_ID', required=True)
@caspia.toolbox.cli.logging_options()
@aiocan.cli_utils.acan_bus_option()
@click.pass_context
@utils.async_command
async def main(context, bus_creator, local_can_id):
context.obj = {}
loop = asyncio.get_event_loop()
bus = await bus_creator(loop)
context.obj['bus'] = bus
context.obj['local_can_id'] = local_can_id
# pylint: disable=unused-variable
@context.call_on_close
def on_close():
loop.run_until_complete(bus.shutdown())