Skip to content

Commit 924ab70

Browse files
committed
Allow GUIVM clients to know if GUIVM has session
Or if GUID of the client can be found on the server. This script is replicated on qubes-core-qrexec. For: QubesOS/qubes-notification-proxy#13 For: QubesOS/qubes-gui-agent-linux#251 For: QubesOS/qubes-core-admin#757 For: QubesOS/qubes-issues#1512 For: QubesOS/qubes-issues#9940 Fixes: QubesOS/qubes-issues#10443
1 parent 1f542b7 commit 924ab70

File tree

1 file changed

+81
-7
lines changed

1 file changed

+81
-7
lines changed

qubes-rpc/qubes.WaitForSession

Lines changed: 81 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,87 @@
11
#!/bin/sh
2+
#
3+
# If no argument is provided, wait for the session to start.
4+
# If QREXEC_SERVICE_ARGUMENT=guid, wait for QREXEC_REMOTE_DOMAIN's GUID.
5+
26
set -eu
37

4-
if test "$(qubesdb-read --default=True /qubes-gui-enabled)" = "True"; then
5-
user="$(qubesdb-read /default-user || echo 'user')"
6-
while ! [ -e "/var/run/qubes/qrexec-server.$user.sock" ]; do
7-
sleep 0.1
8+
# Waits for qubes-guid to become available for a given domain.
9+
wait_client_guid(){
10+
qube="${1-}"
11+
if test -z "$qube"; then
12+
echo "QREXEC_REMOTE_DOMAIN variable needs to be set" >&2
13+
exit 1
14+
fi
15+
16+
prefix="/var/run/qubes"
17+
if test "$in_dom0" = "true"; then
18+
qrexec_name_sock="$prefix/qrexec.$qube"
19+
if ! test -L "$qrexec_name_sock"; then
20+
echo "$0: $qrexec_name_sock not found, domain might be dead" >&2
21+
exit 1
22+
fi
23+
qrexec_id_sock="$(readlink -e "$qrexec_name_sock")"
24+
if test -z "$qrexec_id_sock"; then
25+
echo "$0: readlink failed for $qrexec_name_sock" >&2
26+
exit 1
27+
fi
28+
xid="${qrexec_id_sock##*/qrexec.}"
29+
guid_running="${qrexec_id_sock%/*}/guid-running.$xid"
30+
else
31+
xid="$(qvm-prefs -- "$qube" xid)"
32+
guid_running="$(readlink -e "$prefix/guid-running.$xid")"
33+
fi
34+
35+
while true; do
36+
if test -f "$guid_running"; then
37+
break
38+
fi
39+
40+
if test "$in_dom0" = "true" && ! test -e "$qrexec_id_sock"; then
41+
echo "$0: $qrexec_id_sock not found, domain might be dead" >&2
42+
exit 1
43+
fi
44+
45+
sleep 0.5
846
done
9-
fi
47+
exit 0
48+
}
49+
50+
# Wait for our session to complete.
51+
wait_self_session(){
52+
if ! test "$in_dom0" = "true" &&
53+
test "$(qubesdb-read --default=True /qubes-gui-enabled)" = "True"
54+
then
55+
user="$(qubesdb-read /default-user || echo 'user')"
56+
while ! test -e "/var/run/qubes/qrexec-server.$user.sock"; do
57+
sleep 0.1
58+
done
59+
fi
60+
61+
true "${XDG_RUNTIME_DIR:="/run/user/$(id -u)"}"
62+
true "${DBUS_SESSION_BUS_ADDRESS:="unix:path=${XDG_RUNTIME_DIR}/bus"}"
63+
export DBUS_SESSION_BUS_ADDRESS
64+
systemctl --user --wait --quiet is-system-running
65+
exit 0
66+
}
1067

11-
systemctl --user --wait --quiet is-system-running
68+
main(){
69+
arg="${QREXEC_SERVICE_ARGUMENT-}"
70+
client="${QREXEC_REMOTE_DOMAIN-}"
71+
in_dom0=""
72+
if command -v qrexec-client >/dev/null; then
73+
in_dom0="true"
74+
fi
75+
case "${arg}" in
76+
guid)
77+
wait_client_guid "$client"
78+
;;
79+
"")
80+
wait_self_session
81+
;;
82+
*)
83+
echo "Invalid argument, only allowed value is 'guid'" >&2
84+
esac
85+
}
1286

13-
exit 0
87+
main

0 commit comments

Comments
 (0)