From 67fd748487a4312d7d9a742670a0ee3e86659fe6 Mon Sep 17 00:00:00 2001 From: Arthur Lu Date: Tue, 22 Apr 2025 23:48:45 +0000 Subject: [PATCH] change net and hostpci arguments, fix bug in ct-templates --- src/routes/cluster.js | 4 +-- src/routes/cluster/net.js | 35 ++++++-------------------- src/routes/cluster/pci.js | 52 +++++++++++---------------------------- src/routes/user.js | 12 ++++----- 4 files changed, 30 insertions(+), 73 deletions(-) diff --git a/src/routes/cluster.js b/src/routes/cluster.js index c0c6983..5ab9310 100644 --- a/src/routes/cluster.js +++ b/src/routes/cluster.js @@ -136,7 +136,7 @@ router.get(`${basePath}`, async (req, res) => { const params = { node: req.params.node, type: req.params.type, - vmid: req.params.vmid, + vmid: req.params.vmid }; // check auth for specific instance @@ -150,7 +150,7 @@ router.get(`${basePath}`, async (req, res) => { const instance = await global.pve.getInstance(params.node, params.vmid); res.status(200).send(instance); -}) +}); /** * POST - set basic resources for vm diff --git a/src/routes/cluster/net.js b/src/routes/cluster/net.js index 737d70e..6ae805c 100644 --- a/src/routes/cluster/net.js +++ b/src/routes/cluster/net.js @@ -26,17 +26,10 @@ router.post("/:netid/create", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - netid: Number(req.params.netid.replace("net", "")), + netid: req.params.netid, rate: req.body.rate, name: req.body.name }; - // check netid is a valid number - if (isNaN(params.netid)) { - res.status(500).send({ error: `Network interface id must be a number, got ${req.params.netid}.` }); - res.end(); - return; - } - // check auth for specific instance const vmpath = `/nodes/${params.node}/${params.type}/${params.vmid}`; const auth = await checkAuth(req.cookies, res, vmpath); @@ -46,7 +39,7 @@ router.post("/:netid/create", async (req, res) => { // net interface must not exist const net = await global.pve.getNet(params.node, params.vmid, params.netid); if (net) { - res.status(500).send({ error: `Network interface net${params.netid} already exists.` }); + res.status(500).send({ error: `Network interface ${params.netid} already exists.` }); res.end(); return; } @@ -69,10 +62,10 @@ router.post("/:netid/create", async (req, res) => { const nc = (await global.userManager.getUser(userObj, req.cookies)).templates.network[params.type]; const action = {}; if (params.type === "lxc") { - action[`net${params.netid}`] = `name=${params.name},bridge=${nc.bridge},ip=${nc.ip},ip6=${nc.ip6},tag=${nc.vlan},type=${nc.type},rate=${params.rate}`; + action[`${params.netid}`] = `name=${params.name},bridge=${nc.bridge},ip=${nc.ip},ip6=${nc.ip6},tag=${nc.vlan},type=${nc.type},rate=${params.rate}`; } else { - action[`net${params.netid}`] = `${nc.type},bridge=${nc.bridge},tag=${nc.vlan},rate=${params.rate}`; + action[`${params.netid}`] = `${nc.type},bridge=${nc.bridge},tag=${nc.vlan},rate=${params.rate}`; } const method = params.type === "qemu" ? "POST" : "PUT"; // commit action @@ -102,15 +95,9 @@ router.post("/:netid/modify", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - netid: Number(req.params.netid.replace("net", "")), + netid: req.params.netid, rate: req.body.rate }; - // check netid is a valid number - if (isNaN(params.netid)) { - res.status(500).send({ error: `Network interface id must be a number, got ${req.params.netid}.` }); - res.end(); - return; - } // check auth for specific instance const vmpath = `/nodes/${params.node}/${params.type}/${params.vmid}`; const auth = await checkAuth(req.cookies, res, vmpath); @@ -136,7 +123,7 @@ router.post("/:netid/modify", async (req, res) => { } // setup action const action = {}; - action[`net${params.netid}`] = net.value.replace(`rate=${net.rate}`, `rate=${params.rate}`); + action[`${params.netid}`] = net.value.replace(`rate=${net.rate}`, `rate=${params.rate}`); const method = params.type === "qemu" ? "POST" : "PUT"; // commit action const result = await global.pve.requestPVE(`${vmpath}/config`, method, { token: true }, action); @@ -163,14 +150,8 @@ router.delete("/:netid/delete", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - netid: Number(req.params.netid.replace("net", "")) + netid: req.params.netid }; - // check netid is a valid number - if (isNaN(params.netid)) { - res.status(500).send({ error: `Network interface id must be a number, got ${req.params.netid}.` }); - res.end(); - return; - } // check auth for specific instance const vmpath = `/nodes/${params.node}/${params.type}/${params.vmid}`; const auth = await checkAuth(req.cookies, res, vmpath); @@ -187,7 +168,7 @@ router.delete("/:netid/delete", async (req, res) => { // setup action const method = params.type === "qemu" ? "POST" : "PUT"; // commit action - const result = await global.pve.requestPVE(`${vmpath}/config`, method, { token: true }, { delete: `net${params.netid}` }); + const result = await global.pve.requestPVE(`${vmpath}/config`, method, { token: true }, { delete: `${params.netid}` }); await global.pve.handleResponse(params.node, result, res); await global.pve.syncInstance(params.node, params.vmid); }); diff --git a/src/routes/cluster/pci.js b/src/routes/cluster/pci.js index 4ac971b..5dc7150 100644 --- a/src/routes/cluster/pci.js +++ b/src/routes/cluster/pci.js @@ -22,14 +22,8 @@ router.get("/:hostpci", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - hostpci: Number(req.params.hostpci.replace("hostpci", "")) + hostpci: req.params.hostpci }; - // check hostpci is a valid number - if (isNaN(params.hostpci)) { - res.status(500).send({ error: `Hostpci id must be a number, got ${req.params.hostpci}.` }); - res.end(); - return; - } // check auth for specific instance const vmpath = `/nodes/${params.node}/${params.type}/${params.vmid}`; const auth = await checkAuth(req.cookies, res, vmpath); @@ -39,7 +33,7 @@ router.get("/:hostpci", async (req, res) => { // get device const device = await global.pve.getDevice(params.node, params.vmid, params.hostpci); if (!device) { - res.status(500).send({ error: `Could not find hostpci${params.hostpci}=${device} in ${params.node}.` }); + res.status(500).send({ error: `Could not find ${params.hostpci}=${device} in ${params.node}.` }); res.end(); return; } @@ -68,16 +62,10 @@ router.post("/:hostpci/modify", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - hostpci: Number(req.params.hostpci.replace("hostpci", "")), + hostpci: req.params.hostpci, device: req.body.device, pcie: req.body.pcie }; - // check hostpci is a valid number - if (isNaN(params.hostpci)) { - res.status(500).send({ error: `Hostpci id must be a number, got ${req.params.hostpci}.` }); - res.end(); - return; - } // check if type is qemu if (params.type !== "qemu") { res.status(500).send({ error: "Type must be qemu (vm)." }); @@ -95,13 +83,13 @@ router.post("/:hostpci/modify", async (req, res) => { // device must exist to be modified const existingDevice = await global.pve.getDevice(params.node, params.vmid, params.hostpci); if (!existingDevice) { - res.status(500).send({ error: `No device in hostpci${params.hostpci}.` }); + res.status(500).send({ error: `No device in ${params.hostpci}.` }); res.end(); return; } // only check user and node availability if base id is different, we do the split in case of existing partial-function hostpci const userObj = global.utils.getUserObjFromUsername(req.cookies.username); - if (existingDevice.device_id.split(".")[0] !== params.device) { + if (existingDevice.device_bus.split(".")[0] !== params.device) { // setup request const node = await global.pve.getNode(params.node); const requestedDevice = node.devices[`${params.device}`]; @@ -118,7 +106,7 @@ router.post("/:hostpci/modify", async (req, res) => { return; } // check node availability - if (!Object.values(node.devices).some(element => element.device_id.split(".")[0] === params.device && element.reserved === false)) { + if (!Object.values(node.devices).some(element => element.device_bus.split(".")[0] === params.device && element.reserved === false)) { res.status(500).send({ error: `Device ${params.device} is already in use on ${params.node}.` }); res.end(); return; @@ -126,7 +114,7 @@ router.post("/:hostpci/modify", async (req, res) => { } // setup action const action = {}; - action[`hostpci${params.hostpci}`] = `${params.device},pcie=${params.pcie}`; + action[`${params.hostpci}`] = `${params.device},pcie=${params.pcie}`; // commit action const result = await global.pve.requestPVE(`${vmpath}/config`, "POST", { root: true }, action); await global.pve.handleResponse(params.node, result, res); @@ -153,16 +141,10 @@ router.post("/:hostpci/create", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - hostpci: Number(req.params.hostpci.replace("hostpci", "")), + hostpci: req.params.hostpci, device: req.body.device, pcie: req.body.pcie }; - // check hostpci is a valid number - if (isNaN(params.hostpci)) { - res.status(500).send({ error: `Hostpci id must be a number, got ${req.params.hostpci}.` }); - res.end(); - return; - } // check if type is qemu if (params.type !== "qemu") { res.status(500).send({ error: "Type must be qemu (vm)." }); @@ -180,7 +162,7 @@ router.post("/:hostpci/create", async (req, res) => { // device must not exist to be added const existingDevice = await global.pve.getDevice(params.node, params.vmid, params.hostpci); if (existingDevice) { - res.status(500).send({ error: `Existing device in hostpci${params.hostpci}.` }); + res.status(500).send({ error: `Existing device in ${params.hostpci}.` }); res.end(); return; } @@ -197,14 +179,14 @@ router.post("/:hostpci/create", async (req, res) => { } // check node availability // const node = await global.pve.getNode(params.node); - if (!Object.values(node.devices).some(element => element.device_id.split(".")[0] === params.device && element.reserved === false)) { + if (!Object.values(node.devices).some(element => element.device_bus.split(".")[0] === params.device && element.reserved === false)) { res.status(500).send({ error: `Device ${params.device} is already in use on ${params.node}.` }); res.end(); return; } // setup action const action = {}; - action[`hostpci${params.hostpci}`] = `${params.device},pcie=${params.pcie}`; + action[`${params.hostpci}`] = `${params.device},pcie=${params.pcie}`; // commit action const result = await global.pve.requestPVE(`${vmpath}/config`, "POST", { root: true }, action); await global.pve.handleResponse(params.node, result, res); @@ -230,14 +212,8 @@ router.delete("/:hostpci/delete", async (req, res) => { node: req.params.node, type: req.params.type, vmid: req.params.vmid, - hostpci: Number(req.params.hostpci.replace("hostpci", "")) + hostpci: req.params.hostpci }; - // check hostpci is a valid number - if (isNaN(params.hostpci)) { - res.status(500).send({ error: `Hostpci id must be a number, got ${req.params.hostpci}.` }); - res.end(); - return; - } // check if type is qemu if (params.type !== "qemu") { res.status(500).send({ error: "Type must be qemu (vm)." }); @@ -253,12 +229,12 @@ router.delete("/:hostpci/delete", async (req, res) => { // check device is in instance config const device = global.pve.getDevice(params.node, params.vmid, params.hostpci); if (!device) { - res.status(500).send({ error: `Could not find hostpci${params.hostpci} in ${params.vmid}.` }); + res.status(500).send({ error: `Could not find ${params.hostpci} in ${params.vmid}.` }); res.end(); return; } // setup action - const action = { delete: `hostpci${params.hostpci}` }; + const action = { delete: `${params.hostpci}` }; // commit action, need to use root user here because proxmox api only allows root to modify hostpci for whatever reason const result = await global.pve.requestPVE(`${vmpath}/config`, "POST", { root: true }, action); await global.pve.handleResponse(params.node, result, res); diff --git a/src/routes/user.js b/src/routes/user.js index f1a2e21..619413b 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -73,10 +73,10 @@ router.get("/vm-isos", async (req, res) => { // get user iso config const userIsoConfig = config.useriso; // get all isos - const content = await global.pve.requestPVE(`/nodes/${userIsoConfig.node}/storage/${userIsoConfig.storage}/content?content=iso`, "GET", { token: true }) + const content = await global.pve.requestPVE(`/nodes/${userIsoConfig.node}/storage/${userIsoConfig.storage}/content?content=iso`, "GET", { token: true }); if (content.status !== 200) { - res.status(content.status).send({error: content.statusText}) - return + res.status(content.status).send({ error: content.statusText }); + return; } const isos = content.data.data; const userIsos = []; @@ -103,10 +103,10 @@ router.get("/ct-templates", async (req, res) => { // get user iso config const userIsoConfig = config.useriso; // get all isos - const content = await global.pve.requestPVE(`/nodes/${userIsoConfig.node}/storage/${userIsoConfig.storage}/content?content=iso`, "GET", { token: true }) + const content = await global.pve.requestPVE(`/nodes/${userIsoConfig.node}/storage/${userIsoConfig.storage}/content?content=vztmpl`, "GET", { token: true }); if (content.status !== 200) { - res.status(content.status).send({error: content.statusText}) - return + res.status(content.status).send({ error: content.statusText }); + return; } const isos = content.data.data; const userIsos = [];