Add Nix flake configuration

This commit is contained in:
2023-01-02 22:49:03 +00:00
parent df7e3734e0
commit 201a751382
24 changed files with 724 additions and 110 deletions

64
flake.lock generated Normal file
View File

@ -0,0 +1,64 @@
{
"nodes": {
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"utils": "utils"
},
"locked": {
"lastModified": 1672244468,
"narHash": "sha256-xaZb8AZqoXRCSqPusCk4ouf+fUNP8UJdafmMTF1Ltlw=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "89a8ba0b5b43b3350ff2e3ef37b66736b2ef8706",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-22.11",
"repo": "home-manager",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1672353432,
"narHash": "sha256-oZfgp/44/o2tWiylV30cR+DLyWTJ+5dhsdWZVpzs3e4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "913a47cd064cc06440ea84e5e0452039a85781f0",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-22.11",
"type": "indirect"
}
},
"root": {
"inputs": {
"home-manager": "home-manager",
"nixpkgs": "nixpkgs"
}
},
"utils": {
"locked": {
"lastModified": 1667395993,
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

46
flake.nix Normal file
View File

@ -0,0 +1,46 @@
{
description = "NixOS/Darwin system configuration";
inputs = {
nixpkgs.url = "nixpkgs/nixos-22.11";
home-manager = {
url = "github:nix-community/home-manager/release-22.11";
inputs.nixpkgs.follows = "nixpkgs";
};
};
outputs = inputs @ { nixpkgs, home-manager, ... }:
let
inherit (lib) attrValues;
inherit (lib.my) mapModules mapModulesRec;
mkPkgs = pkgs:
import pkgs {
config.allowUnfree = true;
};
pkgs = mkPkgs nixpkgs;
lib = nixpkgs.lib.extend (self: super: {
my = import ./lib {
inherit pkgs inputs;
lib = self;
};
});
in {
lib = lib.my;
nixosModules = mapModulesRec ./modules import;
nixosConfigurations = {
atlas = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
inputs.home-manager.nixosModules.home-manager
(import ./modules)
./hosts/atlas
];
specialArgs = { inherit lib inputs; };
};
};
};
}

19
hosts/atlas/README.md Normal file
View File

@ -0,0 +1,19 @@
# Atlas
## Overview
A general purpose mini computer used for web browsing and multimedia.
## Specs
* CPU - Intel Core i7-4790K @ 4.00GHz
* Memory - 8 GB DDR3
* Motherboard - ASRock Z97M-ITX
* GPU - AMD Radeon R9 290X 4GB
### Disks
Device | Partitions _(filesystem, usage)_
--- | ---
Samsung SSD 850 | `/dev/sda1` (NTFS, Windows XP)
Samsung SSD 850 | `/dev/sdb1` (EFI, NixOS Boot) <br> `/dev/sdb2` (ext4, NixOS Root)
### Networks
DHCP on `10.0.1.0/24` subnet.

45
hosts/atlas/default.nix Normal file
View File

@ -0,0 +1,45 @@
{ config, lib, pkgs, ... }:
with lib.my;
{
imports = [
./hardware-configuration.nix
../desktop.nix
];
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.efi.efiSysMountPoint = "/boot/efi";
networking.hostName = "atlas";
networking.networkmanager.enable = true;
nix.package = pkgs.nixFlakes;
nix.extraOptions = ''
experimental-features = nix-command flakes
'';
users.defaultUserShell = pkgs.zsh;
system.stateVersion = "22.11";
modules = {
desktop = {
firefox.enable = true;
};
editors = {
neovim.enable = true;
vscode.enable = true;
};
security = {
gpg.enable = true;
pass.enable = true;
};
shell = {
fzf.enable = true;
git.enable = true;
nnn.enable = true;
zsh.enable = true;
};
};
}

View 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.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" "wl" ];
boot.extraModulePackages = [ config.boot.kernelPackages.broadcom_sta ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/db92d689-50d4-4301-90f9-122aab198e38";
fsType = "ext4";
};
fileSystems."/boot/efi" =
{ device = "/dev/disk/by-uuid/0720-9BE0";
fsType = "vfat";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/fb217be3-c5df-4e70-8032-78bfbe7325cb"; }
];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
networking.useDHCP = lib.mkDefault true;
# networking.interfaces.enp0s25.useDHCP = lib.mkDefault true;
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
# high-resolution display
hardware.video.hidpi.enable = lib.mkDefault true;
}

36
hosts/desktop.nix Normal file
View File

@ -0,0 +1,36 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
{
time.timeZone = "Europe/London";
i18n.defaultLocale = "en_GB.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "en_GB.UTF-8";
LC_IDENTIFICATION = "en_GB.UTF-8";
LC_MEASUREMENT = "en_GB.UTF-8";
LC_MONETARY = "en_GB.UTF-8";
LC_NAME = "en_GB.UTF-8";
LC_NUMERIC = "en_GB.UTF-8";
LC_PAPER = "en_GB.UTF-8";
LC_TELEPHONE = "en_GB.UTF-8";
LC_TIME = "en_GB.UTF-8";
};
console.keyMap = "uk";
services.printing.enable = true;
sound.enable = true;
hardware.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
};
modules.desktop.gnome.enable = true;
}

110
install
View File

@ -1,110 +0,0 @@
#!/bin/sh -e
repo_dir=$(readlink -f $(dirname "$0"))
link() {
[ -L "$HOME/.config" ] && return 0
for file in ".profile" ".zprofile" ".config"; do
ln -sf "$repo_dir/$file" "$HOME/$file"
done
source ~/.profile
}
install() {
sudo pacman -S --needed \
base-devel \
bind \
bmon \
cgdb \
expect \
fd \
ffmpeg \
firefox \
fzf \
git \
gdb \
grim \
gtk-layer-shell \
iotop \
imagemagick \
isync \
kitty \
lynx \
mpd \
mpv \
msmtp \
ncmpcpp \
neomutt \
neovim \
newsboat \
ninja \
nnn \
notmuch \
noto-fonts \
nodejs \
npm \
ntfs-3g \
otf-font-awesome \
pass \
pass-otp \
playerctl \
powertop \
python \
python-pip \
python-neovim \
qt5-wayland \
qt6-wayland \
ripgrep \
rsync \
slurp \
sway \
tcpdump \
tokei \
transmission-cli \
tree \
ttf-ubuntu-font-family \
yt-dlp \
waybar \
wf-recorder \
wl-clipboard \
zathura \
zathura-pdf-mupdf \
zsh \
zsh-autosuggestions \
zsh-history-substring-search
[ -d "/usr/share/zsh/plugins/fast-syntax-highlighting" ] || sudo git clone \
https://github.com/zdharma-continuum/fast-syntax-highlighting \
/usr/share/zsh/plugins/fast-syntax-highlighting
[ -d "/usr/share/zsh/plugins/zsh-vim-mode" ] || sudo git clone \
https://github.com/softmoth/zsh-vim-mode \
/usr/share/zsh/plugins/zsh-vim-mode
[ -x "/usr/bin/pam_exec-ssh" ] || {
sudo install -m755 \
"$repo_dir/.config/ssh-agent/pam_exec-ssh" \
/usr/bin/pam_exec-ssh
mkdir ~/.ssh/unlock.d
ln -s ~/.ssh/id_ed25519 ~/.ssh/unlock.d/id_ed25519
sudo sed -i '$a auth optional pam_exec.so expose_authtok /usr/bin/pam_exec-ssh' \
/etc/pam.d/system-local-login
}
[ -x "/usr/bin/sirula" ] || {
tmp_dir="$(mktemp -d)" && pushd "$tmp_dir" && {
curl -sSfO "https://jordanholt.xyz/sirula"
sudo install -m755 sirula /usr/bin/
popd
rm -rf $tmp_dir
}
}
}
configure() {
loginctl enable-linger $UID
}
install && link && configure

26
lib/attrs.nix Normal file
View File

@ -0,0 +1,26 @@
{ lib, ... }:
with builtins;
with lib;
rec {
# attrsToList
attrsToList = attrs:
mapAttrsToList (name: value: { inherit name value; }) attrs;
# mapFilterAttrs ::
# (name -> value -> bool)
# (name -> value -> { name = any; value = any; })
# attrs
mapFilterAttrs = pred: f: attrs: filterAttrs pred (mapAttrs' f attrs);
# Generate an attribute set by mapping a function over a list of values.
genAttrs' = values: f: listToAttrs (map f values);
# anyAttrs :: (name -> value -> bool) attrs
anyAttrs = pred: attrs:
any (attr: pred attr.name attr.value) (attrsToList attrs);
# countAttrs :: (name -> value -> bool) attrs
countAttrs = pred: attrs:
count (attr: pred attr.name attr.value) (attrsToList attrs);
}

19
lib/default.nix Normal file
View File

@ -0,0 +1,19 @@
{ inputs, lib, pkgs, ... }:
let
inherit (lib) makeExtensible attrValues foldr;
inherit (modules) mapModules;
modules = import ./modules.nix {
inherit lib;
self.attrs = import ./attrs.nix { inherit lib; self = {}; };
};
mylib = makeExtensible (self:
with self; mapModules ./.
(file: import file { inherit self lib pkgs inputs; }));
in
mylib.extend
(self: super:
foldr (a: b: a // b) {} (attrValues super))

53
lib/modules.nix Normal file
View File

@ -0,0 +1,53 @@
{ self, lib, ... }:
let
inherit (builtins) attrValues readDir pathExists concatLists;
inherit (lib) id mapAttrsToList filterAttrs hasPrefix hasSuffix nameValuePair removeSuffix;
inherit (self.attrs) mapFilterAttrs;
in
rec {
mapModules = dir: fn:
mapFilterAttrs
(n: v:
v != null &&
!(hasPrefix "_" n))
(n: v:
let path = "${toString dir}/${n}"; in
if v == "directory" && pathExists "${path}/default.nix"
then nameValuePair n (fn path)
else if v == "regular" &&
n != "default.nix" &&
hasSuffix ".nix" n
then nameValuePair (removeSuffix ".nix" n) (fn path)
else nameValuePair "" null)
(readDir dir);
mapModules' = dir: fn:
attrValues (mapModules dir fn);
mapModulesRec = dir: fn:
mapFilterAttrs
(n: v:
v != null &&
!(hasPrefix "_" n))
(n: v:
let path = "${toString dir}/${n}"; in
if v == "directory"
then nameValuePair n (mapModulesRec path fn)
else if v == "regular" && n != "default.nix" && hasSuffix ".nix" n
then nameValuePair (removeSuffix ".nix" n) (fn path)
else nameValuePair "" null)
(readDir dir);
mapModulesRec' = dir: fn:
let
dirs =
mapAttrsToList
(k: _: "${dir}/${k}")
(filterAttrs
(n: v: v == "directory" && !(hasPrefix "_" n))
(readDir dir));
files = attrValues (mapModules dir id);
paths = files ++ concatLists (map (d: mapModulesRec' d id) dirs);
in map fn paths;
}

25
lib/nixos.nix Normal file
View File

@ -0,0 +1,25 @@
{ inputs, lib, pkgs, ... }:
with lib;
with lib.my;
let sys = "x86_64-linux";
in {
mkHost = path: attrs @ { system ? sys, ... }:
nixosSystem {
inherit system;
specialArgs = { inherit lib inputs system; };
modules = [
{
nixpkgs.pkgs = pkgs;
networking.hostName = mkDefault (removeSuffix ".nix" (baseNameOf path));
}
(filterAttrs (n: v: !elem n [ "system" ]) attrs)
../. # /default.nix
(import path)
];
};
mapHosts = dir: attrs @ { system ? system, ... }:
mapModules dir
(hostPath: mkHost hostPath attrs);
}

35
lib/options.nix Normal file
View File

@ -0,0 +1,35 @@
{ lib, ... }:
let
inherit (lib) mkOption types;
in
rec {
mkOpt = type: default:
mkOption { inherit type default; };
mkOpt' = type: default: description:
mkOption { inherit type default description; };
mkBoolOpt = default: mkOption {
inherit default;
type = types.bool;
example = true;
};
mkStringOpt = default: mkOption {
inherit default;
type = types.lines;
example = "";
};
mkListOfStringOpt = default: mkOption {
inherit default;
type = types.listOf types.lines;
example = [ "a" "b" "c" ];
};
mkPath = path:
if path != null
then toString path
else "";
}

15
modules/default.nix Normal file
View File

@ -0,0 +1,15 @@
{
imports = [
./options.nix
./desktop/firefox.nix
./desktop/gnome.nix
./editors/neovim.nix
./editors/vscode.nix
./security/gpg.nix
./security/pass.nix
./shell/fzf.nix
./shell/git.nix
./shell/nnn.nix
./shell/zsh.nix
];
}

View File

@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.desktop.firefox;
in {
options.modules.desktop.firefox = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.firefox = {
enable = true;
};
};
}

37
modules/desktop/gnome.nix Normal file
View File

@ -0,0 +1,37 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.desktop.gnome;
in {
options.modules.desktop.gnome = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
services.xserver = {
enable = true;
displayManager.gdm.enable = true;
desktopManager.gnome.enable = true;
};
fonts.fonts = with pkgs; [
noto-fonts
ubuntu_font_family
];
environment.systemPackages = with pkgs; [
bind
bmon
fd
ffmpeg
iotop
ripgrep
rsync
tcpdump
tokei
tree
wl-clipboard
];
};
}

View File

@ -0,0 +1,18 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.editors.neovim;
in {
options.modules.editors.neovim = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.neovim = {
enable = true;
vimAlias = true;
vimdiffAlias = true;
};
};
}

View File

@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.editors.vscode;
in {
options.modules.editors.vscode = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.vscode = {
enable = true;
};
};
}

69
modules/options.nix Normal file
View File

@ -0,0 +1,69 @@
{ config, options, lib, home-manager, ... }:
with lib;
with lib.my;
{
options = with types; {
user = mkOpt attrs { };
home = {
configFile = mkOpt' attrs { } "Files to place in $XDG_CONFIG_HOME";
dataFile = mkOpt' attrs { } "Files to place in $XDG_DATA_HOME";
file = mkOpt' attrs { } "Files to place directly in $HOME";
packages = mkOpt' attrs { } "User-level installed packages";
programs = mkOpt' attrs { } "Programs managed directly from home-manager";
services = mkOpt' attrs { } "Services managed directly from home-manager";
};
env = mkOption {
type = attrsOf (oneOf [ str path (listOf (either str path)) ]);
apply = mapAttrs (n: v:
if isList v then
concatMapStringsSep ":" (x: toString x) v
else
(toString v));
default = { };
description = "";
};
};
config = {
user =
let user = builtins.getEnv "USER";
name = if elem user [ "" "root" ] then "jordan" else user;
in {
inherit name;
isNormalUser = true;
extraGroups = [ "networkmanager" "wheel" ];
description = "Jordan Holt";
useDefaultShell = true;
home = "/home/${name}";
group = "users";
uid = 1000;
};
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.${config.user.name} = {
home = {
file = mkAliasDefinitions options.home.file;
stateVersion = config.system.stateVersion;
};
home.packages = mkAliasDefinitions options.home.packages;
programs = mkAliasDefinitions options.home.programs;
services = mkAliasDefinitions options.home.services;
xdg = {
enable = true;
configFile = mkAliasDefinitions options.home.configFile;
dataFile = mkAliasDefinitions options.home.dataFile;
};
};
};
users.users.${config.user.name} = mkAliasDefinitions options.user;
nixpkgs.config.allowUnfree = true;
};
}

21
modules/security/gpg.nix Normal file
View File

@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.security.gpg;
in {
options.modules.security.gpg = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.gpg = {
enable = true;
};
home.services.gpg-agent = {
enable = true;
enableSshSupport = true;
};
};
}

17
modules/security/pass.nix Normal file
View File

@ -0,0 +1,17 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.security.pass;
in {
options.modules.security.pass = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.password-store = {
enable = true;
package = pkgs.pass.withExtensions (exts: [ exts.pass-otp ]);
};
};
}

21
modules/shell/fzf.nix Normal file
View File

@ -0,0 +1,21 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.shell.fzf;
in {
options.modules.shell.fzf = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.packages = with pkgs; [
bind
];
home.programs.fzf = {
enable = true;
enableZshIntegration = true;
defaultCommand = "fd --type f --hidden --follow --exclude .git";
};
};
}

34
modules/shell/git.nix Normal file
View File

@ -0,0 +1,34 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.shell.git;
in {
options.modules.shell.git = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.git = {
enable = true;
aliases = {
amend = "commit --amend";
lg = "log --color --graph --abbrev-commit --";
ls = "ls-files";
unadd = "reset HEAD";
undo-commit = "reset --soft \"HEAD^\"";
};
userEmail = "jordan@vimium.com";
userName = "Jordan Holt";
signing = {
key = "B8CFFF61F1CCF520";
signByDefault = true;
};
extraConfig = {
rebase.autosquash = true;
push.default = "current";
pull.rebase = true;
};
};
};
}

16
modules/shell/nnn.nix Normal file
View File

@ -0,0 +1,16 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.shell.nnn;
in {
options.modules.shell.nnn = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.programs.nnn = {
enable = true;
};
};
}

35
modules/shell/zsh.nix Normal file
View File

@ -0,0 +1,35 @@
{ config, lib, pkgs, ... }:
with lib;
with lib.my;
let cfg = config.modules.shell.zsh;
in {
options.modules.shell.zsh = {
enable = mkBoolOpt false;
};
config = mkIf cfg.enable {
home.packages = with pkgs; [
zsh-autosuggestions
zsh-fast-syntax-highlighting
zsh-history-substring-search
];
home.programs.zsh = {
enable = true;
enableCompletion = true;
shellAliases = {
cp = "cp -iv";
mv = "mv -iv";
rm = "rm -v";
mkdir = "mkdir -v";
ls = "ls -h --color=auto --group-directories-first";
e = "nvim";
f = "nnn";
g = "git";
n = "nnn";
v = "nvim";
};
};
};
}