Support per-`ib.vnc_addrs` vnc passwords
Such that the `brokers.toml` can contain any of the following <port> = dict|tuple styles, ```toml [ib.vnc_addrs] 4002 = {host = 'localhost', port = 5900, pw = 'doggy'} # host, port, pw 4002 = {host = 'localhost', port = 5900} # host, port, pw 4002 = ['localhost', 5900] # host, port, pw ``` With the first line demonstrating a vnc-server password (as normally set via a `.env` file in the `dockering/ib/` subdir) with the `pw =` field. This obviously removes the hardcoded `'doggy'` password from prior. Impl details in `.brokers.ib._util`: - pass the `ib.api.Client` down into `vnc_click_hack()` doing all config reading within and removing host, port unpacking in the callingn `data_reset_hack()`. - also pass the client `try_xdo_manual()` and comment (with plans to remove) the recently added localhost-only fallback section since we now have a fully working py vnc client again with `pyvnc` B) - in `vnc_click_hack()` match for all the possible config line styles and, * pass any `pw` field to `pyvncVNCConfig`, * continue matching host, port without password, * fallthrough to raising a val-err when neither ^ match.hist_backfill_fixes
parent
cca2b14548
commit
d89d2a0c04
|
@ -38,7 +38,6 @@ from piker.brokers._util import get_logger
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .api import Client
|
from .api import Client
|
||||||
from ib_insync import IB
|
|
||||||
import i3ipc
|
import i3ipc
|
||||||
|
|
||||||
log = get_logger('piker.brokers.ib')
|
log = get_logger('piker.brokers.ib')
|
||||||
|
@ -62,7 +61,7 @@ no_setup_msg:str = (
|
||||||
|
|
||||||
|
|
||||||
def try_xdo_manual(
|
def try_xdo_manual(
|
||||||
vnc_sockaddr: str,
|
client: Client,
|
||||||
):
|
):
|
||||||
'''
|
'''
|
||||||
Do the "manual" `xdo`-based screen switch + click
|
Do the "manual" `xdo`-based screen switch + click
|
||||||
|
@ -79,6 +78,7 @@ def try_xdo_manual(
|
||||||
_reset_tech = 'i3ipc_xdotool'
|
_reset_tech = 'i3ipc_xdotool'
|
||||||
return True
|
return True
|
||||||
except OSError:
|
except OSError:
|
||||||
|
vnc_sockaddr: str = client.conf.vnc_addrs
|
||||||
log.exception(
|
log.exception(
|
||||||
no_setup_msg.format(vnc_sockaddr=vnc_sockaddr)
|
no_setup_msg.format(vnc_sockaddr=vnc_sockaddr)
|
||||||
)
|
)
|
||||||
|
@ -86,7 +86,6 @@ def try_xdo_manual(
|
||||||
|
|
||||||
|
|
||||||
async def data_reset_hack(
|
async def data_reset_hack(
|
||||||
# vnc_host: str,
|
|
||||||
client: Client,
|
client: Client,
|
||||||
reset_type: Literal['data', 'connection'],
|
reset_type: Literal['data', 'connection'],
|
||||||
|
|
||||||
|
@ -118,36 +117,24 @@ async def data_reset_hack(
|
||||||
that need to be wrangle.
|
that need to be wrangle.
|
||||||
|
|
||||||
'''
|
'''
|
||||||
ib_client: IB = client.ib
|
|
||||||
|
|
||||||
# look up any user defined vnc socket address mapped from
|
# look up any user defined vnc socket address mapped from
|
||||||
# a particular API socket port.
|
# a particular API socket port.
|
||||||
api_port: str = str(ib_client.client.port)
|
vnc_addrs: tuple[str]|None = client.conf.get('vnc_addrs')
|
||||||
vnc_host: str
|
if not vnc_addrs:
|
||||||
vnc_port: int
|
|
||||||
vnc_sockaddr: tuple[str] | None = client.conf.get('vnc_addrs')
|
|
||||||
|
|
||||||
if not vnc_sockaddr:
|
|
||||||
log.warning(
|
log.warning(
|
||||||
no_setup_msg.format(vnc_sockaddr=vnc_sockaddr)
|
no_setup_msg.format(vnc_sockaddr=client.conf)
|
||||||
+
|
+
|
||||||
'REQUIRES A `vnc_addrs: array` ENTRY'
|
'REQUIRES A `vnc_addrs: array` ENTRY'
|
||||||
)
|
)
|
||||||
|
|
||||||
vnc_host, vnc_port = vnc_sockaddr.get(
|
|
||||||
api_port,
|
|
||||||
('localhost', 3003)
|
|
||||||
)
|
|
||||||
global _reset_tech
|
global _reset_tech
|
||||||
|
|
||||||
match _reset_tech:
|
match _reset_tech:
|
||||||
case 'vnc':
|
case 'vnc':
|
||||||
try:
|
try:
|
||||||
await tractor.to_asyncio.run_task(
|
await tractor.to_asyncio.run_task(
|
||||||
partial(
|
partial(
|
||||||
vnc_click_hack,
|
vnc_click_hack,
|
||||||
host=vnc_host,
|
client=client,
|
||||||
port=vnc_port,
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except (
|
except (
|
||||||
|
@ -158,29 +145,31 @@ async def data_reset_hack(
|
||||||
import i3ipc # noqa (since a deps dynamic check)
|
import i3ipc # noqa (since a deps dynamic check)
|
||||||
except ModuleNotFoundError:
|
except ModuleNotFoundError:
|
||||||
log.warning(
|
log.warning(
|
||||||
no_setup_msg.format(vnc_sockaddr=vnc_sockaddr)
|
no_setup_msg.format(vnc_sockaddr=client.conf)
|
||||||
)
|
)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if vnc_host not in {
|
# XXX, Xorg only workaround..
|
||||||
'localhost',
|
# TODO? remove now that we have `pyvnc`?
|
||||||
'127.0.0.1',
|
# if vnc_host not in {
|
||||||
}:
|
# 'localhost',
|
||||||
focussed, matches = i3ipc_fin_wins_titled()
|
# '127.0.0.1',
|
||||||
if not matches:
|
# }:
|
||||||
log.warning(
|
# focussed, matches = i3ipc_fin_wins_titled()
|
||||||
no_setup_msg.format(vnc_sockaddr=vnc_sockaddr)
|
# if not matches:
|
||||||
)
|
# log.warning(
|
||||||
return False
|
# no_setup_msg.format(vnc_sockaddr=vnc_sockaddr)
|
||||||
else:
|
# )
|
||||||
try_xdo_manual(vnc_sockaddr)
|
# return False
|
||||||
|
# else:
|
||||||
|
# try_xdo_manual(vnc_sockaddr)
|
||||||
|
|
||||||
# localhost but no vnc-client or it borked..
|
# localhost but no vnc-client or it borked..
|
||||||
else:
|
else:
|
||||||
try_xdo_manual(vnc_sockaddr)
|
try_xdo_manual(client)
|
||||||
|
|
||||||
case 'i3ipc_xdotool':
|
case 'i3ipc_xdotool':
|
||||||
try_xdo_manual(vnc_sockaddr)
|
try_xdo_manual(client)
|
||||||
# i3ipc_xdotool_manual_click_hack()
|
# i3ipc_xdotool_manual_click_hack()
|
||||||
|
|
||||||
case _ as tech:
|
case _ as tech:
|
||||||
|
@ -191,15 +180,55 @@ async def data_reset_hack(
|
||||||
|
|
||||||
|
|
||||||
async def vnc_click_hack(
|
async def vnc_click_hack(
|
||||||
host: str,
|
client: Client,
|
||||||
port: int,
|
reset_type: str = 'data',
|
||||||
reset_type: str = 'data'
|
pw: str|None = None,
|
||||||
|
|
||||||
) -> None:
|
) -> None:
|
||||||
'''
|
'''
|
||||||
Reset the data or network connection for the VNC attached
|
Reset the data or network connection for the VNC attached
|
||||||
ib-gateway using a (magic) keybinding combo.
|
ib-gateway using a (magic) keybinding combo.
|
||||||
|
|
||||||
|
A vnc-server password can be set either by an input `pw` param or
|
||||||
|
set in the client's config with the latter loaded from the user's
|
||||||
|
`brokers.toml` in a vnc-addrs-port-mapping section,
|
||||||
|
|
||||||
|
.. code:: toml
|
||||||
|
|
||||||
|
[ib.vnc_addrs]
|
||||||
|
4002 = {host = 'localhost', port = 5900, pw = 'doggy'}
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
api_port: str = str(client.client.port)
|
||||||
|
conf: dict = client.conf
|
||||||
|
vnc_addrs: dict[int, tuple] = conf.get('vnc_addrs')
|
||||||
|
if not vnc_addrs:
|
||||||
|
return None
|
||||||
|
|
||||||
|
addr_entry: dict|tuple = vnc_addrs.get(
|
||||||
|
api_port,
|
||||||
|
('localhost', 5900) # a typical default
|
||||||
|
)
|
||||||
|
if pw is None:
|
||||||
|
match addr_entry:
|
||||||
|
case (
|
||||||
|
host,
|
||||||
|
port,
|
||||||
|
):
|
||||||
|
pass
|
||||||
|
|
||||||
|
case {
|
||||||
|
'host': host,
|
||||||
|
'port': port,
|
||||||
|
'pw': pw
|
||||||
|
}:
|
||||||
|
pass
|
||||||
|
|
||||||
|
case _:
|
||||||
|
raise ValueError(
|
||||||
|
f'Invalid `ib.vnc_addrs` entry ?\n'
|
||||||
|
f'{addr_entry!r}\n'
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
from pyvnc import (
|
from pyvnc import (
|
||||||
AsyncVNCClient,
|
AsyncVNCClient,
|
||||||
|
@ -226,7 +255,7 @@ async def vnc_click_hack(
|
||||||
VNCConfig(
|
VNCConfig(
|
||||||
host=host,
|
host=host,
|
||||||
port=port,
|
port=port,
|
||||||
password='doggy',
|
password=pw,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
async with client:
|
async with client:
|
||||||
|
|
Loading…
Reference in New Issue