From b2ce90d06d3702529cde22ebb67ba17e6b3e3d5a Mon Sep 17 00:00:00 2001 From: "info@data-pro.nu" Date: Mon, 4 May 2026 19:41:13 +0200 Subject: [PATCH] Adapted uopdater/shell.qml for smarter sudo handling --- Droidnix/README.org | 234 ++++++-------------------------------------- 1 file changed, 30 insertions(+), 204 deletions(-) diff --git a/Droidnix/README.org b/Droidnix/README.org index fbf7ce0b4..64ab3a4ee 100644 --- a/Droidnix/README.org +++ b/Droidnix/README.org @@ -4572,13 +4572,23 @@ ShellRoot { readonly property int rebuildStep: 5 readonly property var steps: [ - { label: "Updating flake.lock", cmd: ["nix", "flake", "update"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, - { label: "Updating Flatpaks", cmd: ["flatpak", "update", "-y"], cwd: "/home/henrov" }, - { label: "Staging changes", cmd: ["git", "add", "."], cwd: "/home/henrov/Repos/nixos/Droidnix" }, - { label: "Committing changes", cmd: ["git", "commit", "-m", "Updated system"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, - { label: "Pushing to remote", cmd: ["git", "push"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, - { label: "Rebuilding NixOS", cmd: ["sudo", "-S", "nixos-rebuild", "switch", "--flake", ".#traveldroid"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, - { label: "Reloading Hyprland", cmd: ["hyprctl", "reload"], cwd: "/home/henrov" }, + { label: "Updating flake.lock", cmd: ["nix", "flake", "update"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Updating Flatpaks", cmd: ["flatpak", "update", "-y"], cwd: "/home/henrov" }, + { label: "Staging changes", cmd: ["git", "add", "."], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Committing changes", cmd: ["git", "commit", "-m", "Updated system"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + { label: "Pushing to remote", cmd: ["git", "push"], cwd: "/home/henrov/Repos/nixos/Droidnix" }, + + { + label: "Rebuilding NixOS", + cmd: [ + "sh", + "-c", + `echo "${sudoPassword}" | sudo -S nixos-rebuild switch --flake .#traveldroid` + ], + cwd: "/home/henrov/Repos/nixos/Droidnix" + }, + + { label: "Reloading Hyprland", cmd: ["hyprctl", "reload"], cwd: "/home/henrov" }, ] function runStep(index) { @@ -4590,6 +4600,7 @@ ShellRoot { currentStep = index currentLog = "" isRunning = true + stepProc.command = steps[index].cmd stepProc.workingDirectory = steps[index].cwd stepProc.running = true @@ -4611,13 +4622,6 @@ ShellRoot { } } - onStarted: { - if (currentStep === rebuildStep) { - stdin.write(sudoPassword + "\n") - stdin.close() - } - } - onExited: (code) => { if (code !== 0 && currentStep !== 3) { isFailed = true @@ -4629,214 +4633,36 @@ ShellRoot { } FloatingWindow { - title: "quickshell-updater" + title: "quickshell-updater" visible: true - width: 640 - height: contentCol.implicitHeight + 48 - color: "transparent" + width: 640 + + height: (contentCol.implicitHeight + 48) * 1.1 + + color: "transparent" Shortcut { sequence: "Escape" onActivated: Qt.quit() } - Rectangle { - anchors.fill: parent - anchors.margins: -2 - radius: 18 - z: -1 - gradient: Gradient { - orientation: Gradient.Horizontal - GradientStop { position: 0.0; color: colors.blue } - GradientStop { position: 1.0; color: colors.green } - } - } - Rectangle { anchors.fill: parent - radius: 16 - color: colors.base + radius: 16 + color: colors.base ColumnLayout { id: contentCol anchors { - top: parent.top - left: parent.left - right: parent.right + top: parent.top + left: parent.left + right: parent.right margins: 20 } spacing: 12 - Text { - text: " System Update" - color: colors.text - font.pixelSize: 15 - font.bold: true - Layout.topMargin: 8 - } + // ... unchanged UI omitted for brevity ... - // Steps - Repeater { - model: steps.length - - delegate: RowLayout { - spacing: 10 - Layout.fillWidth: true - - readonly property bool done: !isFailed && (index < currentStep || (!isRunning && currentStep === steps.length)) - readonly property bool active: isRunning && index === currentStep - readonly property bool failed: isFailed && index === currentStep - readonly property bool pending: !done && !active && !failed - - Text { - font.pixelSize: 14 - text: failed ? "✗" : done ? "✓" : active ? "›" : "○" - color: failed ? colors.red : done ? colors.green : active ? colors.yellow : colors.surface1 - } - - Text { - text: steps[index].label - font.pixelSize: 13 - color: failed ? colors.red : done ? colors.green : active ? colors.text : colors.surface1 - } - } - } - - // Password field — only shown before start - Rectangle { - visible: !started - Layout.fillWidth: true - height: 38 - radius: 8 - color: colors.surface0 - - RowLayout { - anchors { - fill: parent - margins: 10 - } - spacing: 8 - - Text { - text: "󰌾" - color: colors.subtext0 - font.pixelSize: 14 - } - - TextInput { - id: passwordInput - Layout.fillWidth: true - echoMode: TextInput.Password - color: colors.text - font.pixelSize: 13 - onTextChanged: sudoPassword = text - Keys.onReturnPressed: { - if (sudoPassword !== "") { - started = true - runStep(0) - } - } - } - - Text { - text: sudoPassword === "" ? "enter sudo password" : "" - color: colors.surface1 - font.pixelSize: 13 - // manual placeholder since Qt's built-in isn't always available - } - } - } - - // Log box - Rectangle { - Layout.fillWidth: true - height: 220 - radius: 8 - color: colors.surface0 - visible: currentLog !== "" && started - - Text { - anchors { - fill: parent - margins: 10 - } - text: currentLog - color: colors.subtext0 - font.pixelSize: 11 - font.family: "monospace" - wrapMode: Text.WrapAnywhere - verticalAlignment: Text.AlignBottom - } - } - - // Bottom bar - RowLayout { - Layout.fillWidth: true - Layout.bottomMargin: 8 - - Text { - font.pixelSize: 12 - text: { - if (!started) return "Enter your sudo password, then press Start" - if (isFailed) return "✗ Failed at: " + steps[currentStep].label - if (currentStep === steps.length) return "✓ All done!" - if (isRunning) return steps[currentStep].label + "…" - return "" - } - color: isFailed ? colors.red : currentStep === steps.length ? colors.green : colors.subtext0 - } - - Item { Layout.fillWidth: true } - - Rectangle { - visible: !started - width: 80 - height: 28 - radius: 14 - opacity: sudoPassword === "" ? 0.4 : 1.0 - gradient: Gradient { - orientation: Gradient.Horizontal - GradientStop { position: 0.0; color: colors.blue } - GradientStop { position: 1.0; color: colors.green } - } - Text { - anchors.centerIn: parent - text: "Start" - color: colors.base - font.pixelSize: 12 - font.bold: true - } - MouseArea { - anchors.fill: parent - cursorShape: sudoPassword === "" ? Qt.ArrowCursor : Qt.PointingHandCursor - onClicked: { - if (sudoPassword !== "") { - started = true - runStep(0) - } - } - } - } - - Rectangle { - visible: !isRunning && started - width: 80 - height: 28 - radius: 14 - color: colors.surface1 - Text { - anchors.centerIn: parent - text: currentStep === steps.length ? "Close" : "Dismiss" - color: colors.text - font.pixelSize: 12 - } - MouseArea { - anchors.fill: parent - cursorShape: Qt.PointingHandCursor - onClicked: Qt.quit() - } - } - } } } }