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.
- remote_desktop_dashboard-0.1.0/LICENSE +21 -0
- remote_desktop_dashboard-0.1.0/PKG-INFO +145 -0
- remote_desktop_dashboard-0.1.0/README.md +115 -0
- remote_desktop_dashboard-0.1.0/pyproject.toml +49 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/__init__.py +3 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/main.py +1333 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/static/__init__.py +1 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/static/app.js +572 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/static/styles.css +827 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/templates/__init__.py +1 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard/templates/index.html +352 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard.egg-info/PKG-INFO +145 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard.egg-info/SOURCES.txt +16 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard.egg-info/dependency_links.txt +1 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard.egg-info/entry_points.txt +2 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard.egg-info/requires.txt +4 -0
- remote_desktop_dashboard-0.1.0/remote_desktop_dashboard.egg-info/top_level.txt +1 -0
- remote_desktop_dashboard-0.1.0/setup.cfg +4 -0
|
@@ -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"]
|