edouard@3501: #!/usr/bin/env python edouard@3501: # -*- coding: utf-8 -*- edouard@3501: edouard@3501: import os edouard@3501: import posixpath edouard@3501: import sys edouard@3548: import time edouard@3618: edouard@3501: from functools import wraps edouard@3618: from importlib import import_module edouard@3501: edouard@3501: import click edouard@3501: edouard@3501: class CLISession(object): edouard@3501: def __init__(self, **kwargs): edouard@3501: self.__dict__.update(kwargs) edouard@3501: self.controller = None edouard@3501: edouard@3501: pass_session = click.make_pass_decorator(CLISession) edouard@3501: edouard@3501: edouard@3501: @click.group(chain=True) edouard@3501: @click.option( edouard@3501: "--project-home", edouard@3501: envvar="PROJECT_HOME", edouard@3501: default=".", edouard@3501: metavar="PATH", edouard@3501: help="Changes the project folder location.", edouard@3501: ) edouard@3501: @click.option( edouard@3501: "--config", edouard@3501: nargs=2, edouard@3501: multiple=True, edouard@3501: metavar="KEY VALUE", edouard@3501: help="Overrides a config key/value pair.", edouard@3501: ) edouard@3501: @click.option( edouard@3501: "--keep", "-k", is_flag=True, edouard@3501: help="Keep local runtime, do not kill it after executing commands.", edouard@3501: ) edouard@3501: @click.option("--verbose", "-v", is_flag=True, help="Enables verbose mode.") edouard@3501: @click.option( edouard@3501: "--buildpath", "-b", help="Where to store files created during build." edouard@3501: ) edouard@3501: @click.option( edouard@3501: "--uri", "-u", help="URI to reach remote PLC." edouard@3501: ) edouard@3501: @click.version_option("0.1") edouard@3501: @click.pass_context edouard@3501: def cli(ctx, **kwargs): edouard@3501: """Beremiz CLI manipulates beremiz projects and runtimes. """ edouard@3501: edouard@3501: ctx.obj = CLISession(**kwargs) edouard@3501: edouard@3501: def ensure_controller(func): edouard@3501: @wraps(func) edouard@3501: def func_wrapper(session, *args, **kwargs): edouard@3501: if session.controller is None: edouard@3501: session.controller = import_module("CLIController").CLIController(session) edouard@3501: ret = func(session, *args, **kwargs) edouard@3501: return ret edouard@3501: edouard@3501: return func_wrapper edouard@3501: edouard@3501: @cli.command() edouard@3501: @click.option( edouard@3501: "--target", "-t", help="Target system triplet." edouard@3501: ) edouard@3501: @pass_session edouard@3501: @ensure_controller edouard@3501: def build(session, target): edouard@3501: """Builds project. """ edouard@3501: def processor(): edouard@3501: return session.controller.build_project(target) edouard@3501: return processor edouard@3501: edouard@3501: @cli.command() edouard@3501: @pass_session edouard@3501: @ensure_controller edouard@3501: def transfer(session): edouard@3501: """Transfer program to PLC runtim.""" edouard@3501: def processor(): edouard@3501: return session.controller.transfer_project() edouard@3501: return processor edouard@3501: edouard@3501: @cli.command() edouard@3501: @pass_session edouard@3501: @ensure_controller edouard@3501: def run(session): edouard@3501: """Run program already present in PLC. """ edouard@3501: def processor(): edouard@3501: return session.controller.run_project() edouard@3501: return processor edouard@3501: edouard@3501: edouard@3501: @cli.resultcallback() edouard@3501: @pass_session edouard@3501: def process_pipeline(session, processors, **kwargs): edouard@3501: ret = 0 edouard@3501: for processor in processors: edouard@3501: ret = processor() edouard@3501: if ret != 0: edouard@3501: if len(processors) > 1 : edouard@3501: click.echo("Command sequence aborted") edouard@3501: break edouard@3501: edouard@3548: if session.keep: edouard@3548: click.echo("Press Ctrl+C to quit") edouard@3618: try: edouard@3618: while True: edouard@3618: time.sleep(1) edouard@3618: except KeyboardInterrupt: edouard@3618: pass edouard@3618: edouard@3618: session.controller.finish() edouard@3548: edouard@3501: return ret edouard@3501: edouard@3501: if __name__ == '__main__': edouard@3501: cli() edouard@3501: