tools: terminate qvm-start-gui when X server is terminated

qvm-start-gui lifecycle should be bound to X server lifecycle. It should
be restarted when user logoff and login again, at least to start
gui-daemons again.
Do that by opening a connection to X server and reacting to breaking
that socket.

Fixes QubesOS/qubes-issues#3147
This commit is contained in:
Marek Marczykowski-Górecki 2018-02-26 22:11:25 +01:00
parent aea2dc0790
commit 9bf404f7bf
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
3 changed files with 18 additions and 2 deletions

View File

@ -8,3 +8,4 @@ python-daemon
mock mock
lxml lxml
PyYAML PyYAML
xcffib

View File

@ -23,10 +23,10 @@
import os import os
import signal import signal
import subprocess import subprocess
import asyncio import asyncio
import re import re
import xcffib
import xcffib.xproto # pylint: disable=unused-import
import daemon.pidfile import daemon.pidfile
import qubesadmin import qubesadmin
@ -346,6 +346,14 @@ class GUILauncher(object):
events.add_handler('connection-established', events.add_handler('connection-established',
self.on_connection_established) self.on_connection_established)
def x_reader(conn, callback):
'''Try reading something from X connection to check if it's still alive.
In case it isn't, call *callback*.
'''
try:
conn.poll_for_event()
except xcffib.ConnectionException:
callback()
if 'XDG_RUNTIME_DIR' in os.environ: if 'XDG_RUNTIME_DIR' in os.environ:
pidfile_path = os.path.join(os.environ['XDG_RUNTIME_DIR'], pidfile_path = os.path.join(os.environ['XDG_RUNTIME_DIR'],
@ -394,10 +402,15 @@ def main(args=None):
loop.add_signal_handler(signal.SIGHUP, loop.add_signal_handler(signal.SIGHUP,
launcher.send_monitor_layout_all) launcher.send_monitor_layout_all)
conn = xcffib.connect()
x_fd = conn.get_file_descriptor()
loop.add_reader(x_fd, x_reader, conn, events_listener.cancel)
try: try:
loop.run_until_complete(events_listener) loop.run_until_complete(events_listener)
except asyncio.CancelledError: except asyncio.CancelledError:
pass pass
loop.remove_reader(x_fd)
loop.stop() loop.stop()
loop.run_forever() loop.run_forever()
loop.close() loop.close()

View File

@ -46,6 +46,7 @@ Summary: Python34 module qubesadmin
Requires: python-daemon Requires: python-daemon
Requires: python34-docutils Requires: python34-docutils
Requires: python34-lxml Requires: python34-lxml
Requires: python34-xcffib
Conflicts: qubes-manager < 4.0.6 Conflicts: qubes-manager < 4.0.6
%description -n python34-qubesadmin %description -n python34-qubesadmin
@ -56,6 +57,7 @@ Summary: Python3 module qubesadmin
Requires: python3-daemon Requires: python3-daemon
Requires: python3-docutils Requires: python3-docutils
Requires: python3-lxml Requires: python3-lxml
Requires: python3-xcffib
Conflicts: qubes-manager < 4.0.6 Conflicts: qubes-manager < 4.0.6
%description -n python3-qubesadmin %description -n python3-qubesadmin