elsewindow 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- elsewindow/__init__.py +33 -0
- elsewindow/__main__.py +8 -0
- elsewindow/cli.py +204 -0
- elsewindow/config.py +152 -0
- elsewindow/live-cli.yml +94 -0
- elsewindow/live_config.py +429 -0
- elsewindow/profiles.yml +41 -0
- elsewindow/py.typed +1 -0
- elsewindow/session.py +788 -0
- elsewindow-0.1.0.dist-info/METADATA +176 -0
- elsewindow-0.1.0.dist-info/RECORD +15 -0
- elsewindow-0.1.0.dist-info/WHEEL +5 -0
- elsewindow-0.1.0.dist-info/entry_points.txt +2 -0
- elsewindow-0.1.0.dist-info/licenses/LICENSE +21 -0
- elsewindow-0.1.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: elsewindow
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Run one remote Linux GUI application through Xpra over one owned OpenSSH master
|
|
5
|
+
Author: kogeler
|
|
6
|
+
Maintainer: kogeler
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://kogeler.github.io/elsewindow/
|
|
9
|
+
Project-URL: Documentation, https://kogeler.github.io/elsewindow/
|
|
10
|
+
Project-URL: Repository, https://github.com/kogeler/elsewindow
|
|
11
|
+
Project-URL: Issues, https://github.com/kogeler/elsewindow/issues
|
|
12
|
+
Project-URL: Changelog, https://github.com/kogeler/elsewindow/blob/main/CHANGELOG.md
|
|
13
|
+
Keywords: xpra,openssh,ssh,wayland,remote-desktop
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Environment :: X11 Applications
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: Intended Audience :: System Administrators
|
|
18
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
19
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
22
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
23
|
+
Classifier: Topic :: System :: Networking
|
|
24
|
+
Classifier: Typing :: Typed
|
|
25
|
+
Requires-Python: <3.15,>=3.13
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: ssh-wrapper==0.1.0
|
|
29
|
+
Provides-Extra: quality
|
|
30
|
+
Requires-Dist: bandit[toml]==1.9.4; extra == "quality"
|
|
31
|
+
Requires-Dist: mypy==2.3.1; extra == "quality"
|
|
32
|
+
Requires-Dist: pip-audit==2.10.1; extra == "quality"
|
|
33
|
+
Requires-Dist: pip-licenses==5.5.5; extra == "quality"
|
|
34
|
+
Requires-Dist: ruff==0.16.5; extra == "quality"
|
|
35
|
+
Provides-Extra: test
|
|
36
|
+
Requires-Dist: pytest==9.1.1; extra == "test"
|
|
37
|
+
Requires-Dist: pytest-asyncio==1.4.0; extra == "test"
|
|
38
|
+
Requires-Dist: pytest-cov==7.1.0; extra == "test"
|
|
39
|
+
Requires-Dist: pytest-xdist==3.8.0; extra == "test"
|
|
40
|
+
Provides-Extra: package
|
|
41
|
+
Requires-Dist: build==1.6.0; extra == "package"
|
|
42
|
+
Requires-Dist: setuptools==84.0.0; extra == "package"
|
|
43
|
+
Requires-Dist: wheel==0.48.0; extra == "package"
|
|
44
|
+
Provides-Extra: standalone
|
|
45
|
+
Requires-Dist: pyinstaller==6.22.2; extra == "standalone"
|
|
46
|
+
Provides-Extra: docs
|
|
47
|
+
Requires-Dist: mkdocs-material==9.7.7; extra == "docs"
|
|
48
|
+
Dynamic: license-file
|
|
49
|
+
|
|
50
|
+
# Elsewindow
|
|
51
|
+
|
|
52
|
+
`elsewindow` starts one GUI application on a remote Linux host and shows
|
|
53
|
+
its windows through Xpra. One owned OpenSSH ControlMaster carries every Xpra
|
|
54
|
+
control channel; the command opens no forwarding or Xpra TCP listener and
|
|
55
|
+
cleans only the server, application process group, sockets, and runtime state
|
|
56
|
+
created by that invocation.
|
|
57
|
+
|
|
58
|
+
The application renders through the remote Wayland compositor and remote GPU.
|
|
59
|
+
Only Xpra picture, input, and control traffic crosses SSH.
|
|
60
|
+
|
|
61
|
+
## Install And Run
|
|
62
|
+
|
|
63
|
+
The Python distribution requires Linux, CPython 3.13 or 3.14, OpenSSH,
|
|
64
|
+
`false`, a local graphical session, and compatible Xpra packages on both
|
|
65
|
+
systems. Install with pip or pipx after the first release:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
python3.14 -m pip install "elsewindow==0.1.0"
|
|
69
|
+
# or: pipx install "elsewindow==0.1.0"
|
|
70
|
+
elsewindow --ssh-alias agents-a -- xterm
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Check packaged versions, profile digests, Linux support, and local commands
|
|
74
|
+
without opening a connection:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
elsewindow --diagnose
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The published distribution resolves the exact reviewed
|
|
81
|
+
[`ssh-wrapper==0.1.0`](https://pypi.org/project/ssh-wrapper/0.1.0/) dependency.
|
|
82
|
+
For a source checkout, prepare the hash-locked runtime and use the repository
|
|
83
|
+
launcher from any working directory:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
make runtime-venv
|
|
87
|
+
./bin/elsewindow --help
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Use a direct authority when an OpenSSH alias is not appropriate:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
elsewindow \
|
|
94
|
+
--host host.example \
|
|
95
|
+
--user desktop-user \
|
|
96
|
+
--port 2222 \
|
|
97
|
+
-- /opt/application/bin/application
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
The default encoding and network profiles are `rgb` and `gigabit_lan`.
|
|
101
|
+
Production arguments come exclusively from the reviewed YAML mirrors shipped
|
|
102
|
+
inside the Python package. See [the Xpra guide](doc/xpra.md) for profile,
|
|
103
|
+
hardware, application, and lifecycle details.
|
|
104
|
+
|
|
105
|
+
## Installing The Maintained Xpra Build
|
|
106
|
+
|
|
107
|
+
[`tools/install_xpra_release.py`](tools/install_xpra_release.py) is a standalone
|
|
108
|
+
standard-library installer for Debian 13 and Ubuntu 26.04. It resolves the
|
|
109
|
+
newest canonical package release from `kogeler/xpra:develop`, verifies archive
|
|
110
|
+
and DEB contents before mutation, prints the exact installed Xpra inventory,
|
|
111
|
+
and requires interactive confirmation before purging that inventory. It uses
|
|
112
|
+
APT for the validated local packages and dependencies.
|
|
113
|
+
|
|
114
|
+
Elsewindow deliberately uses this maintained fork rather than treating a
|
|
115
|
+
generic upstream Xpra build as interchangeable. Project development uncovered
|
|
116
|
+
dozens of blocking Xpra defects: some fixes were accepted as direct upstream
|
|
117
|
+
contributions, some were implemented by the upstream maintainer after issue
|
|
118
|
+
reports, and some were not accepted after technical disagreements. The last
|
|
119
|
+
category requires continued maintenance of additional fork patches. The
|
|
120
|
+
[Xpra guide](doc/xpra.md#why-the-maintained-xpra-fork-is-required) explains
|
|
121
|
+
the resulting user compatibility boundary.
|
|
122
|
+
|
|
123
|
+
Review the installer and the [security contract](doc/security.md). The streamed
|
|
124
|
+
route below is pending until the first reviewed `main` push; it must not be
|
|
125
|
+
treated as available before then:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
( set -o pipefail; curl --proto '=https' --tlsv1.2 -fsSL 'https://raw.githubusercontent.com/kogeler/elsewindow/main/tools/install_xpra_release.py' | /usr/bin/python3 - )
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Do not prefix the pipeline or Python process with `sudo`. When privilege is
|
|
132
|
+
needed, the reviewed script reads purge confirmation from the controlling
|
|
133
|
+
terminal and invokes `/usr/bin/sudo` itself only for its root-owned staging and
|
|
134
|
+
APT transaction.
|
|
135
|
+
|
|
136
|
+
## Standalone Linux Executables
|
|
137
|
+
|
|
138
|
+
After the first release, GitHub Releases provide `elsewindow-linux-amd64` and
|
|
139
|
+
`elsewindow-linux-arm64`. These native one-file ELF executables bundle
|
|
140
|
+
Elsewindow, CPython, `ssh-wrapper`, version metadata, and the reviewed YAML
|
|
141
|
+
profiles. They do not bundle OpenSSH, Xpra, Podman, GPU drivers, VA-API, or
|
|
142
|
+
distribution packages. Verify the release's `SHA256SUMS.txt`, make the selected
|
|
143
|
+
file executable, and run `./elsewindow-linux-amd64 --diagnose` (or the arm64
|
|
144
|
+
equivalent) before starting a session.
|
|
145
|
+
|
|
146
|
+
## Documentation
|
|
147
|
+
|
|
148
|
+
- [Rendered documentation site](https://kogeler.github.io/elsewindow/)
|
|
149
|
+
(published by the first reviewed direct `main` push)
|
|
150
|
+
- [Getting started](doc/getting-started.md)
|
|
151
|
+
- [Complete Xpra behavior and options](doc/xpra.md)
|
|
152
|
+
- [Security model](doc/security.md)
|
|
153
|
+
- [Architecture](doc/architecture.md)
|
|
154
|
+
- [Development and validation](doc/development.md)
|
|
155
|
+
- [Contributing](doc/contributing.md)
|
|
156
|
+
- [Maintainer CI contract](doc/maintenance/CI.md)
|
|
157
|
+
- [Dependency maintenance](doc/maintenance/DEPENDENCIES.md)
|
|
158
|
+
- [Release maintenance](doc/maintenance/RELEASES.md)
|
|
159
|
+
|
|
160
|
+
The Pages workflow renders these same maintained Markdown files and validates
|
|
161
|
+
every generated route, local link, anchor, canonical URL, sitemap, crawler
|
|
162
|
+
file, and advertised `llms.txt` route without network access.
|
|
163
|
+
|
|
164
|
+
## Automatic Live Validation
|
|
165
|
+
|
|
166
|
+
`make live-test` resolves the newest fork release, builds checksum-bound Ubuntu
|
|
167
|
+
target and Debian client images, and runs detach and abrupt-master-loss cases
|
|
168
|
+
on a private rootless Podman network. The payload excludes `elsewindow/` source
|
|
169
|
+
and clean-installs the already verified wheel. The harness generates a fresh
|
|
170
|
+
Ed25519 key, performs exactly one authentication per case, verifies a visible
|
|
171
|
+
window and picture updates through the production profile assembler, preserves
|
|
172
|
+
an unrelated session, and removes only its labelled containers and network.
|
|
173
|
+
All wheel, test, and key material enters through validated tar streams; the
|
|
174
|
+
test uses no host bind, data volume, or copy channel.
|
|
175
|
+
|
|
176
|
+
Released under the [MIT License](LICENSE).
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
elsewindow/__init__.py,sha256=ALFyD2F0T7NcXFxQ3PCjK7XP8L5o7bdxONADiyRe7Aw,908
|
|
2
|
+
elsewindow/__main__.py,sha256=UH6MmUHIDl-EY2wq48YejD0aRP2whKfUSoA_O7bT6Wc,151
|
|
3
|
+
elsewindow/cli.py,sha256=fQKACyWuX7x_2YQdIo5BU5awMq8pmSvwgxCCZ-8F2gY,6969
|
|
4
|
+
elsewindow/config.py,sha256=uWlKrRQsABx1gJO1WZv-usV30M3Ouk0mTpUSKr5oDTA,5938
|
|
5
|
+
elsewindow/live-cli.yml,sha256=7JkCFbztfx7VdyABONVhc19T3PbcKEVTNr4WPLLcu28,2513
|
|
6
|
+
elsewindow/live_config.py,sha256=iUzxk_DjhNrOvQF4Bgqd-KFLIRFZ6xjE2TaKDUEFHqc,16460
|
|
7
|
+
elsewindow/profiles.yml,sha256=GoP4CbK2Z4SqyG_Iz44fnB8hef7POLWQVkA2778rIjI,1072
|
|
8
|
+
elsewindow/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
9
|
+
elsewindow/session.py,sha256=_zIBGL_mjszw6f6qlPxsodNstvNT0180x_cwjvywzJI,28225
|
|
10
|
+
elsewindow-0.1.0.dist-info/licenses/LICENSE,sha256=E-AV8LBuBuC247TAAvpwmjjtYMEP06T5cmr-ke-C-bw,1064
|
|
11
|
+
elsewindow-0.1.0.dist-info/METADATA,sha256=VQ9XKdu6mgDSS1kkvOSc07sliXsEiLRY7b1Rzl2RVxs,7621
|
|
12
|
+
elsewindow-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
13
|
+
elsewindow-0.1.0.dist-info/entry_points.txt,sha256=qL3JOigCATPQYeO-_vqjL-EHju-j3BU5SJWovMxZASw,51
|
|
14
|
+
elsewindow-0.1.0.dist-info/top_level.txt,sha256=uQKM1KqnKYGc5A1DGdyJ3PAFOAtZy_xLDVAAyvKWslw,11
|
|
15
|
+
elsewindow-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 kogeler
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
elsewindow
|