infra: steal from the best
(Mic92's cluster TUM's infra.)
This commit is contained in:
parent
41aead1a04
commit
107cc6e53f
22 changed files with 951 additions and 0 deletions
25
modules/auto-upgrade.nix
Normal file
25
modules/auto-upgrade.nix
Normal file
|
@ -0,0 +1,25 @@
|
|||
{ pkgs, ... }: {
|
||||
system.autoUpgrade.enable = true;
|
||||
system.autoUpgrade.flake = "git:git.newtype.fr/newtype/newtype-org-configurations";
|
||||
system.autoUpgrade.flags = [ "--option" "accept-flake-config" "true" ];
|
||||
|
||||
# add a random jitter so not all machines reboot at the same time.
|
||||
systemd.timers.auto-reboot.timerConfig.RandomizedDelaySec = 60 * 20;
|
||||
|
||||
systemd.services.auto-reboot = {
|
||||
path = [ pkgs.systemd pkgs.util-linux ];
|
||||
# The last saturday in a month
|
||||
startAt = "Sat *-*~07/1";
|
||||
script = ''
|
||||
booted="$(readlink /run/booted-system/{initrd,kernel,kernel-modules})"
|
||||
built="$(readlink /nix/var/nix/profiles/system/{initrd,kernel,kernel-modules})"
|
||||
if [ "''${booted}" = "''${built}" ]; then
|
||||
echo "No kernel update... skipping reboot"
|
||||
else
|
||||
# reboot in 24 hours
|
||||
msg=$(shutdown -r +${toString (60 * 24)} 2>&1)
|
||||
echo "$msg" | wall
|
||||
fi
|
||||
'';
|
||||
};
|
||||
}
|
11
modules/builder.nix
Normal file
11
modules/builder.nix
Normal file
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
users.extraUsers.nix = {
|
||||
isNormalUser = true;
|
||||
home = "/home/nix";
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAZpEtSfB0GDwcELc5/AKNiBZJV9OVfQ0BMFzBlF+8Yd raito@everywhere"
|
||||
];
|
||||
uid = 5001;
|
||||
};
|
||||
nix.settings.trusted-users = [ "nix" ];
|
||||
}
|
16
modules/fck-spectr.nix
Normal file
16
modules/fck-spectr.nix
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
# It may leak your data, but look how FAST it is!1!!
|
||||
# https://make-linux-fast-again.com/
|
||||
boot.kernelParams = [
|
||||
"noibrs"
|
||||
"noibpb"
|
||||
"nopti"
|
||||
"nospectre_v2"
|
||||
"nospectre_v1"
|
||||
"l1tf=off"
|
||||
"nospec_store_bypass_disable"
|
||||
"no_stf_barrier"
|
||||
"mds=off"
|
||||
"mitigations=off"
|
||||
];
|
||||
}
|
41
modules/hardware/supermicro-H12SSL-i.nix
Normal file
41
modules/hardware/supermicro-H12SSL-i.nix
Normal file
|
@ -0,0 +1,41 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports =
|
||||
[ (modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
boot.kernelParams = [ "pci=realloc" ];
|
||||
boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
|
||||
boot.initrd.kernelModules = [ ];
|
||||
boot.kernelModules = [ "kvm-amd" ];
|
||||
boot.extraModulePackages = [ ];
|
||||
|
||||
boot.initrd.systemd.enable = lib.mkForce false;
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/disk/by-uuid/3a81ba8f-f5bb-446c-89a3-ad77e354dae0";
|
||||
fsType = "btrfs";
|
||||
};
|
||||
|
||||
boot.initrd.luks.devices."nixroot" = {
|
||||
device = "/dev/disk/by-uuid/c10d2822-cb83-4666-98f8-0aa04be259bc";
|
||||
keyFile = "/dev/zero";
|
||||
keyFileSize = 1;
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-uuid/AFF2-3149";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[ { device = "/dev/disk/by-uuid/93e251e1-1bfc-4bd4-8585-ea2eae7795bf"; }
|
||||
];
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
47
modules/hosts.nix
Normal file
47
modules/hosts.nix
Normal file
|
@ -0,0 +1,47 @@
|
|||
{ lib, config, ... }:
|
||||
let
|
||||
hostOptions = with lib; {
|
||||
ipv4 = mkOption {
|
||||
default = null;
|
||||
type = types.nullOr types.str;
|
||||
description = ''
|
||||
own ipv4 address
|
||||
'';
|
||||
};
|
||||
|
||||
ipv6 = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = ''
|
||||
own ipv6 address
|
||||
'';
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
options = with lib; {
|
||||
networking.newtype.hosts = mkOption {
|
||||
type = with types; attrsOf (submodule [{ options = hostOptions; }]);
|
||||
description = "A host in our cluster";
|
||||
};
|
||||
networking.newtype.currentHost = mkOption {
|
||||
type = with types; submodule [{ options = hostOptions; }];
|
||||
default = config.networking.newtype.hosts.${config.networking.hostName};
|
||||
description = "The host that is described by this configuration";
|
||||
};
|
||||
};
|
||||
config = {
|
||||
warnings =
|
||||
lib.optional (!(config.networking.newtype.hosts ? ${config.networking.hostName}) &&
|
||||
config.networking.hostName != "nixos" # we dont care about nixos netboot/installer images
|
||||
)
|
||||
"Please add network configuration for ${config.networking.hostName}. None found in ${./hosts.nix}";
|
||||
|
||||
# usually, for each host there is a hostname.dse.in.tum.de and hostname.r domain
|
||||
networking.newtype.hosts = {
|
||||
epyc = {
|
||||
ipv6 = "2001:470:ca5e:dee:587c:7a50:f36c:cae8";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
7
modules/ipmi-supermicro.nix
Normal file
7
modules/ipmi-supermicro.nix
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
# supermicro uses ttyS1 for SOL
|
||||
boot.kernelParams = [
|
||||
"console=ttyS1,115200n8"
|
||||
"console=tty1"
|
||||
];
|
||||
}
|
49
modules/network.nix
Normal file
49
modules/network.nix
Normal file
|
@ -0,0 +1,49 @@
|
|||
{ config
|
||||
, lib
|
||||
, ...
|
||||
}: {
|
||||
# use networkd
|
||||
networking.dhcpcd.enable = false;
|
||||
systemd.network.enable = true;
|
||||
|
||||
# add an entry to /etc/hosts for each host
|
||||
networking.extraHosts = lib.concatStringsSep "\n" (lib.mapAttrsToList
|
||||
(name: host: ''
|
||||
${lib.optionalString (host.ipv4 != null) "${host.ipv4} ${name}"}
|
||||
${lib.optionalString (host.ipv6 != null) "${host.ipv6} ${name}"}
|
||||
'')
|
||||
config.networking.newtype.hosts);
|
||||
|
||||
# leave container interfaces alone
|
||||
systemd.network.networks."05-veth".extraConfig = ''
|
||||
[Match]
|
||||
Driver = veth
|
||||
|
||||
[Link]
|
||||
Unmanaged = yes
|
||||
'';
|
||||
|
||||
systemd.network.networks."10-nat-lan" = {
|
||||
matchConfig.Name = "nat-lan";
|
||||
linkConfig.RequiredForOnline = true;
|
||||
DHCP = "yes";
|
||||
};
|
||||
|
||||
systemd.network.links."10-nat-lan" = {
|
||||
matchConfig.MACAddress = "3c:ec:ef:7e:bd:c8";
|
||||
linkConfig.Name = "nat-lan";
|
||||
};
|
||||
|
||||
systemd.network.networks."10-wan" = {
|
||||
matchConfig.Name = "wan";
|
||||
linkConfig.RequiredForOnline = true;
|
||||
networkConfig.Address = [ config.networking.newtype.currentHost.ipv6 ];
|
||||
};
|
||||
|
||||
systemd.network.links."10-wan" = {
|
||||
matchConfig.MACAddress = "3c:ec:ef:7e:bd:c9";
|
||||
linkConfig.Name = "wan";
|
||||
};
|
||||
|
||||
deployment.targetHost = "${config.networking.hostName}.infra.newtype.fr";
|
||||
}
|
60
modules/nix-daemon.nix
Normal file
60
modules/nix-daemon.nix
Normal file
|
@ -0,0 +1,60 @@
|
|||
{ lib
|
||||
, config
|
||||
, pkgs
|
||||
, ...
|
||||
}:
|
||||
|
||||
let
|
||||
gcc-system-features = arch: lib.optionals (arch != null) ([ "gccarch-${arch}" ]
|
||||
++ map (x: "gccarch-${x}") lib.systems.architectures.inferiors.${arch});
|
||||
in
|
||||
{
|
||||
options = {
|
||||
simd.arch = lib.mkOption {
|
||||
type = with lib.types; nullOr str;
|
||||
default = null;
|
||||
description = ''
|
||||
Microarchitecture string for nixpkgs.hostPlatform.gcc.march and to generate system-features.
|
||||
Can be determined with: gcc -march=native -Q --help=target | grep march
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
imports = [ ./builder.nix ];
|
||||
|
||||
config = {
|
||||
warnings = lib.optionals (config.simd.arch == null) [ "Please set simd.arch for ${config.networking.hostName}" ];
|
||||
|
||||
nix = {
|
||||
gc.automatic = true;
|
||||
gc.dates = "03:15";
|
||||
gc.options = "--delete-older-than 30d";
|
||||
|
||||
# 2.11, 2.12 suffers from a bug with remote builders…
|
||||
package = pkgs.nixVersions.nix_2_13;
|
||||
|
||||
# should be enough?
|
||||
nrBuildUsers = lib.mkDefault 32;
|
||||
|
||||
# https://github.com/NixOS/nix/issues/719
|
||||
|
||||
settings = {
|
||||
keep-outputs = true;
|
||||
keep-derivations = true;
|
||||
# in zfs we trust
|
||||
fsync-metadata = lib.boolToString (!config.boot.isContainer or config.fileSystems."/".fsType != "zfs");
|
||||
substituters = [
|
||||
"https://nix-community.cachix.org"
|
||||
"https://tum-dse.cachix.org"
|
||||
];
|
||||
system-features = [ "benchmark" "big-parallel" "kvm" "nixos-test" ] ++ gcc-system-features config.simd.arch;
|
||||
trusted-public-keys = [
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
"tum-dse.cachix.org-1:v67rK18oLwgO0Z4b69l30SrV1yRtqxKpiHodG4YxhNM="
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
};
|
||||
}
|
39
modules/packages.nix
Normal file
39
modules/packages.nix
Normal file
|
@ -0,0 +1,39 @@
|
|||
{ pkgs, ... }: {
|
||||
# this extends the list from:
|
||||
# https://github.com/numtide/srvos/blob/master/server.nix#L10
|
||||
environment.systemPackages = with pkgs; [
|
||||
socat
|
||||
whois
|
||||
|
||||
jq
|
||||
psmisc
|
||||
libarchive
|
||||
sipcalc
|
||||
iperf
|
||||
openssl
|
||||
binutils
|
||||
file
|
||||
wget
|
||||
htop
|
||||
ripgrep
|
||||
lsof
|
||||
tcpdump
|
||||
rsync
|
||||
git
|
||||
tig
|
||||
lazygit
|
||||
python3
|
||||
iotop
|
||||
man-pages
|
||||
netcat
|
||||
mtr
|
||||
(neovim.override { vimAlias = true; })
|
||||
|
||||
pciutils
|
||||
ethtool
|
||||
usbutils
|
||||
|
||||
ipmitool
|
||||
# tries to default to soft-float due to out-dated cc-rs
|
||||
] ++ lib.optional (!stdenv.hostPlatform.isRiscV) bandwhich;
|
||||
}
|
18
modules/tor-ssh.nix
Normal file
18
modules/tor-ssh.nix
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
# imports = [ ./sshd ];
|
||||
services.tor = {
|
||||
enable = true;
|
||||
relay.onionServices."ssh".map = [{ port = 22; }];
|
||||
|
||||
settings = {
|
||||
DnsPort = 9053;
|
||||
AutomapHostsOnResolve = true;
|
||||
AutomapHostsSuffixes = [ ".exit" ".onion" ];
|
||||
EnforceDistinctSubnets = true;
|
||||
ExitNodes = "{fr}";
|
||||
EntryNodes = "{fr}";
|
||||
NewCircuitPeriod = 120;
|
||||
DNSPort = 9053;
|
||||
};
|
||||
};
|
||||
}
|
70
modules/users/admins.nix
Normal file
70
modules/users/admins.nix
Normal file
|
@ -0,0 +1,70 @@
|
|||
{ config
|
||||
, lib
|
||||
, ...
|
||||
}:
|
||||
let
|
||||
extraGroups = [ "wheel" "docker" "plugdev" "vboxusers" "adbusers" "input" ];
|
||||
in
|
||||
{
|
||||
config = {
|
||||
users.users = {
|
||||
# Ryan Lahfa
|
||||
raito = {
|
||||
isNormalUser = true;
|
||||
home = "/home/raito";
|
||||
inherit extraGroups;
|
||||
shell = "/run/current-system/sw/bin/zsh";
|
||||
uid = 1000;
|
||||
openssh.authorizedKeys.keyFiles = [ ./keys/raito.keys ];
|
||||
};
|
||||
|
||||
# Julien Malka
|
||||
luj = {
|
||||
isNormalUser = true;
|
||||
home = "/home/luj";
|
||||
inherit (config.users.users.raito) extraGroups;
|
||||
shell = "/run/current-system/sw/bin/zsh";
|
||||
uid = 1001;
|
||||
openssh.authorizedKeys.keyFiles = [ ./keys/luj.keys ];
|
||||
};
|
||||
|
||||
# Gabriel Doriath Döhler
|
||||
gdd = {
|
||||
isNormalUser = true;
|
||||
home = "/home/gdd";
|
||||
inherit (config.users.users.raito) extraGroups;
|
||||
shell = "/run/current-system/sw/bin/zsh";
|
||||
uid = 1002;
|
||||
openssh.authorizedKeys.keyFiles = [ ./keys/gdd.keys ];
|
||||
};
|
||||
|
||||
# Samy Lahfa
|
||||
akechi = {
|
||||
isNormalUser = true;
|
||||
home = "/home/akechi";
|
||||
inherit (config.users.users.raito) extraGroups;
|
||||
shell = "/run/current-system/sw/bin/zsh";
|
||||
uid = 1003;
|
||||
openssh.authorizedKeys.keyFiles = [ ./keys/akechi.keys ];
|
||||
};
|
||||
|
||||
# Tom Hubrecht
|
||||
tomate = {
|
||||
isNormalUser = true;
|
||||
home = "/home/tomate";
|
||||
inherit (config.users.users.raito) extraGroups;
|
||||
shell = "/run/current-system/sw/bin/zsh";
|
||||
uid = 1004;
|
||||
openssh.authorizedKeys.keyFiles = [ ./keys/tomate.keys ];
|
||||
};
|
||||
|
||||
root = {
|
||||
hashedPassword = "$y$j9T$LiCWsEVrg9FlcEwuDGsol.$ghfkPkQGoAt23hI6.vWNLrSdHDnVwxg8EE/2w2pRbT6";
|
||||
# passwordFile = lib.mkIf config.users.withSops config.sops.secrets.root-password-hash.path;
|
||||
openssh.authorizedKeys.keyFiles = lib.concatMap (user: config.users.users.${user}.openssh.authorizedKeys.keyFiles) [ "raito" "luj" "gdd" "akechi" "tomate" ];
|
||||
};
|
||||
};
|
||||
|
||||
nix.settings.trusted-users = [ "raito" "luj" "gdd" "akechi" "tomate" ];
|
||||
};
|
||||
}
|
2
modules/users/keys/akechi.keys
Normal file
2
modules/users/keys/akechi.keys
Normal file
|
@ -0,0 +1,2 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDmC/lBooMyJZnyuU0/f6Qufi48DCEQ1RNT1l25cbvZWCXRrAJuQUTgb7u2nl8SEiQTRbZy/FTesaoPNBRWtWXK/8M0K58DeTMdNeTV8joW+vwEzRF3LPb9gU3FqCuuFFRqhJNC16cFBxXMCyjmktl8EG9o5yVcT/6HdwvXRKlas+EqXHlZblXxYQfCjWkpd3vzIoEfPwkUpQFlvLltTBT+EUWTiysvF8cCCuBx7EXHX++fNNySDoB9bQJ+sYoAvuhtfZ5eYNePpYQCV71KMEPYBqJ7AQpvdbMa34Rx7mghGCLk580qWTuXf/vqKRD4EAsvPYtK/xJNyjrCTX99TL60NIsBgNzQvvFFIaAsD91nD13gaEvybOjIo1lbzSZhbreX1qdWeUCR32HDUH4fEVv81VSaPbH2zxWqIf8bLDMJ7pCLKncyCZD1yVFCXsDV/J8BQq0c3GtFh3eEt59bkk6iU+LXv9dvwJtCvsp087Yh4qhj0L9z2zgczeljKJtFFTZhWbY3WEKiureoI7iPEJvLB8B6pGF0qQmIjbIIx6gtBoJc891w+XUmaXfHhWsVV7eq2y/AU7BvXAZp3LigWvosmPpoYsgjS0RNp2RJo2ufN6wKBtq+qv0xM+S6JvXo5pf2Oe11qp8hxF32MNv+djFK3Qf/JMkZAQd1Y/vW/Gg8Xw==
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIK5vbxUd8I+uF/OY/PpPhSzrLN14Waq82uyQXNPYpHjA
|
1
modules/users/keys/gdd.keys
Normal file
1
modules/users/keys/gdd.keys
Normal file
|
@ -0,0 +1 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICE7TN5NQKGojNGIeTFiHjLHTDQGT8i05JFqX/zLW2zc
|
11
modules/users/keys/luj.keys
Normal file
11
modules/users/keys/luj.keys
Normal file
|
@ -0,0 +1,11 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIM9Uzb7szWlux7HuxLZej9cBR5MhLz/vaAPPfSoozt2k
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDCKfPoMNrnyNWH6J1OvQ+n1rvSS9Sc2iZf6E1JQC+L4
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIESMWr29i3rhj32oLV3DKe57YI+jvNaKjZhhpq6dEjsn
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJOCKgHRHAJDSgKqYNfWboL04mnEOM0m0K3TGxBhBNDR
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOpGHx430EpJmbtJc8+lF1CpQ1gXeHT9OeZ08O8yzohF
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEaCGndojnmS5IoqHVMEPRfKuBZotMyqo7wNkAZJWigp
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILxfFq8wx5Bet5Q0gI28/lc9ryYYFQelpZdPPdzxGBbA
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGa+7n7kNzb86pTqaMn554KiPrkHRGeTJ0asY1NjSbpr
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILKIDLmQQ+P+jE4zVRpdVp8fmYEe4nzPDqYZt6A4eyIi
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAkj2xsN7Qt/Ew2QO+HiF2yOjXPRucZ3SbIdPDLJoh22
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCUt5I3IgONzYsMOFnRXtvR/uLXlIs6oWsCmh6YGgnpGD4M9lFdoYAOeC1faQUnP66sNs6AoacrGlPZ1UkVUqYEoIr2hiNCDRzzLCQ2J/sSaw7Hv0PKT7MWMo8R076M3TrdunCchBJI1noez3waM9aL4b/iYVhxym28ET55QrWjyMQfZL9PXzOKZatNVcK8AmdtSbI+pFrm/tTZPa321drm9PHOo9CL+lG4YmVZcXa0bVfVtk1GXlWwNpCj2ExLmbF1rRpAa05khfnbg3sBSklwf5NRXj11KneodKRF81ji7MtBhIIfoEXSYht7yspdkkS9e9mv16VGV+2ziM8zG3MK/iUq7fg5ksN54D3DNrd9iI5WjQZsLUrK0ypxO2NtvupWGYt3rCyKA/QvynbxOWFp6cy3Evej142hsfbiOcPIgCtGdHIBevp+KmPxkHBqsJPBqb3Y7nOMT1/ggDMtvHZEZJjEI2D2RjZNEXGbq63OPAqEkgmecW0cXlrjLEGhF2E=
|
3
modules/users/keys/raito.keys
Normal file
3
modules/users/keys/raito.keys
Normal file
|
@ -0,0 +1,3 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDcEkYM1r8QVNM/G5CxJInEdoBCWjEHHDdHlzDYNSUIdHHsn04QY+XI67AdMCm8w30GZnLUIj5RiJEWXREUApby0GrfxGGcy8otforygfgtmuUKAUEHdU2MMwrQI7RtTZ8oQ0USRGuqvmegxz3l5caVU7qGvBllJ4NUHXrkZSja2/51vq80RF4MKkDGiz7xUTixI2UcBwQBCA/kQedKV9G28EH+1XfvePqmMivZjl+7VyHsgUVj9eRGA1XWFw59UPZG8a7VkxO/Eb3K9NF297HUAcFMcbY6cPFi9AaBgu3VC4eetDnoN/+xT1owiHi7BReQhGAy/6cdf7C/my5ehZwD
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE0xMwWedkKosax9+7D2OlnMxFL/eV4CvFZLsbLptpXr
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKiXXYkhRh+s7ixZ8rvG8ntIqd6FELQ9hh7HoaHQJRPU
|
1
modules/users/keys/tomate.keys
Normal file
1
modules/users/keys/tomate.keys
Normal file
|
@ -0,0 +1 @@
|
|||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL+EZXYziiaynJX99EW8KesnmRTZMof3BoIs3mdEl8L3
|
8
modules/zsh.nix
Normal file
8
modules/zsh.nix
Normal file
|
@ -0,0 +1,8 @@
|
|||
{ pkgs, ... }: {
|
||||
programs.zsh.enable = true;
|
||||
programs.zsh.enableCompletion = true;
|
||||
programs.zsh.enableGlobalCompInit = false;
|
||||
programs.zsh.interactiveShellInit = ''
|
||||
source ${pkgs.zsh-nix-shell}/share/zsh-nix-shell/nix-shell.plugin.zsh
|
||||
'';
|
||||
}
|
Reference in a new issue