Skip to content

Commit

Permalink
tools/qubesd-query: add option to report failure with exit code
Browse files Browse the repository at this point in the history
  • Loading branch information
marmarek committed Jun 6, 2017
1 parent 05ba73b commit 43fd1d7
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 4 deletions.
6 changes: 6 additions & 0 deletions doc/manpages/qubesd-query.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
-----------

Expand Down
29 changes: 25 additions & 4 deletions qubes/tools/qubesd_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
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',
Expand All @@ -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'))
Expand All @@ -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()

Expand All @@ -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())

0 comments on commit 43fd1d7

Please sign in to comment.