tools: add qvm-start-gui --notify-monitor-layout option

This is mostly what 'qubes-monitor-layout-notify' tool did in Qubes 3.2.
This commit is contained in:
Marek Marczykowski-Górecki 2017-04-21 15:05:20 +02:00
parent bf053769bf
commit 8eed508864
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724

View File

@ -28,6 +28,7 @@ import asyncio
import re
import daemon.pidfile
import qubesmgmt
import qubesmgmt.events
import qubesmgmt.tools
@ -310,10 +311,21 @@ class GUILauncher(object):
self.on_connection_established)
if 'XDG_RUNTIME_DIR' in os.environ:
pidfile_path = os.path.join(os.environ['XDG_RUNTIME_DIR'],
'qvm-start-gui.pid')
else:
pidfile_path = os.path.join(os.environ.get('HOME', '/'),
'.qvm-start-gui.pid')
parser = qubesmgmt.tools.QubesArgumentParser(
description='forceful shutdown of a domain', vmname_nargs='*')
parser.add_argument('--watch', action='store_true',
help='Keep watching for further domains startups, must be used with --all')
parser.add_argument('--pidfile', action='store', default=pidfile_path,
help='Pidfile path to create in --watch mode')
parser.add_argument('--notify-monitory-layout', action='store_true',
help='Notify running instance in --watch mode about changed monitor layout')
def main(args=None):
@ -321,27 +333,39 @@ def main(args=None):
args = parser.parse_args(args)
if args.watch and not args.all_domains:
parser.error('--watch option must be used with --all')
if args.watch and args.notify_monitor_layout:
parser.error('--watch cannot be used with --notify-monitor-layout')
launcher = GUILauncher(args.app)
if args.watch:
loop = asyncio.get_event_loop()
events = qubesmgmt.events.EventsDispatcher(args.app)
launcher.register_events(events)
with daemon.pidfile.TimeoutPIDLockFile(args.pidfile):
loop = asyncio.get_event_loop()
events = qubesmgmt.events.EventsDispatcher(args.app)
launcher.register_events(events)
events_listener = asyncio.ensure_future(events.listen_for_events())
events_listener = asyncio.ensure_future(events.listen_for_events())
for signame in ('SIGINT', 'SIGTERM'):
loop.add_signal_handler(getattr(signal, signame),
events_listener.cancel) # pylint: disable=no-member
for signame in ('SIGINT', 'SIGTERM'):
loop.add_signal_handler(getattr(signal, signame),
events_listener.cancel) # pylint: disable=no-member
loop.add_signal_handler(signal.SIGHUP, launcher.send_monitor_layout_all)
loop.add_signal_handler(signal.SIGHUP,
launcher.send_monitor_layout_all)
try:
loop.run_until_complete(events_listener)
except asyncio.CancelledError:
pass
loop.stop()
loop.run_forever()
loop.close()
elif args.notify_monitor_layout:
try:
loop.run_until_complete(events_listener)
except asyncio.CancelledError:
pass
loop.stop()
loop.run_forever()
loop.close()
with open(pidfile_path, 'r') as pidfile:
pid = int(pidfile.read().strip())
os.kill(pid, signal.SIGHUP)
except (FileNotFoundError, ValueError) as e:
parser.error('Cannot open pidfile {}: {}'.format(pidfile_path,
str(e)))
else:
loop = asyncio.get_event_loop()
tasks = []