summaryrefslogtreecommitdiffstats
path: root/scripts/remote/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/remote/main.py')
-rw-r--r--scripts/remote/main.py168
1 files changed, 168 insertions, 0 deletions
diff --git a/scripts/remote/main.py b/scripts/remote/main.py
new file mode 100644
index 0000000000..bd304723bb
--- /dev/null
+++ b/scripts/remote/main.py
@@ -0,0 +1,168 @@
+#!/usr/bin/env python2
+
+from __future__ import absolute_import, division, print_function
+
+import sys
+import os
+import argparse
+import logging
+from Queue import Queue
+from .ratp import RatpError
+
+try:
+ import serial
+except:
+ print("error: No python-serial package found", file=sys.stderr)
+ exit(2)
+
+
+def versiontuple(v):
+ return tuple(map(int, (v.split("."))))
+
+if versiontuple(serial.VERSION) < (2, 7):
+ print("warning: python-serial package is buggy in RFC2217 mode,",
+ "consider updating to at least 2.7", file=sys.stderr)
+
+from .ratp import SerialRatpConnection
+from .controller import Controller
+from .threadstdio import ConsoleInput
+
+
+def get_controller(args):
+ port = serial.serial_for_url(args.port, args.baudrate)
+ conn = SerialRatpConnection(port)
+
+ while True:
+ try:
+ ctrl = Controller(conn)
+ break
+ except (RatpError):
+ if args.wait == True:
+ pass
+ else:
+ raise
+
+ return ctrl
+
+
+def handle_run(args):
+ ctrl = get_controller(args)
+ ctrl.export(args.export)
+ res = ctrl.command(' '.join(args.arg))
+ if res:
+ res = 1
+ ctrl.close()
+ return res
+
+
+def handle_ping(args):
+ ctrl = get_controller(args)
+ res = ctrl.ping()
+ if res:
+ res = 1
+ ctrl.close()
+ return res
+
+
+def handle_getenv(args):
+ ctrl = get_controller(args)
+ value = ctrl.getenv(' '.join(args.arg))
+ if not value:
+ res = 1
+ else:
+ print(value)
+ res = 0
+ ctrl.close()
+ return res
+
+
+def handle_listen(args):
+ port = serial.serial_for_url(args.port, args.baudrate)
+ conn = SerialRatpConnection(port)
+ conn.listen()
+ while True:
+ conn.wait(None)
+ conn.close()
+
+
+def handle_console(args):
+ queue = Queue()
+ ctrl = get_controller(args)
+ ctrl.export(args.export)
+ ctrl.start(queue)
+ ctrl.send_async_console('\r')
+ cons = ConsoleInput(queue, exit='\x14') # CTRL-T
+ cons.start()
+ try:
+ while True:
+ src, data = queue.get(block=True)
+ if src == cons:
+ if data is None: # shutdown
+ cons.join()
+ break
+ elif data == '\x10': # CTRL-P
+ ctrl.send_async_ping()
+ else:
+ ctrl.send_async_console(data)
+ elif src == ctrl:
+ if data is None: # shutdown
+ sys.exit(1)
+ break
+ else:
+ os.write(sys.stdout.fileno(), data)
+ ctrl.stop()
+ ctrl.close()
+ finally:
+ print()
+ print("total retransmits=%i crc-errors=%i" % (
+ ctrl.conn.total_retransmits,
+ ctrl.conn.total_crc_errors))
+
+VERBOSITY = {
+ 0: logging.WARN,
+ 1: logging.INFO,
+ 2: logging.DEBUG,
+ }
+
+parser = argparse.ArgumentParser(prog='bbremote')
+parser.add_argument('-v', '--verbose', action='count', default=0)
+parser.add_argument('--port', type=str, default=os.environ.get('BBREMOTE_PORT', None))
+parser.add_argument('--baudrate', type=int, default=os.environ.get('BBREMOTE_BAUDRATE', 115200))
+parser.add_argument('--export', type=str, default=os.environ.get('BBREMOTE_EXPORT', None))
+parser.add_argument('-w', '--wait', action='count', default=0)
+subparsers = parser.add_subparsers(help='sub-command help')
+
+parser_run = subparsers.add_parser('run', help="run a barebox command")
+parser_run.add_argument('arg', nargs='+', help="barebox command to run")
+parser_run.set_defaults(func=handle_run)
+
+parser_ping = subparsers.add_parser('ping', help="test connection")
+parser_ping.set_defaults(func=handle_ping)
+
+parser_ping = subparsers.add_parser('getenv', help="get a barebox environment variable")
+parser_ping.add_argument('arg', nargs='+', help="variable name")
+parser_ping.set_defaults(func=handle_getenv)
+
+parser_run = subparsers.add_parser('listen', help="listen for an incoming connection")
+parser_run.set_defaults(func=handle_listen)
+
+parser_run = subparsers.add_parser('console', help="connect to the console")
+parser_run.set_defaults(func=handle_console)
+
+args = parser.parse_args()
+logging.basicConfig(level=VERBOSITY[args.verbose],
+ format='%(levelname)-8s %(module)-8s %(funcName)-16s %(message)s')
+try:
+ res = args.func(args)
+ exit(res)
+except RatpError as detail:
+ print("Ratp error:", detail, file=sys.stderr);
+ exit(127)
+except KeyboardInterrupt:
+ print("\nInterrupted", file=sys.stderr);
+ exit(1)
+#try:
+# res = args.func(args)
+#except Exception as e:
+# print("error: failed to establish connection: %s" % e, file=sys.stderr)
+# exit(2)