annotate libervia/cli/cmd_remote_control.py @ 4306:94e0968987cd

plugin XEP-0033: code modernisation, improve delivery, data validation: - Code has been rewritten using Pydantic models and `async` coroutines for data validation and cleaner element parsing/generation. - Delivery has been completely rewritten. It now works even if server doesn't support multicast, and send to local multicast service first. Delivering to local multicast service first is due to bad support of XEP-0033 in server (notably Prosody which has an incomplete implementation), and the current impossibility to detect if a sub-domain service handles fully multicast or only for local domains. This is a workaround to have a good balance between backward compatilibity and use of bandwith, and to make it work with the incoming email gateway implementation (the gateway will only deliver to entities of its own domain). - disco feature checking now uses `async` corountines. `host` implementation still use Deferred return values for compatibility with legacy code. rel 450
author Goffi <goffi@goffi.org>
date Thu, 26 Sep 2024 16:12:01 +0200
parents 0d7bb4df2343
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4243
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
3
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Libervia CLI
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
11
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
16
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
19
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 import asyncio
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from functools import partial
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 import logging
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 import xml.etree.ElementTree as ET
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
25
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from prompt_toolkit.input import Input, create_input
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from prompt_toolkit.key_binding import KeyPress
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from prompt_toolkit.keys import Keys
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 from prompt_toolkit.patch_stdout import patch_stdout
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from prompt_toolkit import PromptSession
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
31
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from libervia.backend.core import exceptions
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 from libervia.backend.core.i18n import _
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 from libervia.backend.tools.common import data_format
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 from libervia.cli.constants import Const as C
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 from libervia.frontends.tools import aio, jid
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 from libervia.frontends.tools.webrtc_remote_control import WebRTCRemoteController
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
38
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 from . import base
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 from . import xmlui_manager
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
41
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 __commands__ = ["RemoteControl"]
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
43
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
44
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 class Send(base.CommandBase):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 def __init__(self, host):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 super(Send, self).__init__(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 host,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 "send",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 use_progress=True,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 use_verbose=True,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 help=_("remote control another device"),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 self.remote_controller: WebRTCRemoteController | None = None
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
55
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 def add_parser_options(self):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 self.parser.add_argument("jid", help=_("the destination jid"))
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
58
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 def send_key(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 self,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 key: str,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 code: str,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 ctrl_key: bool = False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 shift_key: bool = False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 alt_key: bool = False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 meta_key: bool = False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 ) -> None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 """
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 Send the key press input.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
70
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 @param key: The key pressed.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 @param code: The code of the key pressed.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 @param ctrl_key: Whether the Ctrl key was pressed.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 @param shift_key: Whether the Shift key was pressed.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 @param alt_key: Whether the Alt key was pressed.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 @param meta_key: Whether the Meta key was pressed.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 """
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 assert self.remote_controller is not None
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 event_data = {
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 "key": key,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 "code": code,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 "ctrlKey": ctrl_key,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 "shiftKey": shift_key,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 "altKey": alt_key,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 "metaKey": meta_key,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 }
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 # we send both events as we don't distinguish them.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 for evt_type in ["keydown", "keyup"]:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 key_data = {"type": evt_type, **event_data}
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 self.remote_controller.send_input(key_data)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 print(f"Sending {key_data}")
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
92
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 def handle_key_press(self, key_press: KeyPress) -> None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 """Handle key press event."""
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 key = key_press.key
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 if key.startswith("c-"):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 key = key[2:] # remove "c-" prefix
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 elif key.startswith("s-"):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 key = key[2:] # remove "s-" prefix
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 self.send_key(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 key=key.lower(),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 # FIXME: handle properly code.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 code=key.lower(),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 ctrl_key=key_press.key.startswith("c-"),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
105 shift_key=key_press.key.startswith("s-") or key.isupper(),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 # FIXME: alt-key is translated to escape + key, see
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 # https://python-prompt-toolkit.readthedocs.io/en/master/pages/advanced_topics/key_bindings.html
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 alt_key=False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 # TODO
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 meta_key=False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
112
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 def on_keys_ready(self, input_: Input, handle_key_fut: asyncio.Future) -> None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 for key_press in input_.read_keys():
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 if key_press.key == Keys.ControlC:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 handle_key_fut.set_exception(KeyboardInterrupt())
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 else:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 self.handle_key_press(key_press)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
119
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 async def confirm_ctrl_c(self) -> bool:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 """Ask user if they want to send Ctrl-C event or quit."""
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 session = PromptSession()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 with patch_stdout():
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 while True:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 response = await session.prompt_async(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 "Ctrl-C pressed. Send event (e) or quit (q)? (e/q): "
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 if response.lower() == "e":
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 return True
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 elif response.lower() == "q":
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 return False
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
132
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 async def handle_ctrl_c(self) -> None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 """Handle Ctrl-C key press."""
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 if await self.confirm_ctrl_c():
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 self.send_key(key="c", code="c", ctrl_key=True)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 else:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 await self.host.a_quit()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
139
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 async def _on_open(self, remote_controller: WebRTCRemoteController) -> None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 input_ = create_input()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 self.disp(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 "Connection with peer established. Your keyboard input will be sent to "
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 "controlled device."
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
146
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 while True:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 handle_key_fut = asyncio.Future()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 try:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 with input_.raw_mode():
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 with input_.attach(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 partial(self.on_keys_ready, input_, handle_key_fut)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 ):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 await handle_key_fut
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 except KeyboardInterrupt:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 await self.handle_ctrl_c()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
157
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 async def start(self):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 root_logger = logging.getLogger()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 # we don't want any formatting for messages from webrtc
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 for handler in root_logger.handlers:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 handler.setFormatter(None)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 if self.verbosity == 0:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 root_logger.setLevel(logging.ERROR)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 if self.verbosity >= 1:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 root_logger.setLevel(logging.WARNING)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 if self.verbosity >= 2:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 root_logger.setLevel(logging.DEBUG)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
169
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 aio.install_glib_asyncio_iteration()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 self.remote_controller = WebRTCRemoteController(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 self.host.bridge, self.profile, end_call_cb=self.host.a_quit
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 await self.remote_controller.start(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 self.args.jid, {"devices": {"keyboard": {}}}, on_open_cb=self._on_open
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
176 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
177
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
178
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 class Receive(base.CommandAnswering):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 def __init__(self, host):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 super().__init__(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 host,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 "receive",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 use_verbose=True,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 help=_("be remote controlled by another device"),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 self.action_callbacks = {
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 C.META_TYPE_CONFIRM: self.on_confirm_action,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 C.META_TYPE_NOT_IN_ROSTER_LEAK: self.on_confirm_action,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 C.META_TYPE_REMOTE_CONTROL: self.on_remote_control_action,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 }
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
192 self.receiver = None
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
193
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 def add_parser_options(self):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 self.parser.add_argument(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 "-S",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 "--share-screen",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 choices=["yes", "no", "auto"],
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 default="auto",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
200 help=_("share the screen (default: auto)"),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 self.parser.add_argument(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 "jids",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
204 nargs="+",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 help=_("jids accepted automatically"),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
206 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
207
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
208 async def start_webrtc(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
209 self, from_jid: jid.JID, session_id: str, screenshare: dict, devices: dict
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
210 ) -> None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
211 """Start the WebRTC workflown"""
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 assert self.receiver is not None
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
213 root_logger = logging.getLogger()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
214 # we don't want any formatting for messages from webrtc
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
215 for handler in root_logger.handlers:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
216 handler.setFormatter(None)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 if self.verbosity == 0:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
218 root_logger.setLevel(logging.ERROR)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
219 if self.verbosity >= 1:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 root_logger.setLevel(logging.WARNING)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 if self.verbosity >= 2:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
222 root_logger.setLevel(logging.DEBUG)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
223 await self.receiver.start_receiving(from_jid, session_id, screenshare)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
224
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
225 def get_xmlui_id(self, action_data):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
226 # FIXME: we temporarily use ElementTree, but a real XMLUI managing module
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
227 # should be available in the futur
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
228 # TODO: XMLUI module
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
229 try:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 xml_ui = action_data["xmlui"]
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
231 except KeyError:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 self.disp(_("Action has no XMLUI"), 1)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 else:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 ui = ET.fromstring(xml_ui.encode("utf-8"))
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 xmlui_id = ui.get("submit")
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
236 if not xmlui_id:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 self.disp(_("Invalid XMLUI received"), error=True)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 return xmlui_id
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
239
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
240 async def get_confirmation(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 self, action_data: dict, pre_accepted: bool = False
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 ) -> tuple[str, jid.JID, bool]:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
243 """Check if action is confirmed, and ask user otherwise
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
244
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
245 @param action_data: Data as used in on_action_new.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 @return: a tuple with:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
247 - XMLUI ID
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 - sender JID
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 - confirmation boolean
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 """
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 xmlui_id = self.get_xmlui_id(action_data)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 if xmlui_id is None:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 self.disp("Internal ERROR: xmlui_id missing", error=True)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
254 raise exceptions.InternalError()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 if (
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 action_data["type"] != C.META_TYPE_REMOTE_CONTROL
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 and action_data.get("subtype") != C.META_TYPE_REMOTE_CONTROL
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
258 ):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
259 self.disp(_("Ignoring confirm dialog unrelated to remote control."), 1)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
260 raise exceptions.CancelError
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 try:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 from_jid = jid.JID(action_data["from_jid"])
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 except ValueError:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
264 self.disp(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 _('invalid "from_jid" value received, ignoring: {value}').format(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 value=action_data["from_jid"]
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 ),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 error=True,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 raise exceptions.DataError
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 except KeyError:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
272 self.disp(_('ignoring action without "from_jid" value'), error=True)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 raise exceptions.DataError
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
274
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
275 self.disp(_("Confirmation needed for request from an entity not in roster"), 1)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
276
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 if pre_accepted:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 # Session has already been accepted during pre-flight.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 confirmed = True
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
280 elif action_data["type"] == C.META_TYPE_CONFIRM and not self.bare_jids:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
281 # Sender is in roster, and we have an "accept all" policy.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
282 confirmed = True
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
283 self.disp(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
284 _(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
285 f"{from_jid} automatically confirmed due to entity being in roster"
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
286 " and accept all policy."
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
287 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 elif from_jid.bare in self.bare_jids:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
290 # If the sender is expected, we can confirm the session.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 confirmed = True
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
292 self.disp(_("Sender confirmed because they are explicitly expected"), 1)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
293 else:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 # Not automatically accepted, we ask authorisation to the user.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
295 xmlui = xmlui_manager.create(self.host, action_data["xmlui"])
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
296 confirmed = await self.host.confirm(xmlui.dlg.message)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
297 return xmlui_id, from_jid, confirmed
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
298
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
299 async def on_confirm_action(self, action_data, action_id, security_limit, profile):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 """Handle pre-flight remote control request"""
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 try:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 xmlui_id, from_jid, confirmed = await self.get_confirmation(action_data)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 except exceptions.InternalError:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 self.host.quit_from_signal(1)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
305 return
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 except (exceptions.InternalError, exceptions.DataError):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 return
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 xmlui_data = {"answer": C.bool_const(confirmed)}
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 await self.host.bridge.action_launch(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 xmlui_id, data_format.serialise(xmlui_data), profile_key=profile
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
311 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 if not confirmed:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
313 self.disp(_("Session refused for {from_jid}").format(from_jid=from_jid))
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 self.host.quit_from_signal(0)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
315
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
316 async def on_remote_control_action(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
317 self, action_data, action_id, security_limit, profile
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
318 ):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 """Handles actual remote control request"""
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
320 try:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
321 session_id = action_data["session_id"]
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
322 except KeyError:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
323 self.disp(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 f"Internal Error: Session ID is missing in action data: {action_data=}",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 error=True,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 return
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
328 pre_accepted = action_data.get("pre_accepted", False)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
329 try:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
330 xmlui_id, from_jid, confirmed = await self.get_confirmation(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
331 action_data, pre_accepted
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 except exceptions.InternalError:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
334 self.host.quit_from_signal(1)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
335 return
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 except (exceptions.InternalError, exceptions.DataError):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
337 return
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
338 if confirmed:
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 await self.start_webrtc(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
340 from_jid,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
341 session_id,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
342 action_data.get("screenshare", {}),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
343 action_data.get("devices", {}),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
345 xmlui_data = {"answer": C.bool_const(confirmed)}
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 await self.host.bridge.action_launch(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
347 xmlui_id, data_format.serialise(xmlui_data), profile_key=profile
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
348 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
349
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
350 async def start(self):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
351 self.bare_jids = [jid.JID(jid_).bare for jid_ in self.args.jids]
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
352 from libervia.frontends.tools.webrtc_remote_control import (
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
353 WebRTCRemoteControlReceiver,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
354 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
355
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
356 self.receiver = WebRTCRemoteControlReceiver(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
357 self.host.bridge,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
358 self.profile,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
359 on_close_cb=self.host.a_quit,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 verbose=self.verbosity >= 1,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 )
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 aio.install_glib_asyncio_iteration()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
363 # FIXME: for now AUTO always do the screen sharing, but is should be disabled and
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 # appropriate method should be used when no desktop environment is detected.
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 with_screen_sharing = self.args.share_screen in ("yes", "auto")
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4243
diff changeset
366 await self.receiver.request_remote_desktop(with_screen_sharing)
4243
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
367
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
368 self.disp(_("Waiting for controlling device…"))
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 await self.start_answering()
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
370
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
371
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
372 class RemoteControl(base.CommandBase):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
373 subcommands = (Send, Receive)
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
374
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
375 def __init__(self, host):
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
376 super().__init__(
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
377 host,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
378 "remote-control",
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 use_profile=False,
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
380 help=_("Control or be controlled by another device."),
e47e29511d57 cli (remote-control): new `remote-control` command:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 )