Browse Source

tools/qubesd-query: add option to report failure with exit code

Marek Marczykowski-Górecki 7 years ago
parent
commit
43fd1d76e8
2 changed files with 31 additions and 4 deletions
  1. 6 0
      doc/manpages/qubesd-query.rst
  2. 25 4
      qubes/tools/qubesd_query.py

+ 6 - 0
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
 -----------
 

+ 25 - 4
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())