connectiopn fix round 2 1
This commit is contained in:
@ -399,13 +399,14 @@
|
||||
let cachedHostGroups = [];
|
||||
let cachedHosts = [];
|
||||
let cachedSshKeys = [];
|
||||
let cachedRdpCredentials = [];
|
||||
let activeHostId = null;
|
||||
let editingHostGroupId = null;
|
||||
|
||||
async function loadHostsTab() {
|
||||
document.getElementById("hgc-tenant-box").classList.toggle("hidden", !meInfo.is_admin && meInfo.tenant_admin_of.length <= 1);
|
||||
await populateTenantSelect(document.getElementById("hgc-tenant"));
|
||||
await Promise.all([refreshHostGroups(), refreshSshKeysCache()]);
|
||||
await Promise.all([refreshHostGroups(), refreshSshKeysCache(), refreshRdpCredentialsCache()]);
|
||||
await refreshHosts();
|
||||
}
|
||||
|
||||
@ -496,6 +497,10 @@
|
||||
cachedSshKeys = await getJson("/admin/ssh-keys");
|
||||
}
|
||||
|
||||
async function refreshRdpCredentialsCache() {
|
||||
cachedRdpCredentials = await getJson("/admin/rdp-credentials");
|
||||
}
|
||||
|
||||
function setDetailBanner(message, type) {
|
||||
const box = document.getElementById("host-detail-banner");
|
||||
if (!message) {
|
||||
@ -512,9 +517,9 @@
|
||||
return `Anmeldung als "${host.rdp_credentials_username}"${domain} (aus den RDP-Zugangsdaten unten).`;
|
||||
}
|
||||
if (host.rdp_username) {
|
||||
return `Noch kein Benutzername in den Zugangsdaten -- es wird der alte Wert am Host verwendet ("${host.rdp_username}"). Bitte unten bei den RDP-Zugangsdaten neu setzen.`;
|
||||
return `Noch kein Zugangsdaten-Objekt zugewiesen -- es wird der alte Wert am Host verwendet ("${host.rdp_username}"). Bitte unten RDP-Zugangsdaten zuweisen.`;
|
||||
}
|
||||
return "Kein Windows-Benutzername hinterlegt -- unten bei den RDP-Zugangsdaten eintragen, sonst schlaegt die Anmeldung fehl.";
|
||||
return "Kein Windows-Benutzername hinterlegt -- unten RDP-Zugangsdaten zuweisen (oder im Reiter \"Zugangsdaten\" zuerst anlegen), sonst schlaegt die Anmeldung fehl.";
|
||||
}
|
||||
const named = (host.ssh_keys || []).filter((k) => k.username);
|
||||
if (named.length) {
|
||||
@ -590,10 +595,11 @@
|
||||
document.getElementById("hspw-username").value = host.ssh_password_credentials_username || "";
|
||||
|
||||
document.getElementById("rdp-cred-status").textContent = host.rdp_credentials_set
|
||||
? `RDP-Zugangsdaten gesetzt fuer "${host.rdp_credentials_username || "(kein Benutzername)"}" (zuletzt aktualisiert: ${host.rdp_credentials_updated_at}).`
|
||||
: "Noch keine RDP-Zugangsdaten gesetzt.";
|
||||
document.getElementById("hrc-username").value = host.rdp_credentials_username || host.rdp_username || "";
|
||||
document.getElementById("hrc-domain").value = host.rdp_credentials_domain || host.rdp_domain || "";
|
||||
? `Zugewiesen: "${host.rdp_credentials_label}" -- Anmeldung als "${host.rdp_credentials_username || "(kein Benutzername)"}" (zuletzt aktualisiert: ${host.rdp_credentials_updated_at}).`
|
||||
: "Noch keine RDP-Zugangsdaten zugewiesen.";
|
||||
const rdpSelect = document.getElementById("hrcm-select");
|
||||
rdpSelect.replaceChildren(...optionsFromList(cachedRdpCredentials, "id", (c) => `${c.label} (${c.username}${c.domain ? "@" + c.domain : ""}, #${c.id})`));
|
||||
if (host.rdp_credentials_id) rdpSelect.value = String(host.rdp_credentials_id);
|
||||
} catch (err) {
|
||||
setDetailBanner(err.message, "error");
|
||||
}
|
||||
@ -697,25 +703,26 @@
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("host-rdp-cred-form").addEventListener("submit", async (ev) => {
|
||||
document.getElementById("host-rdp-cred-map-form").addEventListener("submit", async (ev) => {
|
||||
ev.preventDefault();
|
||||
try {
|
||||
const password = document.getElementById("hrc-password").value;
|
||||
const username = document.getElementById("hrc-username").value.trim();
|
||||
const domain = document.getElementById("hrc-domain").value.trim() || null;
|
||||
await sendJson(`/admin/hosts/${activeHostId}/rdp-credentials`, "PUT", { password, username, domain });
|
||||
showBanner("RDP-Zugangsdaten gespeichert.", "ok");
|
||||
ev.target.reset();
|
||||
const credentialId = document.getElementById("hrcm-select").value;
|
||||
if (!credentialId) {
|
||||
showBanner('Bitte zuerst im Reiter "Zugangsdaten" ein RDP-Zugangsdaten-Objekt anlegen.', "error");
|
||||
return;
|
||||
}
|
||||
await sendJson(`/admin/hosts/${activeHostId}/rdp-credentials/${credentialId}`, "POST", {});
|
||||
showBanner("RDP-Zugangsdaten zugewiesen.", "ok");
|
||||
await showHostDetail(activeHostId);
|
||||
} catch (err) {
|
||||
setDetailBanner(err.message, "error");
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("hrc-delete-btn").addEventListener("click", async () => {
|
||||
document.getElementById("hrc-unassign-btn").addEventListener("click", async () => {
|
||||
try {
|
||||
await apiFetch(`/admin/hosts/${activeHostId}/rdp-credentials`, { method: "DELETE" });
|
||||
showBanner("RDP-Zugangsdaten geloescht.", "ok");
|
||||
showBanner("Zuordnung entfernt.", "ok");
|
||||
await showHostDetail(activeHostId);
|
||||
} catch (err) {
|
||||
setDetailBanner(err.message, "error");
|
||||
@ -754,7 +761,11 @@
|
||||
|
||||
async function loadCredentialsTab() {
|
||||
document.getElementById("skc-tenant-box").classList.toggle("hidden", !meInfo.is_admin && meInfo.tenant_admin_of.length <= 1);
|
||||
await populateTenantSelect(document.getElementById("skc-tenant"));
|
||||
document.getElementById("rcc-tenant-box").classList.toggle("hidden", !meInfo.is_admin && meInfo.tenant_admin_of.length <= 1);
|
||||
await Promise.all([
|
||||
populateTenantSelect(document.getElementById("skc-tenant")),
|
||||
populateTenantSelect(document.getElementById("rcc-tenant")),
|
||||
]);
|
||||
await Promise.all([refreshSshKeys(), refreshRdpCredentials()]);
|
||||
}
|
||||
|
||||
@ -908,37 +919,102 @@
|
||||
}
|
||||
});
|
||||
|
||||
let editingRdpCredentialId = null;
|
||||
|
||||
async function refreshRdpCredentials() {
|
||||
const rows = await getJson("/admin/rdp-credentials");
|
||||
cachedRdpCredentials = await getJson("/admin/rdp-credentials");
|
||||
const tbody = document.querySelector("#rdp-creds-table tbody");
|
||||
fillTable(
|
||||
tbody,
|
||||
rows.map((r) =>
|
||||
cachedRdpCredentials.map((r) =>
|
||||
el("tr", {}, [
|
||||
el("td", { textContent: r.hostname }),
|
||||
el("td", { textContent: r.address }),
|
||||
el("td", { textContent: r.host_group_name }),
|
||||
el("td", { textContent: String(r.id) }),
|
||||
el("td", { textContent: r.label }),
|
||||
el("td", { textContent: r.username || "-" }),
|
||||
el("td", {}, [el("span", { className: `badge ${r.credentials_set ? "ok" : ""}`, textContent: r.credentials_set ? "gesetzt" : "nicht gesetzt" })]),
|
||||
el("td", { textContent: r.updated_at || "-" }),
|
||||
el("td", { textContent: r.domain || "-" }),
|
||||
el("td", { textContent: r.tenant_name }),
|
||||
el("td", {
|
||||
textContent: r.assigned_hosts.length
|
||||
? r.assigned_hosts.map((h) => h.hostname).join(", ")
|
||||
: "(keinem Server zugewiesen)",
|
||||
}),
|
||||
el("td", { textContent: r.rotated_at || r.created_at }),
|
||||
el("td", {}, [
|
||||
actionButton("Zum Host", "btn-secondary", async () => {
|
||||
document.querySelector('.tab-btn[data-tab="servers"]').click();
|
||||
await showHostDetail(r.host_id);
|
||||
actionButton("Bearbeiten", "btn-secondary", () => showRdpCredentialEdit(r)),
|
||||
actionButton("Loeschen", "btn-danger", async () => {
|
||||
const result = await apiFetch(`/admin/rdp-credentials/${r.id}`, { method: "DELETE" });
|
||||
const suffix = result.unmapped_host_ids.length
|
||||
? ` (Zuordnung zu Host(s) ${result.unmapped_host_ids.join(", ")} entfernt)`
|
||||
: "";
|
||||
showBanner(`RDP-Zugangsdaten '${r.label}' geloescht.${suffix}`, "ok");
|
||||
await refreshRdpCredentials();
|
||||
}),
|
||||
...(r.credentials_set
|
||||
? [actionButton("Entfernen", "btn-danger", async () => {
|
||||
await apiFetch(`/admin/hosts/${r.host_id}/rdp-credentials`, { method: "DELETE" });
|
||||
showBanner("RDP-Passwort entfernt.", "ok");
|
||||
await refreshRdpCredentials();
|
||||
})]
|
||||
: []),
|
||||
]),
|
||||
])
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function showRdpCredentialEdit(r) {
|
||||
editingRdpCredentialId = r.id;
|
||||
document.getElementById("rdp-cred-edit-panel").classList.remove("hidden");
|
||||
document.getElementById("rdp-cred-edit-name").textContent = `${r.label} (#${r.id})`;
|
||||
document.getElementById("rce-label").value = r.label;
|
||||
document.getElementById("rce-username").value = r.username || "";
|
||||
document.getElementById("rce-domain").value = r.domain || "";
|
||||
document.getElementById("rcr-password").value = "";
|
||||
}
|
||||
|
||||
document.getElementById("rdp-cred-edit-form").addEventListener("submit", async (ev) => {
|
||||
ev.preventDefault();
|
||||
try {
|
||||
await sendJson(`/admin/rdp-credentials/${editingRdpCredentialId}`, "PUT", {
|
||||
label: document.getElementById("rce-label").value.trim() || null,
|
||||
username: document.getElementById("rce-username").value.trim() || null,
|
||||
// Leeres Feld -> null entfernt die Domaene bewusst (Feld-vorhanden-
|
||||
// vs-null-Semantik wie bei SSH-Keys).
|
||||
domain: document.getElementById("rce-domain").value.trim() || null,
|
||||
});
|
||||
showBanner("RDP-Zugangsdaten aktualisiert.", "ok");
|
||||
await refreshRdpCredentials();
|
||||
} catch (err) {
|
||||
showBanner(err.message, "error");
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("rdp-cred-rotate-form").addEventListener("submit", async (ev) => {
|
||||
ev.preventDefault();
|
||||
try {
|
||||
const password = document.getElementById("rcr-password").value;
|
||||
await sendJson(`/admin/rdp-credentials/${editingRdpCredentialId}`, "PUT", { password });
|
||||
showBanner("Neues Passwort gespeichert.", "ok");
|
||||
document.getElementById("rcr-password").value = "";
|
||||
await refreshRdpCredentials();
|
||||
} catch (err) {
|
||||
showBanner(err.message, "error");
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById("rdp-cred-create-form").addEventListener("submit", async (ev) => {
|
||||
ev.preventDefault();
|
||||
try {
|
||||
const tenantSelect = document.getElementById("rcc-tenant");
|
||||
const payload = {
|
||||
label: document.getElementById("rcc-label").value.trim(),
|
||||
username: document.getElementById("rcc-username").value.trim(),
|
||||
domain: document.getElementById("rcc-domain").value.trim() || null,
|
||||
password: document.getElementById("rcc-password").value,
|
||||
tenant_id: tenantSelect.value ? Number(tenantSelect.value) : null,
|
||||
};
|
||||
await sendJson("/admin/rdp-credentials", "POST", payload);
|
||||
showBanner(`RDP-Zugangsdaten '${payload.label}' angelegt.`, "ok");
|
||||
ev.target.reset();
|
||||
await refreshRdpCredentials();
|
||||
} catch (err) {
|
||||
showBanner(err.message, "error");
|
||||
}
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// Rollen
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user