remote-desktop-dashboard 0.1.0__tar.gz

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.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Remote Desktop Dashboard Contributors
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,145 @@
1
+ Metadata-Version: 2.4
2
+ Name: remote-desktop-dashboard
3
+ Version: 0.1.0
4
+ Summary: Python browser dashboard for reserving, locking, and launching shared Windows Remote Desktop machines, with per-IP firewall lockdown over WinRM.
5
+ Author: Remote Desktop Dashboard Contributors
6
+ License: MIT
7
+ Project-URL: Homepage, https://pypi.org/project/remote-desktop-dashboard/
8
+ Keywords: rdp,remote-desktop,dashboard,winrm,firewall,reservation,windows
9
+ Classifier: Development Status :: 4 - Beta
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Framework :: FastAPI
12
+ Classifier: Intended Audience :: System Administrators
13
+ Classifier: Intended Audience :: Information Technology
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Operating System :: Microsoft :: Windows
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: System :: Systems Administration
21
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: fastapi
26
+ Requires-Dist: uvicorn[standard]
27
+ Requires-Dist: jinja2
28
+ Requires-Dist: python-multipart
29
+ Dynamic: license-file
30
+
31
+ # Remote Desktop Dashboard
32
+
33
+ A Python-based, browser-driven dashboard for managing a pool of shared **Windows** machines:
34
+ see every machine, see who is using which one, **reserve / lock** a machine so others can't grab
35
+ it, and connect with one click. When a machine is reserved, the dashboard pushes a **per-IP
36
+ firewall lockdown** to the target over WinRM so only the reserver can RDP in — native `mstsc.exe`
37
+ from anyone else is dropped at the network layer.
38
+
39
+ ## Install
40
+
41
+ ```powershell
42
+ pip install remote-desktop-dashboard
43
+ remote-desktop-dashboard
44
+ ```
45
+
46
+ The dashboard opens at http://127.0.0.1:8000. It binds to `0.0.0.0` so other laptops on your LAN
47
+ can reach it via the host machine's IP (use the host's LAN address, **not** `localhost`, so the
48
+ server can read each user's real client IP for the firewall rules).
49
+
50
+ ## How it relates to the build spec
51
+
52
+ The reference spec calls for a clientless **Apache Guacamole** HTML5 gateway that streams the
53
+ desktop *inside* the browser. That requires standing up `guacd` + the Guacamole web app as
54
+ separate infrastructure. This tool implements the same **enforcement principle** — the dashboard
55
+ is the sole legitimate gatekeeper and every other path is blocked at the host firewall — but using
56
+ a **zero-infrastructure** model suited to a single Windows host on a LAN:
57
+
58
+ | Spec component | This tool |
59
+ | --- | --- |
60
+ | Clientless HTML5 gateway (Guacamole) | One-click local `mstsc.exe` launch + downloadable `.rdp` fallback |
61
+ | Per-IP firewall lockdown to the gateway | Per-IP firewall lockdown to the **reserver's** client IP, pushed over WinRM |
62
+ | Backend records intent, executes on endpoint | Reservation records firewall status (`applied`/`failed`/`disabled`/`skipped`) + allowed IP |
63
+ | Reservation / lock & release | One active reservation per machine, auto-released on expiry |
64
+ | Audit-style visibility | Live session view via `quser`, tool-activity + serial-port probes, audit-style reservation log |
65
+
66
+ Swapping in a true Guacamole gateway for in-browser streaming is the natural extension point.
67
+
68
+ ## Features
69
+
70
+ - Dark dashboard with machine list, sectioned detail card, admin modal, and audit log.
71
+ - SQLite persistence under `%LOCALAPPDATA%\RemoteDesktopDashboard\data` by default on Windows.
72
+ - One active reservation per machine, auto-released on expiry.
73
+ - One-click local `mstsc.exe` launch with a downloadable `.rdp` fallback (clipboard, drives, USB,
74
+ printers, smart cards, audio, multi-monitor, dynamic resolution, keyboard hook, font smoothing
75
+ all enabled).
76
+ - **Live machine detail card** with four sections:
77
+ - **Status** — reservation, firewall lock, allowed IP, auto-release time.
78
+ - **Sessions** — every row from `quser`: console (physical) user + every RDP user, each tagged.
79
+ - **Tool activity** — remote `Get-CimInstance Win32_Process` over WinRM showing who is running
80
+ `ETGui.exe`, `ETOU.exe`, `MobaXterm.exe`, `MobaXterm_Personal.exe`, and `putty.exe`.
81
+ - **Serial ports** — live list of COM ports on the target host.
82
+ - **Favorites** — per-browser favourite machines (localStorage), pinned to the top, with
83
+ "★ Favorites only" / "Free only" filter chips.
84
+ - **Windows firewall lockdown ON by default**: on reservation, the target's port 3389 is
85
+ restricted to the reserver's IP and an explicit Block-Other-RDP rule is pushed.
86
+ - Per-machine **Verify lock** + **Diagnose** buttons return structured WinRM/ping/firewall reports.
87
+ - Admin PIN gate with single browser-session unlock and bulk delete/release/refresh controls.
88
+ - Admin modal split into Settings, Inventory, and Manage Machines tabs.
89
+
90
+ ## Configuration
91
+
92
+ | Setting | Default | Override env var |
93
+ | --- | --- | --- |
94
+ | Admin PIN | `admin` | `ADMIN_PIN` |
95
+ | Bind host | `0.0.0.0` | `RDD_HOST` |
96
+ | Browser launch host | `127.0.0.1` | `RDD_BROWSER_HOST` |
97
+ | Port | `8000` | `RDD_PORT` |
98
+ | Data dir | `%LOCALAPPDATA%\RemoteDesktopDashboard\data` | `RDD_DATA_DIR` |
99
+ | Default domain | `EU` | `RDP_DOMAIN` |
100
+ | Firewall lock | ON | `RDD_ENFORCE_WINDOWS_FIREWALL=0` to disable |
101
+ | Background session refresh | ON | `RDD_AUTO_REFRESH_SESSIONS=0` to disable |
102
+ | Session refresh interval | 30s | `RDD_SESSION_REFRESH_SECONDS` |
103
+ | Firewall PowerShell timeout | 20s | `RDD_FIREWALL_TIMEOUT_SECONDS` |
104
+ | Auto-open browser | yes | `RDD_OPEN_BROWSER=0` to disable |
105
+
106
+ You can also toggle the firewall lock at runtime from **Admin → Settings → RDP lock ON/OFF**
107
+ (persisted in SQLite).
108
+
109
+ ## How the native-RDP block works
110
+
111
+ When RDP lock is ON, on every reservation the dashboard runs the following on the target over WinRM:
112
+
113
+ 1. Tighten every inbound `Remote Desktop` rule's `RemoteAddress` filter to the reserver's IP.
114
+ 2. Add `RDD-Block-Other-RDP` (Block, TCP 3389, RemoteAddress=Any).
115
+ 3. Add `RDD-Block-Other-RDP-Allow` (Allow, TCP 3389, RemoteAddress=<reserver IP>).
116
+
117
+ On release/revoke/delete those `RDD-*` rules are removed and the Remote Desktop rules are restored
118
+ to `RemoteAddress=Any`.
119
+
120
+ Requirements for this to actually block native RDP:
121
+
122
+ - The dashboard host is Windows and runs as a user that can `Invoke-Command` on the targets.
123
+ - WinRM (`winrm quickconfig` / `Enable-PSRemoting`) is enabled on every target.
124
+ - Users open the dashboard via the server's LAN hostname/IP, **not** `localhost`.
125
+
126
+ Use **Admin → Manage Machines → Verify lock / Diagnose** to confirm the lock and read the exact
127
+ WinRM/ping/firewall state.
128
+
129
+ ## Development
130
+
131
+ ```powershell
132
+ python -m venv .venv
133
+ .\.venv\Scripts\Activate.ps1
134
+ pip install -r requirements.txt
135
+ uvicorn remote_desktop_dashboard.main:app --reload --host 0.0.0.0 --port 8000
136
+ ```
137
+
138
+ ## Out of scope (extension points)
139
+
140
+ Multi-gateway/HA, true Guacamole in-browser streaming, session recording, scheduled/timed
141
+ reservations, calendar booking, and Active Directory group sync are not built in.
142
+
143
+ ## License
144
+
145
+ MIT
@@ -0,0 +1,115 @@
1
+ # Remote Desktop Dashboard
2
+
3
+ A Python-based, browser-driven dashboard for managing a pool of shared **Windows** machines:
4
+ see every machine, see who is using which one, **reserve / lock** a machine so others can't grab
5
+ it, and connect with one click. When a machine is reserved, the dashboard pushes a **per-IP
6
+ firewall lockdown** to the target over WinRM so only the reserver can RDP in — native `mstsc.exe`
7
+ from anyone else is dropped at the network layer.
8
+
9
+ ## Install
10
+
11
+ ```powershell
12
+ pip install remote-desktop-dashboard
13
+ remote-desktop-dashboard
14
+ ```
15
+
16
+ The dashboard opens at http://127.0.0.1:8000. It binds to `0.0.0.0` so other laptops on your LAN
17
+ can reach it via the host machine's IP (use the host's LAN address, **not** `localhost`, so the
18
+ server can read each user's real client IP for the firewall rules).
19
+
20
+ ## How it relates to the build spec
21
+
22
+ The reference spec calls for a clientless **Apache Guacamole** HTML5 gateway that streams the
23
+ desktop *inside* the browser. That requires standing up `guacd` + the Guacamole web app as
24
+ separate infrastructure. This tool implements the same **enforcement principle** — the dashboard
25
+ is the sole legitimate gatekeeper and every other path is blocked at the host firewall — but using
26
+ a **zero-infrastructure** model suited to a single Windows host on a LAN:
27
+
28
+ | Spec component | This tool |
29
+ | --- | --- |
30
+ | Clientless HTML5 gateway (Guacamole) | One-click local `mstsc.exe` launch + downloadable `.rdp` fallback |
31
+ | Per-IP firewall lockdown to the gateway | Per-IP firewall lockdown to the **reserver's** client IP, pushed over WinRM |
32
+ | Backend records intent, executes on endpoint | Reservation records firewall status (`applied`/`failed`/`disabled`/`skipped`) + allowed IP |
33
+ | Reservation / lock & release | One active reservation per machine, auto-released on expiry |
34
+ | Audit-style visibility | Live session view via `quser`, tool-activity + serial-port probes, audit-style reservation log |
35
+
36
+ Swapping in a true Guacamole gateway for in-browser streaming is the natural extension point.
37
+
38
+ ## Features
39
+
40
+ - Dark dashboard with machine list, sectioned detail card, admin modal, and audit log.
41
+ - SQLite persistence under `%LOCALAPPDATA%\RemoteDesktopDashboard\data` by default on Windows.
42
+ - One active reservation per machine, auto-released on expiry.
43
+ - One-click local `mstsc.exe` launch with a downloadable `.rdp` fallback (clipboard, drives, USB,
44
+ printers, smart cards, audio, multi-monitor, dynamic resolution, keyboard hook, font smoothing
45
+ all enabled).
46
+ - **Live machine detail card** with four sections:
47
+ - **Status** — reservation, firewall lock, allowed IP, auto-release time.
48
+ - **Sessions** — every row from `quser`: console (physical) user + every RDP user, each tagged.
49
+ - **Tool activity** — remote `Get-CimInstance Win32_Process` over WinRM showing who is running
50
+ `ETGui.exe`, `ETOU.exe`, `MobaXterm.exe`, `MobaXterm_Personal.exe`, and `putty.exe`.
51
+ - **Serial ports** — live list of COM ports on the target host.
52
+ - **Favorites** — per-browser favourite machines (localStorage), pinned to the top, with
53
+ "★ Favorites only" / "Free only" filter chips.
54
+ - **Windows firewall lockdown ON by default**: on reservation, the target's port 3389 is
55
+ restricted to the reserver's IP and an explicit Block-Other-RDP rule is pushed.
56
+ - Per-machine **Verify lock** + **Diagnose** buttons return structured WinRM/ping/firewall reports.
57
+ - Admin PIN gate with single browser-session unlock and bulk delete/release/refresh controls.
58
+ - Admin modal split into Settings, Inventory, and Manage Machines tabs.
59
+
60
+ ## Configuration
61
+
62
+ | Setting | Default | Override env var |
63
+ | --- | --- | --- |
64
+ | Admin PIN | `admin` | `ADMIN_PIN` |
65
+ | Bind host | `0.0.0.0` | `RDD_HOST` |
66
+ | Browser launch host | `127.0.0.1` | `RDD_BROWSER_HOST` |
67
+ | Port | `8000` | `RDD_PORT` |
68
+ | Data dir | `%LOCALAPPDATA%\RemoteDesktopDashboard\data` | `RDD_DATA_DIR` |
69
+ | Default domain | `EU` | `RDP_DOMAIN` |
70
+ | Firewall lock | ON | `RDD_ENFORCE_WINDOWS_FIREWALL=0` to disable |
71
+ | Background session refresh | ON | `RDD_AUTO_REFRESH_SESSIONS=0` to disable |
72
+ | Session refresh interval | 30s | `RDD_SESSION_REFRESH_SECONDS` |
73
+ | Firewall PowerShell timeout | 20s | `RDD_FIREWALL_TIMEOUT_SECONDS` |
74
+ | Auto-open browser | yes | `RDD_OPEN_BROWSER=0` to disable |
75
+
76
+ You can also toggle the firewall lock at runtime from **Admin → Settings → RDP lock ON/OFF**
77
+ (persisted in SQLite).
78
+
79
+ ## How the native-RDP block works
80
+
81
+ When RDP lock is ON, on every reservation the dashboard runs the following on the target over WinRM:
82
+
83
+ 1. Tighten every inbound `Remote Desktop` rule's `RemoteAddress` filter to the reserver's IP.
84
+ 2. Add `RDD-Block-Other-RDP` (Block, TCP 3389, RemoteAddress=Any).
85
+ 3. Add `RDD-Block-Other-RDP-Allow` (Allow, TCP 3389, RemoteAddress=<reserver IP>).
86
+
87
+ On release/revoke/delete those `RDD-*` rules are removed and the Remote Desktop rules are restored
88
+ to `RemoteAddress=Any`.
89
+
90
+ Requirements for this to actually block native RDP:
91
+
92
+ - The dashboard host is Windows and runs as a user that can `Invoke-Command` on the targets.
93
+ - WinRM (`winrm quickconfig` / `Enable-PSRemoting`) is enabled on every target.
94
+ - Users open the dashboard via the server's LAN hostname/IP, **not** `localhost`.
95
+
96
+ Use **Admin → Manage Machines → Verify lock / Diagnose** to confirm the lock and read the exact
97
+ WinRM/ping/firewall state.
98
+
99
+ ## Development
100
+
101
+ ```powershell
102
+ python -m venv .venv
103
+ .\.venv\Scripts\Activate.ps1
104
+ pip install -r requirements.txt
105
+ uvicorn remote_desktop_dashboard.main:app --reload --host 0.0.0.0 --port 8000
106
+ ```
107
+
108
+ ## Out of scope (extension points)
109
+
110
+ Multi-gateway/HA, true Guacamole in-browser streaming, session recording, scheduled/timed
111
+ reservations, calendar booking, and Active Directory group sync are not built in.
112
+
113
+ ## License
114
+
115
+ MIT
@@ -0,0 +1,49 @@
1
+ [build-system]
2
+ requires = ["setuptools>=69", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "remote-desktop-dashboard"
7
+ version = "0.1.0"
8
+ description = "Python browser dashboard for reserving, locking, and launching shared Windows Remote Desktop machines, with per-IP firewall lockdown over WinRM."
9
+ readme = "README.md"
10
+ license = { text = "MIT" }
11
+ requires-python = ">=3.10"
12
+ authors = [
13
+ { name = "Remote Desktop Dashboard Contributors" }
14
+ ]
15
+ keywords = ["rdp", "remote-desktop", "dashboard", "winrm", "firewall", "reservation", "windows"]
16
+ dependencies = [
17
+ "fastapi",
18
+ "uvicorn[standard]",
19
+ "jinja2",
20
+ "python-multipart"
21
+ ]
22
+ classifiers = [
23
+ "Development Status :: 4 - Beta",
24
+ "Environment :: Web Environment",
25
+ "Framework :: FastAPI",
26
+ "Intended Audience :: System Administrators",
27
+ "Intended Audience :: Information Technology",
28
+ "License :: OSI Approved :: MIT License",
29
+ "Operating System :: Microsoft :: Windows",
30
+ "Programming Language :: Python :: 3",
31
+ "Programming Language :: Python :: 3.10",
32
+ "Programming Language :: Python :: 3.11",
33
+ "Programming Language :: Python :: 3.12",
34
+ "Topic :: System :: Systems Administration",
35
+ "Topic :: Internet :: WWW/HTTP :: Dynamic Content"
36
+ ]
37
+
38
+ [project.urls]
39
+ Homepage = "https://pypi.org/project/remote-desktop-dashboard/"
40
+
41
+ [project.scripts]
42
+ remote-desktop-dashboard = "remote_desktop_dashboard.main:run"
43
+
44
+ [tool.setuptools]
45
+ packages = ["remote_desktop_dashboard", "remote_desktop_dashboard.static", "remote_desktop_dashboard.templates"]
46
+
47
+ [tool.setuptools.package-data]
48
+ "remote_desktop_dashboard.static" = ["*.css", "*.js"]
49
+ "remote_desktop_dashboard.templates" = ["*.html"]
@@ -0,0 +1,3 @@
1
+ """Remote Desktop Dashboard — browser-based reservation & lock tool for shared Windows RDP machines."""
2
+
3
+ __version__ = "0.1.0"