From f2f4317d4597d13ffa040d8026267190999da2c4 Mon Sep 17 00:00:00 2001 From: dusk Date: Mon, 21 Jul 2025 15:34:14 +0300 Subject: [PATCH] feat(dusk@devel.mobi): init user for devbox [skip ci] --- commit.nu | 10 ++-- deploy.nu | 50 +++++++++++++----- flake.nix | 2 +- hosts/wolumonde/modules/nushell.nix | 1 - modules/nushell/default.nix | 82 ----------------------------- modules/nushell/prompt.nu | 1 + users/default.nix | 23 ++++++++ users/dusk@devel.mobi/default.nix | 63 ++++++++++++++++++++++ users/modules/helix/default.nix | 7 +-- users/modules/nushell/aliases.nu | 1 + users/modules/nushell/default.nix | 75 ++++++++++++++++++++++++++ users/modules/nushell/prompt.nu | 1 + users/modules/ssh/default.nix | 2 - users/root/default.nix | 3 ++ 14 files changed, 212 insertions(+), 109 deletions(-) delete mode 120000 hosts/wolumonde/modules/nushell.nix delete mode 100644 modules/nushell/default.nix create mode 100644 users/default.nix create mode 100644 users/dusk@devel.mobi/default.nix create mode 120000 users/modules/nushell/aliases.nu create mode 100644 users/modules/nushell/default.nix create mode 120000 users/modules/nushell/prompt.nu diff --git a/commit.nu b/commit.nu index a010a2a..f43274a 100755 --- a/commit.nu +++ b/commit.nu @@ -10,6 +10,9 @@ def unwrap-or-else [val block] { if $val == null { do $block } else { $val } } +def get-attr-keys [attr: string] { + nix eval $attr --apply builtins.attrNames --json --quiet | from json +} def main [ _msg?: string @@ -21,12 +24,13 @@ def main [ let msg: string = unwrap-or-else $_msg { input 'enter commit message: ' } let types = ["feat" "build" "ci" "fix" "refactor" "chore" "style"] - let hosts: list = (nix eval ".#nixosConfigurations" --apply builtins.attrNames --json --quiet | from json) - let scopes = $hosts ++ ["qol" "treewide" "deploy" "commit" "deps"] + let hosts: list = (get-attr-keys ".#nixosConfigurations") + let users: list = (get-attr-keys ".#homeConfigurations") + let scopes = $hosts ++ $users ++ ["qol" "treewide" "deploy" "commit" "deps"] let ty: string = unwrap-or-else $type { $types | input list 'choose type' --fuzzy } let scp: string = unwrap-or-else $scope { $scopes | input list 'choose scope' --fuzzy } let skipci = if not $skip_ci { "" } else { " [skip ci]" } let commit_msg = $"($ty)\(($scp)\): ($msg)($skipci)" git commit -m $commit_msg ...$rest -} \ No newline at end of file +} diff --git a/deploy.nu b/deploy.nu index 4d79c12..57c824b 100755 --- a/deploy.nu +++ b/deploy.nu @@ -44,13 +44,23 @@ def time-block [block]: nothing -> record { return {result: $result, elapsed: ($end - $start)} } -let ips = { - wolumonde: "23.88.101.188", +let hosts = { + wolumonde: { + type: "nixos", + user: "root", + addr: "23.88.101.188", + }, + "dusk@devel.mobi": { + type: "home", + user: "dusk", + addr: "devel.mobi", + }, } def deploy [hostname: string] { log info $"start deploy host ($hostname)" let hooktitle = $"/($hostname)/deploy" + let hostcfg = $hosts | get $hostname webhook $hooktitle $"=== deploy for ($hostname): started ===\n\n(sys disks | to text)\n\n(sys mem | to text)" @@ -63,20 +73,30 @@ def deploy [hostname: string] { } let result_dir = mktemp -d | path join "result" - let build_cmd = {nh os build --no-nom -H $hostname -o $result_dir -- -L --show-trace} + let build_cmd = { + match $hostcfg.type { + "nixos" => {nh os build --no-nom -H $hostname -o $result_dir -- -L --show-trace} + "home" => {nh home build --no-nom -c $hostname -o $result_dir -- -L --show-trace} + } + } if (run_step "build" $build_cmd) { return } let result_link = readlink $result_dir - # TODO: dont hardcode user - let target = $"root@($ips | get $hostname)" + let target = $"($hostcfg.user)@($hostcfg.addr)" let copy_cmd = {nix copy --to $"ssh://($target)" $result_link} if (run_step "copy to" $copy_cmd) { return } - let activate_cmd = {ssh $target $"sudo '($result_link)/bin/switch-to-configuration' 'switch'"} + let activate_cmd = { + let cmd = match $hostcfg.type { + "nixos" => $"sudo '($result_link)/bin/switch-to-configuration' 'switch'", + "home" => $"($result_link)/activate", + } + ssh $target $cmd + } if (run_step "activate" $activate_cmd) { return } @@ -118,17 +138,19 @@ def update-input [input: string] { } } -def main [hostname: string = "wolumonde"] { +def main [hostname: string = "wolumonde", --only-deploy (-d)] { webhook "deploy" "=== started deploying all ===" - ["blog" "limbusart" "nsid-tracker"] - | each {|input| update-input $input} + if $only_deploy == false { + ["blog" "limbusart" "nsid-tracker"] + | each {|input| update-input $input} - try { - log info "trying to update dns records" - nix run ".#dns" -- push - } catch { |err| - webhook "dns" $"=== error pushing dns ===\n\n($err.msg | to text)" 1 + try { + log info "trying to update dns records" + nix run ".#dns" -- push + } catch { |err| + webhook "dns" $"=== error pushing dns ===\n\n($err.msg | to text)" 1 + } } deploy $hostname diff --git a/flake.nix b/flake.nix index 35a447c..d698b87 100644 --- a/flake.nix +++ b/flake.nix @@ -87,7 +87,7 @@ { lib = tlib; nixosConfigurations = import ./hosts { inherit lib tlib inputs; }; - homeConfigurations = import ./users; + homeConfigurations = import ./users { inherit lib tlib inputs; }; packages = lib.mapAttrs (_: pkgs: pkgs._exported) allPkgs; legacyPackages = allPkgs; diff --git a/hosts/wolumonde/modules/nushell.nix b/hosts/wolumonde/modules/nushell.nix deleted file mode 120000 index a222fb7..0000000 --- a/hosts/wolumonde/modules/nushell.nix +++ /dev/null @@ -1 +0,0 @@ -../../../modules/nushell/default.nix \ No newline at end of file diff --git a/modules/nushell/default.nix b/modules/nushell/default.nix deleted file mode 100644 index f4d97f8..0000000 --- a/modules/nushell/default.nix +++ /dev/null @@ -1,82 +0,0 @@ -{ lib, pkgs, ... }: -{ - environment.shells = [ pkgs.nushell ]; - users.users.root.shell = pkgs.nushell; - - home-manager.users.root = { - programs.nushell = { - enable = true; - package = pkgs.nushell; - shellAliases = { - myip = lib.mkForce "echo"; - }; - extraEnv = '' - source-env ${./prompt.nu} - ''; - extraConfig = '' - let carapace_completer = {|spans: list| - carapace $spans.0 nushell ...$spans - | from json - | if ($in | default [] | where value == $"($spans | last)ERR" | is-empty) { $in } else { null } - } - $env.CARAPACE_BRIDGES = 'zsh,fish,bash,inshellisense' - - let fish_completer = {|spans| - ${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | str join " ")"' - | $"value(char tab)description(char newline)" + $in - | from tsv --flexible --no-infer - } - - let zoxide_completer = {|spans| - $spans | skip 1 | zoxide query -l ...$in | lines | where {|x| $x != $env.PWD} - } - - let multiple_completers = {|spans| - ## alias fixer start https://www.nushell.sh/cookbook/external_completers.html#alias-completions - let expanded_alias = scope aliases - | where name == $spans.0 - | get -i 0.expansion - - let spans = if $expanded_alias != null { - $spans - | skip 1 - | prepend ($expanded_alias | split row ' ' | take 1) - } else { - $spans - } - ## alias fixer end - - match $spans.0 { - __zoxide_z | __zoxide_zi => $zoxide_completer - _ => $carapace_completer - } | do $in $spans - } - - $env.config = { - show_banner: false, - completions: { - case_sensitive: false # case-sensitive completions - quick: true # set to false to prevent auto-selecting completions - partial: true # set to false to prevent partial filling of the prompt - algorithm: "fuzzy" # prefix or fuzzy - external: { - # set to false to prevent nushell looking into $env.PATH to find more suggestions - enable: true - # set to lower can improve completion performance at the cost of omitting some options - max_results: 100 - completer: $multiple_completers - } - } - } - $env.PATH = ($env.PATH | - split row (char esep) | - append /usr/bin/env - ) - - source ${./aliases.nu} - ''; - }; - programs.carapace.enable = true; - programs.carapace.enableNushellIntegration = true; - }; -} diff --git a/modules/nushell/prompt.nu b/modules/nushell/prompt.nu index 91bb3e6..d82ef66 100644 --- a/modules/nushell/prompt.nu +++ b/modules/nushell/prompt.nu @@ -2,6 +2,7 @@ let host_colors = { higashi: {start: "0xEC5228", end: "0xEF9651"}, wolumonde: {start: "0x603F26", end: "0x6C4E31"}, chernobog: {start: "0xA94438", end: "0xD24545"}, + "sd-148036": {start: "0x595CFF", end: "0xC6F8FF"}, } let user_colors = { kirara: {start: "0xFF407D", end: "0xEE99C2"}, diff --git a/users/default.nix b/users/default.nix new file mode 100644 index 0000000..32dbf09 --- /dev/null +++ b/users/default.nix @@ -0,0 +1,23 @@ +{ + inputs, + lib, + tlib, + ... +}: +let + mkHome = + name: system: + let + pkgs = tlib.makePkgs system; + in + import "${inputs.home}/modules" { + inherit pkgs; + configuration = import (./. + "/${name}/default.nix"); + extraSpecialArgs = {inherit tlib inputs;}; + }; + + users = { + "dusk@devel.mobi" = "x86_64-linux"; + }; +in +lib.mapAttrs mkHome users diff --git a/users/dusk@devel.mobi/default.nix b/users/dusk@devel.mobi/default.nix new file mode 100644 index 0000000..cf790f4 --- /dev/null +++ b/users/dusk@devel.mobi/default.nix @@ -0,0 +1,63 @@ +{ + pkgs, + lib, + tlib, + inputs, + ... +}: +let + l = lib // builtins; + + signKeyText = builtins.readFile ../../secrets/yusdacra.key.pub; + personal = import ../../personal.nix; + name = personal.name; + email = personal.emails.primary; +in +{ + imports = + let + modulesToEnable = l.flatten [ + [ + "zoxide" + "fzf" + "direnv" + "nushell" + ] + # dev stuff + [ + "helix" + "git" + "ssh" + ] + ]; + in + l.flatten [ + ../../modules/persist/null.nix + (tlib.prefixStrings "${inputs.self}/users/modules/" modulesToEnable) + ]; + + home = { + homeDirectory = "/home/dusk"; + username = "dusk"; + stateVersion = "25.11"; + # file.".ssh/authorized_keys".text = '' + # ${signKeyText} + # ''; + }; + + programs = { + git = { + userName = name; + userEmail = email; + extraConfig = { + gpg.format = "ssh"; + commit.gpgsign = true; + user.signingkey = signKeyText; + }; + }; + }; + + services.podman = { + enable = true; + }; +} diff --git a/users/modules/helix/default.nix b/users/modules/helix/default.nix index 1f55869..707a509 100644 --- a/users/modules/helix/default.nix +++ b/users/modules/helix/default.nix @@ -1,10 +1,5 @@ { - inputs, - pkgs, - ... -}: -{ - stylix.targets.helix.enable = false; + # stylix.targets.helix.enable = false; programs.helix = { enable = true; languages.language = [ diff --git a/users/modules/nushell/aliases.nu b/users/modules/nushell/aliases.nu new file mode 120000 index 0000000..ff1a638 --- /dev/null +++ b/users/modules/nushell/aliases.nu @@ -0,0 +1 @@ +../../../modules/nushell/aliases.nu \ No newline at end of file diff --git a/users/modules/nushell/default.nix b/users/modules/nushell/default.nix new file mode 100644 index 0000000..5e7dfe2 --- /dev/null +++ b/users/modules/nushell/default.nix @@ -0,0 +1,75 @@ +{pkgs, lib, ...}: { + programs.carapace.enable = true; + programs.carapace.enableNushellIntegration = true; + programs.nushell = { + enable = true; + shellAliases = { + myip = lib.mkForce "echo"; + }; + extraEnv = '' + source-env ${./prompt.nu} + ''; + extraConfig = '' + let carapace_completer = {|spans: list| + carapace $spans.0 nushell ...$spans + | from json + | if ($in | default [] | where value == $"($spans | last)ERR" | is-empty) { $in } else { null } + } + $env.CARAPACE_BRIDGES = 'zsh,fish,bash,inshellisense' + + let fish_completer = {|spans| + ${lib.getExe pkgs.fish} --command $'complete "--do-complete=($spans | str join " ")"' + | $"value(char tab)description(char newline)" + $in + | from tsv --flexible --no-infer + } + + let zoxide_completer = {|spans| + $spans | skip 1 | zoxide query -l ...$in | lines | where {|x| $x != $env.PWD} + } + + let multiple_completers = {|spans| + ## alias fixer start https://www.nushell.sh/cookbook/external_completers.html#alias-completions + let expanded_alias = scope aliases + | where name == $spans.0 + | get -i 0.expansion + + let spans = if $expanded_alias != null { + $spans + | skip 1 + | prepend ($expanded_alias | split row ' ' | take 1) + } else { + $spans + } + ## alias fixer end + + match $spans.0 { + __zoxide_z | __zoxide_zi => $zoxide_completer + _ => $carapace_completer + } | do $in $spans + } + + $env.config = { + show_banner: false, + completions: { + case_sensitive: false # case-sensitive completions + quick: true # set to false to prevent auto-selecting completions + partial: true # set to false to prevent partial filling of the prompt + algorithm: "fuzzy" # prefix or fuzzy + external: { + # set to false to prevent nushell looking into $env.PATH to find more suggestions + enable: true + # set to lower can improve completion performance at the cost of omitting some options + max_results: 100 + completer: $multiple_completers + } + } + } + $env.PATH = ($env.PATH | + split row (char esep) | + append /usr/bin/env + ) + + source ${./aliases.nu} + ''; + }; +} diff --git a/users/modules/nushell/prompt.nu b/users/modules/nushell/prompt.nu new file mode 120000 index 0000000..be45cb0 --- /dev/null +++ b/users/modules/nushell/prompt.nu @@ -0,0 +1 @@ +../../../modules/nushell/prompt.nu \ No newline at end of file diff --git a/users/modules/ssh/default.nix b/users/modules/ssh/default.nix index 1a3f22b..62a9cee 100644 --- a/users/modules/ssh/default.nix +++ b/users/modules/ssh/default.nix @@ -1,11 +1,9 @@ -{ nixosConfig, ... }: { programs.ssh = { enable = true; compression = true; hashKnownHosts = true; addKeysToAgent = "yes"; - package = nixosConfig.programs.ssh.package; # Only needed for darcs hub # extraConfig = '' # Host hub.darcs.net diff --git a/users/root/default.nix b/users/root/default.nix index 1f5f25a..885ab4e 100644 --- a/users/root/default.nix +++ b/users/root/default.nix @@ -1,4 +1,7 @@ { ... }: { users.users.root.initialHashedPassword = "$6$XLWo1sPpgp63Zm$XHBbULH9q1gb/.yalPPU/I7EgTcW80bM.moCjIe/qGyOwE47VcXNVbTHloBZdIWQq0MfIG0IxInAu59.oJyos/"; + home-manager.users.root = { + imports = [../modules/nushell]; + }; } -- 2.51.2