The UI core that runs inside the PVE web interface
  • Python 50.3%
  • JavaScript 49.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-14 09:00:00 +02:00
apps.d Initial import 2026-09-14 09:00:00 +02:00
debian Initial import 2026-09-14 09:00:00 +02:00
src/pmx_cork_ui Initial import 2026-09-14 09:00:00 +02:00
tests Initial import 2026-09-14 09:00:00 +02:00
.gitignore Initial import 2026-09-14 09:00:00 +02:00
LICENSE Initial import 2026-09-14 09:00:00 +02:00
pyproject.toml Initial import 2026-09-14 09:00:00 +02:00
README.md Initial import 2026-09-14 09:00:00 +02:00

pmx-cork-ui

The served presentation layer of the suite: the ExtJS UI core (assembled into pmx-cork-ui.js), the public OpenAPI document, and the API reference page at /pmx-cork/web/api-docs, rendered by a vendored copy of Redoc so nothing loads from a CDN.

It is an add-on. app.py registers its public pages through the runtime's apps.d seam (register_ui_pages), the Redoc bundle over the static lane (register_static), and the Tasks and Services node tabs (register_ui), whose widgets are part of the UI core here. The proxy serves the pages without authentication over its public lane, the way pveproxy serves its static UI. Without this package the runtime serves the auth gate and the API only.

Ships /etc/pmx-cork/apps.d/pmx-cork-ui.conf, naming pmx_cork_ui.app, and the pmx_cork_ui package, one module per served artifact:

Module Serves
app.py nothing itself; the apps.d entry point with the registrations
uicore.py /pmx-cork/web/pmx-cork-ui.js, assembled at request time from the sources in uicore-src/
openapi.py /pmx-cork/api/v1/openapi.json, generated from the registered route tables
apidocs.py /pmx-cork/web/api-docs, Redoc (in vendor/, MIT, see debian/copyright) over the OpenAPI document
manifest.py the window.PmxCork.boot data: the aggregated UI manifest with a ?v= version, and this package's own tab contribution

A node tab is drawn on the nodes its plugin is enabled on, and the UI core will draw one for a plugin this node does not have. window.PmxCork.boot carries entryNodes, the map from an entry to the nodes it belongs under; when the selected node has an entry whose sources are not loaded here, the core fetches them from /pmx-cork/api/v1/manager/nodes/{node}/plugins/{id}/ui, injects the JS and CSS once and then builds the tab. The API calls that tab makes name that node, so the proxy forwards them to it and it answers with its own RBAC check.

The UI core provides PmxCork.Utils.openTaskViewer(upid, {taskDone}), the polling task window with live log and stop button, and PmxCork.Utils.pollTaskResult(upid, callback) for a dialog that only needs the final record. Plugin views call the API with Proxmox.Utils.API2Request against /pmx-cork/api/v1/...; the front routes both that form and the /api2/extjs/pmx-cork/... form the helper produces.

Depends on pmx-cork-host (the registry seam and the URL layout in constants) and starlette. Ships as python3-pmx-cork-ui.