diff --git a/doc/manpages/qubesd-query.rst b/doc/manpages/qubesd-query.rst index 396b0e78..64a8dad9 100644 --- a/doc/manpages/qubesd-query.rst +++ b/doc/manpages/qubesd-query.rst @@ -24,6 +24,12 @@ Options Send empty payload. Do not attempt to read anything from standard input, but send the request immediately. +.. option:: --fail + + Exit with non-0 exit code when qubesd response is not-OK. By default the tool + will exit with 0 when request is successfully delivered to qubesd, regardless + of response. + Description ----------- diff --git a/qubes/tools/qubesd_query.py b/qubes/tools/qubesd_query.py index 7960d922..f444ccce 100644 --- a/qubes/tools/qubesd_query.py +++ b/qubes/tools/qubesd_query.py @@ -25,6 +25,11 @@ parser.add_argument('--empty', '-e', action='store_false', default=True, help='do not read from stdin and send empty payload') +parser.add_argument('--fail', + dest='fail', + action='store_true', + help='Should non-OK qubesd response result in non-zero exit code') + parser.add_argument('src', metavar='SRC', help='source qube') parser.add_argument('method', metavar='METHOD', @@ -42,10 +47,18 @@ def sighandler(loop, signame, coro): @asyncio.coroutine def qubesd_client(socket, payload, *args): + ''' + Connect to qubesd, send request and passthrough response to stdout + + :param socket: path to qubesd socket + :param payload: payload of the request + :param args: request to qubesd + :return: + ''' try: reader, writer = yield from asyncio.open_unix_connection(socket) except asyncio.CancelledError: - return + return 1 for arg in args: writer.write(arg.encode('ascii')) @@ -54,12 +67,16 @@ def qubesd_client(socket, payload, *args): writer.write_eof() try: + header_data = yield from reader.read(1) + returncode = int(header_data) + sys.stdout.buffer.write(header_data) # pylint: disable=no-member while not reader.at_eof(): data = yield from reader.read(4096) sys.stdout.buffer.write(data) # pylint: disable=no-member sys.stdout.flush() + return returncode except asyncio.CancelledError: - return + return 1 finally: writer.close() @@ -79,9 +96,13 @@ def main(args=None): sighandler, loop, signame, coro) try: - loop.run_until_complete(coro) + returncode = loop.run_until_complete(coro) finally: loop.close() + if args.fail: + return returncode + return 0 + if __name__ == '__main__': - main() + sys.exit(main())