Initial import
This commit is contained in:
commit
5543b7a3b7
52 changed files with 6168 additions and 0 deletions
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# Hidden files
|
||||||
|
.*
|
||||||
|
!.git*
|
||||||
|
|
||||||
|
# Nix
|
||||||
|
/result
|
||||||
|
/result-*
|
643
flake.lock
Normal file
643
flake.lock
Normal file
|
@ -0,0 +1,643 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"base16": {
|
||||||
|
"inputs": {
|
||||||
|
"fromYaml": "fromYaml"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708890466,
|
||||||
|
"narHash": "sha256-LlrC09LoPi8OPYOGPXegD72v+//VapgAqhbOFS3i8sc=",
|
||||||
|
"owner": "SenchoPens",
|
||||||
|
"repo": "base16.nix",
|
||||||
|
"rev": "665b3c6748534eb766c777298721cece9453fdae",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "SenchoPens",
|
||||||
|
"repo": "base16.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base16-fish": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1622559957,
|
||||||
|
"narHash": "sha256-PebymhVYbL8trDVVXxCvZgc0S5VxI7I1Hv4RMSquTpA=",
|
||||||
|
"owner": "tomyun",
|
||||||
|
"repo": "base16-fish",
|
||||||
|
"rev": "2f6dd973a9075dabccd26f1cded09508180bf5fe",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tomyun",
|
||||||
|
"repo": "base16-fish",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base16-foot": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696725948,
|
||||||
|
"narHash": "sha256-65bz2bUL/yzZ1c8/GQASnoiGwaF8DczlxJtzik1c0AU=",
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-foot",
|
||||||
|
"rev": "eedbcfa30de0a4baa03e99f5e3ceb5535c2755ce",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-foot",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base16-helix": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1720809814,
|
||||||
|
"narHash": "sha256-numb3xigRGnr/deF7wdjBwVg7fpbTH7reFDkJ75AJkY=",
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-helix",
|
||||||
|
"rev": "34f41987bec14c0f3f6b2155c19787b1f6489625",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-helix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base16-kitty": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1665001328,
|
||||||
|
"narHash": "sha256-aRaizTYPpuWEcvoYE9U+YRX+Wsc8+iG0guQJbvxEdJY=",
|
||||||
|
"owner": "kdrag0n",
|
||||||
|
"repo": "base16-kitty",
|
||||||
|
"rev": "06bb401fa9a0ffb84365905ffbb959ae5bf40805",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "kdrag0n",
|
||||||
|
"repo": "base16-kitty",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base16-tmux": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696725902,
|
||||||
|
"narHash": "sha256-wDPg5elZPcQpu7Df0lI5O8Jv4A3T6jUQIVg63KDU+3Q=",
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-tmux",
|
||||||
|
"rev": "c02050bebb60dbb20cb433cd4d8ce668ecc11ba7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-tmux",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"base16-vim": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1716150083,
|
||||||
|
"narHash": "sha256-ZMhnNmw34ogE5rJZrjRv5MtG3WaqKd60ds2VXvT6hEc=",
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-vim",
|
||||||
|
"rev": "6e955d704d046b0dc3e5c2d68a2a6eeffd2b5d3d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "tinted-theming",
|
||||||
|
"repo": "base16-vim",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"colmena": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"stable": "stable"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1711386353,
|
||||||
|
"narHash": "sha256-gWEpb8Hybnoqb4O4tmpohGZk6+aerAbJpywKcFIiMlg=",
|
||||||
|
"owner": "zhaofengli",
|
||||||
|
"repo": "colmena",
|
||||||
|
"rev": "cd65ef7a25cdc75052fbd04b120aeb066c3881db",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "zhaofengli",
|
||||||
|
"repo": "colmena",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"crane": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"lanzaboote",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1721842668,
|
||||||
|
"narHash": "sha256-k3oiD2z2AAwBFLa4+xfU+7G5fisRXfkvrMTCJrjZzXo=",
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"rev": "529c1a0b1f29f0d78fa3086b8f6a134c71ef3aaf",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1650374568,
|
||||||
|
"narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "b4a34015c698c7793d592d66adbab377907a2be8",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_3": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1673956053,
|
||||||
|
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"lanzaboote",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1719994518,
|
||||||
|
"narHash": "sha256-pQMhCCHyQGRzdfAkdJ4cIWiw+JNuWsTX7f0ZYSyz0VY=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "9227223f6d922fee3c7b190b2cc238a99527bbb7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1659877975,
|
||||||
|
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710146030,
|
||||||
|
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flakey-profile": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1712898590,
|
||||||
|
"narHash": "sha256-FhGIEU93VHAChKEXx905TSiPZKga69bWl1VB37FK//I=",
|
||||||
|
"owner": "lf-",
|
||||||
|
"repo": "flakey-profile",
|
||||||
|
"rev": "243c903fd8eadc0f63d205665a92d4df91d42d9d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "lf-",
|
||||||
|
"repo": "flakey-profile",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fromYaml": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1689549921,
|
||||||
|
"narHash": "sha256-iX0pk/uB019TdBGlaJEWvBCfydT6sRq+eDcGPifVsCM=",
|
||||||
|
"owner": "SenchoPens",
|
||||||
|
"repo": "fromYaml",
|
||||||
|
"rev": "11fbbbfb32e3289d3c631e0134a23854e7865c84",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "SenchoPens",
|
||||||
|
"repo": "fromYaml",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitignore": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"lanzaboote",
|
||||||
|
"pre-commit-hooks-nix",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709087332,
|
||||||
|
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gnome-shell": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1713702291,
|
||||||
|
"narHash": "sha256-zYP1ehjtcV8fo+c+JFfkAqktZ384Y+y779fzmR9lQAU=",
|
||||||
|
"owner": "GNOME",
|
||||||
|
"repo": "gnome-shell",
|
||||||
|
"rev": "0d0aadf013f78a7f7f1dc984d0d812971864b934",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "GNOME",
|
||||||
|
"ref": "46.1",
|
||||||
|
"repo": "gnome-shell",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1723986931,
|
||||||
|
"narHash": "sha256-Fy+KEvDQ+Hc8lJAV3t6leXhZJ2ncU5/esxkgt3b8DEY=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "2598861031b78aadb4da7269df7ca9ddfc3e1671",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lanzaboote": {
|
||||||
|
"inputs": {
|
||||||
|
"crane": "crane",
|
||||||
|
"flake-compat": "flake-compat_2",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"pre-commit-hooks-nix": "pre-commit-hooks-nix",
|
||||||
|
"rust-overlay": "rust-overlay"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1722329086,
|
||||||
|
"narHash": "sha256-e/fSi0WER06N8WCvpht62fkGtWfe5ckDxr6zNYkwkFw=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "lanzaboote",
|
||||||
|
"rev": "f5a3a7dff44d131807fc1a89fbd8576cd870334a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "lanzaboote",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lix": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1723503926,
|
||||||
|
"narHash": "sha256-Rosl9iA9MybF5Bud4BTAQ9adbY81aGmPfV8dDBGl34s=",
|
||||||
|
"rev": "bcaeb6388b8916ac6d1736e3aa2b13313e6a6bd2",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://git.lix.systems/api/v1/repos/lix-project/lix/archive/bcaeb6388b8916ac6d1736e3aa2b13313e6a6bd2.tar.gz?rev=bcaeb6388b8916ac6d1736e3aa2b13313e6a6bd2"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://git.lix.systems/lix-project/lix/archive/2.91.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lix-module": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"flakey-profile": "flakey-profile",
|
||||||
|
"lix": "lix",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1723510904,
|
||||||
|
"narHash": "sha256-zNW/rqNJwhq2lYmQf19wJerRuNimjhxHKmzrWWFJYts=",
|
||||||
|
"rev": "622a2253a071a1fb97a4d3c8103a91114acc1140",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://git.lix.systems/api/v1/repos/lix-project/nixos-module/archive/622a2253a071a1fb97a4d3c8103a91114acc1140.tar.gz?rev=622a2253a071a1fb97a4d3c8103a91114acc1140"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://git.lix.systems/lix-project/nixos-module/archive/2.91.0.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nix-index-database": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1723950649,
|
||||||
|
"narHash": "sha256-dHMkGjwwCGj0c2MKyCjRXVBXq2Sz3TWbbM23AS7/5Hc=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nix-index-database",
|
||||||
|
"rev": "392828aafbed62a6ea6ccab13728df2e67481805",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nix-index-database",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixos-hardware": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724067415,
|
||||||
|
"narHash": "sha256-WJBAEFXAtA41RMpK8mvw0cQ62CJkNMBtzcEeNIJV7b0=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixos-hardware",
|
||||||
|
"rev": "b09c46430ffcf18d575acf5c339b38ac4e1db5d2",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixos-hardware",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724177844,
|
||||||
|
"narHash": "sha256-G7Mf9uN9m8FimeP3eMHu/dOC4QS8QAzo0h4ZIlDHcCA=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "d13fa5a45a34e7c8be33474f58003914430bdc5a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1720386169,
|
||||||
|
"narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "194846768975b7ad2c4988bdb82572c00222c0d7",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nur": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724219095,
|
||||||
|
"narHash": "sha256-+HhSPWqM1VJlQTNwgJE2RmTVUMoF6FuCRKzzTgxjNcM=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "NUR",
|
||||||
|
"rev": "cb4a85f95c647cf5aa7ce75b77ff2c049137160a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "NUR",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"pre-commit-hooks-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": [
|
||||||
|
"lanzaboote",
|
||||||
|
"flake-compat"
|
||||||
|
],
|
||||||
|
"gitignore": "gitignore",
|
||||||
|
"nixpkgs": [
|
||||||
|
"lanzaboote",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": "nixpkgs-stable"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1721042469,
|
||||||
|
"narHash": "sha256-6FPUl7HVtvRHCCBQne7Ylp4p+dpP3P/OYuzjztZ4s70=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "pre-commit-hooks.nix",
|
||||||
|
"rev": "f451c19376071a90d8c58ab1a953c6e9840527fd",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "pre-commit-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"colmena": "colmena",
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"lanzaboote": "lanzaboote",
|
||||||
|
"lix-module": "lix-module",
|
||||||
|
"nix-index-database": "nix-index-database",
|
||||||
|
"nixos-hardware": "nixos-hardware",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"nur": "nur",
|
||||||
|
"rust-overlay": "rust-overlay_2",
|
||||||
|
"stylix": "stylix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"lanzaboote",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1722219664,
|
||||||
|
"narHash": "sha256-xMOJ+HW4yj6e69PvieohUJ3dBSdgCfvI0nnCEe6/yVc=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "a6fbda5d9a14fb5f7c69b8489d24afeb349c7bb4",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay_2": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724206841,
|
||||||
|
"narHash": "sha256-L8dKaX4T3k+TR2fEHCfGbH4UXdspovz/pj87iai9qmc=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "45e98fbd62c32e5927e952d2833fa1ba4fb35a61",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696039360,
|
||||||
|
"narHash": "sha256-g7nIUV4uq1TOVeVIDEZLb005suTWCUjSY0zYOlSBsyE=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "32dcb45f66c0487e92db8303a798ebc548cadedc",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-23.05",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"stylix": {
|
||||||
|
"inputs": {
|
||||||
|
"base16": "base16",
|
||||||
|
"base16-fish": "base16-fish",
|
||||||
|
"base16-foot": "base16-foot",
|
||||||
|
"base16-helix": "base16-helix",
|
||||||
|
"base16-kitty": "base16-kitty",
|
||||||
|
"base16-tmux": "base16-tmux",
|
||||||
|
"base16-vim": "base16-vim",
|
||||||
|
"flake-compat": "flake-compat_3",
|
||||||
|
"gnome-shell": "gnome-shell",
|
||||||
|
"home-manager": [
|
||||||
|
"home-manager"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724091143,
|
||||||
|
"narHash": "sha256-55CrA0BNqmnS4qB812D7JY9hNBB0r36sJlErepkfeTo=",
|
||||||
|
"owner": "danth",
|
||||||
|
"repo": "stylix",
|
||||||
|
"rev": "94d70292d0c687ebacb65d00bd516cbefa18d3ca",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "danth",
|
||||||
|
"repo": "stylix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
140
flake.nix
Normal file
140
flake.nix
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
{
|
||||||
|
description = "I do not have to explain myself";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
|
nixos-hardware.url = "github:NixOS/nixos-hardware";
|
||||||
|
nur.url = "github:nix-community/NUR";
|
||||||
|
|
||||||
|
lix-module = {
|
||||||
|
url = "https://git.lix.systems/lix-project/nixos-module/archive/2.91.0.tar.gz";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
lanzaboote = {
|
||||||
|
url = "github:nix-community/lanzaboote";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
colmena = {
|
||||||
|
url = "github:zhaofengli/colmena";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
stylix = {
|
||||||
|
url = "github:danth/stylix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.home-manager.follows = "home-manager";
|
||||||
|
};
|
||||||
|
|
||||||
|
nix-index-database = {
|
||||||
|
url = "github:nix-community/nix-index-database";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
rust-overlay = {
|
||||||
|
url = "github:oxalica/rust-overlay";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nixConfig = {
|
||||||
|
allow-import-form-derivation = true;
|
||||||
|
|
||||||
|
extra-experimental-features = [ "pipe-operator" ];
|
||||||
|
|
||||||
|
extra-substituters = [
|
||||||
|
"https://colmena.cachix.org"
|
||||||
|
"https://nix-community.cachix.org"
|
||||||
|
"https://cache.kyouma.net"
|
||||||
|
];
|
||||||
|
|
||||||
|
extra-trusted-public-keys = [
|
||||||
|
"colmena.cachix.org-1:7BzpDnjjH8ki2CT3f6GdOk7QAzPOl+1t3LvTLXqYcSg="
|
||||||
|
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||||
|
"cache.kyouma.net:Frjwu4q1rnwE/MnSTmX9yx86GNA/z3p/oElGvucLiZg="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = { self, nixpkgs, ... }@inputs:
|
||||||
|
let
|
||||||
|
inherit (nixpkgs) lib;
|
||||||
|
|
||||||
|
load = base: default: builtins.readDir base
|
||||||
|
|> lib.filterAttrs (name: type: builtins.match "(regular|directory)" type != null)
|
||||||
|
|> lib.mapAttrs' (name: type: {
|
||||||
|
name = if type == "regular" then lib.removeSuffix ".nix" name else name;
|
||||||
|
value =
|
||||||
|
let path = if type == "directory" then "${name}/${default}.nix" else name;
|
||||||
|
in import "${base}/${path}" inputs;
|
||||||
|
});
|
||||||
|
|
||||||
|
eachFlakeSystem = lib.genAttrs lib.systems.flakeExposed;
|
||||||
|
eachNixosSystem = lib.systems.flakeExposed
|
||||||
|
|> lib.systems.parse
|
||||||
|
|> builtins.filter (sys: sys.isLinux)
|
||||||
|
|> builtins.attrNames
|
||||||
|
|> lib.genAttrs;
|
||||||
|
in {
|
||||||
|
lib = load ./lib "lib" // {
|
||||||
|
inherit load;
|
||||||
|
};
|
||||||
|
|
||||||
|
overlays = load ./overlay "overlay";
|
||||||
|
legacyPackages = eachFlakeSystem (system:
|
||||||
|
import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ self.overlays.default ];
|
||||||
|
});
|
||||||
|
|
||||||
|
packages = eachFlakeSystem (system: let pkgs = self.legacyPackages.${system};
|
||||||
|
in load ./package "package"
|
||||||
|
|> lib.mapAttrs (name: pkg: self.legacyPackages.${system}.callPackage pkg { }));
|
||||||
|
|
||||||
|
nixosModules = load ./nixos/module "module";
|
||||||
|
|
||||||
|
colmena = load ./nixos/config "configuration" // {
|
||||||
|
meta = {
|
||||||
|
nixpkgs = self.legacyPackages.x86_64-linux;
|
||||||
|
};
|
||||||
|
|
||||||
|
defaults = { name, config, ... }: {
|
||||||
|
deployment = {
|
||||||
|
allowLocalDeployment = true;
|
||||||
|
targetHost = config.networking.fqdnOrHostName;
|
||||||
|
targetUser = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations =
|
||||||
|
let hive = inputs.colmena.lib.makeHive self.outputs.colmena;
|
||||||
|
in hive.nodes;
|
||||||
|
|
||||||
|
homeModules = load ./home/module "module";
|
||||||
|
homeConfigurations = load ./home/config "home";
|
||||||
|
|
||||||
|
devShells = eachFlakeSystem (system: load ./shell "shell"
|
||||||
|
|> lib.mapAttrs (name: shell: self.legacyPackages.${system}.callPackage shell { }));
|
||||||
|
|
||||||
|
checks = eachFlakeSystem (system: {
|
||||||
|
packages = self.packages.${system};
|
||||||
|
devShells = self.devShells.${system};
|
||||||
|
}) // (self.nixosConfigurations
|
||||||
|
|> lib.mapAttrsToList (name: host: {
|
||||||
|
${host.pkgs.system} = {
|
||||||
|
nixos = {
|
||||||
|
${name} = host.config.system.build.toplevel;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|> lib.mergeAttrsList);
|
||||||
|
|
||||||
|
hydraJobs = { inherit (self) checks; };
|
||||||
|
};
|
||||||
|
}
|
246
home/config/nil/firefox.nix
Normal file
246
home/config/nil/firefox.nix
Normal file
|
@ -0,0 +1,246 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }@args:
|
||||||
|
let
|
||||||
|
osConfig = args.osConfig or { };
|
||||||
|
|
||||||
|
firefox-csshacks = pkgs.fetchFromGitHub {
|
||||||
|
owner = "MrOtherGuy";
|
||||||
|
repo = "firefox-csshacks";
|
||||||
|
rev = "7eca4b1050c4065130a2cf696302b4ef5d88d932";
|
||||||
|
sparseCheckout = [ "!/*" "/chrome" "/content" ];
|
||||||
|
hash = "sha256-rk0jC5AMw41xt5yItY7CAxuYAFhoe5Jy2tvwgh59cPI=";
|
||||||
|
};
|
||||||
|
in lib.mkIf (osConfig.hardware.graphics.enable or false) {
|
||||||
|
programs.firefox = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.firefox;
|
||||||
|
profiles = let
|
||||||
|
extensions = with config.nur.repos.rycee.firefox-addons; [
|
||||||
|
clearurls
|
||||||
|
consent-o-matic
|
||||||
|
decentraleyes
|
||||||
|
keepassxc-browser
|
||||||
|
multi-account-containers
|
||||||
|
ublock-origin
|
||||||
|
];
|
||||||
|
settings = {
|
||||||
|
# use OS locale
|
||||||
|
"intl.regional_prefs.use_os_locales" = true;
|
||||||
|
|
||||||
|
# localisation
|
||||||
|
"intl.accept_languages" = "en-gb,en,de,fr,es-es,es,pt,ja";
|
||||||
|
"intl.locale.requested" = "en-GB,en,de,fr,es-ES,es,pt,ja";
|
||||||
|
|
||||||
|
# use OS resolver
|
||||||
|
"network.trr.mode" = 5;
|
||||||
|
|
||||||
|
# force HTTPS
|
||||||
|
"dom.security.https_only_mode" = true;
|
||||||
|
"dom.security.https_only_mode_ever_enabled" = true;
|
||||||
|
|
||||||
|
# enable EME
|
||||||
|
"media.eme.enabled" = true;
|
||||||
|
|
||||||
|
# founts
|
||||||
|
"font.default.x-unicode" = "sans-serif";
|
||||||
|
"font.default.x-western" = "sans-serif";
|
||||||
|
"font.name.sans-serif.x-unicode" = "Lato";
|
||||||
|
"font.name.sans-serif.x-western" = "Lato";
|
||||||
|
"font.name.monospace.x-unicode" = "Fira Code";
|
||||||
|
"font.name.monospace.x-western" = "Fira Code";
|
||||||
|
|
||||||
|
# hardware acceleration
|
||||||
|
"gfx.webrender.all" = true;
|
||||||
|
"layers.acceleration.force-enabled" = true;
|
||||||
|
"media.ffmpeg.vaapi.enabled" = true;
|
||||||
|
|
||||||
|
# always ask for download location
|
||||||
|
"browser.download.useDownloadDir" = false;
|
||||||
|
|
||||||
|
# disable firefox tab
|
||||||
|
"browser.tabs.firefox-view" = false;
|
||||||
|
|
||||||
|
# disable firefox intro tab
|
||||||
|
"browser.startup.homepage_override.mstone" = "ignore";
|
||||||
|
|
||||||
|
# disable default browser check
|
||||||
|
"browser.shell.checkDefaultBrowser" = false;
|
||||||
|
|
||||||
|
# private containor for new tab page thumbnails
|
||||||
|
"privacy.usercontext.about_newtab_segregation.enabled" = true;
|
||||||
|
|
||||||
|
# disable Beacons API
|
||||||
|
"beacon.enabled" = false;
|
||||||
|
|
||||||
|
# disable pings
|
||||||
|
"browser.send_pings" = false;
|
||||||
|
|
||||||
|
# strip query parameters
|
||||||
|
"privacy.query_stripping" = true;
|
||||||
|
|
||||||
|
# disable access to device sensors
|
||||||
|
"device.sensors.enabled" = false;
|
||||||
|
"dom.battery.enabled" = false;
|
||||||
|
|
||||||
|
# disable media auto‐play
|
||||||
|
"media.autoplay.enabled" = false;
|
||||||
|
|
||||||
|
# block third‐party cookies
|
||||||
|
"network.cookie.cookieBehavior" = 1;
|
||||||
|
|
||||||
|
# spoof referrer header
|
||||||
|
"network.http.referer.spoofSource" = true;
|
||||||
|
|
||||||
|
# isolate all browser identifier sources
|
||||||
|
"privacy.firstparty.isolate" = true;
|
||||||
|
|
||||||
|
# resist fingerprinting
|
||||||
|
#"privacy.resistFingerprinting" = true;
|
||||||
|
|
||||||
|
# enable built‐in tracking protection
|
||||||
|
"privacy.trackingprotection.enabled" = true;
|
||||||
|
"privacy.trackingprotection.emailtracking.enabled" = true;
|
||||||
|
"privacy.trackingprotection.socialtracking.enabled" = true;
|
||||||
|
|
||||||
|
# disable data sharing
|
||||||
|
"app.normandy.enabled" = false;
|
||||||
|
"app.shield.optoutstudies.enabled" = false;
|
||||||
|
"datareporting.healthreport.uploadEnabled" = false;
|
||||||
|
|
||||||
|
# disable safebrowsing
|
||||||
|
"browser.safebrowsing.downloads.enabled" = false;
|
||||||
|
"browser.safebrowsing.malware.enabled" = false;
|
||||||
|
"browser.safebrowsing.phishing.enabled" = false;
|
||||||
|
|
||||||
|
# disable firefox account
|
||||||
|
"identity.fxaccounts.enabled" = false;
|
||||||
|
|
||||||
|
# disable sponsored items
|
||||||
|
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
|
||||||
|
"browser.newtabpage.enhanced" = false;
|
||||||
|
|
||||||
|
# disable Pocket
|
||||||
|
"extensions.pocket.enabled" = false;
|
||||||
|
|
||||||
|
# disable crash reporting
|
||||||
|
"browser.tabs.crashReporting.sendReport" = false;
|
||||||
|
"breakpad.reportURL" = "";
|
||||||
|
|
||||||
|
# disable accessibility services
|
||||||
|
"accessibility.force_disabled" = true;
|
||||||
|
|
||||||
|
# disable password auto‐fill
|
||||||
|
"signon.autofillForms" = false;
|
||||||
|
|
||||||
|
# enable user profile customisation
|
||||||
|
"toolkit.legacyUserProfileCustomizations.stylesheets" = true;
|
||||||
|
};
|
||||||
|
userChrome = lib.concatMapStrings (css:
|
||||||
|
"@import url('${firefox-csshacks}/chrome/${css}.css');\n"
|
||||||
|
) [
|
||||||
|
"hide_tabs_with_one_tab"
|
||||||
|
"autohide_bookmarks_and_main_toolbars"
|
||||||
|
];
|
||||||
|
search = {
|
||||||
|
default = "Google Search";
|
||||||
|
force = true;
|
||||||
|
engines = {
|
||||||
|
"Google Search" = {
|
||||||
|
urls = [{ template = "https://www.google.com/search?q={searchTerms}"; }];
|
||||||
|
definedAliases = [ "g" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Nix Packages" = {
|
||||||
|
urls = [{
|
||||||
|
template = "https://search.nixos.org/packages";
|
||||||
|
params = [
|
||||||
|
{ name = "channel"; value = "unstable"; }
|
||||||
|
{ name = "type"; value = "packages"; }
|
||||||
|
{ name = "query"; value = "{searchTerms}"; }
|
||||||
|
];
|
||||||
|
}];
|
||||||
|
|
||||||
|
definedAliases = [ "np" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Gentoo Packages" = {
|
||||||
|
urls = [{ template = "https://packages.gentoo.org/packages/search?q={searchTerms}"; }];
|
||||||
|
definedAliases = [ "gp" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Alpine Packages" = {
|
||||||
|
urls = [{ template = "https://pkgs.alpinelinux.org/packages?name={searchTerms}"; }];
|
||||||
|
definedAliases = [ "ap" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"NixOS Wiki" = {
|
||||||
|
urls = [{ template = "https://nixos.wiki/index.php?search={searchTerms}"; }];
|
||||||
|
definedAliases = [ "nw" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Wikipedia (eng)" = {
|
||||||
|
urls = [{ template = "https://en.wikipedia.org/wiki/Special:Search?search={searchTerms}"; }];
|
||||||
|
definedAliases = [ "w" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Wikipedia (deu)" = {
|
||||||
|
urls = [{ template = "https://de.wikipedia.org/wiki/Spezial:Suche?search={searchTerms}"; }];
|
||||||
|
definedAliases = [ "wd" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Wiktionary (eng)" = {
|
||||||
|
urls = [{ template = "https://en.wiktionary.org/wiki/Special:Search?search={searchTerms}"; }];
|
||||||
|
definedAliases = [ "k" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Wiktionary (deu)" = {
|
||||||
|
urls = [{ template = "https://de.wiktionary.org/wiki/Spezial:Suche?search={searchTerms}"; }];
|
||||||
|
definedAliases = [ "kd" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Linguee (en‐de)" = {
|
||||||
|
urls = [{ template = "https://www.linguee.com/english-german/search?query={searchTerms}"; }];
|
||||||
|
definedAliases = [ "en" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Linguee (en‐fr)" = {
|
||||||
|
urls = [{ template = "https://www.linguee.com/english-french/search?query={searchTerms}"; }];
|
||||||
|
definedAliases = [ "fr" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Linguee (en‐es)" = {
|
||||||
|
urls = [{ template = "https://www.linguee.com/english-spanish/search?query={searchTerms}"; }];
|
||||||
|
definedAliases = [ "es" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Linguee (en‐pt)" = {
|
||||||
|
urls = [{ template = "https://www.linguee.com/english-portuguese/search?query={searchTerms}"; }];
|
||||||
|
definedAliases = [ "pt" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"Jisho" = {
|
||||||
|
urls = [{ template = "https://jisho.org/search/{searchTerms}"; }];
|
||||||
|
definedAliases = [ "ja" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"DeepL" = {
|
||||||
|
urls = [{ template = "https://www.deepl.com/translator#en//{searchTerms}"; }];
|
||||||
|
definedAliases = [ "dpl" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
default = {
|
||||||
|
inherit extensions settings userChrome search;
|
||||||
|
isDefault = true;
|
||||||
|
};
|
||||||
|
sneaky = {
|
||||||
|
inherit extensions settings userChrome search;
|
||||||
|
id = 1;
|
||||||
|
};
|
||||||
|
vanilla = {
|
||||||
|
inherit userChrome search;
|
||||||
|
id = 2;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
73
home/config/nil/greedy.xkb
Normal file
73
home/config/nil/greedy.xkb
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
xkb_symbols "greedy" {
|
||||||
|
name[Group1]= "Greedy";
|
||||||
|
|
||||||
|
// Modifier keys
|
||||||
|
include "ctrl(nocaps)"
|
||||||
|
include "altwin(alt_super_win)"
|
||||||
|
include "level3(ralt_switch)"
|
||||||
|
include "level5(rctrl_switch)"
|
||||||
|
|
||||||
|
include "compose(lwin-altgr)"
|
||||||
|
include "compose(102)"
|
||||||
|
include "nbsp(level3n)"
|
||||||
|
include "keypad(future)"
|
||||||
|
|
||||||
|
key <TAB> { [ Escape ] };
|
||||||
|
key <ESC> { [ Tab ] };
|
||||||
|
|
||||||
|
key <TLDE> { [ dollar, asciitilde, EuroSign, dead_tilde ] };
|
||||||
|
key <AE01> { [ ampersand, percent, dead_breve, dead_caron ] };
|
||||||
|
key <AE02> { [ bracketleft, 7, 0x100201E, 0x100201A ] };
|
||||||
|
key <AE03> { [ braceleft, 5, 0x100201C, 0x1002018 ] };
|
||||||
|
key <AE04> { [ braceright, 3, 0x100201D, 0x1002019 ] };
|
||||||
|
key <AE05> { [ parenleft, 1, 0x1002039, NoSymbol ] };
|
||||||
|
key <AE06> { [ equal, 9, 0x1002260, NoSymbol ] };
|
||||||
|
key <AE07> { [ asterisk, 0, 0x10022C5, NoSymbol ] };
|
||||||
|
key <AE08> { [ parenright, 2, 0x100203A, NoSymbol ] };
|
||||||
|
key <AE09> { [ plus, 4, plusminus, NoSymbol ] };
|
||||||
|
key <AE10> { [ bracketright, 6, endash, emdash ] };
|
||||||
|
key <AE11> { [ exclam, 8, exclamdown, infinity ] };
|
||||||
|
key <AE12> { [ numbersign, grave, numerosign, dead_grave ] };
|
||||||
|
|
||||||
|
key <AD01> { [ k, K, odiaeresis, Odiaeresis ] };
|
||||||
|
key <AD02> { [ comma, less, dead_cedilla, guillemotleft ] };
|
||||||
|
key <AD03> { [ u, U, oacute, Oacute ] };
|
||||||
|
key <AD04> { [ y, Y, udiaeresis, Udiaeresis ] };
|
||||||
|
key <AD05> { [ p, P, NoSymbol, NoSymbol ] };
|
||||||
|
key <AD06> { [ w, W, NoSymbol, NoSymbol ] };
|
||||||
|
key <AD07> { [ l, L, NoSymbol, NoSymbol ] };
|
||||||
|
key <AD08> { [ m, M, mu, NoSymbol ] };
|
||||||
|
key <AD09> { [ f, F, NoSymbol, NoSymbol ] };
|
||||||
|
key <AD10> { [ c, C, copyright, NoSymbol ] };
|
||||||
|
key <AD11> { [ slash, question, division, questiondown ] };
|
||||||
|
key <AD12> { [ at, asciicircum, 0x100203D, dead_circumflex ] };
|
||||||
|
|
||||||
|
key <AC01> { [ o, O, oacute, Oacute ] };
|
||||||
|
key <AC02> { [ a, A, aacute, Aacute ] };
|
||||||
|
key <AC03> { [ e, E, eacute, Eacute ] };
|
||||||
|
key <AC04> { [ i, I, iacute, Iacute ] };
|
||||||
|
key <AC05> { [ d, D, eth, ETH ] };
|
||||||
|
key <AC06> { [ r, R, NoSymbol, NoSymbol ] };
|
||||||
|
key <AC07> { [ n, N, ntilde, Ntilde ] };
|
||||||
|
key <AC08> { [ t, T, thorn, Thorn ] };
|
||||||
|
key <AC09> { [ h, H, NoSymbol, NoSymbol ] };
|
||||||
|
key <AC10> { [ s, S, ssharp, section ] };
|
||||||
|
key <AC11> { [ minus, underscore, 0x1002010, dead_macron ] };
|
||||||
|
key <BKSL> { [ backslash, bar, NoSymbol, NoSymbol ] };
|
||||||
|
|
||||||
|
key <AB01> { [ q, Q, adiaeresis, Adiaeresis ] };
|
||||||
|
key <AB02> { [ period, greater, ellipsis, guillemotright ] };
|
||||||
|
key <AB03> { [ apostrophe, quotedbl, dead_acute, dead_diaeresis ] };
|
||||||
|
key <AB04> { [ semicolon, colon, periodcentered, NoSymbol ] };
|
||||||
|
key <AB05> { [ z, Z, NoSymbol, NoSymbol ] };
|
||||||
|
key <AB06> { [ x, X, multiply, NoSymbol ] };
|
||||||
|
key <AB07> { [ v, V, NoSymbol, NoSymbol ] };
|
||||||
|
key <AB08> { [ g, G, NoSymbol, NoSymbol ] };
|
||||||
|
key <AB09> { [ b, B, NoSymbol, NoSymbol ] };
|
||||||
|
key <AB10> { [ j, J, NoSymbol, NoSymbol ] };
|
||||||
|
|
||||||
|
key <UP> { [ Up, NoSymbol, uparrow, 0x10021D1 ] };
|
||||||
|
key <LEFT> { [ Left, NoSymbol, leftarrow, 0x10021D0 ] };
|
||||||
|
key <DOWN> { [ Down, NoSymbol, downarrow, 0x10021D3 ] };
|
||||||
|
key <RGHT> { [ Right, NoSymbol, rightarrow, 0x10021D2 ] };
|
||||||
|
};
|
343
home/config/nil/home.nix
Normal file
343
home/config/nil/home.nix
Normal file
|
@ -0,0 +1,343 @@
|
||||||
|
{ self, nur, stylix, nix-index-database, ... }: { config, lib, pkgs, ... }@args:
|
||||||
|
let
|
||||||
|
osConfig = args.osConfig or { };
|
||||||
|
in {
|
||||||
|
imports = [
|
||||||
|
nur.hmModules.nur
|
||||||
|
self.homeModules.locale-en_EU
|
||||||
|
nix-index-database.hmModules.nix-index
|
||||||
|
stylix.homeManagerModules.stylix
|
||||||
|
] ++ self.lib.mods [
|
||||||
|
./firefox.nix
|
||||||
|
./wayland.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
home.stateVersion = "24.11";
|
||||||
|
home.enableNixpkgsReleaseCheck = false;
|
||||||
|
|
||||||
|
home.activation = {
|
||||||
|
fish = lib.hm.dag.entryAfter ["writeBoundary"] ''
|
||||||
|
run ${lib.getExe config.programs.fish.package} -c 'set -U fish_greeting'
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# Terminfo
|
||||||
|
kitty.terminfo
|
||||||
|
|
||||||
|
# Core utilities
|
||||||
|
(lib.meta.setPrio 0 uutils-coreutils-noprefix)
|
||||||
|
|
||||||
|
# Text manipulation
|
||||||
|
#delta
|
||||||
|
sd
|
||||||
|
skim
|
||||||
|
|
||||||
|
# Networking
|
||||||
|
dogdns
|
||||||
|
whois
|
||||||
|
xh
|
||||||
|
|
||||||
|
# Filesystem
|
||||||
|
file
|
||||||
|
#xcp
|
||||||
|
|
||||||
|
# Development
|
||||||
|
pijul
|
||||||
|
|
||||||
|
# Calculator
|
||||||
|
fend
|
||||||
|
];
|
||||||
|
|
||||||
|
home.sessionVariables = {
|
||||||
|
TMPDIR = "$XDG_RUNTIME_DIR/tmp";
|
||||||
|
};
|
||||||
|
|
||||||
|
editorconfig = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
"*" = {
|
||||||
|
indent_style = "tab";
|
||||||
|
tab_width = 4;
|
||||||
|
end_of_line = "lf";
|
||||||
|
charset = "utf-8";
|
||||||
|
trim_trailing_whitespace = true;
|
||||||
|
insert_final_newline = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"*.nix" = {
|
||||||
|
indent_style = "space";
|
||||||
|
indent_size = 2;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.shellAliases = {
|
||||||
|
icat = "kitten icat";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.preferXdgDirectories = true;
|
||||||
|
|
||||||
|
programs.aria2 = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
max-concurrent-downloads = 4;
|
||||||
|
max-connection-per-server = 2;
|
||||||
|
min-split-size = "16M";
|
||||||
|
remote-time = true;
|
||||||
|
split = 4;
|
||||||
|
http-accept-gzip = true;
|
||||||
|
max-overall-upload-limit = "256K";
|
||||||
|
dscp = 8;
|
||||||
|
enable-mmap = true;
|
||||||
|
file-allocation = "falloc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.bat.enable = true;
|
||||||
|
|
||||||
|
programs.bottom = {
|
||||||
|
enable = true;
|
||||||
|
settings.flags = {
|
||||||
|
group = true;
|
||||||
|
battery = true;
|
||||||
|
color = "gruvbox";
|
||||||
|
mem_as_value = true;
|
||||||
|
network_use_binary_prefix = true;
|
||||||
|
network_use_bytes = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.eza = {
|
||||||
|
enable = true;
|
||||||
|
icons = true;
|
||||||
|
git = true;
|
||||||
|
|
||||||
|
extraOptions = [
|
||||||
|
"--binary"
|
||||||
|
"--colour=automatic"
|
||||||
|
"--colour-scale=all"
|
||||||
|
"--colour-scale-mode=gradient"
|
||||||
|
"--group-directories-first"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fd.enable = true;
|
||||||
|
|
||||||
|
programs.fish = {
|
||||||
|
enable = true;
|
||||||
|
functions = {
|
||||||
|
fish_prompt = ''
|
||||||
|
set -l user_colour 'green'
|
||||||
|
if fish_is_root_user
|
||||||
|
set user_colour 'red'
|
||||||
|
end
|
||||||
|
|
||||||
|
echo -n -s (set_color $user_colour --bold) $USER@ (prompt_hostname) \
|
||||||
|
(set_color blue --bold) ' ' (prompt_pwd) ' ❯ ' (set_color normal)
|
||||||
|
'';
|
||||||
|
|
||||||
|
fish_right_prompt = ''
|
||||||
|
set -l st $status
|
||||||
|
|
||||||
|
if test $st -ne 0
|
||||||
|
set_color red --bold
|
||||||
|
printf "%s " (sysexit $st)
|
||||||
|
set_color normal
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
|
||||||
|
fish_title = "prompt_pwd";
|
||||||
|
|
||||||
|
sysexit = builtins.readFile ./sysexit.fish;
|
||||||
|
};
|
||||||
|
|
||||||
|
interactiveShellInit = ''
|
||||||
|
if type -q tabs
|
||||||
|
tabs -4
|
||||||
|
end
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
#delta.enable = true;
|
||||||
|
|
||||||
|
userName = "Mikael Voss";
|
||||||
|
userEmail = "mvs@nyantec.com";
|
||||||
|
|
||||||
|
extraConfig = {
|
||||||
|
core = {
|
||||||
|
eol = "lf";
|
||||||
|
fsync = "committed";
|
||||||
|
};
|
||||||
|
|
||||||
|
user.signingKey = "key::sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAICczPHRwY9MAwDGlcB0QgMOJjcpLJhVU3covrW9RBS62AAAABHNzaDo= primary";
|
||||||
|
|
||||||
|
init.defaultBranch = "main";
|
||||||
|
pull.rebase = true;
|
||||||
|
push.autoSetupRemote = true;
|
||||||
|
rebase.autoStash = true;
|
||||||
|
|
||||||
|
gpg.format = "ssh";
|
||||||
|
gpg.ssh.allowedSignersFile = toString (pkgs.writeText "allowed-signers" ''
|
||||||
|
${config.programs.git.userEmail} AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAICczPHRwY9MAwDGlcB0QgMOJjcpLJhVU3covrW9RBS62AAAABHNzaDo=
|
||||||
|
'');
|
||||||
|
commit.gpgSign = true;
|
||||||
|
tag.gpgSign = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.helix = {
|
||||||
|
enable = true;
|
||||||
|
defaultEditor = true;
|
||||||
|
settings = {
|
||||||
|
editor.auto-pairs = {
|
||||||
|
"“" = "”";
|
||||||
|
"‘" = "’";
|
||||||
|
"„" = "“";
|
||||||
|
"‚" = "‘";
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.whitespace.render = {
|
||||||
|
nbsp = "all";
|
||||||
|
nnbsp = "all";
|
||||||
|
tab = "all";
|
||||||
|
};
|
||||||
|
|
||||||
|
editor.whitespace.characters = {
|
||||||
|
nbsp = "␣";
|
||||||
|
nnbsp = "⍽";
|
||||||
|
tab = "»";
|
||||||
|
tabpad = "·";
|
||||||
|
};
|
||||||
|
|
||||||
|
keys.normal = {
|
||||||
|
minus = "command_mode";
|
||||||
|
r = "move_char_left";
|
||||||
|
n = "move_visual_line_down";
|
||||||
|
t = "move_visual_line_up";
|
||||||
|
h = "move_char_right";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.jq.enable = true;
|
||||||
|
programs.man.generateCaches =
|
||||||
|
osConfig.documentation.man.generateCaches or false;
|
||||||
|
programs.ripgrep.enable = true;
|
||||||
|
|
||||||
|
programs.ssh = {
|
||||||
|
enable = true;
|
||||||
|
compression = true;
|
||||||
|
|
||||||
|
controlMaster = "auto";
|
||||||
|
controlPath = "\${XDG_RUNTIME_DIR}/ssh/%r@%n:%p";
|
||||||
|
controlPersist = "1m";
|
||||||
|
|
||||||
|
matchBlocks = {
|
||||||
|
"*.nyantec.com".user = "mvs";
|
||||||
|
"solitary.social" = {
|
||||||
|
user = "nil";
|
||||||
|
forwardAgent = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
serverAliveInterval = 10;
|
||||||
|
serverAliveCountMax = 60;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.vim = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
background = "dark";
|
||||||
|
expandtab = false;
|
||||||
|
number = true;
|
||||||
|
shiftwidth = 4;
|
||||||
|
tabstop = 4;
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
" no Vi compatibility
|
||||||
|
set nocompatible
|
||||||
|
|
||||||
|
" Unicode support
|
||||||
|
set encoding=utf-8
|
||||||
|
|
||||||
|
" special characters
|
||||||
|
set list
|
||||||
|
set listchars=tab:»·,trail:·,extends:…
|
||||||
|
|
||||||
|
set ruler
|
||||||
|
|
||||||
|
" movement
|
||||||
|
noremap r h
|
||||||
|
noremap R H
|
||||||
|
noremap n j
|
||||||
|
noremap t k
|
||||||
|
noremap h l
|
||||||
|
noremap H L
|
||||||
|
|
||||||
|
" beginning of previous word
|
||||||
|
noremap p b
|
||||||
|
|
||||||
|
" end of word
|
||||||
|
noremap l e
|
||||||
|
noremap L E
|
||||||
|
|
||||||
|
" change one char
|
||||||
|
noremap X s
|
||||||
|
|
||||||
|
" repeat search
|
||||||
|
noremap ; n
|
||||||
|
noremap : N
|
||||||
|
|
||||||
|
" paste
|
||||||
|
noremap s p
|
||||||
|
noremap S P
|
||||||
|
|
||||||
|
" join lines
|
||||||
|
noremap N J
|
||||||
|
|
||||||
|
" change
|
||||||
|
noremap e c
|
||||||
|
noremap E C
|
||||||
|
|
||||||
|
" replace
|
||||||
|
noremap z r
|
||||||
|
noremap Z R
|
||||||
|
|
||||||
|
" inclusive jump
|
||||||
|
noremap m f
|
||||||
|
noremap M F
|
||||||
|
|
||||||
|
" exlusive jump
|
||||||
|
noremap f t
|
||||||
|
noremap F T
|
||||||
|
|
||||||
|
" command mode
|
||||||
|
noremap - :
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.ssh-agent.enable = true;
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"d %t/ssh 700"
|
||||||
|
"d %t/tmp 700 - - 24h"
|
||||||
|
];
|
||||||
|
|
||||||
|
xdg.userDirs =
|
||||||
|
let
|
||||||
|
home = config.home.homeDirectory;
|
||||||
|
in {
|
||||||
|
enable = true;
|
||||||
|
desktop = "${home}/tmp";
|
||||||
|
documents = "${home}/var";
|
||||||
|
download = "${home}/tmp";
|
||||||
|
pictures = "${home}/img";
|
||||||
|
music = "${home}/msc";
|
||||||
|
publicShare = null;
|
||||||
|
templates = null;
|
||||||
|
videos = null;
|
||||||
|
};
|
||||||
|
}
|
104
home/config/nil/sysexit.fish
Normal file
104
home/config/nil/sysexit.fish
Normal file
|
@ -0,0 +1,104 @@
|
||||||
|
if status is-interactive
|
||||||
|
function sysexit
|
||||||
|
switch $argv[1]
|
||||||
|
case 0
|
||||||
|
echo OK
|
||||||
|
case 64
|
||||||
|
echo USAGE
|
||||||
|
case 65
|
||||||
|
echo DATAERR
|
||||||
|
case 66
|
||||||
|
echo NOINPUT
|
||||||
|
case 67
|
||||||
|
echo NOUSER
|
||||||
|
case 68
|
||||||
|
echo NOHOST
|
||||||
|
case 69
|
||||||
|
echo UNAVAILABLE
|
||||||
|
case 70
|
||||||
|
echo SOFTWARE
|
||||||
|
case 71
|
||||||
|
echo OSERR
|
||||||
|
case 72
|
||||||
|
echo OSFILE
|
||||||
|
case 73
|
||||||
|
echo CANTCREAT
|
||||||
|
case 74
|
||||||
|
echo IOERR
|
||||||
|
case 75
|
||||||
|
echo TEMPFAIL
|
||||||
|
case 76
|
||||||
|
echo PROTOCOL
|
||||||
|
case 77
|
||||||
|
echo NOPERM
|
||||||
|
case 78
|
||||||
|
echo CONFIG
|
||||||
|
case 127
|
||||||
|
echo NOTFOUND
|
||||||
|
case 129
|
||||||
|
echo SIGHUP
|
||||||
|
case 130
|
||||||
|
echo SIGINT
|
||||||
|
case 131
|
||||||
|
echo SIGQUIT
|
||||||
|
case 132
|
||||||
|
echo SIGILL
|
||||||
|
case 133
|
||||||
|
echo SIGTRAP
|
||||||
|
case 134
|
||||||
|
echo SIGABRT
|
||||||
|
case 135
|
||||||
|
echo SIGBUS
|
||||||
|
case 136
|
||||||
|
echo SIGFPE
|
||||||
|
case 137
|
||||||
|
echo SIGKILL
|
||||||
|
case 138
|
||||||
|
echo SIGUSR1
|
||||||
|
case 139
|
||||||
|
echo SIGSEGV
|
||||||
|
case 140
|
||||||
|
echo SIGUSR2
|
||||||
|
case 141
|
||||||
|
echo SIGPIPE
|
||||||
|
case 142
|
||||||
|
echo SIGALRM
|
||||||
|
case 143
|
||||||
|
echo SIGTERM
|
||||||
|
case 144
|
||||||
|
echo SIGSTKFLT
|
||||||
|
case 145
|
||||||
|
echo SIGCHLD
|
||||||
|
case 146
|
||||||
|
echo SIGCONT
|
||||||
|
case 147
|
||||||
|
echo SIGSTOP
|
||||||
|
case 148
|
||||||
|
echo SIGTSTP
|
||||||
|
case 149
|
||||||
|
echo SIGTTIN
|
||||||
|
case 150
|
||||||
|
echo SIGTTOU
|
||||||
|
case 151
|
||||||
|
echo SIGURG
|
||||||
|
case 152
|
||||||
|
echo SIGXCPU
|
||||||
|
case 153
|
||||||
|
echo SIGXFSZ
|
||||||
|
case 154
|
||||||
|
echo SIGVTALRM
|
||||||
|
case 155
|
||||||
|
echo SIGPROF
|
||||||
|
case 156
|
||||||
|
echo SIGWINCH
|
||||||
|
case 157
|
||||||
|
echo SIGIO
|
||||||
|
case 158
|
||||||
|
echo SIGPWR
|
||||||
|
case 159
|
||||||
|
echo SIGSYS
|
||||||
|
case '*'
|
||||||
|
echo $argv[1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
BIN
home/config/nil/wallpaper.png
Normal file
BIN
home/config/nil/wallpaper.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 MiB |
665
home/config/nil/wayland.nix
Normal file
665
home/config/nil/wayland.nix
Normal file
|
@ -0,0 +1,665 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }@args:
|
||||||
|
let
|
||||||
|
osConfig = args.osConfig or { };
|
||||||
|
|
||||||
|
fira-code-features = [
|
||||||
|
"cv01"
|
||||||
|
"cv06"
|
||||||
|
"onum"
|
||||||
|
"ss01"
|
||||||
|
"ss03"
|
||||||
|
"ss06"
|
||||||
|
"ss07"
|
||||||
|
"ss08"
|
||||||
|
"zero"
|
||||||
|
];
|
||||||
|
|
||||||
|
cmd = {
|
||||||
|
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
|
||||||
|
fish = "${osConfig.programs.fish.package}/bin/fish";
|
||||||
|
grim = "${pkgs.grim}/bin/grim -l 9";
|
||||||
|
jq = "${config.programs.jq.package}/bin/jq";
|
||||||
|
keepassxc = "${pkgs.keepassxc}/bin/keepassxc";
|
||||||
|
kill = "${pkgs.procps}/bin/kill";
|
||||||
|
kitty = ''${config.programs.kitty.package}/bin/kitty --single-instance --instance-group "$XDG_SESSION_ID"'';
|
||||||
|
loginctl = "${osConfig.systemd.package}/bin/loginctl";
|
||||||
|
mdless = "${pkgs.mdcat}/bin/mdless";
|
||||||
|
mpv = "${config.programs.mpv.package}/bin/mpv";
|
||||||
|
pidof = "${pkgs.procps}/bin/pidof";
|
||||||
|
playerctl = "${pkgs.playerctl}/bin/playerctl";
|
||||||
|
pwvucontrol = "${pkgs.pwvucontrol}/bin/pwvucontrol";
|
||||||
|
slurp = "${pkgs.slurp}/bin/slurp";
|
||||||
|
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
|
||||||
|
swaymsg = "${config.wayland.windowManager.sway.package}/bin/swaymsg";
|
||||||
|
swayrbar = "${pkgs.swayrbar.override { withPulseaudio = true; }}/bin/swayrbar";
|
||||||
|
tofi-drun = "${config.programs.tofi.package}/bin/tofi-drun";
|
||||||
|
wl-copy = "${pkgs.wl-clipboard}/bin/wl-copy";
|
||||||
|
wpctl = "${osConfig.services.pipewire.wireplumber.package}/bin/wpctl";
|
||||||
|
xargs = "${pkgs.findutils}/bin/xargs";
|
||||||
|
xdg-open = "${pkgs.xdg-utils}/bin/xdg-open";
|
||||||
|
};
|
||||||
|
in lib.mkIf (osConfig.hardware.graphics.enable or false) {
|
||||||
|
fonts.fontconfig = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
defaultFonts = {
|
||||||
|
sansSerif = [
|
||||||
|
"Lato"
|
||||||
|
"M PLUS 1"
|
||||||
|
"Noto Sans"
|
||||||
|
"Symbols Nerd Font"
|
||||||
|
"Unifont"
|
||||||
|
"Unifont Upper"
|
||||||
|
];
|
||||||
|
|
||||||
|
serif = [ "Noto Serif"];
|
||||||
|
|
||||||
|
monospace = [
|
||||||
|
"Fira Code"
|
||||||
|
"M PLUS 1 Code"
|
||||||
|
"Noto Sans Mono"
|
||||||
|
"Symbols Nerd Font Mono"
|
||||||
|
];
|
||||||
|
|
||||||
|
emoji = [ "Noto Color Emoji" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".xkb/symbols/greedy".source = ./greedy.xkb;
|
||||||
|
|
||||||
|
home.keyboard = {
|
||||||
|
layout = "greedy";
|
||||||
|
options = [ "ctrl:nocaps" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# Founts
|
||||||
|
lato
|
||||||
|
fira-code
|
||||||
|
mplus-outline-fonts.githubRelease
|
||||||
|
(nerdfonts.override { fonts = [ "NerdFontsSymbolsOnly" ]; })
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-color-emoji
|
||||||
|
unifont
|
||||||
|
|
||||||
|
# Image processing
|
||||||
|
oxipng
|
||||||
|
|
||||||
|
# Documentation
|
||||||
|
linux-manual
|
||||||
|
man-pages
|
||||||
|
man-pages-posix
|
||||||
|
|
||||||
|
# System operations
|
||||||
|
restic
|
||||||
|
|
||||||
|
# Cryptography
|
||||||
|
rage
|
||||||
|
|
||||||
|
# Messaging
|
||||||
|
fractal
|
||||||
|
signal-desktop
|
||||||
|
|
||||||
|
# Audio control
|
||||||
|
pwvucontrol
|
||||||
|
|
||||||
|
evince
|
||||||
|
inkscape
|
||||||
|
obsidian
|
||||||
|
|
||||||
|
kicad
|
||||||
|
calibre
|
||||||
|
keepassxc
|
||||||
|
|
||||||
|
# Multimedia
|
||||||
|
jellyfin-mpv-shim
|
||||||
|
|
||||||
|
libreoffice
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.beets = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
directory = "~/msc";
|
||||||
|
import.reflink = "auto";
|
||||||
|
|
||||||
|
plugins = [
|
||||||
|
"chroma"
|
||||||
|
"spotify"
|
||||||
|
"fromfilename"
|
||||||
|
|
||||||
|
"fetchart"
|
||||||
|
"lyrics"
|
||||||
|
"replaygain"
|
||||||
|
|
||||||
|
"duplicates"
|
||||||
|
"hook"
|
||||||
|
];
|
||||||
|
|
||||||
|
hook.hooks = [
|
||||||
|
{
|
||||||
|
event = "import";
|
||||||
|
command = "systemctl --user start mopidy-scan.service";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.eza.extraOptions = lib.mkAfter [ "--hyperlink" ];
|
||||||
|
|
||||||
|
programs.imv.enable = true;
|
||||||
|
|
||||||
|
programs.kitty = {
|
||||||
|
enable = true;
|
||||||
|
theme = "Catppuccin-Mocha";
|
||||||
|
settings = {
|
||||||
|
disable_ligatures = "cursor";
|
||||||
|
|
||||||
|
cursor_blink_interval = 0;
|
||||||
|
|
||||||
|
scrollback_lines = 65536;
|
||||||
|
scrollback_fill_enlarged_window = true;
|
||||||
|
|
||||||
|
enable_audio_bell = false;
|
||||||
|
|
||||||
|
close_on_child_death = true;
|
||||||
|
|
||||||
|
clear_all_shortcuts = true;
|
||||||
|
|
||||||
|
# Mouse
|
||||||
|
click_interval = "0.2";
|
||||||
|
};
|
||||||
|
|
||||||
|
keybindings = {
|
||||||
|
"ctrl+shift+c" = "copy_to_clipboard";
|
||||||
|
"ctrl+shift+v" = "paste_from_clipboard";
|
||||||
|
"ctrl+shift+s" = "paste_from_selection";
|
||||||
|
"shift+insert" = "paste_from_selection";
|
||||||
|
"ctrl+up" = "scroll_line_up";
|
||||||
|
"ctrl+down" = "scroll_line_down";
|
||||||
|
"ctrl+page_up" = "scroll_page_up";
|
||||||
|
"ctrl+page_down" = "scroll_page_down";
|
||||||
|
"shift+page_up" = "scroll_page_up";
|
||||||
|
"shift+page_down" = "scroll_page_down";
|
||||||
|
"ctrl+home" = "scroll_home";
|
||||||
|
"ctrl+end" = "scroll_end";
|
||||||
|
"ctrl+print_screen" = "show_scrollback";
|
||||||
|
|
||||||
|
"ctrl+equal" = "change_font_size all 0";
|
||||||
|
"ctrl+plus" = "change_font_size all +1";
|
||||||
|
"ctrl+minus" = "change_font_size all -1";
|
||||||
|
|
||||||
|
"ctrl+shift+u" = "kitten unicode_input";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = let
|
||||||
|
mouse = {
|
||||||
|
"left click ungrabbed" = "mouse_handle_click selection prompt";
|
||||||
|
"ctrl+left click ungrabbed" = "mouse_handle_click link";
|
||||||
|
|
||||||
|
"left press ungrabbed" = "mouse_selection normal";
|
||||||
|
"shift+left press ungrabbed" = "mouse_selection line";
|
||||||
|
"ctrl+left press ungrabbed" = "mouse_selection rectangle";
|
||||||
|
|
||||||
|
"left doublepress ungrabbed" = "mouse_selection word";
|
||||||
|
"left triplepress ungrabbed" = " mouse_selection line";
|
||||||
|
} |> lib.mapAttrsToList (n: v: "mouse_map ${n} ${v}\n")
|
||||||
|
|> lib.concatStrings;
|
||||||
|
in ''
|
||||||
|
clear_all_mouse_actions yes
|
||||||
|
${mouse}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.mpv = {
|
||||||
|
enable = true;
|
||||||
|
defaultProfiles = [ "high-quality" ];
|
||||||
|
config = {
|
||||||
|
#access-references = false;
|
||||||
|
|
||||||
|
# Video output
|
||||||
|
vo = "gpu";
|
||||||
|
#gpu-api = "vulkan";
|
||||||
|
hwdec = "vulkan,vaapi,auto-safe";
|
||||||
|
vd-lavc-dr = true;
|
||||||
|
|
||||||
|
scale = "ewa_lanczos4sharpest";
|
||||||
|
cscale = "spline64";
|
||||||
|
dscale = "mitchell";
|
||||||
|
tscale = "oversample";
|
||||||
|
|
||||||
|
# A/V sync
|
||||||
|
video-sync = "display-resample";
|
||||||
|
interpolation = true;
|
||||||
|
|
||||||
|
# Audio
|
||||||
|
volume = 100;
|
||||||
|
volume-max = 100;
|
||||||
|
|
||||||
|
# Subtitles
|
||||||
|
sub-auto = "fuzzy";
|
||||||
|
|
||||||
|
# Screenshots
|
||||||
|
screenshot-format = "avif";
|
||||||
|
|
||||||
|
# Cache
|
||||||
|
demuxer-max-bytes = "768MiB";
|
||||||
|
demuxer-max-back-bytes = "256MiB";
|
||||||
|
};
|
||||||
|
|
||||||
|
profiles = {
|
||||||
|
highres = {
|
||||||
|
scale = "spline64";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
scripts = with pkgs.mpvScripts; [
|
||||||
|
mpris
|
||||||
|
autocrop
|
||||||
|
autodeint
|
||||||
|
];
|
||||||
|
|
||||||
|
scriptOpts = {
|
||||||
|
autocrop.auto = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.swaylock = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.swaylock-effects;
|
||||||
|
settings = {
|
||||||
|
screenshots = true;
|
||||||
|
effect-blur = "5x3";
|
||||||
|
grace = 2;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.texlive = {
|
||||||
|
enable = true;
|
||||||
|
extraPackages = tpkgs: {
|
||||||
|
inherit (tpkgs)
|
||||||
|
texlive-scripts
|
||||||
|
|
||||||
|
xelatex-dev
|
||||||
|
fontspec
|
||||||
|
polyglossia
|
||||||
|
|
||||||
|
hyphen-english
|
||||||
|
hyphen-french
|
||||||
|
hyphen-german
|
||||||
|
hyphen-portuguese
|
||||||
|
hyphen-spanish
|
||||||
|
|
||||||
|
koma-script
|
||||||
|
|
||||||
|
amsmath
|
||||||
|
bookmark
|
||||||
|
booktabs
|
||||||
|
csquotes
|
||||||
|
hyperref
|
||||||
|
multirow
|
||||||
|
paralist
|
||||||
|
preprint
|
||||||
|
realscripts
|
||||||
|
textpos
|
||||||
|
unicode-math
|
||||||
|
units
|
||||||
|
xecjk
|
||||||
|
xecolor
|
||||||
|
xltxtra
|
||||||
|
xtab
|
||||||
|
;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.thunderbird = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.thunderbird;
|
||||||
|
profiles = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.tofi = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
history = true;
|
||||||
|
fuzzy-match = true;
|
||||||
|
num-results = 8;
|
||||||
|
|
||||||
|
font = pkgs.runCommand "fount-path" {
|
||||||
|
preferLocal = true;
|
||||||
|
nativeBuildInputs = with pkgs; [ fontconfig fira-code ];
|
||||||
|
} ''
|
||||||
|
fc-match -f "%{file}" "Fira Code" >"$out"
|
||||||
|
'' |> builtins.readFile |> lib.mkForce;
|
||||||
|
|
||||||
|
font-size = lib.mkForce 14;
|
||||||
|
font-features = fira-code-features |> lib.concatStringsSep ",";
|
||||||
|
font-variations = "wght 450";
|
||||||
|
font-hint = true;
|
||||||
|
|
||||||
|
anchor = "top";
|
||||||
|
horizontal = true;
|
||||||
|
|
||||||
|
width = "100%";
|
||||||
|
height = 30;
|
||||||
|
|
||||||
|
min-input-width = 120;
|
||||||
|
result-spacing = 20;
|
||||||
|
|
||||||
|
border-width = 0;
|
||||||
|
outline-width = 0;
|
||||||
|
|
||||||
|
padding-top = 4;
|
||||||
|
padding-bottom = 4;
|
||||||
|
padding-left = 12;
|
||||||
|
padding-right = 12;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.yt-dlp.enable = true;
|
||||||
|
|
||||||
|
services.gammastep = lib.optionalAttrs (osConfig ? location) (
|
||||||
|
let inherit (osConfig) location; in {
|
||||||
|
inherit (location) provider;
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
general.adjustment-method = "wayland";
|
||||||
|
};
|
||||||
|
} // lib.optionalAttrs (location.provider == "manual") {
|
||||||
|
#inherit (location) latitude longitude;
|
||||||
|
});
|
||||||
|
|
||||||
|
services.mako = {
|
||||||
|
enable = true;
|
||||||
|
defaultTimeout = 5000;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mopidy = {
|
||||||
|
enable = true;
|
||||||
|
extensionPackages = with pkgs; [
|
||||||
|
mopidy-iris
|
||||||
|
mopidy-local
|
||||||
|
mopidy-mpd
|
||||||
|
mopidy-mpris
|
||||||
|
];
|
||||||
|
settings = {
|
||||||
|
core = {
|
||||||
|
cache_dir = "$XDG_CACHE_DIR/mopidy";
|
||||||
|
config_dir = "$XDG_CONFIG_DIR/mopidy";
|
||||||
|
data_dir = "$XDG_DATA_DIR/mopidy";
|
||||||
|
};
|
||||||
|
|
||||||
|
audio.mixer = "none";
|
||||||
|
file.media_dirs = [ "$XDG_MUSIC_DIR" ];
|
||||||
|
local.media_dir = "$XDG_MUSIC_DIR";
|
||||||
|
|
||||||
|
mpd.hostname = "localhost";
|
||||||
|
|
||||||
|
http = {
|
||||||
|
hostname = "localhost";
|
||||||
|
port = 6680;
|
||||||
|
default_app = "iris";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.swayidle = {
|
||||||
|
enable = true;
|
||||||
|
events = with cmd; [
|
||||||
|
{ event = "lock"; command = "${swaylock} -f"; }
|
||||||
|
{ event = "before-sleep"; command = "${loginctl} lock-session"; }
|
||||||
|
];
|
||||||
|
|
||||||
|
timeouts = with cmd; [
|
||||||
|
{
|
||||||
|
timeout = 210;
|
||||||
|
command = "${brightnessctl} --save -e set 20%-";
|
||||||
|
resumeCommand = "${brightnessctl} --restore";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
timeout = 240;
|
||||||
|
command = "${loginctl} lock-session";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
timeout = 270;
|
||||||
|
command = "${swaymsg} output '* dpms off'";
|
||||||
|
resumeCommand = "${swaymsg} output '* dpms on'";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.syncthing = {
|
||||||
|
enable = true;
|
||||||
|
tray.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.udiskie = {
|
||||||
|
enable = true;
|
||||||
|
automount = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
stylix = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
image = ./wallpaper.png;
|
||||||
|
base16Scheme = "${pkgs.base16-schemes}/share/themes/catppuccin-macchiato.yaml";
|
||||||
|
polarity = "dark";
|
||||||
|
|
||||||
|
opacity = {
|
||||||
|
applications = 0.98;
|
||||||
|
desktop = 0.98;
|
||||||
|
popups = 0.99;
|
||||||
|
terminal = 0.98;
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
sansSerif = {
|
||||||
|
package = pkgs.lato;
|
||||||
|
name = "sans-serif";
|
||||||
|
};
|
||||||
|
|
||||||
|
serif = {
|
||||||
|
package = pkgs.noto-fonts;
|
||||||
|
name = "serif";
|
||||||
|
};
|
||||||
|
|
||||||
|
monospace = {
|
||||||
|
package = pkgs.fira-code;
|
||||||
|
name = "monospace";
|
||||||
|
};
|
||||||
|
|
||||||
|
emoji = {
|
||||||
|
package = pkgs.noto-fonts-color-emoji;
|
||||||
|
name = "emoji";
|
||||||
|
};
|
||||||
|
|
||||||
|
sizes = {
|
||||||
|
terminal = 11;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.services = lib.genAttrs [ "syncthing" ] (service: {
|
||||||
|
Unit = {
|
||||||
|
ConditionACPower = true;
|
||||||
|
StopPropagatedFrom = [ "power-external.target" ];
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
wayland.windowManager.sway = {
|
||||||
|
enable = true;
|
||||||
|
checkConfig = false;
|
||||||
|
xwayland = false;
|
||||||
|
|
||||||
|
wrapperFeatures = {
|
||||||
|
base = true;
|
||||||
|
gtk = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.variables = lib.mkAfter [ "PATH" ];
|
||||||
|
|
||||||
|
extraSessionCommands = let
|
||||||
|
env = {
|
||||||
|
WLR_RENDERER = "vulkan";
|
||||||
|
NIXOS_OZONE_WL = 1;
|
||||||
|
};
|
||||||
|
in env
|
||||||
|
|> lib.mapAttrsToList (n: v: "export ${lib.toShellVar n v}\n")
|
||||||
|
|> lib.concatStrings;
|
||||||
|
|
||||||
|
config = with cmd; {
|
||||||
|
input."*" = {
|
||||||
|
xkb_layout = "us,${config.home.keyboard.layout}";
|
||||||
|
xkb_options = lib.concatStringsSep ","
|
||||||
|
config.home.keyboard.options;
|
||||||
|
xkb_switch_layout = "1";
|
||||||
|
};
|
||||||
|
|
||||||
|
output = {
|
||||||
|
"*" = {
|
||||||
|
scale = "1";
|
||||||
|
background = "${./wallpaper.png} fill";
|
||||||
|
adaptive_sync = "on";
|
||||||
|
};
|
||||||
|
|
||||||
|
"Lenovo Group Limited P40w-20 V9084N0R" = {
|
||||||
|
resolution = "5120x2160";
|
||||||
|
position = "0 0";
|
||||||
|
subpixel = "rgb";
|
||||||
|
};
|
||||||
|
|
||||||
|
"LG Display 0x06AA Unknown" = {
|
||||||
|
position = "0 2160";
|
||||||
|
subpixel = "rgb";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
bars = [
|
||||||
|
{
|
||||||
|
fonts = lib.mkForce {
|
||||||
|
names = [ "monospace" ];
|
||||||
|
size = 11.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
statusCommand = swayrbar;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
gaps = {
|
||||||
|
inner = 4;
|
||||||
|
outer = 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
window.titlebar = false;
|
||||||
|
|
||||||
|
bindkeysToCode = true;
|
||||||
|
modifier = "Mod4";
|
||||||
|
terminal = kitty;
|
||||||
|
menu = "${tofi-drun} | ${xargs} ${swaymsg} exec --";
|
||||||
|
|
||||||
|
keybindings = let
|
||||||
|
mod = config.wayland.windowManager.sway.config.modifier;
|
||||||
|
in lib.mkOptionDefault {
|
||||||
|
# Workspaces
|
||||||
|
"${mod}+Grave" = "workspace number 0";
|
||||||
|
"${mod}+Shift+Grave" = "move container to workspace number 0";
|
||||||
|
|
||||||
|
"${mod}+Shift+Return" = "exec ${kitty} ${fish} --private";
|
||||||
|
|
||||||
|
# Function keys
|
||||||
|
XF86MonBrightnessUp = "exec ${brightnessctl} -e set +5%";
|
||||||
|
XF86MonBrightnessDown = "exec ${brightnessctl} -e set 5%-";
|
||||||
|
XF86AudioRaiseVolume = "exec ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ +2dB";
|
||||||
|
XF86AudioLowerVolume = "exec ${wpctl} set-volume @DEFAULT_AUDIO_SINK@ -2dB";
|
||||||
|
XF86AudioMute = "exec set-mute @DEFAULT_AUDIO_SINK@ toggle";
|
||||||
|
XF86AudioMicMute = "exec set-mute @DEFAULT_AUDIO_SOURCE@ toggle";
|
||||||
|
XF86AudioNext = "exec ${playerctl} next";
|
||||||
|
XF86AudioPrev = "exec ${playerctl} previous";
|
||||||
|
XF86AudioPlay = "exec ${playerctl} play";
|
||||||
|
XF86AudioStop = "exec ${playerctl} pause";
|
||||||
|
XF86Explorer = "exec ${xdg-open} https:";
|
||||||
|
|
||||||
|
# Screenshots
|
||||||
|
"${mod}+Print" = "exec ${grim} -g - - | ${wl-copy}";
|
||||||
|
"${mod}+Shift+Print" = "exec ${slurp} | ${grim} -g - - | ${wl-copy}";
|
||||||
|
"${mod}+Ctrl+Print" = ''
|
||||||
|
exec ${swaymsg} -t get_tree \
|
||||||
|
| ${jq} -r '.. | select(.focused?) | .rect | "\(.x),\(.y) \(.width)x\(.height)"' \
|
||||||
|
| ${grim} -g - - \
|
||||||
|
| ${wl-copy}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
startup = [
|
||||||
|
{ command = "${swaymsg} input '*' xkb_switch_layout 1"; always = true; }
|
||||||
|
{ command = "${keepassxc}"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.configFile."fontconfig/conf.d/80-fira-code.conf".text = ''
|
||||||
|
<?xml version='1.0'?>
|
||||||
|
<!DOCTYPE fontconfig SYSTEM 'urn:fontconfig:fonts.dtd'>
|
||||||
|
<fontconfig>
|
||||||
|
<match target="font">
|
||||||
|
<test name="family" compare="eq" ignore-blanks="true">
|
||||||
|
<string>Fira Code</string>
|
||||||
|
</test>
|
||||||
|
<edit name="fontfeatures" mode="append">
|
||||||
|
${fira-code-features
|
||||||
|
|> map (tag: "<string>${lib.escapeXML tag}</string>")
|
||||||
|
|> lib.concatStrings}
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
</fontconfig>
|
||||||
|
'';
|
||||||
|
|
||||||
|
xdg.configFile."kitty/open-actions.conf".text = with cmd; ''
|
||||||
|
protocol file
|
||||||
|
mime image/*
|
||||||
|
action launch --type overlay kitten icat --hold -- "$FILE_PATH"
|
||||||
|
|
||||||
|
protocol file
|
||||||
|
mime text/markdown
|
||||||
|
action launch --type overlay ${mdless} -- "$FILE_PATH"
|
||||||
|
|
||||||
|
protocol file
|
||||||
|
mime text/*
|
||||||
|
action launch --type overlay $EDITOR -- "$FILE_PATH"
|
||||||
|
|
||||||
|
protocol file
|
||||||
|
mime video/*
|
||||||
|
action launch --type background ${mpv} -- "$FILE_PATH"
|
||||||
|
|
||||||
|
protocol file
|
||||||
|
mime audio/*
|
||||||
|
action launch --type overlay ${mpv} -- "$FILE_PATH"
|
||||||
|
|
||||||
|
protocol
|
||||||
|
action launch --type background ${xdg-open} "$FILE_PATH"
|
||||||
|
'';
|
||||||
|
|
||||||
|
xdg.desktopEntries = {
|
||||||
|
kitty = {
|
||||||
|
name = "kitty";
|
||||||
|
exec = builtins.replaceStrings [ "$" ] [ ''\\$'' ] cmd.kitty;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.mimeApps = {
|
||||||
|
enable = true;
|
||||||
|
defaultApplications = {
|
||||||
|
"default-web-browser" = [ "firefox.desktop" ];
|
||||||
|
"application/pdf" = [ "org.gnome.Evince.desktop" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
config.common.default = [ "wlr" "gtk" ];
|
||||||
|
extraPortals = with pkgs; [
|
||||||
|
xdg-desktop-portal-wlr
|
||||||
|
(xdg-desktop-portal-gtk.override { buildPortalsInGnome = false; })
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
4
home/module/locale-en_EU.nix
Normal file
4
home/module/locale-en_EU.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ self, ... }: { lib, pkgs, ... }: {
|
||||||
|
home.language.base = lib.mkDefault "en_EU.UTF-8";
|
||||||
|
i18n.glibcLocales = self.packages.${pkgs.system}.locale-en_EU;
|
||||||
|
}
|
58
lib/kernel.nix
Normal file
58
lib/kernel.nix
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
{ nixpkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (builtins)
|
||||||
|
isAttrs
|
||||||
|
isInt
|
||||||
|
length
|
||||||
|
match
|
||||||
|
toString;
|
||||||
|
|
||||||
|
inherit (nixpkgs.lib.asserts)
|
||||||
|
assertMsg;
|
||||||
|
|
||||||
|
inherit (nixpkgs.lib.attrsets)
|
||||||
|
isDerivation
|
||||||
|
mapAttrsToList
|
||||||
|
mergeAttrsList;
|
||||||
|
|
||||||
|
inherit (nixpkgs.lib.lists)
|
||||||
|
flatten;
|
||||||
|
|
||||||
|
inherit (nixpkgs.lib.strings)
|
||||||
|
concatStrings
|
||||||
|
concatStringsSep
|
||||||
|
escape;
|
||||||
|
|
||||||
|
isKey = str: match "[0-9A-Z][0-9A-Zx_]*" str != null;
|
||||||
|
isNum = str: match "(0x[0-9A-Fa-f]+|[1-9][0-9]*)" str != null;
|
||||||
|
|
||||||
|
mkValueString = v: let
|
||||||
|
v' = toString v;
|
||||||
|
in if v == true then "y"
|
||||||
|
else if isInt v || isNum v' then v'
|
||||||
|
else "\"${escape [ "\"" ] v'}\"";
|
||||||
|
|
||||||
|
in rec {
|
||||||
|
flattenAttrs = let
|
||||||
|
compose = p: n: if isKey n then p ++ [ n ] else p;
|
||||||
|
recurse = p: v:
|
||||||
|
if isValue v then { ${concatStringsSep "_" p} = v; }
|
||||||
|
else mapAttrsToList (n: v: recurse (compose p n) v) v;
|
||||||
|
in attrs: recurse [ ] attrs |> flatten |> mergeAttrsList;
|
||||||
|
|
||||||
|
option = v: { _option = v; };
|
||||||
|
isValue = x: isAttrs x -> !isDerivation x -> x ? _option;
|
||||||
|
isOptional = x: isAttrs x && !isDerivation x && x ? _option;
|
||||||
|
getValue = x: if isOptional x then x._option else x;
|
||||||
|
|
||||||
|
mkKey = n: assert isKey n; "CONFIG_${n}";
|
||||||
|
|
||||||
|
mkKeyValue = n: v: let
|
||||||
|
v' = getValue v;
|
||||||
|
in if (v' == false || v' == null)
|
||||||
|
then "# ${mkKey n} is not set"
|
||||||
|
else "${mkKey n}=${mkValueString v'}";
|
||||||
|
|
||||||
|
mkConfig = attrs: mapAttrsToList (k: v: mkKeyValue k v + "\n") attrs
|
||||||
|
|> concatStrings;
|
||||||
|
}
|
1
lib/mods.nix
Normal file
1
lib/mods.nix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
{ ... }@inputs: map (mod: import mod inputs)
|
308
nixos/config/muon.nix
Normal file
308
nixos/config/muon.nix
Normal file
|
@ -0,0 +1,308 @@
|
||||||
|
{ self, nixos-hardware, ... }: { lib, config, pkgs, ... }: {
|
||||||
|
imports = [
|
||||||
|
nixos-hardware.nixosModules.lenovo-thinkpad-x1-extreme-gen4
|
||||||
|
] ++ (with self.nixosModules; [
|
||||||
|
default
|
||||||
|
physical
|
||||||
|
portable
|
||||||
|
graphical
|
||||||
|
wireless
|
||||||
|
]);
|
||||||
|
|
||||||
|
boot.initrd = {
|
||||||
|
luks.devices."luks-2fb93d4f-a0fe-4a49-9e40-3ac38ffe4d75".device = "/dev/disk/by-uuid/2fb93d4f-a0fe-4a49-9e40-3ac38ffe4d75";
|
||||||
|
luks.devices."luks-ea77e674-847f-41b8-9e1d-8b6dd08710e6".device = "/dev/disk/by-uuid/ea77e674-847f-41b8-9e1d-8b6dd08710e6";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.kernelParams = [
|
||||||
|
"intel_iommu=on"
|
||||||
|
"nouveau.config=NvGspRm=1"
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernelPackages = let
|
||||||
|
inherit (self.packages.x86_64-linux) linux-hardened;
|
||||||
|
in pkgs.linuxPackagesFor (linux-hardened.override {
|
||||||
|
instSetArch = "alderlake";
|
||||||
|
extraFirmware = [
|
||||||
|
"i915/adlp_dmc.bin"
|
||||||
|
"i915/adlp_dmc_ver2_16.bin"
|
||||||
|
"i915/adlp_guc_70.bin"
|
||||||
|
"i915/tgl_huc.bin"
|
||||||
|
"intel/ibt-0040-0041.sfi"
|
||||||
|
"intel/ibt-0040-0041.ddc"
|
||||||
|
"intel/sof/sof-adl.ri"
|
||||||
|
"intel/sof-tplg/sof-hda-generic-2ch.tplg"
|
||||||
|
"iwlwifi-so-a0-gf-a0-89.ucode"
|
||||||
|
"iwlwifi-so-a0-gf-a0.pnvm"
|
||||||
|
"nvidia/ga107/acr/ucode_unload.bin"
|
||||||
|
"nvidia/ga107/acr/ucode_asb.bin"
|
||||||
|
"nvidia/ga107/acr/ucode_ahesasc.bin"
|
||||||
|
"nvidia/ga107/gr/fecs_bl.bin"
|
||||||
|
"nvidia/ga107/gr/fecs_sig.bin"
|
||||||
|
"nvidia/ga107/gr/gpccs_bl.bin"
|
||||||
|
"nvidia/ga107/gr/gpccs_sig.bin"
|
||||||
|
"nvidia/ga107/gr/NET_img.bin"
|
||||||
|
"nvidia/ga107/sec2/desc.bin"
|
||||||
|
"nvidia/ga107/sec2/image.bin"
|
||||||
|
"nvidia/ga107/sec2/sig.bin"
|
||||||
|
"nvidia/ga107/sec2/hs_bl_sig.bin"
|
||||||
|
"nvidia/ga107/nvdec/scrubber.bin"
|
||||||
|
"nvidia/ga107/gsp/booter_load-535.113.01.bin"
|
||||||
|
"nvidia/ga107/gsp/booter_unload-535.113.01.bin"
|
||||||
|
"nvidia/ga107/gsp/bootloader-535.113.01.bin"
|
||||||
|
"nvidia/ga107/gsp/gsp-535.113.01.bin"
|
||||||
|
"regulatory.db"
|
||||||
|
"regulatory.db.p7s"
|
||||||
|
"rtl_nic/rtl8153b-2.fw"
|
||||||
|
];
|
||||||
|
|
||||||
|
extraConfig =
|
||||||
|
(with linux-hardened.profile; physical // portable // dm-crypt // wireless // audio)
|
||||||
|
// (with self.lib.kernel; {
|
||||||
|
X86_INTEL_LPSS = true;
|
||||||
|
|
||||||
|
CPU_SUP_INTEL = true;
|
||||||
|
CPU_SUP_AMD = false;
|
||||||
|
NR_CPUS = 20;
|
||||||
|
X86_MCE_INTEL = true;
|
||||||
|
|
||||||
|
ACPI_DPTF = true;
|
||||||
|
DPTF_POWER = true;
|
||||||
|
DPTF_PCH_FIVR = true;
|
||||||
|
INTEL_IDLE = true;
|
||||||
|
|
||||||
|
VIRTUALIZATION = true;
|
||||||
|
KVM = true;
|
||||||
|
KVM_INTEL = true;
|
||||||
|
KVM_SMM = true;
|
||||||
|
|
||||||
|
IP_MULTICAST = true;
|
||||||
|
|
||||||
|
IPV6_ROUTER_PREF = true;
|
||||||
|
IPV6_ROUTE_INFO = true;
|
||||||
|
IPV6_OPTIMISTIC_DAD = true;
|
||||||
|
|
||||||
|
BT_INTEL = true;
|
||||||
|
BT_HCIBTUSB = true;
|
||||||
|
|
||||||
|
EISA = true;
|
||||||
|
EISA_PCI_EISA = true;
|
||||||
|
EISA_VIRTUAL_ROOT = false;
|
||||||
|
EISA_NAMES = true;
|
||||||
|
|
||||||
|
NVME_CORE = true;
|
||||||
|
BLK_DEV_NVME = true;
|
||||||
|
NVME_VERBOSE_ERRORS = true;
|
||||||
|
NVME_HWMON = true;
|
||||||
|
|
||||||
|
MISC_RTSX = true;
|
||||||
|
INTEL_MEI = true;
|
||||||
|
MISC_RTSX_PCI = true;
|
||||||
|
|
||||||
|
ETHERNET = true;
|
||||||
|
AQTION = true;
|
||||||
|
|
||||||
|
WLAN = true;
|
||||||
|
IWLWIFI = true;
|
||||||
|
IWLMVM = true;
|
||||||
|
|
||||||
|
INPUT_MOUSEDEV = true;
|
||||||
|
INPUT_JOYDEV = true;
|
||||||
|
|
||||||
|
KEYBOARD_ATKBD = true;
|
||||||
|
|
||||||
|
INPUT_MOUSE = true;
|
||||||
|
MOUSE_PS2 = true;
|
||||||
|
MOUSE_PS2_TRACKPOINT = true;
|
||||||
|
|
||||||
|
INPUT_JOYSTICK = true;
|
||||||
|
|
||||||
|
INTEL_PCH_THERMAL = true;
|
||||||
|
|
||||||
|
MFD_CORE = true;
|
||||||
|
MFD_INTEL_LPSS_PCI = true;
|
||||||
|
|
||||||
|
I2C = true;
|
||||||
|
I2C_I801 = true;
|
||||||
|
|
||||||
|
SPI = true;
|
||||||
|
SPI_MEM = true;
|
||||||
|
SPI_INTEL_PCI = true;
|
||||||
|
|
||||||
|
INT340X_THERMAL = true;
|
||||||
|
|
||||||
|
VIDEO = true;
|
||||||
|
VGA_SWITCHEROO = true;
|
||||||
|
DRM = true;
|
||||||
|
DRM_FBDEV_EMULATION = true;
|
||||||
|
DRM_NOUVEAU = true;
|
||||||
|
DRM_NOUVEAU_SVM = true;
|
||||||
|
DRM_NOUVEAU_GSP_DEFAULT = true;
|
||||||
|
DRM_I915 = true;
|
||||||
|
|
||||||
|
BACKLIGHT_CLASS_DEVICE = true;
|
||||||
|
|
||||||
|
HDMI = true;
|
||||||
|
|
||||||
|
SND_HDA_INTEL = true;
|
||||||
|
SND_HDA_HWDEP = true;
|
||||||
|
SND_HDA_CODEC_REALTEK = true;
|
||||||
|
SND_HDA_CODEC_HDMI = true;
|
||||||
|
SND_HDA_POWER_SAVE_DEFAULT = 2;
|
||||||
|
|
||||||
|
SND_SOC = true;
|
||||||
|
SND_SOC_SOF_TOPLEVEL = true;
|
||||||
|
SND_SOC_SOF_PCI = true;
|
||||||
|
SND_SOC_SOF_INTEL_TOPLEVEL = true;
|
||||||
|
SND_SOC_SOF_TIGERLAKE = true;
|
||||||
|
SND_SOC_SOF_HDA_LINK = true;
|
||||||
|
SND_SOC_SOF_HDA_AUDIO_CODEC = true;
|
||||||
|
SND_SOC_DMIC = true;
|
||||||
|
|
||||||
|
HID_LENOVO = true;
|
||||||
|
HID_LOGITECH = true;
|
||||||
|
|
||||||
|
USB_ACM = true;
|
||||||
|
|
||||||
|
USB_SERIAL = true;
|
||||||
|
USB_SERIAL_PL2303 = true;
|
||||||
|
|
||||||
|
EDAC_IGEN6 = true;
|
||||||
|
|
||||||
|
ACPI_WMI = true;
|
||||||
|
MXM_WMI = true;
|
||||||
|
THINKPAD_ACPI = true;
|
||||||
|
THINKPAD_ACPI_ALSA_SUPPORT = true;
|
||||||
|
THINKPAD_ACPI_VIDEO = true;
|
||||||
|
|
||||||
|
INTEL_TURBO_MAX_3 = true;
|
||||||
|
INTEL_VSEC = true;
|
||||||
|
|
||||||
|
INTEL_IOMMU = true;
|
||||||
|
INTEL_IOMMU_DEFAULT_ON = true;
|
||||||
|
|
||||||
|
SOUNDWIRE = true;
|
||||||
|
SOUNDWIRE_INTEL = true;
|
||||||
|
|
||||||
|
INTEL_IDMA64 = true;
|
||||||
|
|
||||||
|
INTEL_RAPL = true;
|
||||||
|
|
||||||
|
EXT4_FS = true;
|
||||||
|
EXT4_USE_FOR_EXT2 = true;
|
||||||
|
EXT4_FS_POSIX_ACL = true;
|
||||||
|
BTRFS_FS = true;
|
||||||
|
BTRFS_FS_POSIX_ACL = true;
|
||||||
|
FUSE_FS = true;
|
||||||
|
EXFAT_FS = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
hardware.cpu.clusters.performance = lib.range 0 11;
|
||||||
|
hardware.cpu.clusters.efficiency = lib.range 12 19;
|
||||||
|
hardware.cpu.intel.updateMicrocode = true;
|
||||||
|
|
||||||
|
hardware.glasgow.enable = true;
|
||||||
|
|
||||||
|
hardware.graphics.extraPackages = with pkgs; [
|
||||||
|
intel-media-driver
|
||||||
|
];
|
||||||
|
|
||||||
|
hardware.keyboard.qmk.enable = true;
|
||||||
|
hardware.nitrokey.enable = true;
|
||||||
|
|
||||||
|
hardware.sane = {
|
||||||
|
enable = true;
|
||||||
|
extraBackends = [ pkgs.utsushi ];
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.trackpoint = {
|
||||||
|
enable = true;
|
||||||
|
sensitivity = 255;
|
||||||
|
speed = 64;
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.uinput.enable = true;
|
||||||
|
|
||||||
|
ephemeral.enable = true;
|
||||||
|
ephemeral.device = "UUID=039aa386-a39d-4329-bcf0-48936b938db1";
|
||||||
|
ephemeral.boot.device = "PARTUUID=61c6f04c-0923-437e-860e-e88452b8e39e";
|
||||||
|
ephemeral.boot.fsType = "vfat";
|
||||||
|
ephemeral.subvolumes."/home" = {
|
||||||
|
options = [ "nodev" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.extraInputRules = ''
|
||||||
|
ip6 daddr { ff02::1:3, ff02::fb } udp dport 5353 accept
|
||||||
|
ip daddr { 224.0.0.251, 224.0.0.252 } udp dport 5353 accept
|
||||||
|
|
||||||
|
ip6 daddr ff12::8384 udp dport 21027 accept
|
||||||
|
ip daddr 255.255.255.255 udp dport 21027 accept
|
||||||
|
|
||||||
|
udp dport 4992 accept
|
||||||
|
'';
|
||||||
|
|
||||||
|
networking.hosts = {
|
||||||
|
"172.16.0.1" = [ "airlink.local" ];
|
||||||
|
"192.168.178.1" = [ "fritz.box" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ 5000 22000 ];
|
||||||
|
networking.firewall.allowedUDPPorts = [ 4992 22000 ];
|
||||||
|
networking.firewall.allowedUDPPortRanges = [
|
||||||
|
{ from = 6001; to = 6011; }
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.ssh.knownHosts."zh1830.rsync.net".publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJtclizeBy1Uo3D86HpgD3LONGVH0CJ0NT+YfZlldAJd";
|
||||||
|
|
||||||
|
services.beesd.filesystems.root = {
|
||||||
|
spec = "UUID=039aa386-a39d-4329-bcf0-48936b938db1";
|
||||||
|
hashTableSizeMB = 1024;
|
||||||
|
verbosity = "crit";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.fprintd.enable = true;
|
||||||
|
|
||||||
|
services.printing.enable = true;
|
||||||
|
services.printing.drivers = with pkgs; [
|
||||||
|
brlaser
|
||||||
|
];
|
||||||
|
|
||||||
|
services.udev.packages = with pkgs; [ utsushi ];
|
||||||
|
|
||||||
|
systemd.services."beesd@root" = {
|
||||||
|
bindsTo = [ "power-external.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
IOSchedulingClass = "idle";
|
||||||
|
CPUWeight = lib.mkForce "idle";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.nil.hashedPasswordFile = "/etc/keys/users/nil";
|
||||||
|
users.users.nil.extraGroups = [
|
||||||
|
"audio" "input" "uinput" "plugdev" "video" "render" "scanner" "nitrokey"
|
||||||
|
];
|
||||||
|
|
||||||
|
nix.distributedBuilds = true;
|
||||||
|
nix.buildMachines = [
|
||||||
|
{
|
||||||
|
hostName = "build-worker-03.nyantec.com";
|
||||||
|
maxJobs = 16;
|
||||||
|
publicHostKey = "c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUVHcVRZNzRjNWcxNURTTlBOTTJXZHI1akF3UzdCRmdYMVhSbmh0R09uSmMgcm9vdEBidWlsZC13b3JrZXItMDMK";
|
||||||
|
sshKey = "/etc/keys/nix-ssh";
|
||||||
|
sshUser = "nix-ssh";
|
||||||
|
supportedFeatures = [ "kvm" "nixos-test" "benchmark" "big-parallel" "gccarch-x86-64-v3" ];
|
||||||
|
system = "x86_64-linux";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
hostName = "build-worker-04.nyantec.com";
|
||||||
|
maxJobs = 16;
|
||||||
|
publicHostKey = "c3NoLWVkMjU1MTkgQUFBQUMzTnphQzFsWkRJMU5URTVBQUFBSUNPcSs1SStubEFOMmxKb090b1hyWUVEdVovVE1QTWE0M3BJbGFibFlpZ0sgcm9vdEBidWlsZC13b3JrZXItMDQK";
|
||||||
|
sshKey = "/etc/keys/nix-ssh";
|
||||||
|
sshUser = "nix-ssh";
|
||||||
|
supportedFeatures = [ "kvm" "nixos-test" "benchmark" "big-parallel" "gccarch-x86-64-v3" ];
|
||||||
|
system = "x86_64-linux";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
738
nixos/config/solitary.nix
Normal file
738
nixos/config/solitary.nix
Normal file
|
@ -0,0 +1,738 @@
|
||||||
|
{ self, ... }: { lib, config, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib; let
|
||||||
|
ports = {
|
||||||
|
acme = 1360;
|
||||||
|
nginx = 8080;
|
||||||
|
synapse = 8008;
|
||||||
|
syncv3 = 8009;
|
||||||
|
unbound = 8484;
|
||||||
|
};
|
||||||
|
|
||||||
|
security-txt = pkgs.writeText "security.txt" ''
|
||||||
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
|
Hash: SHA512
|
||||||
|
|
||||||
|
Canonical: https://solitary.social/.well-known/security.txt
|
||||||
|
Contact: mailto:mvs@nya.yt
|
||||||
|
Encryption: openpgp4fpr:950623eb2f52402e0cf56ccbee49e25700058dd6
|
||||||
|
Preferred-Languages: en, de
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iHUEARYKAB0WIQRbjUmg6ccaTk940M7ZkbGDPEZ7AwUCYz2XrwAKCRDZkbGDPEZ7
|
||||||
|
A4w5AQD3Mzb5Bi8CERe3j3NjQhgeEkMVBcfM3RumuWdjs6i+LgD9HHuY3Bp6ljtR
|
||||||
|
LnLJRZt4Q8CYKoPaYkSO0vBaYKmUnwY=
|
||||||
|
=iQpI
|
||||||
|
-----END PGP SIGNATURE-----
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
imports = with self.nixosModules; [
|
||||||
|
default
|
||||||
|
headless
|
||||||
|
acme-ocsp
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.loader.grub = {
|
||||||
|
enable = true;
|
||||||
|
device = "/dev/vda";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.kernelPackages = let
|
||||||
|
inherit (self.packages.x86_64-linux) linux-hardened;
|
||||||
|
in pkgs.linuxPackagesFor (linux-hardened.override {
|
||||||
|
instSetArch = "x86-64-v3";
|
||||||
|
extraConfig = linux-hardened.profile.paravirt;
|
||||||
|
});
|
||||||
|
|
||||||
|
environment.etc."machine-id".text = "1c97ae368741530de77aad42b5a6ae42";
|
||||||
|
|
||||||
|
ephemeral.device = "UUID=07a91cc3-4dd4-48e6-81d7-eb5d31fcf720";
|
||||||
|
ephemeral.boot.device = "UUID=24c72e0c-b467-4def-a641-ae09100465f0";
|
||||||
|
ephemeral.boot.fsType = "ext4";
|
||||||
|
|
||||||
|
i18n.supportedLocales = [ "C.UTF-8/UTF-8" "en_EU.UTF-8/UTF-8" "en_GB.UTF-8/UTF-8" ];
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostName = "solitary";
|
||||||
|
domain = "social";
|
||||||
|
firewall.allowedTCPPorts = [ 22 80 443 853 ];
|
||||||
|
firewall.allowedUDPPorts = [ 443 ];
|
||||||
|
};
|
||||||
|
|
||||||
|
security.acme = {
|
||||||
|
certs.${config.networking.fqdn} = {
|
||||||
|
email = "mvs@nya.yt";
|
||||||
|
listenHTTP = "127.0.0.1:${toString ports.acme}";
|
||||||
|
reloadServices = [ "haproxy.service" "unbound.service" ];
|
||||||
|
extraDomainNames = [
|
||||||
|
"cache.solitary.social"
|
||||||
|
"matrix.solitary.social"
|
||||||
|
"media.solitary.social"
|
||||||
|
"resolve.solitary.social"
|
||||||
|
"syncv3.solitary.social"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.akkoma.enable = true;
|
||||||
|
services.akkoma.extraStatic."emoji/blobs.gg" = pkgs.akkoma-emoji.blobs_gg;
|
||||||
|
services.akkoma.extraStatic."static/terms-of-service.html" = pkgs.writeText "terms-of-service.html" ''
|
||||||
|
<h2>Commitments</h2>
|
||||||
|
<p>This is currently a single‐user instance and therefore I decided to formulate what would be <em>Terms of Service</em> for a multi‐user user instance as commitments. These are still incomplete and subject to expansion in the future.</p>
|
||||||
|
<ul>
|
||||||
|
<li>I shall observe and respect your boundaries.</li>
|
||||||
|
<li>I shall respect your right to disengage, and support you if you wish to disengage from others.</li>
|
||||||
|
<li>I shall accept that you may not want to be confronted with certain content and tag my posts appropriately.</li>
|
||||||
|
</ul>
|
||||||
|
'';
|
||||||
|
|
||||||
|
services.akkoma.extraStatic."favicon.png" = let
|
||||||
|
rev = "697a8211b0f427a921e7935a35d14bb3e32d0a2c";
|
||||||
|
in pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "favicon.png";
|
||||||
|
|
||||||
|
src = pkgs.fetchurl {
|
||||||
|
url = "https://raw.githubusercontent.com/TilCreator/NixOwO/${rev}/NixOwO_plain.svg";
|
||||||
|
hash = "sha256-tWhHMfJ3Od58N9H5yOKPMfM56hYWSOnr/TGCBi8bo9E=";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [ librsvg ];
|
||||||
|
|
||||||
|
dontUnpack = true;
|
||||||
|
installPhase = ''
|
||||||
|
rsvg-convert -o $out -w 96 -h 96 $src
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.akkoma.config = let
|
||||||
|
elixir = pkgs.formats.elixirConf { };
|
||||||
|
in with elixir.lib; {
|
||||||
|
":pleroma" = {
|
||||||
|
":instance" = {
|
||||||
|
name = "solitary.social";
|
||||||
|
email = "mvs+solitary.social@nya.yt";
|
||||||
|
notify_email = "akkoma@solitary.social";
|
||||||
|
description = "Single‐user fediverse instance";
|
||||||
|
instance_thumbnail = "/instance/thumbnail.avif";
|
||||||
|
limit = 5120;
|
||||||
|
description_limit = 5120;
|
||||||
|
remote_limit = 131072;
|
||||||
|
upload_limit = 160 * 1024 * 1024;
|
||||||
|
avatar_upload_limit = 2097152;
|
||||||
|
background_upload_limit = 4194304;
|
||||||
|
banner_upload_limit = 4194304;
|
||||||
|
registrations_open = false;
|
||||||
|
account_approval_required = true;
|
||||||
|
remote_post_retention_days = 180;
|
||||||
|
user_bio_length = 5120;
|
||||||
|
user_name_length = 64;
|
||||||
|
max_account_fields = 8;
|
||||||
|
cleanup_attachments = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
"Pleroma.Web.Endpoint" = {
|
||||||
|
secret_key_base._secret = "/var/lib/secrets/akkoma/key-base";
|
||||||
|
signing_salt._secret = "/var/lib/secrets/akkoma/signing-salt";
|
||||||
|
live_view.signing_salt._secret = "/var/lib/secrets/akkoma/liveview-salt";
|
||||||
|
};
|
||||||
|
|
||||||
|
"Pleroma.Emails.Mailer" = {
|
||||||
|
enabled = true;
|
||||||
|
adapter = mkRaw "Swoosh.Adapters.SMTP";
|
||||||
|
relay = "localhost";
|
||||||
|
dkim = {
|
||||||
|
a = "ed25519-sha256";
|
||||||
|
s = "akkoma";
|
||||||
|
d = config.networking.fqdn;
|
||||||
|
private_key = mkTuple [
|
||||||
|
(mkAtom ":pem_plain")
|
||||||
|
(mkRaw ''File.read!("/var/lib/akkoma/dkim.pem")'')
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
":database".rum_enabled = true;
|
||||||
|
|
||||||
|
":media_proxy" = {
|
||||||
|
enabled = true;
|
||||||
|
base_url = "https://cache.solitary.social";
|
||||||
|
proxy_opts.redirect_on_failure = true;
|
||||||
|
proxy_opts.max_body_length = 64 * 1024 * 1024;
|
||||||
|
};
|
||||||
|
|
||||||
|
":media_preview_proxy" = {
|
||||||
|
enabled = false;
|
||||||
|
thumbnail_max_width = 1920;
|
||||||
|
thumbnail_max_height = 1080;
|
||||||
|
min_content_length = 128 * 1024;
|
||||||
|
};
|
||||||
|
|
||||||
|
"Pleroma.Upload".base_url = "https://media.solitary.social";
|
||||||
|
|
||||||
|
"Pleroma.Upload".filters = map mkRaw [
|
||||||
|
"Pleroma.Upload.Filter.Exiftool.ReadDescription"
|
||||||
|
"Pleroma.Upload.Filter.Exiftool.StripMetadata"
|
||||||
|
"Pleroma.Upload.Filter.Dedupe"
|
||||||
|
"Pleroma.Upload.Filter.AnonymizeFilename"
|
||||||
|
];
|
||||||
|
|
||||||
|
":mrf".policies = map mkRaw [
|
||||||
|
"Pleroma.Web.ActivityPub.MRF.SimplePolicy"
|
||||||
|
"Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy"
|
||||||
|
];
|
||||||
|
|
||||||
|
":mrf_simple" = {
|
||||||
|
reject = mkMap {
|
||||||
|
"bae.st" = "harassment";
|
||||||
|
"brighteon.social" = "incompatible";
|
||||||
|
"detroitriotcity.com" = "incompatible";
|
||||||
|
"freeatlantis.com" = "incompatible";
|
||||||
|
"freespeechextremist.com" = "incompatible";
|
||||||
|
"gab.com" = "incompatible";
|
||||||
|
"gleasonator.com" = "incompatible";
|
||||||
|
"kitsunemimi.club" = "incompatible";
|
||||||
|
"poa.st" = "incompatible";
|
||||||
|
"seal.cafe" = "harassment";
|
||||||
|
"social.quodverum.com" = "incompatible";
|
||||||
|
"spinster.xyz" = "incompatible";
|
||||||
|
"truthsocial.co.in" = "incompatible";
|
||||||
|
"varishangout.net" = "incompatible";
|
||||||
|
|
||||||
|
"activitypub-troll.cf" = "security";
|
||||||
|
"misskey-forkbomb.cf" = "security";
|
||||||
|
"repl.co" = "security";
|
||||||
|
};
|
||||||
|
|
||||||
|
followers_only = mkMap {
|
||||||
|
"bitcoinhackers.org" = "annoying";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
":mrf_object_age".threshold = 90 * 24 * 3600;
|
||||||
|
|
||||||
|
":frontend_configurations" = {
|
||||||
|
pleroma_fe = mkMap {
|
||||||
|
collapseMessageWithSubject = true;
|
||||||
|
hideSiteFavicon = true;
|
||||||
|
streaming = true;
|
||||||
|
webPushNotifications = true;
|
||||||
|
useStreamingApi = true;
|
||||||
|
scopeCopy = true;
|
||||||
|
showFeaturesPanel = false;
|
||||||
|
subjectLineBehavior = "masto";
|
||||||
|
alwaysShowSubjectInput = true;
|
||||||
|
postContentType = "text/markdown";
|
||||||
|
modalOnRepeat = true;
|
||||||
|
minimalScopesMode = true;
|
||||||
|
redirectRootNoLogin = "/mkl";
|
||||||
|
translationLanguage = "EN";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
":restrict_unauthenticated" = {
|
||||||
|
timelines = mkMap {
|
||||||
|
local = false;
|
||||||
|
federated = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
":translator" = {
|
||||||
|
enabled = true;
|
||||||
|
module = mkRaw "Pleroma.Akkoma.Translators.DeepL";
|
||||||
|
};
|
||||||
|
|
||||||
|
":deepl" = {
|
||||||
|
tier = mkAtom ":free";
|
||||||
|
api_key._secret = "/var/lib/secrets/akkoma/deepl";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
":web_push_encryption".":vapid_details" = {
|
||||||
|
subject = "mailto:mvs+solitary.social@nya.yt";
|
||||||
|
public_key = "BPwdJZjBeZw_ZkWU_RQ48RdPI2pHIhMAYaNJc6xut4nQRi2YSaKnfP_kLrXzRjETQh5VJsDI-azYCeEhtk-C33s";
|
||||||
|
private_key._secret = "/var/lib/secrets/akkoma/vapid";
|
||||||
|
};
|
||||||
|
|
||||||
|
":joken".":default_signer"._secret = "/var/lib/secrets/akkoma/jwt-signer";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.haproxy.enable = true;
|
||||||
|
services.haproxy.config =
|
||||||
|
let
|
||||||
|
ciphers = "ECDHE+CHACHA20:ECDHE+AESGCM";
|
||||||
|
cipherSuites = "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256";
|
||||||
|
options = "ssl-min-ver TLSv1.2 no-tls-tickets";
|
||||||
|
acmeDir = config.security.acme.certs.${config.networking.fqdn}.directory;
|
||||||
|
compTypes = [
|
||||||
|
"application/javascript"
|
||||||
|
"application/json"
|
||||||
|
"image/svg+xml"
|
||||||
|
"text/css"
|
||||||
|
"text/html"
|
||||||
|
"text/javascript"
|
||||||
|
"text/plain"
|
||||||
|
];
|
||||||
|
in ''
|
||||||
|
global
|
||||||
|
expose-experimental-directives
|
||||||
|
|
||||||
|
log stderr format short alert notice
|
||||||
|
|
||||||
|
maxconn 9216
|
||||||
|
nbthread 2
|
||||||
|
cpu-map auto:1/all 0-63
|
||||||
|
|
||||||
|
ssl-default-bind-ciphers ${ciphers}
|
||||||
|
ssl-default-bind-ciphersuites ${cipherSuites}
|
||||||
|
ssl-default-bind-options prefer-client-ciphers ${options}
|
||||||
|
|
||||||
|
ssl-default-server-ciphers ${ciphers}
|
||||||
|
ssl-default-server-ciphersuites ${cipherSuites}
|
||||||
|
ssl-default-server-options ${options}
|
||||||
|
|
||||||
|
defaults
|
||||||
|
log global
|
||||||
|
mode http
|
||||||
|
option abortonclose
|
||||||
|
option checkcache
|
||||||
|
option forwardfor
|
||||||
|
option http-keep-alive
|
||||||
|
option http-restrict-req-hdr-names reject
|
||||||
|
option httpchk
|
||||||
|
option splice-auto
|
||||||
|
option tcp-smart-connect
|
||||||
|
|
||||||
|
timeout connect 5s
|
||||||
|
timeout client 30s
|
||||||
|
timeout http-request 5s
|
||||||
|
timeout client-fin 5s
|
||||||
|
timeout tunnel 1h
|
||||||
|
timeout server 30s
|
||||||
|
timeout check 5s
|
||||||
|
|
||||||
|
cache default
|
||||||
|
total-max-size 16
|
||||||
|
max-age 240
|
||||||
|
|
||||||
|
frontend http
|
||||||
|
bind :::443 v4v6 defer-accept tfo ssl crt ${acmeDir}/full.pem allow-0rtt alpn h2,http/1.1
|
||||||
|
bind quic6@:443 v4v6 ssl crt ${acmeDir}/full.pem allow-0rtt alpn h3
|
||||||
|
bind :::80 v4v6 defer-accept tfo
|
||||||
|
|
||||||
|
acl replay-safe method GET HEAD OPTIONS req.body_size eq 0
|
||||||
|
|
||||||
|
acl host-solitary hdr(host),host_only solitary.social
|
||||||
|
acl host-cache hdr(host),host_only cache.solitary.social
|
||||||
|
acl host-media hdr(host),host_only media.solitary.social
|
||||||
|
acl host-matrix hdr(host),host_only matrix.solitary.social
|
||||||
|
acl host-syncv3 hdr(host),host_only syncv3.solitary.social
|
||||||
|
acl host-resolve hdr(host),host_only resolve.solitary.social
|
||||||
|
|
||||||
|
acl path-acme path_dir /.well-known/acme-challenge
|
||||||
|
acl path-security.txt path /.well-known/security.txt
|
||||||
|
acl path-matrix-well-known path_dir /.well-known/matrix
|
||||||
|
acl path-proxy path_dir /proxy
|
||||||
|
acl path-media path_dir /media
|
||||||
|
|
||||||
|
#http-request normalize-uri fragment-strip
|
||||||
|
#http-request normalize-uri path-strip-dot
|
||||||
|
#http-request normalize-uri path-strip-dotdot full
|
||||||
|
#http-request normalize-uri path-merge-slashes
|
||||||
|
#http-request normalize-uri percent-decode-unreserved strict
|
||||||
|
#http-request normalize-uri percent-to-uppercase strict
|
||||||
|
#http-request normalize-uri query-sort-by-name
|
||||||
|
|
||||||
|
http-request redirect scheme https code 301 unless { ssl_fc } or path-acme
|
||||||
|
http-request wait-for-handshake unless replay-safe
|
||||||
|
|
||||||
|
http-response set-tos 20 if path-acme # AF22 (low‐latency, med drop)
|
||||||
|
http-response set-tos 20 if host-resolve # AF22 (low‐latency, med drop)
|
||||||
|
http-response set-tos 10 if host-matrix # AF11 (high‐throughput, low drop)
|
||||||
|
http-response set-tos 10 if host-syncv3 # AF11 (high‐throughput, low drop)
|
||||||
|
http-response set-tos 12 if host-solitary # AF12 (high‐throughput, med drop)
|
||||||
|
http-response set-tos 14 if host-media # AF13 (high‐throughput, high drop)
|
||||||
|
http-response set-tos 14 if host-cache # AF13 (high‐throughput, high drop)
|
||||||
|
|
||||||
|
http-request cache-use default
|
||||||
|
http-request set-header X-Forwarded-Proto %[ssl_fc,iif(https,http)]
|
||||||
|
|
||||||
|
acl no-coep res.hdr(Cross-Origin-Embedder-Policy) -m len 0
|
||||||
|
acl no-coop res.hdr(Cross-Origin-Opener-Policy) -m len 0
|
||||||
|
acl no-corp res.hdr(Cross-Origin-Resource-Policy) -m len 0
|
||||||
|
acl no-csp res.hdr(Content-Security-Policy) -m len 0
|
||||||
|
acl no-rp res.hdr(Referrer-Policy) -m len 0
|
||||||
|
|
||||||
|
http-response set-header Alt-Svc "h3=\":443\""
|
||||||
|
http-response set-header Cross-Origin-Embedder-Policy require-corp if no-coep
|
||||||
|
http-response set-header Cross-Origin-Opener-Policy same-origin if no-coop
|
||||||
|
http-response set-header Cross-Origin-Resource-Policy same-origin if no-corp
|
||||||
|
http-response set-header Content-Security-Policy "default-src 'self'; frame-ancestors 'none'" if no-csp
|
||||||
|
http-response set-header Referrer-Policy same-origin if no-rp
|
||||||
|
http-response set-header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
|
||||||
|
http-response set-header X-Frame-Options DENY
|
||||||
|
http-response set-header X-Content-Type-Options nosniff
|
||||||
|
http-response set-header X-XSS-Protection "1; mode=block"
|
||||||
|
|
||||||
|
compression algo gzip
|
||||||
|
compression type ${concatStringsSep " " compTypes}
|
||||||
|
http-response cache-store default
|
||||||
|
|
||||||
|
http-request redirect code 308 location https://media.solitary.social%[capture.req.uri,regsub("^/media","")] if host-solitary path-media
|
||||||
|
http-request redirect code 308 location https://media.solitary.social%[capture.req.uri,regsub("^/media","")] if host-media path-media
|
||||||
|
http-request redirect code 308 location https://cache.solitary.social%[capture.req.uri] if host-solitary path-proxy
|
||||||
|
http-request set-path "/media%[path]" if host-media !path-media
|
||||||
|
|
||||||
|
use_backend acme if path-acme
|
||||||
|
use_backend security.txt if path-security.txt
|
||||||
|
use_backend unbound if host-resolve
|
||||||
|
use_backend synapse if host-matrix
|
||||||
|
use_backend syncv3 if host-syncv3
|
||||||
|
use_backend wellknown-matrix if host-solitary path-matrix-well-known
|
||||||
|
use_backend nginx if host-cache
|
||||||
|
use_backend akkoma if host-solitary
|
||||||
|
use_backend akkoma if host-media
|
||||||
|
default_backend notfound
|
||||||
|
|
||||||
|
backend acme
|
||||||
|
server acme 127.0.0.1:${toString ports.acme}
|
||||||
|
retry-on all-retryable-errors
|
||||||
|
|
||||||
|
backend akkoma
|
||||||
|
server akkoma /run/akkoma/socket
|
||||||
|
|
||||||
|
backend nginx
|
||||||
|
server nginx [::1]:${toString ports.nginx} tfo proto h2
|
||||||
|
retry-on conn-failure empty-response response-timeout
|
||||||
|
|
||||||
|
backend synapse
|
||||||
|
server synapse [::1]:${toString ports.synapse}
|
||||||
|
|
||||||
|
backend syncv3
|
||||||
|
server syncv3 [::1]:${toString ports.syncv3}
|
||||||
|
|
||||||
|
backend unbound
|
||||||
|
server unbound [::1]:${toString ports.unbound} tfo ssl ssl-min-ver TLSv1.3 alpn h2 allow-0rtt ca-file ${acmeDir}/chain.pem
|
||||||
|
retry-on conn-failure empty-response response-timeout 0rtt-rejected
|
||||||
|
|
||||||
|
backend security.txt
|
||||||
|
http-request return status 200 content-type text/plain file ${security-txt} if { path /.well-known/security.txt }
|
||||||
|
|
||||||
|
backend wellknown-matrix
|
||||||
|
http-request return status 200 content-type application/json file ${pkgs.writeText "client.json" (builtins.toJSON {
|
||||||
|
"m.homeserver".base_url = config.services.matrix-synapse.settings.public_baseurl;
|
||||||
|
"m.identity_server".base_url = "https://vector.im";
|
||||||
|
"org.matrix.msc3575.proxy".url = "https://syncv3.solitary.social";
|
||||||
|
})} if { path /.well-known/matrix/client }
|
||||||
|
|
||||||
|
http-request return status 200 content-type application/json file ${pkgs.writeText "server.json" (builtins.toJSON {
|
||||||
|
"m.server" = "matrix.solitary.social:443";
|
||||||
|
})} if { path /.well-known/matrix/server }
|
||||||
|
|
||||||
|
backend notfound
|
||||||
|
http-request return status 404
|
||||||
|
'';
|
||||||
|
|
||||||
|
services.matrix-synapse.enable = true;
|
||||||
|
services.matrix-synapse.settings = {
|
||||||
|
database_type = "psycopg2";
|
||||||
|
server_name = "solitary.social";
|
||||||
|
public_baseurl = "https://matrix.solitary.social/";
|
||||||
|
default_identity_server = "https://vector.im";
|
||||||
|
enable_registration = false;
|
||||||
|
|
||||||
|
listeners = [ {
|
||||||
|
bind_addresses = [ "::1" ];
|
||||||
|
port = ports.synapse;
|
||||||
|
type = "http";
|
||||||
|
tls = false;
|
||||||
|
x_forwarded = true;
|
||||||
|
|
||||||
|
resources = [ {
|
||||||
|
names = [ "client" "federation" ];
|
||||||
|
compress = true;
|
||||||
|
} ];
|
||||||
|
} ];
|
||||||
|
|
||||||
|
log_config = ./log_config.yaml;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
package = pkgs.tengine;
|
||||||
|
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
|
||||||
|
commonHttpConfig = ''
|
||||||
|
charset utf-8;
|
||||||
|
proxy_cache_path /var/cache/nginx/cache/akkoma_media_cache
|
||||||
|
levels= keys_zone=akkoma_media_cache:16m max_size=16g
|
||||||
|
inactive=1y use_temp_path=off;
|
||||||
|
access_log off;
|
||||||
|
|
||||||
|
set_real_ip_from ::1;
|
||||||
|
real_ip_header X-Forwarded-For;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.matrix-sliding-sync = {
|
||||||
|
enable = true;
|
||||||
|
environmentFile = "/etc/keys/sliding-sync.env";
|
||||||
|
settings = {
|
||||||
|
SYNCV3_BINDADDR = "[::1]:${toString ports.syncv3}";
|
||||||
|
SYNCV3_LOG_LEVEL = "warn";
|
||||||
|
SYNCV3_SERVER = "https://matrix.solitary.social";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."cache.solitary.social" = {
|
||||||
|
listen = [ {
|
||||||
|
addr = "[::1]";
|
||||||
|
port = ports.nginx;
|
||||||
|
extraParameters = [ "http2" "fastopen=512" ];
|
||||||
|
} ];
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://unix:/run/akkoma/socket";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_cache akkoma_media_cache;
|
||||||
|
slice 1m;
|
||||||
|
proxy_cache_key $host$uri$is_args$args$slice_range;
|
||||||
|
proxy_set_header Range $slice_range;
|
||||||
|
|
||||||
|
proxy_buffering on;
|
||||||
|
proxy_cache_lock on;
|
||||||
|
proxy_ignore_client_abort on;
|
||||||
|
|
||||||
|
proxy_cache_valid 200 1y;
|
||||||
|
proxy_cache_valid 206 301 304 1h;
|
||||||
|
|
||||||
|
proxy_cache_use_stale error timeout invalid_header updating;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.postfix = {
|
||||||
|
enable = true;
|
||||||
|
destination = [ ];
|
||||||
|
localRecipients = [ ];
|
||||||
|
networks = [ "localhost" ];
|
||||||
|
hostname = config.networking.fqdn;
|
||||||
|
masterConfig.smtp_inet.name = mkForce "localhost:smtp";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.postgresql_14;
|
||||||
|
|
||||||
|
extraPlugins = with pkgs.postgresql_14.pkgs; [
|
||||||
|
rum
|
||||||
|
];
|
||||||
|
|
||||||
|
initialScript = pkgs.writeText "init.psql" ''
|
||||||
|
CREATE ROLE "matrix-synapse";
|
||||||
|
CREATE DATABASE "matrix-synapse" OWNER "matrix-synapse"
|
||||||
|
TEMPLATE template0
|
||||||
|
ENCODING 'utf8'
|
||||||
|
LOCALE 'C';
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.unbound = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
package = pkgs.unbound-with-systemd.override {
|
||||||
|
withDoH = true;
|
||||||
|
withTFO = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
enableRootTrustAnchor = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
services.unbound.settings = {
|
||||||
|
server = let
|
||||||
|
acmeDir = config.security.acme.certs.${config.networking.fqdn}.directory;
|
||||||
|
num-threads = 2;
|
||||||
|
in {
|
||||||
|
inherit num-threads;
|
||||||
|
|
||||||
|
interface = [
|
||||||
|
"::1@53"
|
||||||
|
"127.0.0.1@53"
|
||||||
|
|
||||||
|
"::1@${toString ports.unbound}"
|
||||||
|
|
||||||
|
"::@853"
|
||||||
|
"0.0.0.0@853"
|
||||||
|
];
|
||||||
|
|
||||||
|
so-reuseport = true;
|
||||||
|
ip-dscp = 20;
|
||||||
|
outgoing-range = 8192;
|
||||||
|
edns-buffer-size = 1472;
|
||||||
|
udp-upstream-without-downstream = true;
|
||||||
|
num-queries-per-thread = 4096;
|
||||||
|
incoming-num-tcp = 1024;
|
||||||
|
outgoing-num-tcp = 16;
|
||||||
|
stream-wait-size = "64m";
|
||||||
|
msg-cache-size = "128m";
|
||||||
|
msg-cache-slabs = num-threads;
|
||||||
|
rrset-cache-size = "256m";
|
||||||
|
rrset-cache-slabs = num-threads;
|
||||||
|
infra-cache-slabs = num-threads;
|
||||||
|
key-cache-slabs = num-threads;
|
||||||
|
cache-min-ttl = 60;
|
||||||
|
cache-max-negative-ttl = 360;
|
||||||
|
prefer-ip6 = true;
|
||||||
|
tls-service-pem = "${acmeDir}/fullchain.pem";
|
||||||
|
tls-service-key = "${acmeDir}/key.pem";
|
||||||
|
https-port = ports.unbound;
|
||||||
|
http-query-buffer-size = "64m";
|
||||||
|
http-response-buffer-size = "64m";
|
||||||
|
access-control = [ "::/0 allow" "0.0.0.0/0 allow" ];
|
||||||
|
harden-dnssec-stripped = true;
|
||||||
|
hide-identity = true;
|
||||||
|
hide-version = true;
|
||||||
|
prefetch = true;
|
||||||
|
prefetch-key = true;
|
||||||
|
serve-expired-client-timeout = 1800;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = let
|
||||||
|
backendServices = [
|
||||||
|
"akkoma.service"
|
||||||
|
"matrix-synapse.service"
|
||||||
|
"nginx.service"
|
||||||
|
"unbound.service"
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
services.akkoma.confinement.enable = false;
|
||||||
|
services.akkoma.serviceConfig.BindReadOnlyPaths = [ "/var/lib/akkoma:/var/lib/akkoma:norbind" ];
|
||||||
|
|
||||||
|
services.haproxy = {
|
||||||
|
confinement.enable = false;
|
||||||
|
|
||||||
|
wants = [ "acme-finished-${config.networking.fqdn}.service" ]
|
||||||
|
++ backendServices;
|
||||||
|
after = [ "acme-selfsigned-${config.networking.fqdn}.service" ]
|
||||||
|
++ backendServices;
|
||||||
|
before = [ "acme-${config.networking.fqdn}.service" ];
|
||||||
|
|
||||||
|
reloadTriggers = [ "${config.security.acme.certs.${config.networking.fqdn}.directory}/cert.ocsp" ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
BindReadOnlyPaths = [
|
||||||
|
"/etc/haproxy.cfg"
|
||||||
|
"/etc/hosts"
|
||||||
|
"/etc/resolv.conf"
|
||||||
|
"/run/akkoma"
|
||||||
|
config.security.acme.certs."solitary.social".directory
|
||||||
|
security-txt
|
||||||
|
];
|
||||||
|
|
||||||
|
CapabilityBoundingSet = [ "CAP_NET_BIND_SERVICE" ];
|
||||||
|
SocketBindAllow = [ "tcp:80" "tcp:443" "udp:443" ];
|
||||||
|
SocketBindDeny = "any";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.matrix-sliding-sync = {
|
||||||
|
after = [ "matrix-synapse.service" ];
|
||||||
|
serviceConfig.ReadOnlyPaths = [
|
||||||
|
"/run/postgres"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
confinement.enable = true;
|
||||||
|
after = [ "akkoma.service" ];
|
||||||
|
serviceConfig = {
|
||||||
|
BindReadOnlyPaths = [
|
||||||
|
"/etc/hosts"
|
||||||
|
"/etc/resolv.conf"
|
||||||
|
"/run"
|
||||||
|
];
|
||||||
|
|
||||||
|
BindPaths = [
|
||||||
|
"/var/cache/nginx"
|
||||||
|
];
|
||||||
|
|
||||||
|
ProtectSystem = mkForce false;
|
||||||
|
SocketBindAllow = [ "tcp:${toString ports.nginx}" ];
|
||||||
|
SocketBindDeny = "any";
|
||||||
|
RestrictNetworkInterfaces = [ "lo" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.unbound = {
|
||||||
|
wants = [ "acme-finished-${config.networking.fqdn}.service" ];
|
||||||
|
after = [ "acme-selfsigned-${config.networking.fqdn}.service" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.synapse-compress-state = {
|
||||||
|
confinement.enable = true;
|
||||||
|
|
||||||
|
after = [ "postgresql.service" ];
|
||||||
|
description = "Compress Synapse state tables";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = ''
|
||||||
|
${pkgs.matrix-synapse-tools.rust-synapse-compress-state}/bin/synapse_auto_compressor \
|
||||||
|
-p "host=/run/postgresql \
|
||||||
|
user=${config.services.matrix-synapse.settings.database.args.database} \
|
||||||
|
dbname=${config.services.matrix-synapse.settings.database.args.database}" \
|
||||||
|
-c 512 -n 128
|
||||||
|
'';
|
||||||
|
User = "matrix-synapse";
|
||||||
|
WorkingDirectory = "/tmp";
|
||||||
|
|
||||||
|
BindReadOnlyPaths = [
|
||||||
|
"/run/postgresql"
|
||||||
|
];
|
||||||
|
|
||||||
|
ProtectProc = "noaccess";
|
||||||
|
ProcSubset = "pid";
|
||||||
|
ProtectHome = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
PrivateDevices = true;
|
||||||
|
PrivateIPC = true;
|
||||||
|
ProtectHostname = true;
|
||||||
|
ProtectClock = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
|
||||||
|
RestrictAddressFamilies = [ "AF_UNIX" ];
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
LockPersonality = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
RemoveIPC = true;
|
||||||
|
|
||||||
|
CapabilityBoundingSet = null;
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
SystemCallFilter = [ "@system-service" "~@resources" "~@privileged" ];
|
||||||
|
SystemCallArchitectures = "native";
|
||||||
|
|
||||||
|
UMask = "0077";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
timers.synapse-compress-state = {
|
||||||
|
enable = true;
|
||||||
|
description = "Compress Synapse state tables daily";
|
||||||
|
timerConfig = {
|
||||||
|
OnCalendar = "04:00";
|
||||||
|
};
|
||||||
|
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.${config.services.haproxy.user}.extraGroups = [ config.security.acme.certs.${config.networking.fqdn}.group ];
|
||||||
|
users.users.${config.services.unbound.user}.extraGroups = [ config.security.acme.certs.${config.networking.fqdn}.group ];
|
||||||
|
}
|
85
nixos/module/acme-ocsp.nix
Normal file
85
nixos/module/acme-ocsp.nix
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
{ ... }: { config, pkgs, lib, ...}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.security.acme;
|
||||||
|
|
||||||
|
script = pkgs.writeShellApplication {
|
||||||
|
name = "ocsp-query";
|
||||||
|
runtimeInputs = with pkgs; [ openssl ];
|
||||||
|
text = ''
|
||||||
|
cd "$1"
|
||||||
|
|
||||||
|
tmp="$(mktemp ocsp.der.XXXXXXXXXX)"
|
||||||
|
trap 'rm -f "$tmp"' EXIT TERM
|
||||||
|
|
||||||
|
url="$(openssl x509 -in cert.pem -noout -ocsp_uri)"
|
||||||
|
openssl ocsp -issuer chain.pem -cert cert.pem -url "$url" -respout "$tmp"
|
||||||
|
|
||||||
|
chown "$(id -u):$(id -g)" "$tmp"
|
||||||
|
chmod 644 "$tmp"
|
||||||
|
mv "$tmp" ocsp.der
|
||||||
|
|
||||||
|
ln -s -f ocsp.der full.ocsp
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.security.acme.ocspTimer = lib.mkOption {
|
||||||
|
type = with lib.types; nullOr nonEmptyStr;
|
||||||
|
default = "daily";
|
||||||
|
description = "Realtime (wall clock) timer for regular OCSP queries.";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf (cfg.ocspTimer != null) {
|
||||||
|
systemd.services = lib.mapAttrs' (cert: conf: lib.nameValuePair "ocsp-${cert}" {
|
||||||
|
description = "Query OCSP endpoint for ${cert}";
|
||||||
|
after = [ "network.target" "network-online.target" "acme-${cert}.service" ];
|
||||||
|
wants = [ "network.target" "network-online.target" "acme-${cert}.service" ];
|
||||||
|
|
||||||
|
confinement.enable = true;
|
||||||
|
confinement.packages = with pkgs; [ openssl ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
|
||||||
|
User = "acme";
|
||||||
|
Group = conf.group;
|
||||||
|
UMask = "0022";
|
||||||
|
|
||||||
|
BindPaths = [ conf.directory ];
|
||||||
|
|
||||||
|
ExecStart = "${script}/bin/ocsp-query ${lib.escapeShellArg conf.directory}";
|
||||||
|
|
||||||
|
ProtectProc = "noaccess";
|
||||||
|
ProcSubset = "pid";
|
||||||
|
ProtectHome = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
PrivateDevices = true;
|
||||||
|
PrivateIPC = true;
|
||||||
|
ProtectHostname = true;
|
||||||
|
ProtectClock = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
RestrictAddressFamilies = ["AF_INET" "AF_INET6" ];
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
LockPersonality = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
RemoveIPC = true;
|
||||||
|
CapabilityBoundingSet = null;
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
SystemCallFilter = [ "@system-service" "~@privileged" "@chown" ];
|
||||||
|
SystemCallArchitectures = "native";
|
||||||
|
DeviceAllow = null;
|
||||||
|
DevicePolicy = "closed";
|
||||||
|
SocketBindDeny = "any";
|
||||||
|
};
|
||||||
|
}) cfg.certs;
|
||||||
|
|
||||||
|
systemd.timers = lib.mapAttrs' (cert: conf: lib.nameValuePair "ocsp-${cert}" {
|
||||||
|
description = "Query OCSP endpoint for ${cert} regularly";
|
||||||
|
timerConfig.OnCalendar = cfg.ocspTimer;
|
||||||
|
}) cfg.certs;
|
||||||
|
};
|
||||||
|
}
|
7
nixos/module/broken.nix
Normal file
7
nixos/module/broken.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{ ... }: { config, lib, ... }: {
|
||||||
|
nixpkgs.config = {
|
||||||
|
permittedInsecurePackages = [
|
||||||
|
"jitsi-meet-1.0.8043"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
66
nixos/module/btrfs.nix
Normal file
66
nixos/module/btrfs.nix
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
{ self, ... }: { config, lib, pkgs, ... }: let
|
||||||
|
monthly = {
|
||||||
|
OnCalendar = "monthly";
|
||||||
|
RandomizedDelaySec = "1w";
|
||||||
|
};
|
||||||
|
|
||||||
|
timers = {
|
||||||
|
"btrfs-scrub@nix" = monthly;
|
||||||
|
"btrfs-scrub@home" = monthly;
|
||||||
|
"btrfs-scrub@var" = monthly;
|
||||||
|
"btrfs-balance@nix" = monthly;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
imports = with self.nixosModules; [
|
||||||
|
powersupply
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd = {
|
||||||
|
services =
|
||||||
|
let
|
||||||
|
btrfs = "${pkgs.btrfs-progs}/bin/btrfs";
|
||||||
|
|
||||||
|
service = serviceConfig: {
|
||||||
|
unitConfig = {
|
||||||
|
ConditionPathIsMountPoint = "%f";
|
||||||
|
RequiresMountsFor = "%f";
|
||||||
|
Requisite = [ "power-external.target" ];
|
||||||
|
StopPropagatedFrom = [ "power-external.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "exec";
|
||||||
|
KillSignal = "SIGINT";
|
||||||
|
|
||||||
|
CPUSchedulingPolicy = "batch";
|
||||||
|
IOSchedulingClass = "idle";
|
||||||
|
CPUWeight = "idle";
|
||||||
|
} // serviceConfig;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
"btrfs-scrub@" = service {
|
||||||
|
ExecStart = "${btrfs} scrub start -B %f";
|
||||||
|
BindPaths = [ "%f:%f:norbind" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
"btrfs-balance@" = service {
|
||||||
|
ExecStart = "${btrfs} balance start -dusage=10 -musage=5 %f";
|
||||||
|
};
|
||||||
|
} // lib.mapAttrs (name: _: {
|
||||||
|
overrideStrategy = "asDropin";
|
||||||
|
}) timers;
|
||||||
|
|
||||||
|
timers = lib.mapAttrs (name: timerConfig: {
|
||||||
|
bindsTo = [ "power-external.target" ];
|
||||||
|
|
||||||
|
unitConfig = {
|
||||||
|
ConditionPathIsMountPoint = "%f";
|
||||||
|
RequiresMountsFor = "%f";
|
||||||
|
};
|
||||||
|
|
||||||
|
timerConfig = timerConfig // {
|
||||||
|
Persistent = true;
|
||||||
|
};
|
||||||
|
}) timers;
|
||||||
|
};
|
||||||
|
}
|
46
nixos/module/clusters.nix
Normal file
46
nixos/module/clusters.nix
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{ ... }: { config, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.hardware.cpu.clusters;
|
||||||
|
|
||||||
|
concat = lib.concatMapStringsSep "," toString;
|
||||||
|
performance = concat cfg.performance;
|
||||||
|
efficiency = concat cfg.efficiency;
|
||||||
|
in {
|
||||||
|
options = {
|
||||||
|
hardware.cpu.clusters = {
|
||||||
|
performance = lib.mkOption {
|
||||||
|
type = with lib.types; listOf ints.unsigned;
|
||||||
|
default = [ ];
|
||||||
|
description = "List of performance CPUs";
|
||||||
|
};
|
||||||
|
|
||||||
|
efficiency = lib.mkOption {
|
||||||
|
type = with lib.types; listOf ints.unsigned;
|
||||||
|
default = [ ];
|
||||||
|
description = "List of efficiency CPUs";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf (cfg.performance != [ ] && cfg.efficiency != [ ]) {
|
||||||
|
boot.kernelParams = [
|
||||||
|
"irqaffinity=${efficiency}"
|
||||||
|
"nohz_full=${performance}"
|
||||||
|
"rcu_nocbs=all"
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.slices = lib.genAttrs [ "system" ] (slice: {
|
||||||
|
sliceConfig.AllowedCPUs = efficiency;
|
||||||
|
});
|
||||||
|
|
||||||
|
systemd.user.slices = lib.genAttrs [ "session" "app" ] (slice: {
|
||||||
|
sliceConfig.AllowedCPUs = efficiency;
|
||||||
|
});
|
||||||
|
|
||||||
|
assertions = lib.singleton {
|
||||||
|
assertion = lib.mutuallyExclusive cfg.performance cfg.efficiency;
|
||||||
|
message = "Performance and efficiency clusters must not overlap";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
15
nixos/module/datacow.nix
Normal file
15
nixos/module/datacow.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.services;
|
||||||
|
|
||||||
|
noDataCow = dir: ''
|
||||||
|
mkdir -p ${lib.escapeShellArg dir}
|
||||||
|
${pkgs.e2fsprogs}/bin/chattr +C ${lib.escapeShellArg dir}
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
systemd.services.mysql.preStart = lib.mkIf cfg.mysql.enable
|
||||||
|
(lib.mkBefore (noDataCow cfg.mysql.dataDir));
|
||||||
|
systemd.services.postgresql.preStart = lib.mkIf cfg.postgresql.enable
|
||||||
|
(lib.mkBefore (noDataCow cfg.postgresql.dataDir));
|
||||||
|
}
|
82
nixos/module/default.nix
Normal file
82
nixos/module/default.nix
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
{ self, ... }: { config, lib, pkgs, ... }: {
|
||||||
|
imports = with self.nixosModules; [
|
||||||
|
broken
|
||||||
|
btrfs
|
||||||
|
clusters
|
||||||
|
datacow
|
||||||
|
email
|
||||||
|
ephemeral
|
||||||
|
iosched
|
||||||
|
kernel
|
||||||
|
locale-en_EU
|
||||||
|
network
|
||||||
|
nix
|
||||||
|
openssh
|
||||||
|
powersupply
|
||||||
|
security
|
||||||
|
users
|
||||||
|
zram
|
||||||
|
];
|
||||||
|
|
||||||
|
#boot.initrd.systemd.enable = true;
|
||||||
|
boot.tmp.useTmpfs = true;
|
||||||
|
|
||||||
|
documentation = {
|
||||||
|
dev.enable = true;
|
||||||
|
doc.enable = false;
|
||||||
|
info.enable = false;
|
||||||
|
man.generateCaches = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
binsh = "${pkgs.dash}${pkgs.dash.shellPath}";
|
||||||
|
|
||||||
|
shellAliases = builtins.mapAttrs (name: lib.mkOverride 999) {
|
||||||
|
ls = null;
|
||||||
|
ll = null;
|
||||||
|
l = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemPackages = with pkgs; [
|
||||||
|
# Terminfo
|
||||||
|
kitty.terminfo
|
||||||
|
|
||||||
|
# Utilities
|
||||||
|
(lib.meta.setPrio 0 uutils-coreutils-noprefix)
|
||||||
|
|
||||||
|
# Hardware info
|
||||||
|
pciutils
|
||||||
|
usbutils
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.block = {
|
||||||
|
defaultScheduler = "kyber";
|
||||||
|
defaultSchedulerRotational = "bfq";
|
||||||
|
scheduler = {
|
||||||
|
"mmcblk*" = "bfq";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.enableRedistributableFirmware = false;
|
||||||
|
hardware.firmware = with pkgs; [
|
||||||
|
linux-firmware
|
||||||
|
#alsa-firmware
|
||||||
|
sof-firmware
|
||||||
|
];
|
||||||
|
|
||||||
|
ephemeral.enable = lib.mkDefault true;
|
||||||
|
|
||||||
|
location.provider = lib.mkIf config.hardware.graphics.enable "geoclue2";
|
||||||
|
|
||||||
|
services.dbus.implementation = "broker";
|
||||||
|
services.lvm.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
#system.etc.overlay.enable = true;
|
||||||
|
|
||||||
|
system.stateVersion = "24.11";
|
||||||
|
|
||||||
|
time.timeZone = lib.mkDefault "CET";
|
||||||
|
|
||||||
|
users.mutableUsers = false;
|
||||||
|
}
|
5
nixos/module/email.nix
Normal file
5
nixos/module/email.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ ... }: { lib, ... }: {
|
||||||
|
services.postfix.config = lib.mkDefault {
|
||||||
|
smtpd_tls_security_level = "may";
|
||||||
|
};
|
||||||
|
}
|
237
nixos/module/ephemeral.nix
Normal file
237
nixos/module/ephemeral.nix
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
{ ... }: { config, lib, ...}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.ephemeral;
|
||||||
|
|
||||||
|
device = lib.mkOption {
|
||||||
|
type = lib.types.nonEmptyStr;
|
||||||
|
description = "Device to mount.";
|
||||||
|
};
|
||||||
|
|
||||||
|
options = lib.mkOption {
|
||||||
|
type = with lib.types; listOf nonEmptyStr;
|
||||||
|
readOnly = true;
|
||||||
|
description = "Options used to mount the file system.";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraOptions = lib.mkOption {
|
||||||
|
type = with lib.types; listOf nonEmptyStr;
|
||||||
|
default = [ ];
|
||||||
|
description = "Additional options used to mount the file system.";
|
||||||
|
};
|
||||||
|
|
||||||
|
filesystem = {
|
||||||
|
options = {
|
||||||
|
inherit device options extraOptions;
|
||||||
|
fsType = lib.mkOption {
|
||||||
|
type = lib.types.nonEmptyStr;
|
||||||
|
description = "Type of the file system.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
tmpfs = {
|
||||||
|
options = {
|
||||||
|
inherit options extraOptions;
|
||||||
|
name = lib.mkOption {
|
||||||
|
type = lib.types.nonEmptyStr;
|
||||||
|
default = "none";
|
||||||
|
description = "Name of the file system.";
|
||||||
|
};
|
||||||
|
|
||||||
|
size = lib.mkOption {
|
||||||
|
type = with lib.types; either nonEmptyStr ints.positive;
|
||||||
|
description = "Size of the file system.";
|
||||||
|
};
|
||||||
|
|
||||||
|
mode = lib.mkOption {
|
||||||
|
type = lib.types.nonEmptyStr;
|
||||||
|
description = "Initial permissions of the root directory.";
|
||||||
|
};
|
||||||
|
|
||||||
|
uid = lib.mkOption {
|
||||||
|
type = with lib.types; either nonEmptyStr ints.unsigned;
|
||||||
|
default = 0;
|
||||||
|
description = "Initial user ID of the root directory";
|
||||||
|
};
|
||||||
|
|
||||||
|
gid = lib.mkOption {
|
||||||
|
type = with lib.types; either nonEmptyStr ints.unsigned;
|
||||||
|
default = 0;
|
||||||
|
description = "Initial group ID of the root directory";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
subvol = {
|
||||||
|
options = {
|
||||||
|
inherit options extraOptions;
|
||||||
|
subvolume = lib.mkOption {
|
||||||
|
type = with lib.types; nullOr nonEmptyStr;
|
||||||
|
default = null;
|
||||||
|
description = "Source path of the subvolume.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ephemeralDefaults = {
|
||||||
|
"/" = {
|
||||||
|
size = "64m";
|
||||||
|
mode = "755";
|
||||||
|
uid = 0;
|
||||||
|
gid = 0;
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ ];
|
||||||
|
};
|
||||||
|
"/run/nix" = {
|
||||||
|
size = "80%";
|
||||||
|
mode = "1775";
|
||||||
|
uid = 0;
|
||||||
|
gid = "nixbld";
|
||||||
|
options = [ "nodev" "nosuid" ];
|
||||||
|
extraOptions = [ ];
|
||||||
|
};
|
||||||
|
"/tmp" = {
|
||||||
|
size = "256m";
|
||||||
|
mode = "1777";
|
||||||
|
uid = 0;
|
||||||
|
gid = 0;
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
subvolumeDefaults = {
|
||||||
|
"/etc/keys" = {
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"/etc/credstore" = {
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"/etc/credstore.encrypted" = {
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" ];
|
||||||
|
};
|
||||||
|
"/nix" = {
|
||||||
|
options = [ "nodev" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"/var" = {
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options = {
|
||||||
|
ephemeral = {
|
||||||
|
enable = lib.mkEnableOption "ephemeral filesystem";
|
||||||
|
|
||||||
|
device = lib.mkOption {
|
||||||
|
type = lib.types.nonEmptyStr;
|
||||||
|
description = "Persistent btrfs device.";
|
||||||
|
};
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
inherit device;
|
||||||
|
|
||||||
|
fsType = lib.mkOption {
|
||||||
|
type = lib.types.nonEmptyStr;
|
||||||
|
};
|
||||||
|
|
||||||
|
options = lib.mkOption {
|
||||||
|
inherit (options) type readOnly description;
|
||||||
|
default = [ "nodev" "noexec" "nosuid" ]
|
||||||
|
++ lib.optionals (cfg.boot.fsType == "vfat") [ "fmask=0137" "dmask=022" ]
|
||||||
|
++ lib.optionals (builtins.match "ext[34]" cfg.boot.fsType != null) [ "data=journal" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
extraOptions = lib.mkOption {
|
||||||
|
inherit (extraOptions) type description;
|
||||||
|
default = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ephemeral = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule tmpfs);
|
||||||
|
description = "Ephemeral filesystems.";
|
||||||
|
default = ephemeralDefaults;
|
||||||
|
};
|
||||||
|
|
||||||
|
subvolumes = lib.mkOption {
|
||||||
|
type = with lib.types; attrsOf (submodule subvol);
|
||||||
|
description = "Persistent subvolumes.";
|
||||||
|
default = subvolumeDefaults;
|
||||||
|
example = {
|
||||||
|
"/home" = {
|
||||||
|
options = [ "nodev" "noexec" "nosuid" ];
|
||||||
|
extraOptions = [ "noatime" "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
boot.initrd.availableKernelModules = [ "zstd" ];
|
||||||
|
boot.supportedFilesystems = [ "btrfs" ];
|
||||||
|
|
||||||
|
environment.etc.machine-id.source = lib.mkDefault "/etc/keys/machine-id";
|
||||||
|
environment.etc.secureboot.source = lib.mkDefault "/etc/keys/secureboot";
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/boot" = {
|
||||||
|
device = cfg.boot.device;
|
||||||
|
fsType = cfg.boot.fsType;
|
||||||
|
options = cfg.boot.options ++ cfg.boot.extraOptions;
|
||||||
|
};
|
||||||
|
} //
|
||||||
|
(builtins.mapAttrs (key: val: {
|
||||||
|
fsType = "tmpfs";
|
||||||
|
options = val.options ++ val.extraOptions
|
||||||
|
++ [
|
||||||
|
"strictatime"
|
||||||
|
"size=${toString val.size}"
|
||||||
|
"mode=${val.mode}"
|
||||||
|
"uid=${toString val.uid}"
|
||||||
|
"gid=${toString val.gid}"
|
||||||
|
"huge=within_size"
|
||||||
|
];
|
||||||
|
}) (ephemeralDefaults // cfg.ephemeral)) //
|
||||||
|
(builtins.mapAttrs (key: val: {
|
||||||
|
device = cfg.device;
|
||||||
|
fsType = "btrfs";
|
||||||
|
options = val.options ++ val.extraOptions
|
||||||
|
++ [ "subvol=${if (val ? subvolume && val.subvolume != null) then val.subvolume else key}" ];
|
||||||
|
neededForBoot = true;
|
||||||
|
}) (subvolumeDefaults // cfg.subvolumes));
|
||||||
|
|
||||||
|
nix.settings.build-dir = lib.mkDefault "/run/nix";
|
||||||
|
systemd.services.nix-daemon.environment.TMPDIR = lib.mkDefault "/run/nix";
|
||||||
|
|
||||||
|
systemd.tmpfiles.settings.ephemeral = {
|
||||||
|
"/etc/keys".z = {
|
||||||
|
mode = "0751";
|
||||||
|
user = "root";
|
||||||
|
group = "root";
|
||||||
|
};
|
||||||
|
"/etc/credentials".z = {
|
||||||
|
mode = "0750";
|
||||||
|
user = "root";
|
||||||
|
group = "root";
|
||||||
|
};
|
||||||
|
"/etc/credentials.encrypted".z = {
|
||||||
|
mode = "0750";
|
||||||
|
user = "root";
|
||||||
|
group = "root";
|
||||||
|
};
|
||||||
|
"/run/nix".D = {
|
||||||
|
mode = "1775";
|
||||||
|
user = "root";
|
||||||
|
group = "nixbld";
|
||||||
|
age = "1d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
21
nixos/module/graphical.nix
Normal file
21
nixos/module/graphical.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }: {
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
"kernel.sysrq" = lib.mkDefault "0x1f4";
|
||||||
|
"kernel.unprivileged_userns_clone" = lib.mkDefault 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.pathsToLink = [
|
||||||
|
"/share/applications"
|
||||||
|
"/share/xdg-desktop-portal"
|
||||||
|
];
|
||||||
|
|
||||||
|
hardware.graphics.enable = true;
|
||||||
|
|
||||||
|
security.polkit.enable = true;
|
||||||
|
security.rtkit.enable = true;
|
||||||
|
|
||||||
|
services.pipewire = {
|
||||||
|
enable = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
}
|
31
nixos/module/headless.nix
Normal file
31
nixos/module/headless.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{ self, ... }: { config, lib, pkgs, ... }: {
|
||||||
|
imports = with self.nixosModules; [
|
||||||
|
mimalloc
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernelParams = [ "panic=-1" ];
|
||||||
|
|
||||||
|
boot.initrd.network = {
|
||||||
|
enable = false;
|
||||||
|
ssh.enable = true;
|
||||||
|
ssh.authorizedKeys = lib.flatten (lib.mapAttrsToList (_: user: user.openssh.authorizedKeys.keys) (lib.filterAttrs (_: user: lib.any (group: group == "wheel") user.extraGroups) config.users.users));
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.graphics.enable = false;
|
||||||
|
|
||||||
|
security.lockKernelModules = true;
|
||||||
|
security.pam.sshAgentAuth.enable = true;
|
||||||
|
security.protectKernelImage = true;
|
||||||
|
services.openssh.enable = true;
|
||||||
|
services.openssh.openFirewall = true;
|
||||||
|
|
||||||
|
systemd.network.networks."97-ethernet-default-dhcp-static.network" = {
|
||||||
|
matchConfig.Type = "ether";
|
||||||
|
matchConfig.Name = "en*";
|
||||||
|
|
||||||
|
networkConfig.DHCP = "yes";
|
||||||
|
dhcpV4Config.UseDNS = false;
|
||||||
|
dhcpV6Config.UseDNS = false;
|
||||||
|
ipv6AcceptRAConfig.Token = lib.mkDefault "static:::1";
|
||||||
|
};
|
||||||
|
}
|
118
nixos/module/iosched.nix
Normal file
118
nixos/module/iosched.nix
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.hardware.block;
|
||||||
|
escape = lib.strings.escape [ ''"'' ];
|
||||||
|
|
||||||
|
inherit (lib)
|
||||||
|
mkIf
|
||||||
|
mkOption
|
||||||
|
types
|
||||||
|
|
||||||
|
concatStrings
|
||||||
|
mapAttrsToList
|
||||||
|
optionalString;
|
||||||
|
in {
|
||||||
|
options.hardware.block = {
|
||||||
|
defaultScheduler = mkOption {
|
||||||
|
type = with types; nullOr nonEmptyStr;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
Default block I/O scheduler.
|
||||||
|
|
||||||
|
Unless `null`, the value is assigned through a udev rule matching all
|
||||||
|
block devices.
|
||||||
|
'';
|
||||||
|
example = "kyber";
|
||||||
|
};
|
||||||
|
|
||||||
|
defaultSchedulerRotational = mkOption {
|
||||||
|
type = with types; nullOr nonEmptyStr;
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
Default block I/O scheduler for rotational drives (e.g. hard disks).
|
||||||
|
|
||||||
|
Unless `null`, the value is assigned through a udev rule matching all
|
||||||
|
rotational block devices.
|
||||||
|
|
||||||
|
This option takes precedence over
|
||||||
|
{option}`config.hardware.block.defaultScheduler`.
|
||||||
|
'';
|
||||||
|
example = "bfq";
|
||||||
|
};
|
||||||
|
|
||||||
|
scheduler = mkOption {
|
||||||
|
type = with types; attrsOf nonEmptyStr;
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
Assign block I/O scheduler by device name pattern.
|
||||||
|
|
||||||
|
Names are matched using the {manpage}`udev(7)` pattern syntax:
|
||||||
|
|
||||||
|
`*`
|
||||||
|
: Matches zero or more characters.
|
||||||
|
|
||||||
|
`?`
|
||||||
|
: Matches any single character.
|
||||||
|
|
||||||
|
`[]`
|
||||||
|
: Matches any single character specified in the brackets. Ranges are
|
||||||
|
supported via the `-` character.
|
||||||
|
|
||||||
|
`|`
|
||||||
|
: Separates alternative patterns.
|
||||||
|
|
||||||
|
|
||||||
|
Please note that overlapping patterns may produce unexpected results.
|
||||||
|
More complex configurations requiring these should instead be specified
|
||||||
|
directly through custom udev rules, for example via
|
||||||
|
[{option}`config.services.udev.extraRules`](#opt-services.udev.extraRules),
|
||||||
|
to ensure correct ordering.
|
||||||
|
|
||||||
|
Available schedulers depend on the kernel configuration but modern
|
||||||
|
Linux systems typically support:
|
||||||
|
|
||||||
|
`none`
|
||||||
|
: No‐operation scheduler with no re‐ordering of requests. Suitable
|
||||||
|
for devices with fast random I/O such as NVMe SSDs.
|
||||||
|
|
||||||
|
[`mq-deadline`](https://www.kernel.org/doc/html/latest/block/deadline-iosched.html)
|
||||||
|
: Simple latency‐oriented general‐purpose scheduler.
|
||||||
|
|
||||||
|
[`kyber`](https://www.kernel.org/doc/html/latest/block/kyber-iosched.html)
|
||||||
|
: Simple latency‐oriented scheduler for fast multi‐queue devices
|
||||||
|
like NVMe SSDs.
|
||||||
|
|
||||||
|
[`bfq`](https://www.kernel.org/doc/html/latest/block/bfq-iosched.html)
|
||||||
|
: Complex fairness‐oriented scheduler. Higher processing overhead,
|
||||||
|
but good interactive response, especially with slower devices.
|
||||||
|
|
||||||
|
|
||||||
|
Schedulers assigned through this option take precedence over
|
||||||
|
{option}`config.hardware.block.defaultScheduler` and
|
||||||
|
{option}`config.hardware.block.defaultSchedulerRotational` but may be
|
||||||
|
overridden by other udev rules.
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
"mmcblk[0-9]*" = "bfq";
|
||||||
|
"nvme[0-9]*" = "kyber";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.defaultScheduler != null ||
|
||||||
|
cfg.defaultSchedulerRotational != null || cfg.scheduler != { }) {
|
||||||
|
services.udev.packages = [
|
||||||
|
(pkgs.writeTextDir "etc/udev/rules.d/98-block-io-scheduler.rules"
|
||||||
|
(optionalString (cfg.defaultScheduler != null) ''
|
||||||
|
SUBSYSTEM=="block", ACTION=="add|change", TEST=="queue/scheduler", ATTR{queue/scheduler}="${escape cfg.defaultScheduler}"
|
||||||
|
'' + optionalString (cfg.defaultSchedulerRotational != null) ''
|
||||||
|
SUBSYSTEM=="block", ACTION=="add|change", ATTR{queue/rotational}=="1", TEST=="queue/scheduler", ATTR{queue/scheduler}="${escape cfg.defaultSchedulerRotational}"
|
||||||
|
'' + concatStrings (mapAttrsToList (name: sched: ''
|
||||||
|
SUBSYSTEM=="block", ACTION=="add|change", KERNEL=="${escape name}", ATTR{queue/scheduler}="${escape sched}"
|
||||||
|
'') cfg.scheduler)))
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
meta.maintainers = with lib.maintainers; [ mvs ];
|
||||||
|
}
|
141
nixos/module/kernel.nix
Normal file
141
nixos/module/kernel.nix
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
{ self, ... }: { lib, pkgs, ... }: {
|
||||||
|
boot.consoleLogLevel = lib.mkDefault 3;
|
||||||
|
|
||||||
|
boot.initrd = {
|
||||||
|
includeDefaultModules = lib.mkDefault false;
|
||||||
|
luks.cryptoModules = lib.mkDefault [ ];
|
||||||
|
verbose = lib.mkDefault false;
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.kernelPackages = lib.mkDefault
|
||||||
|
(pkgs.linuxPackagesFor self.packages.${pkgs.system}.linux-hardened);
|
||||||
|
boot.modprobeConfig.enable = lib.mkDefault false;
|
||||||
|
|
||||||
|
boot.kernelParams = [
|
||||||
|
# Disable kernel messages on the console
|
||||||
|
"quiet"
|
||||||
|
|
||||||
|
# Zero‐fill page and slab allocations on free
|
||||||
|
"init_on_free=1"
|
||||||
|
|
||||||
|
# Disable I/O delay
|
||||||
|
"io_delay=none"
|
||||||
|
|
||||||
|
# Enable page allocator free list randomisation
|
||||||
|
"page_alloc.shuffle=1"
|
||||||
|
|
||||||
|
# Disable slab merging
|
||||||
|
"slab_nomerge"
|
||||||
|
|
||||||
|
# Disable vsyscall mechanism
|
||||||
|
"vsyscall=none"
|
||||||
|
|
||||||
|
# Enable transparent hugepages
|
||||||
|
"transparent_hugepage=always"
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
# Mitigate some TOCTOU vulnerabilities
|
||||||
|
"fs.protected_fifos" = 2;
|
||||||
|
"fs.protected_hardlinks" = 1;
|
||||||
|
"fs.protected_regular" = 2;
|
||||||
|
"fs.protected_symlinks" = 1;
|
||||||
|
|
||||||
|
# Disable automatic loading of TTY line disciplines
|
||||||
|
"dev.tty.ldisc_autoload" = 0;
|
||||||
|
|
||||||
|
# Disable first 64 KiB of virtual memory for allocation
|
||||||
|
"vm.mmap_min_addr" = 65536;
|
||||||
|
|
||||||
|
# Increase ASLR randomisation
|
||||||
|
"vm.mmap_rnd_bits" = 32;
|
||||||
|
"vm.mmap_rnd_compat_bits" = 16;
|
||||||
|
|
||||||
|
# Restrict ptrace()
|
||||||
|
"kernel.yama.ptrace_scope" = 1;
|
||||||
|
|
||||||
|
# Hide kernel memory addresses
|
||||||
|
"kernel.kptr_restrict" = 2;
|
||||||
|
|
||||||
|
# Restrict kernel log access
|
||||||
|
"kernel.dmesg_restrict" = 1;
|
||||||
|
|
||||||
|
# Enable hardened eBPF JIT
|
||||||
|
"kernel.unprivileged_bpf_disabled" = 1;
|
||||||
|
"net.core.bpf_jit_enable" = 1;
|
||||||
|
"net.core.bpf_jit_harden" = 2;
|
||||||
|
|
||||||
|
# Ignore ICMP redirects
|
||||||
|
"net.ipv4.conf.default.accept_redirects" = 0;
|
||||||
|
"net.ipv6.conf.default.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_redirects" = 0;
|
||||||
|
|
||||||
|
# Set default Qdisc
|
||||||
|
"net.core.default_qdisc" = "fq";
|
||||||
|
|
||||||
|
# Increase minimum PMTU
|
||||||
|
"net.ipv4.route.min_pmtu" = 1280;
|
||||||
|
|
||||||
|
# Set default TCP congestion control algorithm
|
||||||
|
"net.ipv4.tcp_congestion_control" = "bbr";
|
||||||
|
|
||||||
|
# Enable ECN
|
||||||
|
"net.ipv4.tcp_ecn" = 1;
|
||||||
|
|
||||||
|
# Enable TCP fast open
|
||||||
|
"net.ipv4.tcp_fastopen" = 3;
|
||||||
|
|
||||||
|
# Disable TCP slow start after idling
|
||||||
|
"net.ipv4.tcp_slow_start_after_idle" = 0;
|
||||||
|
|
||||||
|
# Allow re‐use of TCP ports during TIME-WAIT
|
||||||
|
"net.ipv4.tcp_tw_reuse" = 1;
|
||||||
|
|
||||||
|
# Enable TCP MTU probing
|
||||||
|
"net.ipv4.tcp_mtu_probing" = 1;
|
||||||
|
"net.ipv4.tcp_mtu_probe_floor" = 1220;
|
||||||
|
|
||||||
|
# Increase socket buffer space
|
||||||
|
# default of 16 MiB should be sufficient to saturate 1GE
|
||||||
|
# maximum for 54 MiB sufficient for 10GE
|
||||||
|
"net.core.rmem_default" = 16777216;
|
||||||
|
"net.core.rmem_max" = 56623104;
|
||||||
|
"net.core.wmem_default" = 16777216;
|
||||||
|
"net.core.wmem_max" = 56623104;
|
||||||
|
"net.core.optmem_max" = 65536;
|
||||||
|
"net.ipv4.tcp_rmem" = "4096 1048576 56623104";
|
||||||
|
"net.ipv4.tcp_wmem" = "4096 65536 56623104";
|
||||||
|
"net.ipv4.tcp_notsent_lowat" = 16384;
|
||||||
|
"net.ipv4.udp_rmem_min" = 9216;
|
||||||
|
"net.ipv4.udp_wmem_min" = 9216;
|
||||||
|
|
||||||
|
# Reduce TCP keep‐alive time‐out to 2 minutes
|
||||||
|
"net.ipv4.tcp_keepalive_time" = 60;
|
||||||
|
"net.ipv4.tcp_keepalive_probes" = 6;
|
||||||
|
"net.ipv4.tcp_keepalive_intvl" = 10;
|
||||||
|
|
||||||
|
# Widen local port range
|
||||||
|
"net.ipv4.ip_local_port_range" = "16384 65535";
|
||||||
|
|
||||||
|
# Increase default MTU
|
||||||
|
"net.ipv6.conf.default.mtu" = 1452;
|
||||||
|
"net.ipv6.conf.all.mtu" = 1452;
|
||||||
|
|
||||||
|
# Set traffic class for NDP to CS6 (network control)
|
||||||
|
"net.ipv6.conf.default.ndisc_tclass" = 192;
|
||||||
|
"net.ipv6.conf.all.ndisc_tclass" = 192;
|
||||||
|
|
||||||
|
# Dirty page cache ratio
|
||||||
|
"vm.dirty_background_ratio" = 3;
|
||||||
|
"vm.dirty_ratio" = 6;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Work around initrd generation bug
|
||||||
|
environment.etc."modprobe.d/nixos.conf".text = "";
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"w- /sys/kernel/mm/transparent_hugepage/enabled - - - - always"
|
||||||
|
"w- /sys/kernel/mm/transparent_hugepage/defrag - - - - defer+madvise"
|
||||||
|
];
|
||||||
|
}
|
7
nixos/module/locale-en_EU.nix
Normal file
7
nixos/module/locale-en_EU.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{ self, ... }: { config, lib, pkgs, ... }: {
|
||||||
|
i18n.defaultLocale = lib.mkDefault "en_EU.UTF-8";
|
||||||
|
i18n.glibcLocales = self.packages.${pkgs.system}.locale-en_EU.override {
|
||||||
|
allLocales = builtins.any (x: x == "all") config.i18n.supportedLocales;
|
||||||
|
locales = config.i18n.supportedLocales;
|
||||||
|
};
|
||||||
|
}
|
4
nixos/module/mimalloc.nix
Normal file
4
nixos/module/mimalloc.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }: {
|
||||||
|
environment.memoryAllocator.provider = "mimalloc";
|
||||||
|
environment.variables.MIMALLOC_LARGE_OS_PAGES = 1;
|
||||||
|
}
|
49
nixos/module/network.nix
Normal file
49
nixos/module/network.nix
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
{ ... }: { lib, name, ... }: {
|
||||||
|
networking.nameservers = [
|
||||||
|
"[2a05:f480:1800:d2e::1]:853#resolve.solitary.social"
|
||||||
|
"80.240.30.163:853#resolve.solitary.social"
|
||||||
|
"[2a01:4f8:1c0c:6c89::1]:853#resolve.nyantec.com"
|
||||||
|
"116.203.220.161:853#resolve.nyantec.com"
|
||||||
|
];
|
||||||
|
|
||||||
|
networking.hostName = lib.mkDefault name;
|
||||||
|
networking.nftables.enable = true;
|
||||||
|
networking.useNetworkd = true;
|
||||||
|
|
||||||
|
services.resolved = {
|
||||||
|
enable = true;
|
||||||
|
dnsovertls = "true";
|
||||||
|
dnssec = "true";
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks."98-ethernet-default-dhcp" = {
|
||||||
|
matchConfig.Type = "ether";
|
||||||
|
matchConfig.Name = "en*";
|
||||||
|
|
||||||
|
DHCP = lib.mkDefault "yes";
|
||||||
|
dhcpV4Config.UseDNS = false;
|
||||||
|
dhcpV6Config.UseDNS = false;
|
||||||
|
ipv6AcceptRAConfig.Token = "prefixstable";
|
||||||
|
|
||||||
|
fairQueueingConfig.Pacing = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks."98-wireless-client-dhcp" = {
|
||||||
|
matchConfig.Type = "wlan";
|
||||||
|
matchConfig.WLANInterfaceType = "station";
|
||||||
|
|
||||||
|
DHCP = lib.mkDefault "yes";
|
||||||
|
dhcpV4Config.UseDNS = false;
|
||||||
|
dhcpV4Config.RouteMetric = 1025;
|
||||||
|
dhcpV6Config.UseDNS = false;
|
||||||
|
ipv6AcceptRAConfig.Token = "prefixstable";
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 1025;
|
||||||
|
|
||||||
|
cakeConfig = {
|
||||||
|
Bandwidth = lib.mkDefault "100M";
|
||||||
|
AutoRateIngress = true;
|
||||||
|
UseRawPacketSize = false;
|
||||||
|
PriorityQueueingPreset = "diffserv4";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
23
nixos/module/nitrokey-random.nix
Normal file
23
nixos/module/nitrokey-random.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
lib.mkIf config.hardware.nitrokey.enable {
|
||||||
|
services.udev.packages = [
|
||||||
|
(pkgs.writeTextDir "etc/udev/rules.d/98-nitrokey-random-seed.rules" ''
|
||||||
|
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="20a0", ATTRS{idProduct}=="42b1|42b2", TAG+="systemd", ENV{SYSTEMD_WANTS}+="nitrokey-random-seed@%k.service"
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.services."nitrokey-random-seed@" = {
|
||||||
|
description = "Feed kernel from Nitrokey TRNG";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "${pkgs.pynitrokey}/bin/nitropy fido2 rng feedkernel";
|
||||||
|
DynamicUser = true;
|
||||||
|
SupplementaryGroups = [ "plugdev" ];
|
||||||
|
AmbientCapabilities = [ "CAP_SYS_ADMIN" ];
|
||||||
|
|
||||||
|
DeviceAllow = [ "/dev/%i rw" ];
|
||||||
|
DevicePolicy = "closed";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
67
nixos/module/nix.nix
Normal file
67
nixos/module/nix.nix
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
{ self, ... }: { lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
inherit (pkgs.stdenv) hostPlatform;
|
||||||
|
# inherit (inputs.idiosyn.lib.platforms.${hostPlatform.system}.gcc) arch;
|
||||||
|
in {
|
||||||
|
imports = with self.nixosModules; [
|
||||||
|
powersupply
|
||||||
|
];
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
package = pkgs.lix;
|
||||||
|
|
||||||
|
channel.enable = false;
|
||||||
|
|
||||||
|
daemonCPUSchedPolicy = "batch";
|
||||||
|
daemonIOSchedClass = "best-effort";
|
||||||
|
daemonIOSchedPriority = 7;
|
||||||
|
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
randomizedDelaySec = "24h";
|
||||||
|
options = "--delete-older-than 10d";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
experimental-features = [
|
||||||
|
"cgroups"
|
||||||
|
"flakes"
|
||||||
|
"nix-command"
|
||||||
|
"repl-flake"
|
||||||
|
"pipe-operator"
|
||||||
|
];
|
||||||
|
|
||||||
|
allowed-users = [ "@users" ];
|
||||||
|
trusted-users = [ "@wheel" ];
|
||||||
|
|
||||||
|
builders-use-substitutes = true;
|
||||||
|
download-attempts = 8;
|
||||||
|
http-connections = 128;
|
||||||
|
max-substitution-jobs = 128;
|
||||||
|
preallocate-contents = true;
|
||||||
|
use-cgroups = true;
|
||||||
|
use-xdg-base-directories = true;
|
||||||
|
|
||||||
|
/* system-features = lib.mkOptionDefault
|
||||||
|
(map (arch: "gccarch-${arch}") ([ arch ] ++ lib.systems.architectures.inferiors.${arch} or [ ]));*/
|
||||||
|
};
|
||||||
|
|
||||||
|
registry = {
|
||||||
|
nixpkgs.to = {
|
||||||
|
type = "path";
|
||||||
|
path = pkgs.path;
|
||||||
|
narHash = lib.trim (builtins.readFile
|
||||||
|
(pkgs.runCommandLocal "get-nixpkgs-hash"
|
||||||
|
{ nativeBuildInputs = [ pkgs.nix ]; }
|
||||||
|
"nix-hash --type sha256 --sri ${pkgs.path} > $out"));
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = {
|
||||||
|
services.nix-daemon.serviceConfig.Slice = "nix-build.slice";
|
||||||
|
slices.nix-build = { };
|
||||||
|
timers.nix-gc.bindsTo = [ "power-external.target" ];
|
||||||
|
};
|
||||||
|
}
|
64
nixos/module/openssh.nix
Normal file
64
nixos/module/openssh.nix
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
{ ... }: { lib, ...}:
|
||||||
|
|
||||||
|
let
|
||||||
|
ciphers = [
|
||||||
|
"chacha20-poly1305@openssh.com"
|
||||||
|
"aes256-gcm@openssh.com"
|
||||||
|
"aes128-gcm@openssh.com"
|
||||||
|
];
|
||||||
|
|
||||||
|
sigAlgorithms = [
|
||||||
|
"ssh-ed25519-cert-v01@openssh.com"
|
||||||
|
"ssh-ed25519"
|
||||||
|
"sk-ssh-ed25519-cert-v01@openssh.com"
|
||||||
|
"sk-ssh-ed25519@openssh.com"
|
||||||
|
];
|
||||||
|
|
||||||
|
kexAlgorithms = [
|
||||||
|
"sntrup761x25519-sha512@openssh.com"
|
||||||
|
"curve25519-sha256"
|
||||||
|
"curve25519-sha256@libssh.org"
|
||||||
|
];
|
||||||
|
|
||||||
|
macs = [
|
||||||
|
"umac-128-etm@openssh.com"
|
||||||
|
"hmac-sha2-512-etm@openssh.com"
|
||||||
|
"hmac-sha2-256-etm@openssh.com"
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
programs.ssh = {
|
||||||
|
inherit ciphers kexAlgorithms macs;
|
||||||
|
hostKeyAlgorithms = sigAlgorithms;
|
||||||
|
pubkeyAcceptedKeyTypes = sigAlgorithms;
|
||||||
|
setXAuthLocation = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh = {
|
||||||
|
hostKeys = lib.mkDefault [
|
||||||
|
{
|
||||||
|
path = "/etc/keys/ssh_host_ed25519_key";
|
||||||
|
type = "ed25519";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
PermitRootLogin = "no";
|
||||||
|
|
||||||
|
PasswordAuthentication = false;
|
||||||
|
KbdInteractiveAuthentication = false;
|
||||||
|
AuthenticationMethods = "publickey";
|
||||||
|
|
||||||
|
Ciphers = ciphers;
|
||||||
|
Macs = macs;
|
||||||
|
|
||||||
|
KexAlgorithms = kexAlgorithms;
|
||||||
|
HostKeyAlgorithms = lib.concatStringsSep "," sigAlgorithms;
|
||||||
|
PubkeyAcceptedAlgorithms = lib.concatStringsSep "," sigAlgorithms;
|
||||||
|
|
||||||
|
# Remove stale Unix sockets when forwarding
|
||||||
|
StreamLocalBindUnlink = true;
|
||||||
|
|
||||||
|
ClientAliveInterval = 900;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
19
nixos/module/physical.nix
Normal file
19
nixos/module/physical.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ self, lanzaboote, ... }: { config, lib, pkgs, ... }: {
|
||||||
|
imports = [
|
||||||
|
lanzaboote.nixosModules.lanzaboote
|
||||||
|
] ++ (with self.nixosModules; [
|
||||||
|
nitrokey-random
|
||||||
|
]);
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader.efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
lanzaboote = {
|
||||||
|
enable = true;
|
||||||
|
pkiBundle = lib.mkDefault "/etc/keys/secureboot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
security.tpm2.enable = true;
|
||||||
|
services.fwupd.enable = true;
|
||||||
|
}
|
34
nixos/module/portable.nix
Normal file
34
nixos/module/portable.nix
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{ ... }: { lib, config, pkgs, ... }: {
|
||||||
|
# Work around TTL‐based rate limiting in mobile networks
|
||||||
|
boot.kernel.sysctl."net.ipv4.ip_default_ttl" = 65;
|
||||||
|
|
||||||
|
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||||
|
powerManagement.scsiLinkPolicy = lib.mkDefault "med_power_with_dipm";
|
||||||
|
|
||||||
|
services.auto-cpufreq = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
battery = {
|
||||||
|
governor = "powersave";
|
||||||
|
turbo = "never";
|
||||||
|
};
|
||||||
|
|
||||||
|
charger = {
|
||||||
|
governor = "powersave";
|
||||||
|
turbo = "auto";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.thermald.enable = lib.mkDefault true;
|
||||||
|
services.tlp.enable = false;
|
||||||
|
|
||||||
|
services.udev.packages = [
|
||||||
|
(pkgs.writeTextDir "/etc/udev/rules.d/98-power-supply-portable.rules" ''
|
||||||
|
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", SYSCTL{vm/dirty_writeback_centisecs}="6000"
|
||||||
|
SUBSYSTEM=="power_supply", ATTR{status}!="Discharging", SYSCTL{vm/dirty_writeback_centisecs}="1500"
|
||||||
|
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[3-5]", RUN+="${config.systemd.package}/bin/systemctl suspend"
|
||||||
|
SUBSYSTEM=="power_supply", ATTR{status}=="Discharging", ATTR{capacity}=="[0-2]", RUN+="${config.systemd.package}/bin/systemctl poweroff"
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
}
|
27
nixos/module/powersupply.nix
Normal file
27
nixos/module/powersupply.nix
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{ ... }: { config, lib, pkgs, ... }: {
|
||||||
|
services.udev.packages = [
|
||||||
|
(pkgs.writeTextDir "/etc/udev/rules.d/98-power-supply.rules" ''
|
||||||
|
SUBSYSTEM=="power_supply", KERNEL=="AC", TAG+="systemd", ENV{SYSTEMD_WANTS}+="power-internal.target power-external.target"
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.targets.power-internal = {
|
||||||
|
description = "On internal power supply";
|
||||||
|
conflicts = [ "power-external.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
unitConfig = {
|
||||||
|
ConditionACPower = false;
|
||||||
|
DefaultDependencies = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.targets.power-external = {
|
||||||
|
description = "On external power supply";
|
||||||
|
conflicts = [ "power-internal.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
unitConfig = {
|
||||||
|
ConditionACPower = true;
|
||||||
|
DefaultDependencies = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
21
nixos/module/security.nix
Normal file
21
nixos/module/security.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ ... }: { lib, config, ... }: {
|
||||||
|
boot.loader.systemd-boot.editor = false;
|
||||||
|
|
||||||
|
security.acme.acceptTerms = true;
|
||||||
|
security.pam.services.swaylock.fprintAuth = false;
|
||||||
|
security.pam.services.login.fprintAuth = false;
|
||||||
|
security.pam.services.sudo-rs = {
|
||||||
|
fprintAuth = config.services.fprintd.enable;
|
||||||
|
sshAgentAuth = config.security.pam.sshAgentAuth.enable;
|
||||||
|
};
|
||||||
|
|
||||||
|
security.sudo.enable = false;
|
||||||
|
security.sudo-rs = {
|
||||||
|
enable = true;
|
||||||
|
execWheelOnly = true;
|
||||||
|
wheelNeedsPassword = config.security.pam.services.sudo-rs.fprintAuth
|
||||||
|
|| config.security.pam.services.sudo-rs.sshAgentAuth;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.logind.killUserProcesses = true;
|
||||||
|
}
|
59
nixos/module/users.nix
Normal file
59
nixos/module/users.nix
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
{ self, home-manager, ...}: { config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
graphical = config.hardware.graphics.enable;
|
||||||
|
in {
|
||||||
|
imports = [ home-manager.nixosModules.home-manager ];
|
||||||
|
|
||||||
|
home-manager = {
|
||||||
|
useUserPackages = lib.mkDefault true;
|
||||||
|
useGlobalPkgs = lib.mkDefault true;
|
||||||
|
users = { inherit (self.homeConfigurations) nil; };
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.config.allowUnfreePredicate = lib.mkIf graphical
|
||||||
|
(pkg: builtins.elem (lib.getName pkg) [ "obsidian" ]);
|
||||||
|
|
||||||
|
programs.dconf.enable = lib.mkIf graphical true;
|
||||||
|
programs.fish.enable = true;
|
||||||
|
|
||||||
|
services.udev.packages = [
|
||||||
|
(pkgs.writeTextDir "/etc/udev/rules.d/98-user-power-supply.rules" ''
|
||||||
|
SUBSYSTEM=="power_supply", KERNEL=="AC", TAG+="systemd", ENV{SYSTEMD_USER_WANTS}+="power-internal.target power-external.target"
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
|
||||||
|
systemd.user = {
|
||||||
|
targets = {
|
||||||
|
power-internal = {
|
||||||
|
description = "On internal power supply";
|
||||||
|
conflicts = [ "power-external.target" ];
|
||||||
|
wantedBy = [ "default.target" ];
|
||||||
|
unitConfig = {
|
||||||
|
ConditionACPower = false;
|
||||||
|
DefaultDependencies = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
power-external = {
|
||||||
|
description = "On external power supply";
|
||||||
|
conflicts = [ "power-internal.target" ];
|
||||||
|
wantedBy = [ "default.target" ];
|
||||||
|
unitConfig = {
|
||||||
|
ConditionACPower = true;
|
||||||
|
DefaultDependencies = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.nil = {
|
||||||
|
isNormalUser = true;
|
||||||
|
shell = config.programs.fish.package;
|
||||||
|
extraGroups = [ "wheel" ];
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAICczPHRwY9MAwDGlcB0QgMOJjcpLJhVU3covrW9RBS62AAAABHNzaDo= primary"
|
||||||
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIAgnEAwe59/yY/U55y7WxGa/QI20/XMQEsQvs1/6LitRAAAABHNzaDo= backup"
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGOTvXiNHTXq9wkcxdVOblHVyvcAaCfxmJp/CXI4rzMj legacy"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
16
nixos/module/wireless.nix
Normal file
16
nixos/module/wireless.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{ ... }: { config, ...}: {
|
||||||
|
hardware.bluetooth.enable = true;
|
||||||
|
hardware.wirelessRegulatoryDatabase = true;
|
||||||
|
networking.wireless.iwd = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
General = {
|
||||||
|
AddressRandomization = "network";
|
||||||
|
};
|
||||||
|
|
||||||
|
Rank = {
|
||||||
|
BandModifier2_4GHz = 0.8;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
82
nixos/module/zram.nix
Normal file
82
nixos/module/zram.nix
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
{ ... }: { lib, pkgs, ... }: {
|
||||||
|
boot.kernelParams = [
|
||||||
|
"zswap.zpool=zsmalloc"
|
||||||
|
"zram.num_devices=0"
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
"vm.page-cluster" = lib.mkDefault 0;
|
||||||
|
"vm.swappiness" = lib.mkDefault 180;
|
||||||
|
"vm.watermark_boost_factor" = lib.mkDefault 0;
|
||||||
|
"vm.watermark_scale_factor" = lib.mkDefault 125;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.zram-swap =
|
||||||
|
let
|
||||||
|
writeShell = { name, text, runtimeInputs ? [ ] }:
|
||||||
|
pkgs.writeShellApplication { inherit name text runtimeInputs; } + "/bin/${name}";
|
||||||
|
in {
|
||||||
|
description = "Compressed in-memory swap space";
|
||||||
|
|
||||||
|
wantedBy = [ "swap.target" ];
|
||||||
|
unitConfig.DefaultDependencies = false;
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
RuntimeDirectory = "zram-swap";
|
||||||
|
|
||||||
|
CapabilityBoundingSet = [ "CAP_DAC_OVERRIDE" "CAP_SYS_ADMIN" ];
|
||||||
|
SystemCallFilter = [ "@system-service" "@swap" ];
|
||||||
|
|
||||||
|
ExecStartPre = writeShell {
|
||||||
|
name = "zram-swap-start-pre";
|
||||||
|
runtimeInputs = with pkgs; [ coreutils getconf util-linux ];
|
||||||
|
text = ''
|
||||||
|
pages="$(getconf _PHYS_PAGES)"
|
||||||
|
pagesize="$(getconf PAGESIZE)"
|
||||||
|
|
||||||
|
dev="$(cat /sys/class/zram-control/hot_add)"
|
||||||
|
echo "$dev" >"$RUNTIME_DIRECTORY/device"
|
||||||
|
|
||||||
|
echo zstd >"/sys/block/zram$dev/comp_algorithm"
|
||||||
|
echo "$((pages * pagesize * 3 / 2))" >"/sys/block/zram$dev/disksize"
|
||||||
|
echo "$((pages * pagesize * 3 / 4))" >"/sys/block/zram$dev/mem_limit"
|
||||||
|
|
||||||
|
mkswap "/dev/zram$dev"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ExecStart = writeShell {
|
||||||
|
name = "zram-swap-start";
|
||||||
|
runtimeInputs = with pkgs; [ util-linux ];
|
||||||
|
text = ''
|
||||||
|
swapon --discard --priority 32767 "/dev/zram$(<"$RUNTIME_DIRECTORY/device")"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ExecStop = writeShell {
|
||||||
|
name = "zram-swap-stop";
|
||||||
|
runtimeInputs = with pkgs; [ util-linux ];
|
||||||
|
text = ''
|
||||||
|
swapoff "/dev/zram$(<"$RUNTIME_DIRECTORY/device")"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ExecStopPost = writeShell {
|
||||||
|
name = "zram-swap-stop-post";
|
||||||
|
runtimeInputs = with pkgs; [ coreutils ];
|
||||||
|
text = ''
|
||||||
|
test -s "$RUNTIME_DIRECTORY/device" || exit 0
|
||||||
|
|
||||||
|
dev="$(<"$RUNTIME_DIRECTORY/device")"
|
||||||
|
|
||||||
|
echo 1 >"/sys/block/zram$dev/reset"
|
||||||
|
echo "$dev" >/sys/class/zram-control/hot_remove
|
||||||
|
|
||||||
|
rm -f -- "$RUNTIME_DIRECTORY/device"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
overlay/default.nix
Normal file
13
overlay/default.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ self, nixpkgs, lix-module, colmena, rust-overlay, ... }:
|
||||||
|
|
||||||
|
final: prev:
|
||||||
|
|
||||||
|
nixpkgs.lib.composeManyExtensions [
|
||||||
|
lix-module.overlays.default
|
||||||
|
colmena.overlays.default
|
||||||
|
rust-overlay.overlays.default
|
||||||
|
# self.overlays.no-x
|
||||||
|
# self.overlays.no-alsa
|
||||||
|
# self.overlays.no-jemalloc
|
||||||
|
# self.overlays.modern-minimal
|
||||||
|
] final prev
|
69
overlay/modern-minimal.nix
Normal file
69
overlay/modern-minimal.nix
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
{ nixpkgs, ... }: final: prev: {
|
||||||
|
curl = prev.curl.override {
|
||||||
|
gssSupport = false;
|
||||||
|
scpSupport = false;
|
||||||
|
zstdSupport = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
ffmpeg = prev.ffmpeg.override {
|
||||||
|
ffmpegVariant = "headless";
|
||||||
|
withAlsa = false;
|
||||||
|
withSsh = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
firefox-unwrapped = prev.firefox-unwrapped.override {
|
||||||
|
alsaSupport = false;
|
||||||
|
gssSupport = false;
|
||||||
|
jemallocSupport = false;
|
||||||
|
sndioSupport = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
firefox = final.wrapFirefox final.firefox-unwrapped { };
|
||||||
|
|
||||||
|
imv = prev.imv.override {
|
||||||
|
withWindowSystem = "wayland";
|
||||||
|
};
|
||||||
|
|
||||||
|
mesa = prev.mesa.override {
|
||||||
|
galliumDrivers = [
|
||||||
|
"iris"
|
||||||
|
"kmsro"
|
||||||
|
"nouveau"
|
||||||
|
"radeonsi"
|
||||||
|
"swrast"
|
||||||
|
"zink"
|
||||||
|
];
|
||||||
|
|
||||||
|
vulkanDrivers = [
|
||||||
|
"amd"
|
||||||
|
"intel"
|
||||||
|
"nouveau"
|
||||||
|
"swrast"
|
||||||
|
];
|
||||||
|
|
||||||
|
eglPlatforms = [ "wayland" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
mpv-unwrapped = prev.mpv-unwrapped.override {
|
||||||
|
alsaSupport = false;
|
||||||
|
cacaSupport = false;
|
||||||
|
openalSupport = false;
|
||||||
|
sdl2Support = false;
|
||||||
|
vdpauSupport = false;
|
||||||
|
x11Support = false;
|
||||||
|
xineramaSupport = false;
|
||||||
|
xvSupport = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
mpv = final.mpv-unwrapped.wrapper {
|
||||||
|
mpv = final.mpv-unwrapped;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = prev.systemd.override {
|
||||||
|
withApparmor = false;
|
||||||
|
withHomed = false;
|
||||||
|
withIptables = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
foo = null;
|
||||||
|
}
|
20
overlay/no-alsa.nix
Normal file
20
overlay/no-alsa.nix
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{ nixpkgs, ... }: final: prev:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (nixpkgs.lib.attrsets) genAttrs;
|
||||||
|
in genAttrs [
|
||||||
|
"SDL2"
|
||||||
|
"firefox-unwrapped"
|
||||||
|
"mpv-unwrapped"
|
||||||
|
] (pkg: prev.${pkg}.override { alsaSupport = false; })
|
||||||
|
// genAttrs [
|
||||||
|
"ffmpeg"
|
||||||
|
"libcanberra"
|
||||||
|
] (pkg: prev.${pkg}.override { withAlsa = false; })
|
||||||
|
// {
|
||||||
|
firefox = final.wrapFirefox final.firefox-unwrapped { };
|
||||||
|
|
||||||
|
mpv = final.mpv-unwrapped.wrapper {
|
||||||
|
mpv = final.mpv-unwrapped;
|
||||||
|
};
|
||||||
|
}
|
10
overlay/no-jemalloc.nix
Normal file
10
overlay/no-jemalloc.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{ nixpkgs, ... }: final: prev:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (nixpkgs.lib.attrsets) genAttrs;
|
||||||
|
in genAttrs [
|
||||||
|
"firefox-unwrapped"
|
||||||
|
] (pkg: prev.${pkg}.override { jemallocSupport = false; })
|
||||||
|
// {
|
||||||
|
firefox = final.wrapFirefox final.firefox-unwrapped { };
|
||||||
|
}
|
102
overlay/no-x.nix
Normal file
102
overlay/no-x.nix
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
{ nixpkgs, ... }: final: prev:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (nixpkgs.lib.attrsets) genAttrs;
|
||||||
|
inherit (nixpkgs.lib.lists) remove toList;
|
||||||
|
inherit (nixpkgs.lib.strings) mesonBool mesonEnable;
|
||||||
|
in genAttrs [
|
||||||
|
"SDL2"
|
||||||
|
"cairo"
|
||||||
|
"dbus"
|
||||||
|
"ghostscript"
|
||||||
|
"gobject-introspection"
|
||||||
|
"gtk3"
|
||||||
|
"gtk4"
|
||||||
|
"imlib2"
|
||||||
|
"libcaca"
|
||||||
|
"pango"
|
||||||
|
"pipewire"
|
||||||
|
] (pkg: prev.${pkg}.override { x11Support = false; })
|
||||||
|
|
||||||
|
// genAttrs [
|
||||||
|
"intel-media-driver"
|
||||||
|
"mupdf"
|
||||||
|
] (pkg: prev.${pkg}.override { enableX11 = false; })
|
||||||
|
|
||||||
|
// genAttrs [
|
||||||
|
"hyprland"
|
||||||
|
"sway"
|
||||||
|
"sway-unwrapped"
|
||||||
|
"swayfx"
|
||||||
|
"swayfx-unwrapped"
|
||||||
|
"wlroots"
|
||||||
|
] (pkg: prev.${pkg}.override { enableXWayland = false; })
|
||||||
|
|
||||||
|
// {
|
||||||
|
beam = prev.beam_nox;
|
||||||
|
graphviz = prev.graphviz-nox;
|
||||||
|
|
||||||
|
gammastep = prev.gammastep.override {
|
||||||
|
withRandr = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
gd = prev.gd.override { withXorg = false; };
|
||||||
|
|
||||||
|
gst_all_1 = prev.gst_all_1 // genAttrs [
|
||||||
|
"gst-plugins-base"
|
||||||
|
"gst-plugins-good"
|
||||||
|
] (pkg: prev.gst_all_1.${pkg}.override { enableX11 = false; });
|
||||||
|
|
||||||
|
imagemagick = prev.imagemagick.override {
|
||||||
|
libX11Support = false;
|
||||||
|
libXtSupport = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
libepoxy = (prev.libepoxy.overrideAttrs (prevAttrs: {
|
||||||
|
buildInputs = prevAttrs.buildInputs or [ ]
|
||||||
|
++ [ final.libGL ];
|
||||||
|
mesonFlags = prevAttrs.mesonFlags or [ ]
|
||||||
|
|> map (flag: if flag == "-Degl=no" then "-Degl=yes" else flag);
|
||||||
|
})).override {
|
||||||
|
x11Support = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
libgnomekbd = prev.libgnomekbd.overrideAttrs (prevAttrs: {
|
||||||
|
mesonFlags = prevAttrs.mesonFlags or [ ]
|
||||||
|
++ [ (mesonBool "tests" false) ];
|
||||||
|
});
|
||||||
|
|
||||||
|
mesa = (prev.mesa.overrideAttrs (prevAttrs: {
|
||||||
|
mesonFlags = prevAttrs.mesonFlags or [ ] ++ [
|
||||||
|
(mesonEnable "xlib-lease" false)
|
||||||
|
(mesonEnable "glx" false)
|
||||||
|
(mesonEnable "gallium-vdpau" false)
|
||||||
|
];
|
||||||
|
})).override {
|
||||||
|
eglPlatforms = [ "wayland" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
mpv-unwrapped = prev.mpv-unwrapped.override {
|
||||||
|
x11Support = false;
|
||||||
|
xineramaSupport = false;
|
||||||
|
xvSupport = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
mpv = final.mpv-unwrapped.wrapper {
|
||||||
|
mpv = final.mpv-unwrapped;
|
||||||
|
};
|
||||||
|
|
||||||
|
w3m = prev.w3m.override {
|
||||||
|
x11Support = false;
|
||||||
|
imlib2 = final.imlib2;
|
||||||
|
};
|
||||||
|
|
||||||
|
utsushi = prev.utsushi.overrideAttrs (prevAttrs: {
|
||||||
|
buildInputs = remove prev.gtkmm2.dev prevAttrs.buildInputs;
|
||||||
|
});
|
||||||
|
|
||||||
|
wayland = prev.wayland.override {
|
||||||
|
# broken
|
||||||
|
withDocumentation = false;
|
||||||
|
};
|
||||||
|
}
|
14
overlay/pkgconf.nix
Normal file
14
overlay/pkgconf.nix
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{ ... }:
|
||||||
|
|
||||||
|
final: prev: {
|
||||||
|
pkg-config = prev.pkg-config.override {
|
||||||
|
pkg-config = final.libpkgconf.overrideAttrs (prevAttrs: {
|
||||||
|
postInstall = let
|
||||||
|
ext = final.hostPlatform.extensions.executable;
|
||||||
|
in prevAttrs.postInstall or "" + ''
|
||||||
|
ln -s pkgconf${ext} "$out/bin/pkg-config${ext}"
|
||||||
|
ln -s pkgconf.1 "$man/share/man/man1/pkg-config.1"
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
29
package/libslz.nix
Normal file
29
package/libslz.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ ... }: { lib, stdenv, fetchFromGitHub }:
|
||||||
|
|
||||||
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "libslz";
|
||||||
|
version = "1.2.1";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "wtarreau";
|
||||||
|
repo = finalAttrs.pname;
|
||||||
|
rev = "v${finalAttrs.version}";
|
||||||
|
hash = "sha256-+3e0yTk6l8miQs/zBYSiPuj/gRWICR3QYTkV3OAHAtI=";
|
||||||
|
};
|
||||||
|
|
||||||
|
makeFlags = [
|
||||||
|
"TOPDIR=$(src)"
|
||||||
|
"PREFIX=$(out)"
|
||||||
|
];
|
||||||
|
|
||||||
|
buildFlags = [
|
||||||
|
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
|
||||||
|
"CC=cc"
|
||||||
|
];
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "http://www.libslz.org/";
|
||||||
|
license = lib.licenses.mit;
|
||||||
|
maintainers = with lib.maintainers; [ mvs ];
|
||||||
|
};
|
||||||
|
})
|
633
package/linux-hardened/config.nix
Normal file
633
package/linux-hardened/config.nix
Normal file
|
@ -0,0 +1,633 @@
|
||||||
|
{ kernel, lib, hostPlatform, systemd }: with kernel; {
|
||||||
|
meta = {
|
||||||
|
EXPERT = true;
|
||||||
|
STAGING = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
PROCESSOR_SELECT = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
build = {
|
||||||
|
COMPILE_TEST = false;
|
||||||
|
WERROR = true;
|
||||||
|
|
||||||
|
STANDALONE = true;
|
||||||
|
PREVENT_FIRMWARE_BUILD = true;
|
||||||
|
|
||||||
|
JUMP_LABEL = true;
|
||||||
|
|
||||||
|
LTO_CLANG_FULL = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
KERNEL_ZSTD = true;
|
||||||
|
BLK_DEV_INITRD = true;
|
||||||
|
RD_GZIP = false;
|
||||||
|
RD_BZIP2 = false;
|
||||||
|
RD_LZMA = false;
|
||||||
|
RD_XZ = false;
|
||||||
|
RD_LZO = false;
|
||||||
|
RD_LZ4 = false;
|
||||||
|
RD_ZSTD = true;
|
||||||
|
|
||||||
|
BOOT_CONFIG = true;
|
||||||
|
|
||||||
|
EFI = true;
|
||||||
|
EFI_STUB = true;
|
||||||
|
|
||||||
|
DEVTMPFS = true;
|
||||||
|
DEVTMPFS_MOUNT = true;
|
||||||
|
DEVTMPFS_SAFE = true;
|
||||||
|
|
||||||
|
FW_LOADER = true;
|
||||||
|
FW_LOADER_COMPRESS = true;
|
||||||
|
FW_LOADER_COMPRESS_XZ = false;
|
||||||
|
FW_LOADER_COMPRESS_ZSTD = true;
|
||||||
|
FW_CACHE = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
EFI_HANDOVER_PROTOCOL = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
debug = {
|
||||||
|
KALLSYMS = true;
|
||||||
|
KALLSYMS_ALL = false;
|
||||||
|
|
||||||
|
SYMBOLIC_ERRNAME = true;
|
||||||
|
DEBUG_BUGVERBOSE = true;
|
||||||
|
DEBUG_INFO_DWARF5 = true;
|
||||||
|
DEBUG_INFO_SPLIT = true;
|
||||||
|
STRIP_ASM_SYMS = true;
|
||||||
|
|
||||||
|
MAGIC_SYSRQ = true;
|
||||||
|
MAGIC_SYSRQ_DEFAULT_ENABLE = "0x1f4";
|
||||||
|
|
||||||
|
SLUB_DEBUG = false;
|
||||||
|
|
||||||
|
DEBUG_WX = true;
|
||||||
|
WARN_ALL_UNSEEDED_RANDOM = true;
|
||||||
|
|
||||||
|
RCU_TRACE = false;
|
||||||
|
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_VERBOSE_BOOTUP = false;
|
||||||
|
EARLY_PRINTK = false;
|
||||||
|
X86_DEBUG_FPU = false;
|
||||||
|
|
||||||
|
UNWINDER_ORC = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
firmware = {
|
||||||
|
EFI_DXE_MEM_ATTRIBUTES = true;
|
||||||
|
EFI_BOOTLOADER_CONTROL = true;
|
||||||
|
RESET_ATTACK_MITIGATION = true;
|
||||||
|
EFI_DISABLE_PCI_DMA = true;
|
||||||
|
|
||||||
|
EFIVAR_FS = true;
|
||||||
|
|
||||||
|
# pstore
|
||||||
|
PSTORE = true;
|
||||||
|
PSTORE_COMPRESS = true;
|
||||||
|
EFI_VARS_PSTORE = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
platform = {
|
||||||
|
"64BIT" = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_MPPARSE = false;
|
||||||
|
X86_FRED = true;
|
||||||
|
X86_EXTENDED_PLATFORM = false;
|
||||||
|
|
||||||
|
CPU_SUP_HYGON = false;
|
||||||
|
CPU_SUP_CENTAUR = false;
|
||||||
|
CPU_SUP_ZHAOXIN = false;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isAarch64 {
|
||||||
|
ARM64_VA_BITS_48 = true;
|
||||||
|
ARM64_PAN = true;
|
||||||
|
ARM64_USE_LSE_ATOMICS = true;
|
||||||
|
ARM64_CNP = true;
|
||||||
|
ARM64_PTR_AUTH = true;
|
||||||
|
ARM64_EPAN = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isRiscV64 {
|
||||||
|
ARCH_RV64I = true;
|
||||||
|
COMPAT = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
security = {
|
||||||
|
SECCOMP = true;
|
||||||
|
|
||||||
|
# Kernel memory base
|
||||||
|
RELOCATABLE = true;
|
||||||
|
RANDOMIZE_BASE = true;
|
||||||
|
RANDOMIZE_MEMORY = true;
|
||||||
|
|
||||||
|
# Stack protection
|
||||||
|
STACKPROTECTOR = true;
|
||||||
|
STACKPROTECTOR_STRONG = true;
|
||||||
|
VMAP_STACK = true;
|
||||||
|
RANDOMIZE_KSTACK_OFFSET = true;
|
||||||
|
RANDOMIZE_KSTACK_OFFSET_DEFAULT = true;
|
||||||
|
INIT_STACK_ALL_ZERO = true;
|
||||||
|
|
||||||
|
STRICT_KERNEL_RWX = true;
|
||||||
|
CFI_CLANG = true;
|
||||||
|
|
||||||
|
# Slab allocator
|
||||||
|
SLAB_MERGE_DEFAULT = false;
|
||||||
|
SLAB_FREELIST_RANDOM = true;
|
||||||
|
SLAB_FREELIST_HARDENED = true;
|
||||||
|
SLAB_CANARY = true;
|
||||||
|
SLUB_CPU_PARTIAL = true;
|
||||||
|
RANDOM_KMALLOC_CACHES = true;
|
||||||
|
|
||||||
|
# Page allocator
|
||||||
|
SHUFFLE_PAGE_ALLOCATOR = true;
|
||||||
|
COMPAT_BRK = false;
|
||||||
|
INIT_ON_FREE_DEFAULT_ON = true;
|
||||||
|
|
||||||
|
# False positives in combination with panic on BUG()
|
||||||
|
PAGE_SANITIZE_VERIFY = false;
|
||||||
|
SLAB_SANITIZE_VERIFY = false;
|
||||||
|
|
||||||
|
MODULES = false;
|
||||||
|
|
||||||
|
LDISC_AUTOLOAD = false;
|
||||||
|
|
||||||
|
DEVMEM = false;
|
||||||
|
DEVPORT = false;
|
||||||
|
|
||||||
|
DEBUG_FS = false;
|
||||||
|
|
||||||
|
# Bounds checking
|
||||||
|
# False positives in iwlwifi
|
||||||
|
#UBSAN = true;
|
||||||
|
#UBSAN_BOUNDS = true;
|
||||||
|
#UBSAN_SIGNED_WRAP = false;
|
||||||
|
#UBSAN_BOOL = false;
|
||||||
|
#UBSAN_ENUM = false;
|
||||||
|
|
||||||
|
# Memory safety error detection
|
||||||
|
KFENCE = true;
|
||||||
|
KFENCE_DEFERRABLE = true;
|
||||||
|
KFENCE_BUG_ON_DATA_CORRUPTION = true;
|
||||||
|
|
||||||
|
PANIC_ON_OOPS = true;
|
||||||
|
PANIC_TIMEOUT = (-1);
|
||||||
|
|
||||||
|
HARDENED_USERCOPY = true;
|
||||||
|
FORTIFY_SOURCE = true;
|
||||||
|
|
||||||
|
SECURITY_DMESG_RESTRICT = true;
|
||||||
|
SECURITY_PERF_EVENTS_RESTRICT = true;
|
||||||
|
SECURITY_TIOCSTI_RESTRICT = true;
|
||||||
|
SECURITY = true;
|
||||||
|
SECURITY_NETWORK = true;
|
||||||
|
SECURITY_SELINUX = false;
|
||||||
|
SECURITY_YAMA = true;
|
||||||
|
SECURITY_LOCKDOWN_LSM = true;
|
||||||
|
SECURITY_LOCKDOWN_LSM_EARLY = true;
|
||||||
|
LOCK_DOWN_KERNEL_FORCE_CONFIDENTIALITY = true;
|
||||||
|
SECURITY_LANDLOCK = true;
|
||||||
|
|
||||||
|
LIST_HARDENED = true;
|
||||||
|
BUG_ON_DATA_CORRUPTION = true;
|
||||||
|
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_UMIP = true;
|
||||||
|
X86_USER_SHADOW_STACK = true;
|
||||||
|
|
||||||
|
STRICT_SIGALTSTACK_SIZE = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer = {
|
||||||
|
NO_HZ_FULL = true;
|
||||||
|
HIGH_RES_TIMERS = true;
|
||||||
|
HZ_1000 = true;
|
||||||
|
|
||||||
|
RTC_CLASS = true;
|
||||||
|
RTC_HCTOSYS = true;
|
||||||
|
RTC_SYSTOHC = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_PM_TIMER = true;
|
||||||
|
RTC_DRV_CMOS = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
interfaces = {
|
||||||
|
SYSVIPC = true;
|
||||||
|
USELIB = false;
|
||||||
|
|
||||||
|
UID16 = false;
|
||||||
|
SGETMASK_SYSCALL = false;
|
||||||
|
SYSFS_SYSCALL = false;
|
||||||
|
POSIX_TIMERS = true;
|
||||||
|
PCSPKR_PLATFORM = false;
|
||||||
|
FUTEX = true;
|
||||||
|
EPOLL = true;
|
||||||
|
AIO = false;
|
||||||
|
IO_URING = true;
|
||||||
|
ADVISE_SYSCALLS = true;
|
||||||
|
|
||||||
|
COMPAT_VDSO = false;
|
||||||
|
COMPAT_32BIT_TIME = false;
|
||||||
|
|
||||||
|
DNOTIFY = false;
|
||||||
|
|
||||||
|
bpf = {
|
||||||
|
BPF_SYSCALL = true;
|
||||||
|
BPF_JIT = true;
|
||||||
|
BPF_JIT_ALWAYS_ON = true;
|
||||||
|
BPF_UNPRIV_DEFAULT_OFF = true;
|
||||||
|
BPF_LSM = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
namespaces = {
|
||||||
|
NAMESPACES = true;
|
||||||
|
UTS_NS = true;
|
||||||
|
TIME_NS = true;
|
||||||
|
USER_NS = true;
|
||||||
|
USER_NS_UNPRIVILEGED = false;
|
||||||
|
PID_NS = true;
|
||||||
|
NET_NS = true;
|
||||||
|
};
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_VSYSCALL_EMULATION = false;
|
||||||
|
X86_IOPL_IOPERM = false;
|
||||||
|
LEGACY_VSYSCALL_NONE = true;
|
||||||
|
MODIFY_LDT_SYSCALL = false;
|
||||||
|
IA32_EMULATION = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
scheduler = {
|
||||||
|
SMP = true;
|
||||||
|
PREEMPT_DYNAMIC = false;
|
||||||
|
|
||||||
|
SCHED_CORE = true;
|
||||||
|
SCHED_CLUSTER = true;
|
||||||
|
SCHED_MC = true;
|
||||||
|
SCHED_AUTOGROUP = true;
|
||||||
|
|
||||||
|
RCU_NOCB_CPU_DEFAULT_ALL = true;
|
||||||
|
RCU_LAZY = true;
|
||||||
|
|
||||||
|
CGROUPS = true;
|
||||||
|
BLK_CGROUP = true;
|
||||||
|
CGROUP_SCHED = true;
|
||||||
|
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
SCHED_OMIT_FRAME_POINTER = true;
|
||||||
|
|
||||||
|
SCHED_MC_PRIO = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
memory = {
|
||||||
|
NUMA = true;
|
||||||
|
NUMA_BALANCING = true;
|
||||||
|
NUMA_BALANCING_DEFAULT_ENABLED = true;
|
||||||
|
|
||||||
|
SPARSEMEM_VMEMMAP = true;
|
||||||
|
MEMORY_HOTPLUG = true;
|
||||||
|
MEMORY_HOTREMOVE = true;
|
||||||
|
|
||||||
|
COMPACTION = true;
|
||||||
|
MIGRATION = true;
|
||||||
|
|
||||||
|
KSM = true;
|
||||||
|
|
||||||
|
TRANSPARENT_HUGEPAGE = true;
|
||||||
|
TRANSPARENT_HUGEPAGE_ALWAYS = true;
|
||||||
|
READ_ONLY_THP_FOR_FS = true;
|
||||||
|
HUGETLBFS = true;
|
||||||
|
HUGETLB_PAGE_OPTIMIZE_VMEMMAP = true;
|
||||||
|
HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON = true;
|
||||||
|
|
||||||
|
DEFERRED_STRUCT_PAGE_INIT = true;
|
||||||
|
|
||||||
|
ZONE_DEVICE = true;
|
||||||
|
DEVICE_PRIVATE = true;
|
||||||
|
|
||||||
|
LRU_GEN = true;
|
||||||
|
LRU_GEN_ENABLED = true;
|
||||||
|
|
||||||
|
DMADEVICES = true;
|
||||||
|
ASYNC_TX_DMA = option true;
|
||||||
|
|
||||||
|
zram = {
|
||||||
|
SWAP = true;
|
||||||
|
ZSMALLOC = true;
|
||||||
|
ZRAM = true;
|
||||||
|
ZRAM_DEF_COMP_ZSTD = true;
|
||||||
|
ZRAM_WRITEBACK = true;
|
||||||
|
CRYPTO_ZSTD = true;
|
||||||
|
};
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
AMD_NUMA = option false;
|
||||||
|
X86_64_ACPI_NUMA = true;
|
||||||
|
|
||||||
|
X86_INTEL_TSX_MODE_AUTO = true;
|
||||||
|
|
||||||
|
ADDRESS_MASKING = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
block = {
|
||||||
|
BLOCK = true;
|
||||||
|
BLOCK_LEGACY_AUTOLOAD = false;
|
||||||
|
BLK_DEV = true;
|
||||||
|
BLK_DEV_WRITE_MOUNTED = true;
|
||||||
|
BLK_WBT = true;
|
||||||
|
BLK_WBT_MQ = true;
|
||||||
|
|
||||||
|
PARTITION_ADVANCED = true;
|
||||||
|
MSDOS_PARTITION = false;
|
||||||
|
EFI_PARTITION = true;
|
||||||
|
|
||||||
|
MQ_IOSCHED_DEADLINE = true;
|
||||||
|
MQ_IOSCHED_KYBER = true;
|
||||||
|
IOSCHED_BFQ = true;
|
||||||
|
BFQ_GROUP_IOSCHED = true;
|
||||||
|
|
||||||
|
BLK_DEV_LOOP = true;
|
||||||
|
BLK_DEV_LOOP_MIN_COUNT = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
binfmt = {
|
||||||
|
BINFMT_ELF = true;
|
||||||
|
CORE_DUMP_DEFAULT_ELF_HEADERS = true;
|
||||||
|
BINFMT_SCRIPT = true;
|
||||||
|
BINFMT_MISC = true;
|
||||||
|
COREDUMP = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
io = {
|
||||||
|
IOMMU_SUPPORT = true;
|
||||||
|
IOMMU_DEFAULT_DMA_STRICT = true;
|
||||||
|
IRQ_REMAP = true;
|
||||||
|
SWIOTLB_DYNAMIC = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_X2APIC = true;
|
||||||
|
|
||||||
|
AMD_IOMMU = option true;
|
||||||
|
INTEL_IOMMU = option true;
|
||||||
|
INTEL_IOMMU_SVM = option true;
|
||||||
|
INTEL_IOMMU_DEFAULT_ON = option true;
|
||||||
|
INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON = option true;
|
||||||
|
|
||||||
|
IO_DELAY_NONE = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isAarch64 {
|
||||||
|
ARM_SMMU_V3 = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
bus = {
|
||||||
|
PCI = true;
|
||||||
|
PCIEPORTBUS = true;
|
||||||
|
PCI_MSI = true;
|
||||||
|
PCIE_BUS_PERFORMANCE = true;
|
||||||
|
|
||||||
|
HID_SUPPORT = true;
|
||||||
|
HID = true;
|
||||||
|
HIDRAW = true;
|
||||||
|
UHID = true;
|
||||||
|
HID_GENERIC = true;
|
||||||
|
USB_HID = true;
|
||||||
|
USB_HIDDEV = true;
|
||||||
|
|
||||||
|
USB_SUPPORT = true;
|
||||||
|
USB = true;
|
||||||
|
USB_PCI = true;
|
||||||
|
USB_ANNOUNCE_NEW_DEVICES = true;
|
||||||
|
USB_DEFAULT_PERSIST = true;
|
||||||
|
USB_DYNAMIC_MINORS = true;
|
||||||
|
USB_XHCI_HCD = true;
|
||||||
|
USB_XHCI_PCI = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
power = {
|
||||||
|
PM = true;
|
||||||
|
ENERGY_MODEL = true;
|
||||||
|
ACPI = true;
|
||||||
|
ACPI_APEI = true;
|
||||||
|
ACPI_NUMA = true;
|
||||||
|
|
||||||
|
CPU_FREQ = true;
|
||||||
|
CPU_FREQ_STAT = true;
|
||||||
|
CPU_FREQ_DEFAULT_GOV_SCHEDUTIL = true;
|
||||||
|
CPU_FREQ_GOV_SCHEDUTIL = true;
|
||||||
|
|
||||||
|
CPU_IDLE = true;
|
||||||
|
CPU_IDLE_GOV_MENU = false;
|
||||||
|
CPU_IDLE_GOV_TEO = true;
|
||||||
|
|
||||||
|
PCIEASPM = true;
|
||||||
|
PCIEASPM_POWER_SUPERSAVE = true;
|
||||||
|
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
X86_ACPI_CPUFREQ = true;
|
||||||
|
X86_ACPI_CPUFREQ_CPB = false;
|
||||||
|
} // lib.optionalAttrs (hostPlatform.isAarch64 || hostPlatform.isRiscV64) {
|
||||||
|
ACPI_CPPC_CPUFREQ = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
framebuffer = {
|
||||||
|
DRM_SIMPLE_DRM = option true;
|
||||||
|
FB = true;
|
||||||
|
FB_EFI = true;
|
||||||
|
FB_SIMPLE = option true;
|
||||||
|
FB_DEVICE = false;
|
||||||
|
VGA_CONSOLE = false;
|
||||||
|
FRAMEBUFFER_CONSOLE = true;
|
||||||
|
FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER = true;
|
||||||
|
SYSFB_SIMPLEFB = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
network = {
|
||||||
|
NET = true;
|
||||||
|
PACKET = true;
|
||||||
|
PACKET_DIAG = true;
|
||||||
|
UNIX = true;
|
||||||
|
UNIX_DIAG = true;
|
||||||
|
XDP_SOCKETS = true;
|
||||||
|
XDP_SOCKETS_DIAG = true;
|
||||||
|
INET = true;
|
||||||
|
SYN_COOKIES = true;
|
||||||
|
INET_DIAG = true;
|
||||||
|
INET_UDP_DIAG = true;
|
||||||
|
INET_RAW_DIAG = true;
|
||||||
|
|
||||||
|
TCP_CONG_ADVANCED = true;
|
||||||
|
TCP_CONG_BIC = false;
|
||||||
|
TCP_CONG_CUBIC = false;
|
||||||
|
TCP_CONG_WESTWOOD = false;
|
||||||
|
TCP_CONG_HTCP = false;
|
||||||
|
TCP_CONG_BBR = true;
|
||||||
|
DEFAULT_BBR = true;
|
||||||
|
|
||||||
|
IPV6 = true;
|
||||||
|
|
||||||
|
NETFILTER = true;
|
||||||
|
NETFILTER_ADVANCED = true;
|
||||||
|
NETFILTER_INGRESS = true;
|
||||||
|
NETFILTER_EGRESS = true;
|
||||||
|
|
||||||
|
NETFILTER_NETLINK_LOG = true;
|
||||||
|
NF_LOG_SYSLOG = true;
|
||||||
|
|
||||||
|
NF_CONNTRACK = true;
|
||||||
|
NF_TABLES = true;
|
||||||
|
NF_TABLES_INET = true;
|
||||||
|
NFT_CT = true;
|
||||||
|
NFT_CONNLIMIT = true;
|
||||||
|
NFT_LIMIT = true;
|
||||||
|
NFT_LOG = true;
|
||||||
|
NFT_REJECT = true;
|
||||||
|
NFT_FIB_INET = true;
|
||||||
|
NF_TABLES_IPV4 = true;
|
||||||
|
NFT_FIB_IPV4 = true;
|
||||||
|
NF_TABLES_IPV6 = true;
|
||||||
|
NFT_FIB_IPV6 = true;
|
||||||
|
|
||||||
|
NET_SCH_CAKE = true;
|
||||||
|
NET_SCH_FQ = true;
|
||||||
|
NET_SCH_DEFAULT = true;
|
||||||
|
DEFAULT_FQ = true;
|
||||||
|
DEFAULT_NET_SCH = "fq";
|
||||||
|
|
||||||
|
NETLINK_DIAG = true;
|
||||||
|
ETHTOOL_NETLINK = true;
|
||||||
|
|
||||||
|
NETDEVICES = true;
|
||||||
|
ETHERNET = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
chardev = {
|
||||||
|
TTY = true;
|
||||||
|
VT = true;
|
||||||
|
CONSOLE_TRANSLATIONS = true;
|
||||||
|
VT_CONSOLE = true;
|
||||||
|
UNIX98_PTYS = true;
|
||||||
|
|
||||||
|
SERIAL_DEV_BUS = true;
|
||||||
|
SERIAL_DEV_CTRL_TTYPORT = true;
|
||||||
|
|
||||||
|
HW_RANDOM = true;
|
||||||
|
HW_RANDOM_INTEL = false;
|
||||||
|
HW_RANDOM_AMD = false;
|
||||||
|
HW_RANDOM_VIA = false;
|
||||||
|
|
||||||
|
TCG_TPM = true;
|
||||||
|
TCG_TPM2_HMAC = true;
|
||||||
|
HW_RANDOM_TPM = true;
|
||||||
|
TCG_TIS = true;
|
||||||
|
TCG_CRB = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
input = {
|
||||||
|
INPUT = true;
|
||||||
|
INPUT_SPARSEKMAP = true;
|
||||||
|
INPUT_EVDEV = true;
|
||||||
|
INPUT_KEYBOARD = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
filesystem = {
|
||||||
|
OVERLAY_FS = true;
|
||||||
|
OVERLAY_FS_REDIRECT_DIR = true;
|
||||||
|
OVERLAY_FS_REDIRECT_ALWAYS_FOLLOW = false;
|
||||||
|
OVERLAY_FS_XINO_AUTO = true;
|
||||||
|
OVERLAY_FS_METACOPY = true;
|
||||||
|
|
||||||
|
MSDOS_FS = true;
|
||||||
|
VFAT_FS = true;
|
||||||
|
FAT_DEFAULT_UTF8 = true;
|
||||||
|
|
||||||
|
PROC_FS = true;
|
||||||
|
PROC_KCORE = false;
|
||||||
|
PROC_SYSCTL = true;
|
||||||
|
PROC_PAGE_MONITOR = true;
|
||||||
|
SYSFS = true;
|
||||||
|
TMPFS = true;
|
||||||
|
TMPFS_POSIX_ACL = true;
|
||||||
|
EFIVAR_FS = true;
|
||||||
|
|
||||||
|
EROFS_FS = true;
|
||||||
|
EROFS_FS_XATTR = true;
|
||||||
|
EROFS_FS_POSIX_ACL = true;
|
||||||
|
EROFS_FS_SECURITY = false;
|
||||||
|
EROFS_FS_ZIP = true;
|
||||||
|
EROFS_FS_ZIP_ZSTD = true;
|
||||||
|
|
||||||
|
NLS = true;
|
||||||
|
NLS_CODEPAGE_437 = true;
|
||||||
|
NLS_ISO8859_1 = true;
|
||||||
|
UNICODE = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
fonts = {
|
||||||
|
FONTS = true;
|
||||||
|
FONT_TER16x32 = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = lib.optionalAttrs (lib.meta.availableOn hostPlatform systemd) {
|
||||||
|
# Base requirements
|
||||||
|
DEVTMPFS = true;
|
||||||
|
CGROUPS = true;
|
||||||
|
INOTIFY_USER = true;
|
||||||
|
SIGNALFD = true;
|
||||||
|
TIMERFD = true;
|
||||||
|
EPOLL = true;
|
||||||
|
UNIX = true;
|
||||||
|
PROC_FS = true;
|
||||||
|
FHANDLE = true;
|
||||||
|
|
||||||
|
# Legacy interfaces
|
||||||
|
UEVENT_HELPER = false;
|
||||||
|
FW_LOADER_USER_HELPER = false;
|
||||||
|
|
||||||
|
# udev & virtualisation
|
||||||
|
DMIID = true;
|
||||||
|
|
||||||
|
# SCSI device serial number retrieval
|
||||||
|
BLK_DEV_BSG = option true;
|
||||||
|
|
||||||
|
# PrivateNetwork
|
||||||
|
NET_NS = true;
|
||||||
|
|
||||||
|
# PrivateUser
|
||||||
|
USER_NS = true;
|
||||||
|
|
||||||
|
# Optional but recommended
|
||||||
|
IPV6 = true;
|
||||||
|
AUTOFS_FS = true;
|
||||||
|
TMPFS_XATTR = true;
|
||||||
|
TMPFS_POSIX_ACL = true;
|
||||||
|
SECCOMP = true;
|
||||||
|
SECCOMP_FILTER = true;
|
||||||
|
KCMP = true;
|
||||||
|
NET_SCHED = true;
|
||||||
|
|
||||||
|
# CPUShares
|
||||||
|
CGROUP_SCHED = true;
|
||||||
|
FAIR_GROUP_SCHED = true;
|
||||||
|
|
||||||
|
# CPUQuota
|
||||||
|
CFS_BANDWIDTH = true;
|
||||||
|
|
||||||
|
# IPaddress{Allow,Deny}, SocketBind{Allow,Deny}, RestrictNetworkInterfaces
|
||||||
|
BPF = true;
|
||||||
|
BPF_SYSCALL = true;
|
||||||
|
BPF_JIT = true;
|
||||||
|
CGROUP_BPF = true;
|
||||||
|
|
||||||
|
# EFI
|
||||||
|
EFIVAR_FS = true;
|
||||||
|
EFI_PARTITION = true;
|
||||||
|
|
||||||
|
# SMBIOS credentials
|
||||||
|
DMI = true;
|
||||||
|
DMI_SYSFS = true;
|
||||||
|
|
||||||
|
# Real‐time scheduling
|
||||||
|
RT_GROUP_SCHED = false;
|
||||||
|
|
||||||
|
# systemd-oomd
|
||||||
|
PSI = true;
|
||||||
|
MEMCG = true;
|
||||||
|
|
||||||
|
AUDIT = false;
|
||||||
|
};
|
||||||
|
}
|
251
package/linux-hardened/package.nix
Normal file
251
package/linux-hardened/package.nix
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
{ self, ... }: {
|
||||||
|
lib,
|
||||||
|
stdenv,
|
||||||
|
buildPackages,
|
||||||
|
llvmPackages_19,
|
||||||
|
hostPlatform,
|
||||||
|
fetchFromGitHub,
|
||||||
|
buildEnv,
|
||||||
|
callPackage,
|
||||||
|
|
||||||
|
linux-firmware,
|
||||||
|
sof-firmware,
|
||||||
|
wireless-regdb,
|
||||||
|
|
||||||
|
systemd,
|
||||||
|
|
||||||
|
jq,
|
||||||
|
python3,
|
||||||
|
perl,
|
||||||
|
flex,
|
||||||
|
bison,
|
||||||
|
bc,
|
||||||
|
openssl,
|
||||||
|
zstd,
|
||||||
|
|
||||||
|
elfutils,
|
||||||
|
kmod,
|
||||||
|
...
|
||||||
|
}@args:
|
||||||
|
|
||||||
|
lib.makeOverridable ({
|
||||||
|
llvmPackages ? llvmPackages_19,
|
||||||
|
instSetArch ? hostPlatform.gccarch or null,
|
||||||
|
extraConfig ? { },
|
||||||
|
firmwarePackages ? [
|
||||||
|
linux-firmware
|
||||||
|
sof-firmware
|
||||||
|
wireless-regdb
|
||||||
|
],
|
||||||
|
extraFirmware ? [ ],
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (self.lib) kernel;
|
||||||
|
|
||||||
|
inherit (lib.attrsets)
|
||||||
|
filterAttrs
|
||||||
|
mapAttrsToList
|
||||||
|
mergeAttrsList;
|
||||||
|
|
||||||
|
inherit (lib.strings)
|
||||||
|
concatStringsSep;
|
||||||
|
|
||||||
|
firmwareEnv = buildEnv {
|
||||||
|
name = "linux-firmware";
|
||||||
|
pathsToLink = [ "/lib/firmware" ];
|
||||||
|
paths = firmwarePackages;
|
||||||
|
} + "/lib/firmware";
|
||||||
|
|
||||||
|
config = lib.mergeAttrsList (map kernel.flattenAttrs [
|
||||||
|
(import ./config.nix { inherit kernel lib hostPlatform systemd; })
|
||||||
|
extraConfig
|
||||||
|
{
|
||||||
|
EXTRA_FIRMWARE = extraFirmware;
|
||||||
|
EXTRA_FIRMWARE_DIR = kernel.option firmwareEnv;
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
in stdenv.mkDerivation (finalAttrs: {
|
||||||
|
__structuredAttrs = true;
|
||||||
|
|
||||||
|
pname = "linux-hardened";
|
||||||
|
version = "6.10.4-hardened1";
|
||||||
|
|
||||||
|
modDirVersion = lib.versions.pad 3 finalAttrs.version;
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "anthraxx";
|
||||||
|
repo = finalAttrs.pname;
|
||||||
|
rev = "v${finalAttrs.version}";
|
||||||
|
hash = "sha256-qq2vmrUIYUuXEwuZoXrXbZY/li+ReFNuqhsy1R0yx0s=";
|
||||||
|
};
|
||||||
|
|
||||||
|
depsBuildBuild = [
|
||||||
|
jq
|
||||||
|
|
||||||
|
flex
|
||||||
|
bison
|
||||||
|
bc
|
||||||
|
python3
|
||||||
|
perl
|
||||||
|
openssl
|
||||||
|
|
||||||
|
zstd
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
elfutils
|
||||||
|
kmod
|
||||||
|
];
|
||||||
|
|
||||||
|
makeFlags = [
|
||||||
|
"ARCH:=${hostPlatform.linuxArch}"
|
||||||
|
|
||||||
|
"HOSTCC:=${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc"
|
||||||
|
"HOSTCXX:=${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}c++"
|
||||||
|
"HOSTLD:=${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}ld"
|
||||||
|
"HOSTAR:=${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}ar"
|
||||||
|
|
||||||
|
"CC:=${llvmPackages.clang-unwrapped}/bin/clang"
|
||||||
|
"LD:=${llvmPackages.lld}/bin/ld.lld"
|
||||||
|
"AR:=${llvmPackages.llvm}/bin/llvm-ar"
|
||||||
|
"NM:=${llvmPackages.llvm}/bin/llvm-nm"
|
||||||
|
"OBJCOPY:=${llvmPackages.llvm}/bin/llvm-objcopy"
|
||||||
|
"OBJDUMP:=${llvmPackages.llvm}/bin/llvm-objdump"
|
||||||
|
"READELF:=${llvmPackages.llvm}/bin/llvm-readelf"
|
||||||
|
"STRIP:=${llvmPackages.llvm}/bin/llvm-strip"
|
||||||
|
];
|
||||||
|
|
||||||
|
configfile = config |> kernel.mkConfig;
|
||||||
|
|
||||||
|
requiredPresent = config
|
||||||
|
|> filterAttrs (n: v: !kernel.isOptional v && kernel.getValue v != false)
|
||||||
|
|> mapAttrsToList kernel.mkKeyValue;
|
||||||
|
|
||||||
|
optionalPresent = config
|
||||||
|
|> filterAttrs (n: v: kernel.isOptional v && kernel.getValue v != false)
|
||||||
|
|> mapAttrsToList kernel.mkKeyValue;
|
||||||
|
|
||||||
|
requiredAbsent = config
|
||||||
|
|> filterAttrs (n: v: !kernel.isOptional v && kernel.getValue v == false)
|
||||||
|
|> mapAttrsToList (n: v: kernel.mkKey n);
|
||||||
|
|
||||||
|
optionalAbsent = config
|
||||||
|
|> filterAttrs (n: v: kernel.isOptional v && kernel.getValue v == false)
|
||||||
|
|> mapAttrsToList (n: v: kernel.mkKey n);
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
patchShebangs scripts/
|
||||||
|
'';
|
||||||
|
|
||||||
|
preConfigure = ''
|
||||||
|
mkdir build
|
||||||
|
|
||||||
|
export KBUILD_BUILD_TIMESTAMP="$(date -u -d @$SOURCE_DATE_EPOCH)"
|
||||||
|
export KBUILD_OUTPUT="$(pwd)/build"
|
||||||
|
|
||||||
|
makeFlags+=( "-j $NIX_BUILD_CORES" )
|
||||||
|
'' + lib.optionalString (hostPlatform ? linux-kernel.target) ''
|
||||||
|
export KBUILD_IMAGE=${lib.escapeShellArg hostPlatform.linux-kernel.target}
|
||||||
|
'' + lib.optionalString (instSetArch != null) ''
|
||||||
|
export KCFLAGS="-march=${lib.escapeShellArg instSetArch}"
|
||||||
|
'';
|
||||||
|
|
||||||
|
configurePhase = ''
|
||||||
|
runHook preConfigure
|
||||||
|
|
||||||
|
cat >build/.config <<<"$configfile"
|
||||||
|
make "''${makeFlags[@]}" olddefconfig
|
||||||
|
|
||||||
|
runHook postConfigure
|
||||||
|
'';
|
||||||
|
|
||||||
|
postConfigure = ''
|
||||||
|
# Verify configuration
|
||||||
|
for keyValue in "''${requiredPresent[@]}"; do
|
||||||
|
if ! grep -F -x -q "$keyValue" build/.config; then
|
||||||
|
printf 'Required: %s\nActual: %s\n\n' "$keyValue" \
|
||||||
|
"$(grep -E "''${keyValue%%=*}[ =]" build/.config || echo "(absent)")" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for key in "''${requiredAbsent[@]}"; do
|
||||||
|
if grep -E -q "^$key=" build/.config; then
|
||||||
|
printf 'Required: %s unset or absent.\n Actual: %s\n\n' "$key" \
|
||||||
|
"$(grep -E -q "^key=" build/.config)" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for keyValue in "''${optionalPresent[@]}"; do
|
||||||
|
if ! grep -F -x -q "$keyValue" build/.config; then
|
||||||
|
printf 'Suggested: %s\nActual: %s\n\n' "$keyValue" \
|
||||||
|
"$(grep -E "''${keyValue%%=*}[ =]" build/.config || echo "(absent)")" >&2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for key in "''${optionalAbsent[@]}"; do
|
||||||
|
if grep -E -q "^$key=" build/.config; then
|
||||||
|
printf 'Suggested: %s unset or absent.\nActual: %s\n\n' "$key" \
|
||||||
|
"$(grep -E "^$key=" build/.config)" >&2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
'';
|
||||||
|
|
||||||
|
preInstall = let
|
||||||
|
installkernel = buildPackages.writeShellScriptBin "installkernel" ''
|
||||||
|
cp "$2" "$4"
|
||||||
|
cp "$3" "$4"
|
||||||
|
'';
|
||||||
|
in ''
|
||||||
|
export HOME=${installkernel}
|
||||||
|
'';
|
||||||
|
|
||||||
|
installFlags = [
|
||||||
|
"INSTALL_PATH=$(out)"
|
||||||
|
"INSTALL_MOD_PATH=$(out)"
|
||||||
|
];
|
||||||
|
|
||||||
|
installTargets = [
|
||||||
|
"install"
|
||||||
|
"modules_install"
|
||||||
|
];
|
||||||
|
|
||||||
|
postInstall = ''
|
||||||
|
depmod -b "$out" ${finalAttrs.modDirVersion}
|
||||||
|
touch "$out/lib/modules/${finalAttrs.modDirVersion}/modules.order"
|
||||||
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
profile = import ./profile.nix { inherit kernel lib hostPlatform; };
|
||||||
|
|
||||||
|
config = with kernel; {
|
||||||
|
isYes = option: getValue config.${option} or false == true;
|
||||||
|
isNo = option: getValue config.${option} or false == false;
|
||||||
|
isModule = option: false;
|
||||||
|
|
||||||
|
isEnabled = option: getValue config.${option} or false == true;
|
||||||
|
isDisabled = option: getValue config.${option} or false == false;
|
||||||
|
};
|
||||||
|
|
||||||
|
isHardened = true;
|
||||||
|
isLibre = false;
|
||||||
|
isZen = false;
|
||||||
|
|
||||||
|
features = {
|
||||||
|
efiBootStub = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
kernelOlder = lib.versionOlder finalAttrs.version;
|
||||||
|
kernelAtLeast = lib.versionAtLeast finalAttrs.version;
|
||||||
|
};
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
homepage = "https://github.com/anthraxx/linux-hardened";
|
||||||
|
license = lib.licenses.gpl2Only;
|
||||||
|
maintainers = with lib.maintainers; [ mvs ];
|
||||||
|
platforms = [ "x86_64-linux" "aarch64-linux" "riscv64-linux" ];
|
||||||
|
};
|
||||||
|
})) args
|
231
package/linux-hardened/profile.nix
Normal file
231
package/linux-hardened/profile.nix
Normal file
|
@ -0,0 +1,231 @@
|
||||||
|
{ kernel, lib, hostPlatform }: with kernel; {
|
||||||
|
paravirt = {
|
||||||
|
HYPERVISOR_GUEST = true;
|
||||||
|
PARAVIRT = true;
|
||||||
|
PARAVIRT_SPINLOCKS = true;
|
||||||
|
KVM_GUEST = true;
|
||||||
|
ARCH_CPUIDLE_HALTPOLL = true;
|
||||||
|
PARAVIRT_CLOCK = true;
|
||||||
|
|
||||||
|
HALTPOLL_CPUIDLE = true;
|
||||||
|
|
||||||
|
FW_CFG_SYSFS = true;
|
||||||
|
|
||||||
|
BLK_MQ_VIRTIO = true;
|
||||||
|
VIRTIO_BLK = true;
|
||||||
|
VIRTIO_NET = true;
|
||||||
|
VIRTIO_CONSOLE = true;
|
||||||
|
|
||||||
|
HW_RANDOM_VIRTIO = true;
|
||||||
|
|
||||||
|
DRM = true;
|
||||||
|
DRM_FBDEV_EMULATION = true;
|
||||||
|
DRM_VIRTIO_GPU = true;
|
||||||
|
DRM_VIRTIO_GPU_KMS = true;
|
||||||
|
DRM_BOCHS = true;
|
||||||
|
DRM_SIMPLEDRM = true;
|
||||||
|
|
||||||
|
VIRT_DRIVERS = true;
|
||||||
|
VMGENID = true;
|
||||||
|
|
||||||
|
VIRTIO_MENU = true;
|
||||||
|
VIRTIO = true;
|
||||||
|
VIRTIO_PCI = true;
|
||||||
|
VIRTIO_PCI_LEGACY = false;
|
||||||
|
VIRTIO_BALLOON = true;
|
||||||
|
VIRTIO_INPUT = true;
|
||||||
|
|
||||||
|
VIRTIO_IOMMU = true;
|
||||||
|
|
||||||
|
FUSE_FS = true;
|
||||||
|
VIRTIO_FS = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
physical = {
|
||||||
|
ACPI_BUTTON = true;
|
||||||
|
ACPI_VIDEO = true;
|
||||||
|
ACPI_FAN = true;
|
||||||
|
ACPI_TAD = true;
|
||||||
|
ACPI_PROCESSOR_AGGREGATOR = true;
|
||||||
|
ACPI_THERMAL = true;
|
||||||
|
ACPI_PCI_SLOT = true;
|
||||||
|
|
||||||
|
SCSI = true;
|
||||||
|
BLK_DEV_SD = true;
|
||||||
|
CHR_DEV_SG = true;
|
||||||
|
SCSI_CONSTANTS = true;
|
||||||
|
SCSI_SCAN_ASYNC = true;
|
||||||
|
|
||||||
|
USB_STORAGE = true;
|
||||||
|
USB_UAS = true;
|
||||||
|
|
||||||
|
LEDS_CLASS = true;
|
||||||
|
LEDS_TRIGGERS = true;
|
||||||
|
LEDS_TRIGGER_PANIC = true;
|
||||||
|
LEDS_TRIGGER_NETDEV = true;
|
||||||
|
|
||||||
|
EDAC = true;
|
||||||
|
|
||||||
|
THERMAL = true;
|
||||||
|
THERMAL_NETLINK = true;
|
||||||
|
THERMAL_DEFAULT_GOV_FAIR_SHARE = true;
|
||||||
|
THERMAL_GOV_FAIR_SHARE = true;
|
||||||
|
|
||||||
|
POWERCAP = true;
|
||||||
|
|
||||||
|
RAS = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
portable = {
|
||||||
|
PREEMPT_VOLUNTARY = true;
|
||||||
|
|
||||||
|
SUSPEND = true;
|
||||||
|
WQ_POWER_EFFICIENT_DEFAULT = true;
|
||||||
|
ACPI_BATTERY = true;
|
||||||
|
|
||||||
|
HOTPLUG_PCI_PCIE = true;
|
||||||
|
HOTPLUG_PCI = true;
|
||||||
|
|
||||||
|
MEDIA_SUPPORT = true;
|
||||||
|
MEDIA_SUPPORT_FILTER = true;
|
||||||
|
MEDIA_SUBDRV_AUTOSELECT = true;
|
||||||
|
MEDIA_CAMERA_SUPPORT = true;
|
||||||
|
MEDIA_USB_SUPPORT = true;
|
||||||
|
USB_VIDEO_CLASS = true;
|
||||||
|
USB_VIDEO_CLASS_INPUT_EVDEV = true;
|
||||||
|
|
||||||
|
HID_BATTERY_STRENGTH = true;
|
||||||
|
|
||||||
|
USB_NET_DRIVERS = true;
|
||||||
|
USB_RTL8152 = true;
|
||||||
|
USB_USBNET = true;
|
||||||
|
USB_NET_AX88179_178A = true;
|
||||||
|
USB_NET_CDCETHER = true;
|
||||||
|
USB_NET_CDC_SUBSET = true;
|
||||||
|
|
||||||
|
BACKLIGHT_CLASS_DEVICE = true;
|
||||||
|
|
||||||
|
TYPEC = true;
|
||||||
|
TYPEC_TCPM = true;
|
||||||
|
TYPEC_TCPCI = true;
|
||||||
|
TYPEC_UCSI = true;
|
||||||
|
UCSI_ACPI = true;
|
||||||
|
TYPEC_DP_ALTMODE = true;
|
||||||
|
|
||||||
|
MMC = true;
|
||||||
|
MMC_BLOCK = true;
|
||||||
|
|
||||||
|
USB4 = true;
|
||||||
|
|
||||||
|
KFENCE_SAMPLE_INTERVAL = "500";
|
||||||
|
};
|
||||||
|
|
||||||
|
dm-crypt = {
|
||||||
|
MD = true;
|
||||||
|
MD_BITMAP_FILE = false;
|
||||||
|
BLK_DEV_DM = true;
|
||||||
|
DM_CRYPT = true;
|
||||||
|
DM_UEVENT = true;
|
||||||
|
DM_INTEGRITY = true;
|
||||||
|
|
||||||
|
CRYPTO_AES = true;
|
||||||
|
CRYPTO_XTS = true;
|
||||||
|
CRYPTO_AEGIS128 = true;
|
||||||
|
CRYPTO_SHA256 = true;
|
||||||
|
|
||||||
|
CRYPTO_USER_API_HASH = true;
|
||||||
|
CRYPTO_USER_API_SKCIPHER = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
CRYPTO_AES_NI_INTEL = true;
|
||||||
|
CRYPTO_AEGIS128_AESNI_SSE2 = true;
|
||||||
|
CRYPTO_SHA256_SSSE3 = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isRiscV64 {
|
||||||
|
CRYPTO_AES_RISCV64 = true;
|
||||||
|
CRYPTO_SHA256_RISCV64 = true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isAarch64 {
|
||||||
|
CRYPTO_AES_ARM64 = true;
|
||||||
|
CRYPTO_AES_ARM64_CE = true;
|
||||||
|
CRYPTO_AES_ARM64_CE_BLK = true;
|
||||||
|
CRYPTO_AES_ARM64_NEON_BLK = true;
|
||||||
|
CRYPTO_AES_ARM64_BS = true;
|
||||||
|
CRYPTO_AEGIS128_SIMD = true;
|
||||||
|
CRYPTO_SHA256_ARM64 = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
wireless = {
|
||||||
|
WIRELESS = true;
|
||||||
|
CFG80211 = true;
|
||||||
|
CFG80211_DEFAULT_PS = true;
|
||||||
|
CFG80211_CRDA_SUPPORT = true;
|
||||||
|
MAC80211 = true;
|
||||||
|
MAC80211_RC_MINSTREL = true;
|
||||||
|
MAC80211_RC_DEFAULT_MINSTREL = true;
|
||||||
|
MAC80211_LEDS = true;
|
||||||
|
|
||||||
|
BT = true;
|
||||||
|
BT_BREDR = true;
|
||||||
|
BT_RFCOMM = true;
|
||||||
|
BT_HIDP = true;
|
||||||
|
BT_LE = true;
|
||||||
|
BT_LEDS = true;
|
||||||
|
|
||||||
|
BT_HCIBTUSB_AUTOSUSPEND = option true;
|
||||||
|
BT_HCIBTUSB_BCM = option false;
|
||||||
|
BT_HCIBTUSB_RTL = option false;
|
||||||
|
|
||||||
|
RFKILL = true;
|
||||||
|
RFKILL_INPUT = true;
|
||||||
|
|
||||||
|
# iwd
|
||||||
|
KEYS = true;
|
||||||
|
CRYPTO_USER_API_SKCIPHER = true;
|
||||||
|
CRYPTO_USER_API_HASH = true;
|
||||||
|
CRYPTO_HMAC = true;
|
||||||
|
CRYPTO_CMAC = true;
|
||||||
|
CRYPTO_MD4 = true;
|
||||||
|
CRYPTO_MD5 = true;
|
||||||
|
CRYPTO_SHA1 = true;
|
||||||
|
CRYPTO_SHA256 = true;
|
||||||
|
CRYPTO_SHA512 = true;
|
||||||
|
CRYPTO_AES = true;
|
||||||
|
CRYPTO_ECB = true;
|
||||||
|
CRYPTO_DES = true;
|
||||||
|
CRYPTO_CBC = true;
|
||||||
|
|
||||||
|
ASYMMETRIC_KEY_TYPE = option true;
|
||||||
|
ASYMMETRIC_PUBLIC_KEY_SUBTYPE = option true;
|
||||||
|
X509_CERTIFICATE_PARSER = option true;
|
||||||
|
PKCS7_MESSAGE_PARSER = option true;
|
||||||
|
PKCS8_PRIVATE_KEY_PARSER = option true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isx86_64 {
|
||||||
|
CRYPTO_AES_NI_INTEL = option true;
|
||||||
|
CRYPTO_DES3_EDE_X86_64 = option true;
|
||||||
|
CRYPTO_SHA1_SSSE3 = option true;
|
||||||
|
CRYPTO_SHA256_SSSE3 = option true;
|
||||||
|
CRYPTO_SHA512_SSSE3 = option true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isRiscV64 {
|
||||||
|
CRYPTO_AES_RISCV64 = option true;
|
||||||
|
CRYPTO_SHA256_RISCV64 = option true;
|
||||||
|
CRYPTO_SHA512_RISCV64 = option true;
|
||||||
|
} // lib.optionalAttrs hostPlatform.isAarch64 {
|
||||||
|
CRYPTO_AES_ARM64_CE = option true;
|
||||||
|
CRYPTO_AES_ARM64_CE_BLK = option true;
|
||||||
|
CRYPTO_SHA1_ARM64_CE = option true;
|
||||||
|
CRYPTO_SHA256_ARM64 = option true;
|
||||||
|
CRYPTO_SHA2_ARM64_CE = option true;
|
||||||
|
CRYPTO_SHA512_ARM64 = option true;
|
||||||
|
CRYPTO_SHA512_ARM64_CE = option true;
|
||||||
|
};
|
||||||
|
|
||||||
|
audio = {
|
||||||
|
SOUND = true;
|
||||||
|
SND = true;
|
||||||
|
SND_PCM_TIMER = true;
|
||||||
|
SND_DYNAMIC_MINORS = true;
|
||||||
|
SND_SUPPORT_OLD_API = false;
|
||||||
|
SND_PCI = true;
|
||||||
|
|
||||||
|
SND_USB = true;
|
||||||
|
SND_USB_AUDIO = true;
|
||||||
|
};
|
||||||
|
}
|
120
package/locale-en_EU/en_EU
Normal file
120
package/locale-en_EU/en_EU
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
comment_char %
|
||||||
|
escape_char /
|
||||||
|
|
||||||
|
LC_IDENTIFICATION
|
||||||
|
title "Custom locale"
|
||||||
|
source ""
|
||||||
|
address ""
|
||||||
|
contact "Mikael Voss"
|
||||||
|
email ""
|
||||||
|
language "en"
|
||||||
|
territory "EU"
|
||||||
|
revision "0"
|
||||||
|
date "2022-10-12"
|
||||||
|
|
||||||
|
category "i18n:2012";LC_IDENTIFICATION
|
||||||
|
category "i18n:2012";LC_CTYPE
|
||||||
|
category "i18n:2012";LC_COLLATE
|
||||||
|
category "i18n:2012";LC_MONETARY
|
||||||
|
category "i18n:2012";LC_NUMERIC
|
||||||
|
category "i18n:2012";LC_TIME
|
||||||
|
category "i18n:2012";LC_MESSAGES
|
||||||
|
category "i18n:2012";LC_PAPER
|
||||||
|
category "i18n:2012";LC_NAME
|
||||||
|
category "i18n:2012";LC_ADDRESS
|
||||||
|
category "i18n:2012";LC_TELEPHONE
|
||||||
|
category "i18n:2012";LC_MEASUREMENT
|
||||||
|
END LC_IDENTIFICATION
|
||||||
|
|
||||||
|
LC_CTYPE
|
||||||
|
copy "i18n_ctype"
|
||||||
|
|
||||||
|
translit_start
|
||||||
|
include "translit_neutral";""
|
||||||
|
translit_end
|
||||||
|
|
||||||
|
translit_start
|
||||||
|
include "translit_combining";""
|
||||||
|
translit_end
|
||||||
|
END LC_CTYPE
|
||||||
|
|
||||||
|
LC_COLLATE
|
||||||
|
copy "iso14651_t1"
|
||||||
|
END LC_COLLATE
|
||||||
|
|
||||||
|
LC_NUMERIC
|
||||||
|
decimal_point "."
|
||||||
|
thousands_sep "<U202F>"
|
||||||
|
grouping 3;3
|
||||||
|
END LC_NUMERIC
|
||||||
|
|
||||||
|
LC_MONETARY
|
||||||
|
int_curr_symbol "EUR "
|
||||||
|
currency_symbol "<U20AC>"
|
||||||
|
mon_decimal_point "."
|
||||||
|
mon_thousands_sep "<U202F>"
|
||||||
|
mon_grouping 3;3
|
||||||
|
positive_sign ""
|
||||||
|
negative_sign "-"
|
||||||
|
int_frac_digits 2
|
||||||
|
frac_digits 2
|
||||||
|
p_cs_precedes 0
|
||||||
|
p_sep_by_space 1
|
||||||
|
n_cs_precedes 0
|
||||||
|
n_sep_by_space 1
|
||||||
|
p_sign_posn 1
|
||||||
|
n_sign_posn 1
|
||||||
|
END LC_MONETARY
|
||||||
|
|
||||||
|
LC_TIME
|
||||||
|
abday "Sun";"Mon";"Tue";"Wed";"Thu";"Fri";"Sat"
|
||||||
|
day "Sunday";"Monday";"Tuesday";"Wednesday";"Thursday";"Friday";"Saturday"
|
||||||
|
abmon "Jan";"Feb";"Mar";"Apr";"May";"Jun";"Jul";"Aug";"Sep";"Oct";"Nov";"Dec"
|
||||||
|
mon "January";"February";"March";"April";"May";"June";/
|
||||||
|
"July";"August";"September";"October";"November";"December"
|
||||||
|
week 7;19971201;4
|
||||||
|
d_t_fmt "%F %T %Z"
|
||||||
|
date_fmt "%F %T %Z"
|
||||||
|
d_fmt "%F"
|
||||||
|
t_fmt "%T"
|
||||||
|
t_fmt_ampm ""
|
||||||
|
am_pm "";""
|
||||||
|
END LC_TIME
|
||||||
|
|
||||||
|
LC_MESSAGES
|
||||||
|
yesexpr "^[+1Tty]"
|
||||||
|
noexpr "^[-0Ffn]"
|
||||||
|
END LC_MESSAGES
|
||||||
|
|
||||||
|
LC_PAPER
|
||||||
|
% ISO A4
|
||||||
|
height 297
|
||||||
|
width 210
|
||||||
|
END LC_PAPER
|
||||||
|
|
||||||
|
LC_NAME
|
||||||
|
name_fmt "%p%t%g%m%t%f"
|
||||||
|
% profession + primary + additionals + family
|
||||||
|
END LC_NAME
|
||||||
|
|
||||||
|
LC_ADDRESS
|
||||||
|
postal_fmt "%n%N%a%N%d%N%f%N%b%t%e%t%r%N%s%t%h%N%z%t%T%S%N%c%N"
|
||||||
|
% person’s name
|
||||||
|
% c/o person
|
||||||
|
% department
|
||||||
|
% firm
|
||||||
|
% building + floor + room
|
||||||
|
% street + number
|
||||||
|
% postal code + town
|
||||||
|
% state or provice
|
||||||
|
% country
|
||||||
|
END LC_ADDRESS
|
||||||
|
|
||||||
|
LC_TELEPHONE
|
||||||
|
tel_int_fmt "+%c %a%t%l"
|
||||||
|
END LC_TELEPHONE
|
||||||
|
|
||||||
|
LC_MEASUREMENT
|
||||||
|
% metric
|
||||||
|
measurement 1
|
||||||
|
END LC_MEASUREMENT
|
15
package/locale-en_EU/package.nix
Normal file
15
package/locale-en_EU/package.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ ... }: { pkgs, lib, callPackage, allLocales ? false, locales ? [ "en_EU.UTF-8/UTF-8" ] }:
|
||||||
|
|
||||||
|
let glibcLocales = callPackage
|
||||||
|
(pkgs.path + "/pkgs/development/libraries/glibc/locales.nix")
|
||||||
|
{ inherit allLocales locales; };
|
||||||
|
in glibcLocales.overrideAttrs (prevAttrs: {
|
||||||
|
postPatch = prevAttrs.postPatch + ''
|
||||||
|
cp ${./en_EU} localedata/locales/en_EU
|
||||||
|
echo 'en_EU.UTF-8/UTF-8 \' >>localedata/SUPPORTED
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = prevAttrs.meta // {
|
||||||
|
maintainers = with lib.maintainers; [ mvs ];
|
||||||
|
};
|
||||||
|
})
|
5
shell/default.nix
Normal file
5
shell/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{ colmena, ... }: { mkShell, system }:
|
||||||
|
|
||||||
|
mkShell {
|
||||||
|
packages = [ colmena.packages.${system}.colmena ];
|
||||||
|
}
|
Loading…
Reference in a new issue