From 30d784e20c1b64100e3b01af11f4f24c8c448eb0 Mon Sep 17 00:00:00 2001 From: maralorn Date: Wed, 8 Mar 2023 23:02:07 +0100 Subject: [PATCH] Improve hotkey --- home-manager/roles/hotkeys.nix | 2 +- overlays/update-system.nix | 131 +++++++++++++++++++++++++++----- overlays/writeHaskellScript.nix | 3 + 3 files changed, 114 insertions(+), 22 deletions(-) diff --git a/home-manager/roles/hotkeys.nix b/home-manager/roles/hotkeys.nix index eafb55ee..389e8c65 100644 --- a/home-manager/roles/hotkeys.nix +++ b/home-manager/roles/hotkeys.nix @@ -134,7 +134,7 @@ in [ "MPD Whisky" = "ncmpcpp -h whisky.w17.io"; "MPD Burbon" = "ncmpcpp -h burbon.w17.io"; "MPD Kitchen" = "ncmpcpp -h kitchen.w17.io"; - Strichliste = "firefox https://strichliste.w17.io"; + Strichliste = "firefox https://strichliste.w17.io/#!/user/56"; Hub = "firefox https://hub.w17.io"; Summer = "ssh door@burbon.w17.io buzzer"; Open = "ssh door@burbon.w17.io open"; diff --git a/overlays/update-system.nix b/overlays/update-system.nix index 130e2ad3..ef2a9d3d 100644 --- a/overlays/update-system.nix +++ b/overlays/update-system.nix @@ -1,22 +1,111 @@ -final: _: { - updateSystem = final.writeShellScriptBin "update-system" '' - set -e - remote_host=$1 - host=''${remote_host:-$(hostname)} - echo "Building configuration for $host …" - output=$(nom build --builders @$(builders-configurator) /home/maralorn/git/config#nixosConfigurations.$host.config.system.build.toplevel --no-link --print-out-paths) - if [[ -z "$remote_host" ]]; then - on_target() { - /run/wrappers/bin/sudo $@ - } - else - on_target() { - ${final.lib.getExe final.openssh} root@$host $@ - } - echo "Uploading configuration to $host …" - ${final.lib.getExe final.nix} copy $output --to ssh://$host - fi - on_target ${final.nix}/bin/nix-env -p /nix/var/nix/profiles/system --set $output - on_target $output/bin/switch-to-configuration switch +final: _: let + inherit (final) pkgs lib; + homeDir = "/home/maralorn"; + modeFile = "${homeDir}/.volatile/mode"; + modeDir = "${homeDir}/.volatile/modes"; + configPath = "${homeDir}/git/config"; + configGit = "${lib.getExe pkgs.git} -C ${configPath}"; + get_mode = '' + mode <- decodeUtf8 @Text <$> (cat "${modeFile}" |> captureTrim) ''; -} + get_available_modes = '' + available_modes <- Directory.listDirectory "${modeDir}" + ''; + get_hostname = '' + hostname <- BSC.strip <$> readFileBS "/etc/hostname" + ''; + get_builders = '' + builders <- builders_configurator |> captureTrim + ''; + mode-scripts = { + maintenance = pkgs.writeShellScriptBin "maintenance" '' + set -e + ${configGit} pull --ff-only + echo "Running update-modes …" + ${lib.getExe pkgs.updateModes} + echo "Updating system …" + ${lib.getExe pkgs.updateSystem} + echo "Maintenance finished." + ''; + activateMode = pkgs.writeHaskellScript {name = "activate-mode";} '' + wallpaperCmd = "random-wallpaper" + + main = do + ${get_mode} + say [i|Switching to mode #{mode}...|] + exe ([i|${modeDir}/#{mode}/activate|] :: String) + whenM (elem wallpaperCmd <$> pathBins) $ exe wallpaperCmd + ''; + selectMode = + pkgs.writeHaskellScript + { + name = "select-mode"; + bins = [ + pkgs.activateMode + pkgs.psmisc + ]; + imports = ["System.Directory qualified as Directory"]; + } '' + main = do + [mode] <- getArgs + ${get_available_modes} + unless (mode `elem` available_modes) do say [i|"#{mode}" is not a known mode|]; exitFailure + writeFile "${modeFile}" mode + activate_mode + ignoreFailure $ killall ["GeckoMain", "firefox", ".firefox-wrapped"] + ''; + updateModes = + pkgs.writeHaskellScript + { + name = "update-modes"; + bins = [pkgs.activateMode pkgs.git pkgs.nix-output-monitor pkgs.builders-configurator]; + } '' + main = do + ${get_hostname} + say [i|Building ~/.modes for #{hostname}|] + ${get_builders} + nom ["build", "--builders", [i|@#{builders}|], [i|${configPath}\#homeModes.#{hostname}|], "-o", "${modeDir}"] + activate_mode + ''; + quickUpdateMode = + pkgs.writeHaskellScript + { + name = "quick-update-mode"; + bins = [pkgs.updateModes pkgs.git pkgs.home-manager pkgs.nix-output-monitor pkgs.builders-configurator]; + } '' + + main = do + ${get_hostname} + ${get_mode} + ${get_builders} + say [i|Quick switching to mode #{mode} ...|] + path <- decodeUtf8 @Text <$> (nom ["build", "--builders", [i|@#{builders}|], "--print-out-paths", "--no-link", [i|${configPath}\#homeConfigurations.#{hostname}-#{mode}.activationPackage|]] |> captureTrim) + exe ([i|#{path}/activate|] :: String) + update_modes + ''; + updateSystem = pkgs.writeShellScriptBin "update-system" '' + set -e + remote_host=$1 + host=''${remote_host:-$(hostname)} + echo "Building configuration for $host …" + output=$(nom build --builders @$(builders-configurator) /home/maralorn/git/config#nixosConfigurations.$host.config.system.build.toplevel --no-link --print-out-paths) + if [[ -z "$remote_host" ]]; then + on_target() { + /run/wrappers/bin/sudo $@ + } + else + on_target() { + ${pkgs.lib.getExe pkgs.openssh} root@$host $@ + } + echo "Uploading configuration to $host …" + ${final.lib.getExe pkgs.nix} copy $output --to ssh://$host + fi + on_target ${pkgs.nix}/bin/nix-env -p /nix/var/nix/profiles/system --set $output + on_target $output/bin/switch-to-configuration switch + ''; + }; +in + mode-scripts + // { + inherit mode-scripts; + } diff --git a/overlays/writeHaskellScript.nix b/overlays/writeHaskellScript.nix index 7fb5cff1..77ae7786 100644 --- a/overlays/writeHaskellScript.nix +++ b/overlays/writeHaskellScript.nix @@ -71,13 +71,16 @@ in { {-# LANGUAGE PartialTypeSignatures #-} {-# LANGUAGE BlockArguments #-} {-# LANGUAGE ImportQualifiedPost #-} + {-# LANGUAGE TypeApplications #-} import Shh import Relude import Say import qualified Relude.Unsafe as Unsafe import qualified Data.ByteString.Lazy as LBS + import qualified Data.ByteString.Lazy.Char8 as LBSC import qualified Data.ByteString as BS + import qualified Data.ByteString.Char8 as BSC import qualified Data.Text as Text import System.Environment (setEnv) import Control.Exception (bracket, try)