qubes/tools/qubesd-query: low-level interrogation tool
This commit is contained in:
		
							parent
							
								
									02639b8d02
								
							
						
					
					
						commit
						249d8c08e2
					
				| @ -292,6 +292,9 @@ man_pages = [ | |||||||
| 
 | 
 | ||||||
|     ('manpages/qubes-prefs', 'qubes-prefs', |     ('manpages/qubes-prefs', 'qubes-prefs', | ||||||
|         u'Display system-wide Qubes settings', _man_pages_author, 1), |         u'Display system-wide Qubes settings', _man_pages_author, 1), | ||||||
|  | 
 | ||||||
|  |     ('manpages/qubesd-query', 'qubesd-query', | ||||||
|  |         u'Low-level qubesd interrogation tool', _man_pages_author, 1), | ||||||
| ] | ] | ||||||
| 
 | 
 | ||||||
| if os.path.exists('sandbox.rst'): | if os.path.exists('sandbox.rst'): | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								doc/manpages/qubesd-query.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								doc/manpages/qubesd-query.rst
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | .. program:: qubesd-query | ||||||
|  | 
 | ||||||
|  | :program:`qubesd-query` -- low-level qubesd interrogation tool | ||||||
|  | ============================================================== | ||||||
|  | 
 | ||||||
|  | Synopsis | ||||||
|  | -------- | ||||||
|  | 
 | ||||||
|  | :command:`qubesd-query` [-h] [--connect *PATH*] *SRC* *METHOD* *DEST* [*ARGUMENT*] | ||||||
|  | 
 | ||||||
|  | Options | ||||||
|  | ------- | ||||||
|  | 
 | ||||||
|  | .. option:: --help, -h | ||||||
|  | 
 | ||||||
|  |    Show the help message and exit. | ||||||
|  | 
 | ||||||
|  | .. option:: --connect=PATH, -c PATH | ||||||
|  | 
 | ||||||
|  |    Change path to qubesd UNIX socket from default. | ||||||
|  | 
 | ||||||
|  | .. option:: --empty, -e | ||||||
|  | 
 | ||||||
|  |    Send empty payload. Do not attempt to read anything from standard input, but | ||||||
|  |    send the request immediately. | ||||||
|  | 
 | ||||||
|  | Description | ||||||
|  | ----------- | ||||||
|  | 
 | ||||||
|  | This tool is used to directly invoke qubesd. The parameters of RPC call shall be | ||||||
|  | given as arguments to the command. Payload should be written to standard input. | ||||||
|  | Result can be read from standard output. | ||||||
|  | 
 | ||||||
|  | Authors | ||||||
|  | ------- | ||||||
|  | 
 | ||||||
|  | | Joanna Rutkowska <joanna at invisiblethingslab dot com> | ||||||
|  | | Rafal Wojtczuk <rafal at invisiblethingslab dot com> | ||||||
|  | | Marek Marczykowski <marmarek at invisiblethingslab dot com> | ||||||
|  | | Wojtek Porczyk <woju at invisiblethingslab dot com> | ||||||
|  | 
 | ||||||
|  | .. vim: ts=3 sw=3 et tw=80 | ||||||
| @ -1,4 +1,4 @@ | |||||||
| #!/usr/bin/python | #!/usr/bin/python3 | ||||||
| 
 | 
 | ||||||
| import os | import os | ||||||
| import sys | import sys | ||||||
|  | |||||||
							
								
								
									
										86
									
								
								qubes/tools/qubesd_query.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								qubes/tools/qubesd_query.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | |||||||
|  | #!/usr/bin/env python3.6 | ||||||
|  | # pylint: disable=deprecated-method | ||||||
|  | 
 | ||||||
|  | import argparse | ||||||
|  | import asyncio | ||||||
|  | import signal | ||||||
|  | import sys | ||||||
|  | 
 | ||||||
|  | QUBESD_SOCK = '/var/run/qubesd.sock' | ||||||
|  | 
 | ||||||
|  | try: | ||||||
|  |     asyncio.ensure_future | ||||||
|  | except AttributeError: | ||||||
|  |     asyncio.ensure_future = asyncio.async | ||||||
|  | 
 | ||||||
|  | parser = argparse.ArgumentParser( | ||||||
|  |     description='low-level qubesd interrogation tool') | ||||||
|  | 
 | ||||||
|  | parser.add_argument('--connect', '-c', metavar='PATH', | ||||||
|  |     dest='socket', | ||||||
|  |     default=QUBESD_SOCK, | ||||||
|  |     help='path to qubesd UNIX socket (default: %(default)s)') | ||||||
|  | 
 | ||||||
|  | parser.add_argument('--empty', '-e', | ||||||
|  |     dest='payload', | ||||||
|  |     action='store_false', default=True, | ||||||
|  |     help='do not read from stdin and send empty payload') | ||||||
|  | 
 | ||||||
|  | parser.add_argument('src', metavar='SRC', | ||||||
|  |     help='source qube') | ||||||
|  | parser.add_argument('method', metavar='METHOD', | ||||||
|  |     help='method name') | ||||||
|  | parser.add_argument('dest', metavar='DEST', | ||||||
|  |     help='destination qube') | ||||||
|  | parser.add_argument('arg', metavar='ARGUMENT', | ||||||
|  |     nargs='?', default='', | ||||||
|  |     help='argument to method') | ||||||
|  | 
 | ||||||
|  | def sighandler(loop, signame, coro): | ||||||
|  |     print('caught {}, exiting'.format(signame)) | ||||||
|  |     coro.cancel() | ||||||
|  |     loop.stop() | ||||||
|  | 
 | ||||||
|  | @asyncio.coroutine | ||||||
|  | def qubesd_client(socket, payload, *args): | ||||||
|  |     try: | ||||||
|  |         reader, writer = yield from asyncio.open_unix_connection(socket) | ||||||
|  |     except asyncio.CancelledError: | ||||||
|  |         return | ||||||
|  | 
 | ||||||
|  |     for arg in args: | ||||||
|  |         writer.write(arg.encode('ascii')) | ||||||
|  |         writer.write(b'\0') | ||||||
|  |     writer.write(payload) | ||||||
|  |     writer.write_eof() | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         data = yield from reader.read() | ||||||
|  |         sys.stdout.buffer.write(data)  # pylint: disable=no-member | ||||||
|  |     except asyncio.CancelledError: | ||||||
|  |         return | ||||||
|  |     finally: | ||||||
|  |         writer.close() | ||||||
|  | 
 | ||||||
|  | def main(args=None): | ||||||
|  |     args = parser.parse_args(args) | ||||||
|  |     loop = asyncio.get_event_loop() | ||||||
|  | 
 | ||||||
|  |     # pylint: disable=no-member | ||||||
|  |     payload = sys.stdin.buffer.read() if args.payload else b'' | ||||||
|  |     # pylint: enable=no-member | ||||||
|  | 
 | ||||||
|  |     coro = asyncio.ensure_future(qubesd_client(args.socket, payload, | ||||||
|  |         args.src, args.method, args.dest, args.arg)) | ||||||
|  | 
 | ||||||
|  |     for signame in ('SIGINT', 'SIGTERM'): | ||||||
|  |         loop.add_signal_handler(getattr(signal, signame), | ||||||
|  |             sighandler, loop, signame, coro) | ||||||
|  | 
 | ||||||
|  |     try: | ||||||
|  |         loop.run_until_complete(coro) | ||||||
|  |     finally: | ||||||
|  |         loop.close() | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     main() | ||||||
| @ -208,7 +208,7 @@ fi | |||||||
| /usr/bin/qvm-* | /usr/bin/qvm-* | ||||||
| /usr/bin/qubes-* | /usr/bin/qubes-* | ||||||
| /usr/bin/qmemmand | /usr/bin/qmemmand | ||||||
| /usr/bin/qubesd | /usr/bin/qubesd* | ||||||
| 
 | 
 | ||||||
| %dir %{python3_sitelib}/qubes-*.egg-info | %dir %{python3_sitelib}/qubes-*.egg-info | ||||||
| %{python3_sitelib}/qubes-*.egg-info/* | %{python3_sitelib}/qubes-*.egg-info/* | ||||||
| @ -268,6 +268,7 @@ fi | |||||||
| %{python3_sitelib}/qubes/tools/qubes_monitor_layout_notify.py | %{python3_sitelib}/qubes/tools/qubes_monitor_layout_notify.py | ||||||
| %{python3_sitelib}/qubes/tools/qubes_prefs.py | %{python3_sitelib}/qubes/tools/qubes_prefs.py | ||||||
| %{python3_sitelib}/qubes/tools/qubesd.py | %{python3_sitelib}/qubes/tools/qubesd.py | ||||||
|  | %{python3_sitelib}/qubes/tools/qubesd_query.py | ||||||
| %{python3_sitelib}/qubes/tools/qvm_block.py | %{python3_sitelib}/qubes/tools/qvm_block.py | ||||||
| %{python3_sitelib}/qubes/tools/qvm_backup.py | %{python3_sitelib}/qubes/tools/qvm_backup.py | ||||||
| %{python3_sitelib}/qubes/tools/qvm_backup_restore.py | %{python3_sitelib}/qubes/tools/qvm_backup_restore.py | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Wojtek Porczyk
						Wojtek Porczyk