Always render VM list; surface SPICE connect target for diagnosis
- Auto-connect (single-VM shortcut and autostart match) now renders the VM list first instead of skipping straight to the connect attempt. With cluster dedup collapsing 3 duplicate entries down to 1, the VM vanished from the screen entirely whenever the connection failed. - proxmox:connect now returns the resolved host:port it handed to remote-viewer, shown in the success notice, so connection failures (e.g. Proxmox handing out a cluster-internal node address the client cannot route to) can be diagnosed without racing delete-this-file.
This commit is contained in:
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "proxmox-spice-client",
|
"name": "proxmox-spice-client",
|
||||||
"version": "1.0.5",
|
"version": "1.0.6",
|
||||||
"description": "VDI SPICE Client f\u00fcr Proxmox",
|
"description": "VDI SPICE Client f\u00fcr Proxmox",
|
||||||
"main": "src/main.js",
|
"main": "src/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
+8
-3
@@ -222,9 +222,9 @@ ipcMain.handle('proxmox:connect', async (_e, { host, node, vmid }) => {
|
|||||||
const entry = clients.find((c) => c.host === host) || clients[0];
|
const entry = clients.find((c) => c.host === host) || clients[0];
|
||||||
if (!entry) throw new Error('Nicht angemeldet.');
|
if (!entry) throw new Error('Nicht angemeldet.');
|
||||||
const params = await entry.client.getSpiceTicket(node, vmid);
|
const params = await entry.client.getSpiceTicket(node, vmid);
|
||||||
const vvPath = buildVVFile(params, vmid, entry.client);
|
const { vvPath, target } = buildVVFile(params, vmid, entry.client);
|
||||||
launchRemoteViewer(vvPath);
|
launchRemoteViewer(vvPath);
|
||||||
return { success: true };
|
return { success: true, target };
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return { success: false, error: err.message };
|
return { success: false, error: err.message };
|
||||||
}
|
}
|
||||||
@@ -290,7 +290,12 @@ function buildVVFile(params, vmid, client) {
|
|||||||
|
|
||||||
const vvPath = path.join(os.tmpdir(), `spice-${vmid}-${Date.now()}.vv`);
|
const vvPath = path.join(os.tmpdir(), `spice-${vmid}-${Date.now()}.vv`);
|
||||||
fs.writeFileSync(vvPath, lines.join('\n') + '\n', { mode: 0o600 });
|
fs.writeFileSync(vvPath, lines.join('\n') + '\n', { mode: 0o600 });
|
||||||
return vvPath;
|
|
||||||
|
// Surfaced to the renderer so a failed connection (e.g. Proxmox handing out
|
||||||
|
// a cluster-internal node address the client can't route to) is diagnosable
|
||||||
|
// without having to catch the .vv file before remote-viewer deletes it.
|
||||||
|
const port = params['tls-port'] || params.port || '?';
|
||||||
|
return { vvPath, target: `${host}:${port}` };
|
||||||
}
|
}
|
||||||
|
|
||||||
// VirtViewer's Windows installer names its folder after the bundled version
|
// VirtViewer's Windows installer names its folder after the bundled version
|
||||||
|
|||||||
+11
-8
@@ -76,6 +76,15 @@ async function loadVMs() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const autoConnect = await api.settings.getAutoConnect();
|
||||||
|
const autoMatch = autoConnect && vms.find(
|
||||||
|
(vm) => vm.host === autoConnect.host && String(vm.vmid) === String(autoConnect.vmid)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Render the list first — even when we're about to auto-connect, Stefan
|
||||||
|
// needs to see the VM (and reach Settings/retry) if that connection fails.
|
||||||
|
renderList(vms, autoConnect);
|
||||||
|
|
||||||
// Auto-connect when there is exactly one SPICE VM
|
// Auto-connect when there is exactly one SPICE VM
|
||||||
if (vms.length === 1) {
|
if (vms.length === 1) {
|
||||||
showNotice(`Nur eine VM verfügbar — verbinde mit „${vms[0].name}" …`);
|
showNotice(`Nur eine VM verfügbar — verbinde mit „${vms[0].name}" …`);
|
||||||
@@ -84,18 +93,11 @@ async function loadVMs() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Auto-connect the VM the user marked for autostart (only one at a time)
|
// Auto-connect the VM the user marked for autostart (only one at a time)
|
||||||
const autoConnect = await api.settings.getAutoConnect();
|
|
||||||
const autoMatch = autoConnect && vms.find(
|
|
||||||
(vm) => vm.host === autoConnect.host && String(vm.vmid) === String(autoConnect.vmid)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (autoMatch) {
|
if (autoMatch) {
|
||||||
showNotice(`Autostart-VM „${autoMatch.name}" markiert — verbinde …`);
|
showNotice(`Autostart-VM „${autoMatch.name}" markiert — verbinde …`);
|
||||||
await connectVM(autoMatch);
|
await connectVM(autoMatch);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderList(vms, autoConnect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
loadVMs();
|
loadVMs();
|
||||||
@@ -187,7 +189,8 @@ async function connectVM(vm) {
|
|||||||
if (!result.success) {
|
if (!result.success) {
|
||||||
showError(result.error || 'Verbindung fehlgeschlagen.');
|
showError(result.error || 'Verbindung fehlgeschlagen.');
|
||||||
} else {
|
} else {
|
||||||
showNotice(`„${vm.name}" — SPICE-Sitzung gestartet.`);
|
const targetInfo = result.target ? ` (Ziel: ${result.target})` : '';
|
||||||
|
showNotice(`„${vm.name}" — SPICE-Sitzung gestartet${targetInfo}.`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user