From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH proxmox 1/2] pve-api-types: add termproxy call and types
Date: Wed, 5 Nov 2025 15:13:07 +0100 [thread overview]
Message-ID: <20251105141335.1230493-6-f.gruenbichler@proxmox.com> (raw)
In-Reply-To: <20251105141335.1230493-1-f.gruenbichler@proxmox.com>
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
---
pve-api-types/generate.pl | 2 +
pve-api-types/pve-api.json | 4 ++
pve-api-types/src/generated/code.rs | 20 +++++++-
pve-api-types/src/generated/types.rs | 76 ++++++++++++++++++++++++++++
4 files changed, 101 insertions(+), 1 deletion(-)
diff --git a/pve-api-types/generate.pl b/pve-api-types/generate.pl
index 099437f3..6eecba6d 100644
--- a/pve-api-types/generate.pl
+++ b/pve-api-types/generate.pl
@@ -387,6 +387,8 @@ api(DELETE => '/cluster/sdn/lock', 'release_sdn_lock', 'param-name' => 'ReleaseS
api(PUT => '/cluster/sdn', 'sdn_apply', 'param-name' => 'ReloadSdn', 'output-type' => 'PveUpid');
api(POST => '/cluster/sdn/rollback', 'rollback_sdn_changes', 'param-name' => 'RollbackSdn');
+api(POST => '/nodes/{node}/termproxy', 'node_shell_termproxy', 'param-name' => 'NodeShellTermproxy', 'return-name' => 'NodeShellTicket');
+
# NOW DUMP THE CODE:
#
# We generate one file for API types, and one for API method calls.
diff --git a/pve-api-types/pve-api.json b/pve-api-types/pve-api.json
index 7bde484e..1775fdae 100644
--- a/pve-api-types/pve-api.json
+++ b/pve-api-types/pve-api.json
@@ -51649,15 +51649,19 @@
"additionalProperties": 0,
"properties": {
"port": {
+ "description": "port used to bind termproxy to",
"type": "integer"
},
"ticket": {
+ "description": "VNC ticket used to verifiy websocket connection",
"type": "string"
},
"upid": {
+ "description": "UPID for termproxy worker task",
"type": "string"
},
"user": {
+ "description": "user/token that generated the VNC ticket in `ticket`",
"type": "string"
}
}
diff --git a/pve-api-types/src/generated/code.rs b/pve-api-types/src/generated/code.rs
index dd90ec00..07728f3f 100644
--- a/pve-api-types/src/generated/code.rs
+++ b/pve-api-types/src/generated/code.rs
@@ -356,7 +356,6 @@
/// - /nodes/{node}/storage/{storage}/upload
/// - /nodes/{node}/suspendall
/// - /nodes/{node}/syslog
-/// - /nodes/{node}/termproxy
/// - /nodes/{node}/time
/// - /nodes/{node}/version
/// - /nodes/{node}/vncshell
@@ -585,6 +584,15 @@ pub trait PveClient {
Err(Error::Other("migrate_qemu not implemented"))
}
+ /// Creates a VNC Shell proxy.
+ async fn node_shell_termproxy(
+ &self,
+ node: &str,
+ params: NodeShellTermproxy,
+ ) -> Result<NodeShellTicket, Error> {
+ Err(Error::Other("node_shell_termproxy not implemented"))
+ }
+
/// Read node status
async fn node_status(&self, node: &str) -> Result<NodeStatus, Error> {
Err(Error::Other("node_status not implemented"))
@@ -1116,6 +1124,16 @@ where
Ok(self.0.post(url, ¶ms).await?.expect_json()?.data)
}
+ /// Creates a VNC Shell proxy.
+ async fn node_shell_termproxy(
+ &self,
+ node: &str,
+ params: NodeShellTermproxy,
+ ) -> Result<NodeShellTicket, Error> {
+ let url = &format!("/api2/extjs/nodes/{node}/termproxy");
+ Ok(self.0.post(url, ¶ms).await?.expect_json()?.data)
+ }
+
/// Read node status
async fn node_status(&self, node: &str) -> Result<NodeStatus, Error> {
let url = &format!("/api2/extjs/nodes/{node}/status");
diff --git a/pve-api-types/src/generated/types.rs b/pve-api-types/src/generated/types.rs
index 5321cf67..6c42b620 100644
--- a/pve-api-types/src/generated/types.rs
+++ b/pve-api-types/src/generated/types.rs
@@ -4223,6 +4223,82 @@ pub enum NetworkInterfaceVlanProtocol {
serde_plain::derive_display_from_serialize!(NetworkInterfaceVlanProtocol);
serde_plain::derive_fromstr_from_deserialize!(NetworkInterfaceVlanProtocol);
+#[api(
+ properties: {
+ cmd: {
+ optional: true,
+ type: NodeShellTermproxyCmd,
+ },
+ "cmd-opts": {
+ default: "",
+ optional: true,
+ type: String,
+ },
+ },
+)]
+/// Object.
+#[derive(Debug, serde::Deserialize, serde::Serialize)]
+pub struct NodeShellTermproxy {
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ pub cmd: Option<NodeShellTermproxyCmd>,
+
+ /// Add parameters to a command. Encoded as null terminated strings.
+ #[serde(default, skip_serializing_if = "Option::is_none")]
+ #[serde(rename = "cmd-opts")]
+ pub cmd_opts: Option<String>,
+}
+
+#[api]
+/// Run specific command or default to login (requires 'root@pam')
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+pub enum NodeShellTermproxyCmd {
+ #[serde(rename = "ceph_install")]
+ /// ceph_install.
+ CephInstall,
+ #[serde(rename = "login")]
+ #[default]
+ /// login.
+ Login,
+ #[serde(rename = "upgrade")]
+ /// upgrade.
+ Upgrade,
+}
+serde_plain::derive_display_from_serialize!(NodeShellTermproxyCmd);
+serde_plain::derive_fromstr_from_deserialize!(NodeShellTermproxyCmd);
+
+#[api(
+ properties: {
+ port: {
+ type: Integer,
+ },
+ ticket: {
+ type: String,
+ },
+ upid: {
+ type: String,
+ },
+ user: {
+ type: String,
+ },
+ },
+)]
+/// Object.
+#[derive(Debug, serde::Deserialize, serde::Serialize)]
+pub struct NodeShellTicket {
+ /// port used to bind termproxy to
+ #[serde(deserialize_with = "proxmox_serde::perl::deserialize_i64")]
+ pub port: i64,
+
+ /// ticket used to verifiy websocket connection
+ pub ticket: String,
+
+ /// UPID for termproxy worker task
+ pub upid: String,
+
+ /// user
+ pub user: String,
+}
+
#[api(
additional_properties: "additional_properties",
properties: {
--
2.47.3
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
next prev parent reply other threads:[~2025-11-05 14:14 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-05 14:13 [pve-devel] [RFC access-control/manager/proxmox{, -yew-comp, -datacenter-manager}/xtermjs 00/11] add remote node shell Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH pve-xtermjs 1/1] xtermjs: add support for remote node shells via PDM Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH access-control 1/1] api: ticket: allow token-owned VNC ticket verification Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH manager 1/2] api: termproxy/vncwebsocket: allow tokens Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH manager 2/2] api: termproxy: add description to return schema Fabian Grünbichler
2025-11-05 14:13 ` Fabian Grünbichler [this message]
2025-11-05 14:13 ` [pve-devel] [PATCH proxmox 2/2] http: websocket: add proxy helper Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH proxmox-yew-comp 1/1] xtermjs: add remote support Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH proxmox-datacenter-manager 1/4] connection: add access to "raw" client Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH proxmox-datacenter-manager 2/4] api: pve: add termproxy endpoint Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH proxmox-datacenter-manager 3/4] api: pve: add vncwebsocket endpoint Fabian Grünbichler
2025-11-05 14:13 ` [pve-devel] [PATCH proxmox-datacenter-manager 4/4] ui: pve: node: add shell tab Fabian Grünbichler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251105141335.1230493-6-f.gruenbichler@proxmox.com \
--to=f.gruenbichler@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.