Bunch of changes I really cant be bothered to write a commit message for
This commit is contained in:
parent
e8de6cfa53
commit
d011815d05
15 changed files with 1470 additions and 422 deletions
|
@ -5,7 +5,18 @@
|
||||||
./home-manager.nix
|
./home-manager.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
nix.settings.experimental-features = [ "nix-command" "flakes" ];
|
nix = {
|
||||||
|
settings = {
|
||||||
|
experimental-features = [ "nix-command" "flakes" ];
|
||||||
|
auto-optimise-store = true;
|
||||||
|
};
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "daily";
|
||||||
|
options = "--delete-older-than 14d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
nixpkgs.config.allowUnfree = true;
|
nixpkgs.config.allowUnfree = true;
|
||||||
time.timeZone = "Europe/Amsterdam";
|
time.timeZone = "Europe/Amsterdam";
|
||||||
|
|
||||||
|
@ -36,8 +47,11 @@
|
||||||
isNormalUser = true;
|
isNormalUser = true;
|
||||||
extraGroups = [ "wheel" "docker" "wireshark" "video" "dialout" "libvirt" ];
|
extraGroups = [ "wheel" "docker" "wireshark" "video" "dialout" "libvirt" ];
|
||||||
description = "Sijmen";
|
description = "Sijmen";
|
||||||
|
shell = pkgs.zsh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
programs.zsh.enable = true;
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
pipewire.enable = true;
|
pipewire.enable = true;
|
||||||
gvfs.enable = true;
|
gvfs.enable = true;
|
||||||
|
@ -58,18 +72,17 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
syncthing = {
|
#syncthing = {
|
||||||
enable = true;
|
#enable = true;
|
||||||
user = "sijmen";
|
#user = "sijmen";
|
||||||
dataDir = config.users.users.sijmen.home;
|
#dataDir = config.users.users.sijmen.home;
|
||||||
};
|
#};
|
||||||
};
|
};
|
||||||
|
|
||||||
fonts.fonts = with pkgs; [
|
fonts.fonts = with pkgs; [
|
||||||
corefonts
|
corefonts
|
||||||
dejavu_fonts
|
dejavu_fonts
|
||||||
iosevka
|
iosevka
|
||||||
nerdfonts
|
|
||||||
noto-fonts
|
noto-fonts
|
||||||
noto-fonts-cjk
|
noto-fonts-cjk
|
||||||
noto-fonts-emoji
|
noto-fonts-emoji
|
||||||
|
|
|
@ -1,381 +1,20 @@
|
||||||
{ config, pkgs, lib, ... }:
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [<home-manager/nixos>];
|
||||||
<home-manager/nixos>
|
|
||||||
];
|
|
||||||
|
|
||||||
home-manager.users.sijmen = {
|
home-manager.users.sijmen = {
|
||||||
imports = [
|
imports = [
|
||||||
./home-manager/home.nix
|
./home-manager/home.nix
|
||||||
./home-manager/gtk.nix
|
./home-manager/gtk.nix
|
||||||
|
./home-manager/systemd.nix
|
||||||
|
./home-manager/programs.nix
|
||||||
|
./home-manager/wayland.nix
|
||||||
|
./home-manager/services.nix
|
||||||
|
./home-manager/accounts.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
nixpkgs.config.allowUnfree = true;
|
nixpkgs.config.allowUnfree = true;
|
||||||
home.stateVersion = config.system.stateVersion;
|
home.stateVersion = config.system.stateVersion;
|
||||||
|
|
||||||
programs = {
|
|
||||||
bash = {
|
|
||||||
enable = true;
|
|
||||||
initExtra = ''
|
|
||||||
source ${pkgs.fetchurl {
|
|
||||||
url = "https://raw.githubusercontent.com/rupa/z/b82ac78a2d4457d2ca09973332638f123f065fd1/z.sh";
|
|
||||||
sha256 = "98e4438cd31afb3ce594130335e7fbd8be5d75d9a53e4f3e084d97e6b8d19b0e";
|
|
||||||
}}
|
|
||||||
|
|
||||||
# SSH agent
|
|
||||||
eval $(${pkgs.openssh}/bin/ssh-agent) > /dev/null
|
|
||||||
trap 'test -n "$SSH_AUTH_SOCK" && eval $(${pkgs.openssh}/bin/ssh-agent -k)' 0
|
|
||||||
'';
|
|
||||||
sessionVariables = {
|
|
||||||
PYTHON_KEYRING_BACKEND = "keyring.backends.null.Keyring";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
firefox = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.firefox-wayland;
|
|
||||||
};
|
|
||||||
|
|
||||||
ncmpcpp = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
colors_enabled = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
foot = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
main = {
|
|
||||||
term = "xterm-256color";
|
|
||||||
font = "Iosevka:size=12";
|
|
||||||
};
|
|
||||||
|
|
||||||
colors = {
|
|
||||||
background = "fafafa";
|
|
||||||
foreground = "383a42";
|
|
||||||
|
|
||||||
regular0 = "383a42";
|
|
||||||
regular1 = "e45649";
|
|
||||||
regular2 = "50a14f";
|
|
||||||
regular3 = "c18401";
|
|
||||||
regular4 = "0184bc";
|
|
||||||
regular5 = "a626a4";
|
|
||||||
regular6 = "0997b3";
|
|
||||||
regular7 = "fafafa";
|
|
||||||
|
|
||||||
bright0 = "383a42";
|
|
||||||
bright1 = "e45649";
|
|
||||||
bright2 = "50a14f";
|
|
||||||
bright3 = "c18401";
|
|
||||||
bright4 = "0184bc";
|
|
||||||
bright5 = "a626a4";
|
|
||||||
bright6 = "0997b3";
|
|
||||||
bright7 = "fafafa";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
git = {
|
|
||||||
enable = true;
|
|
||||||
lfs.enable = true;
|
|
||||||
package = pkgs.gitAndTools.gitFull;
|
|
||||||
|
|
||||||
userName = "Sijmen";
|
|
||||||
userEmail = "me@sijman.nl";
|
|
||||||
|
|
||||||
signing = {
|
|
||||||
signByDefault = true;
|
|
||||||
key = "0xDAF7821E067D9C48";
|
|
||||||
};
|
|
||||||
|
|
||||||
extraConfig = {
|
|
||||||
fetch.prune = true;
|
|
||||||
init.defaultBranch = "main";
|
|
||||||
pull.rebase = true;
|
|
||||||
push.autoSetupRemote = true;
|
|
||||||
safe.directory = [ "/etc/nixos" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mpv = {
|
|
||||||
enable = true;
|
|
||||||
config = {
|
|
||||||
script-opts = "ytdl_hook-ytdl_path=${pkgs.yt-dlp}/bin/yt-dlp";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
neovim = {
|
|
||||||
enable = true;
|
|
||||||
vimAlias = true;
|
|
||||||
|
|
||||||
extraConfig = ''
|
|
||||||
luafile /etc/nixos/common/nvim.lua
|
|
||||||
'';
|
|
||||||
|
|
||||||
extraPackages = with pkgs; [
|
|
||||||
gcc
|
|
||||||
rnix-lsp
|
|
||||||
nodePackages.pyright
|
|
||||||
];
|
|
||||||
|
|
||||||
plugins = with pkgs.vimPlugins; [
|
|
||||||
bufferline-nvim
|
|
||||||
cmp-nvim-lsp
|
|
||||||
cmp_luasnip
|
|
||||||
ctrlp-vim
|
|
||||||
galaxyline-nvim
|
|
||||||
indentLine
|
|
||||||
leap-nvim
|
|
||||||
lualine-nvim
|
|
||||||
luasnip
|
|
||||||
neorg
|
|
||||||
nvim-cmp
|
|
||||||
nvim-colorizer-lua
|
|
||||||
nvim-lspconfig
|
|
||||||
nvim-tree-lua
|
|
||||||
nvim-treesitter.withAllGrammars
|
|
||||||
nvim-web-devicons
|
|
||||||
onehalf
|
|
||||||
pears-nvim
|
|
||||||
plenary-nvim
|
|
||||||
vim-closetag
|
|
||||||
vim-nix
|
|
||||||
vim-startify
|
|
||||||
vim-startuptime
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
tmux = {
|
|
||||||
enable = true;
|
|
||||||
prefix = "C-a";
|
|
||||||
extraConfig = ''
|
|
||||||
set -g mouse on
|
|
||||||
set-option -g set-titles on
|
|
||||||
set-option -g set-titles-string "#W"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
yt-dlp = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
sponsorblock-mark = "sponsor,selfpromo,intro,outro,poi_highlight";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
waybar = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
beets = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
paths.default = "$albumartist/$year - $album%aunique{}/$track $title";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
ssh = {
|
|
||||||
enable = true;
|
|
||||||
matchBlocks = {
|
|
||||||
# Home
|
|
||||||
"rpi" = {
|
|
||||||
user = "root";
|
|
||||||
hostname = "cloud.sijmenschoon.nl";
|
|
||||||
};
|
|
||||||
"desktop" = {
|
|
||||||
user = "vijfhoek";
|
|
||||||
hostname = "192.168.1.99";
|
|
||||||
proxyJump = "cloud.sijmenschoon.nl";
|
|
||||||
};
|
|
||||||
"nas" = {
|
|
||||||
user = "sijmen";
|
|
||||||
hostname = "192.168.1.123";
|
|
||||||
proxyJump = "cloud.sijmenschoon.nl";
|
|
||||||
};
|
|
||||||
# Servers
|
|
||||||
"hermes" = {
|
|
||||||
user = "ubuntu";
|
|
||||||
hostname = "hermes.sijmenschoon.nl";
|
|
||||||
};
|
|
||||||
# Scintilla
|
|
||||||
"linscin" = {
|
|
||||||
user = "sijmens";
|
|
||||||
hostname = "linscin.scintilla.utwente.nl";
|
|
||||||
};
|
|
||||||
"britt" = {
|
|
||||||
user = "sijmens";
|
|
||||||
hostname = "britt.scintilla.utwente.nl";
|
|
||||||
proxyJump = "linscin";
|
|
||||||
};
|
|
||||||
"*.scintilla.utwente.nl" = {
|
|
||||||
user = "sijmens";
|
|
||||||
};
|
|
||||||
"*.scintilla.nl" = {
|
|
||||||
user = "sijmens";
|
|
||||||
};
|
|
||||||
# Uni
|
|
||||||
"xoc2" = {
|
|
||||||
user = "s2639149";
|
|
||||||
hostname = "xoc2.ewi.utwente.nl";
|
|
||||||
proxyJump = "sijmens@linscin.scintilla.utwente.nl";
|
|
||||||
};
|
|
||||||
"noc2" = {
|
|
||||||
user = "s2639149";
|
|
||||||
hostname = "noc2.ewi.utwente.nl";
|
|
||||||
proxyJump = "sijmens@linscin.scintilla.utwente.nl";
|
|
||||||
};
|
|
||||||
"hidde" = {
|
|
||||||
user = "hidde";
|
|
||||||
hostname = "84.245.15.16";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
extraConfig = ''
|
|
||||||
AddKeysToAgent 15m
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
alot.enable = true;
|
|
||||||
chromium.enable = true;
|
|
||||||
gpg.enable = true;
|
|
||||||
home-manager.enable = true;
|
|
||||||
mbsync.enable = true;
|
|
||||||
msmtp.enable = true;
|
|
||||||
password-store.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
wayland.windowManager.sway = {
|
|
||||||
enable = true;
|
|
||||||
config = let
|
|
||||||
scintillaDellOutput = { pos = "0 0"; };
|
|
||||||
scintillaHpOutput = { pos = "0 120"; };
|
|
||||||
in rec {
|
|
||||||
modifier = "Mod4";
|
|
||||||
terminal = "foot";
|
|
||||||
fonts = {
|
|
||||||
names = [ "Ubuntu" ];
|
|
||||||
style = "Regular";
|
|
||||||
size = 11.0;
|
|
||||||
};
|
|
||||||
input = {
|
|
||||||
"type:touchpad" = {
|
|
||||||
natural_scroll = "enabled";
|
|
||||||
dwt = "disabled";
|
|
||||||
click_method = "clickfinger";
|
|
||||||
};
|
|
||||||
"type:keyboard" = {
|
|
||||||
xkb_layout = "us,kr";
|
|
||||||
xkb_options = "grp:alt_caps_toggle";
|
|
||||||
};
|
|
||||||
"type:mouse" = {
|
|
||||||
accel_profile = "flat";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
output = {
|
|
||||||
"*" = {
|
|
||||||
bg = "~/Pictures/berg.jpg fill";
|
|
||||||
subpixel = "none";
|
|
||||||
};
|
|
||||||
"Unknown 0x095F 0x00000000" = { pos = "92 1200"; scale = "1.3"; }; # framework
|
|
||||||
"Dell Inc. DELL U2410 F525M13318GL" = scintillaDellOutput; # bibi
|
|
||||||
"Dell Inc. DELL U2410 F525M12P08RL" = scintillaDellOutput; # fabienne
|
|
||||||
"Hewlett Packard HP E222 CNK6110ZM2" = scintillaHpOutput; # floortje
|
|
||||||
"Hewlett Packard HP E222 CNK6110ZM7" = scintillaHpOutput;
|
|
||||||
"Hewlett Packard HP E222 CNK6110ZMF" = scintillaHpOutput; # tamara
|
|
||||||
"Hewlett Packard HP E222 CNK6110ZR8" = scintillaHpOutput; # megan
|
|
||||||
"Hewlett Packard HP E222 CNK611104P" = scintillaHpOutput; # charissa
|
|
||||||
"Hewlett Packard HP E222 CNK611104X" = scintillaHpOutput;
|
|
||||||
"Hewlett Packard HP E222 CNK6111052" = scintillaHpOutput; # ilona
|
|
||||||
"Goldstar Company Ltd LG Ultra HD 0x00008520" = { mode = "2560x1440@60Hz"; }; # thuis rechts
|
|
||||||
"Dell Inc. DELL S2722DGM 3P84Z83" = { mode = "2560x1440@144Hz"; }; # thuis links (hdmi)
|
|
||||||
};
|
|
||||||
keybindings = lib.mkOptionDefault {
|
|
||||||
XF86MonBrightnessDown = "exec ${pkgs.light}/bin/light -U 5";
|
|
||||||
XF86MonBrightnessUp = "exec ${pkgs.light}/bin/light -A 5";
|
|
||||||
"shift+XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 1";
|
|
||||||
"shift+XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 1";
|
|
||||||
XF86AudioRaiseVolume = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%'";
|
|
||||||
XF86AudioLowerVolume = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%'";
|
|
||||||
XF86AudioMute = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle'";
|
|
||||||
Print = "exec '${pkgs.grim}/bin/grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | wl-copy -t image/png'";
|
|
||||||
|
|
||||||
"${modifier}+alt+l" = "exec '${pkgs.swaylock}/bin/swaylock -c 000000 -i eDP-1:Pictures/vista32.jpg'";
|
|
||||||
"${modifier}+ctrl+Return" = "exec '${pkgs.gnome.nautilus}/bin/nautilus'";
|
|
||||||
|
|
||||||
"${modifier}+ctrl+Down" = "move workspace to down";
|
|
||||||
"${modifier}+ctrl+Up" = "move workspace to up";
|
|
||||||
"${modifier}+ctrl+Left" = "move workspace to left";
|
|
||||||
"${modifier}+ctrl+Right" = "move workspace to right";
|
|
||||||
"${modifier}+ctrl+j" = "move workspace to down";
|
|
||||||
"${modifier}+ctrl+k" = "move workspace to up";
|
|
||||||
"${modifier}+ctrl+h" = "move workspace to left";
|
|
||||||
"${modifier}+ctrl+l" = "move workspace to right";
|
|
||||||
|
|
||||||
"${modifier}+ctrl+f" = "exec '${pkgs.python3}/bin/python /etc/nixos/common/sway/next_free.py | xargs swaymsg -- workspace number'";
|
|
||||||
"${modifier}+comma" = "workspace prev_on_output";
|
|
||||||
"${modifier}+period" = "workspace next_on_output";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
gpg-agent = {
|
|
||||||
enable = true;
|
|
||||||
pinentryFlavor = "qt";
|
|
||||||
};
|
|
||||||
|
|
||||||
gnome-keyring = {
|
|
||||||
enable = true;
|
|
||||||
components = ["secrets" "ssh"];
|
|
||||||
};
|
|
||||||
|
|
||||||
mpd = {
|
|
||||||
enable = true;
|
|
||||||
musicDirectory = "/home/sijmen/Music";
|
|
||||||
};
|
|
||||||
|
|
||||||
mako = {
|
|
||||||
enable = true;
|
|
||||||
font = "Ubuntu 11";
|
|
||||||
defaultTimeout = 5000;
|
|
||||||
groupBy = "app-name,summary";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
accounts.email.accounts.Personal = {
|
|
||||||
primary = true;
|
|
||||||
|
|
||||||
address = "me@sijmenschoon.nl";
|
|
||||||
aliases = [ "me@sijman.nl" "me@vijf.life" "info@sijmenschoon.nl" ];
|
|
||||||
realName = "Sijmen Schoon";
|
|
||||||
|
|
||||||
userName = "me@sijmenschoon.nl";
|
|
||||||
passwordCommand = "pass show email/personal";
|
|
||||||
|
|
||||||
imap.host = "imap.soverin.net";
|
|
||||||
smtp.host = "smtp.soverin.net";
|
|
||||||
|
|
||||||
folders.inbox = "INBOX";
|
|
||||||
|
|
||||||
mbsync = {
|
|
||||||
enable = true;
|
|
||||||
create = "maildir";
|
|
||||||
};
|
|
||||||
|
|
||||||
msmtp.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
accounts.email.accounts.Scintilla = {
|
|
||||||
primary = false;
|
|
||||||
|
|
||||||
address = "sijmens@scintilla.utwente.nl";
|
|
||||||
aliases = [ "sschoon@scintilla.utwente.nl" ];
|
|
||||||
realName = "Sijmen Schoon";
|
|
||||||
|
|
||||||
userName = "sijmens";
|
|
||||||
passwordCommand = "pass show email/scintilla";
|
|
||||||
|
|
||||||
folders.inbox = "INBOX";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
39
common/home-manager/accounts.nix
Normal file
39
common/home-manager/accounts.nix
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
{
|
||||||
|
accounts.email.accounts = {
|
||||||
|
Personal = {
|
||||||
|
primary = true;
|
||||||
|
|
||||||
|
address = "me@sijmenschoon.nl";
|
||||||
|
aliases = [ "me@sijman.nl" "me@vijf.life" "info@sijmenschoon.nl" ];
|
||||||
|
realName = "Sijmen Schoon";
|
||||||
|
|
||||||
|
userName = "me@sijmenschoon.nl";
|
||||||
|
passwordCommand = "pass show email/personal";
|
||||||
|
|
||||||
|
imap.host = "imap.soverin.net";
|
||||||
|
smtp.host = "smtp.soverin.net";
|
||||||
|
|
||||||
|
folders.inbox = "INBOX";
|
||||||
|
|
||||||
|
mbsync = {
|
||||||
|
enable = true;
|
||||||
|
create = "maildir";
|
||||||
|
};
|
||||||
|
|
||||||
|
msmtp.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
Scintilla = {
|
||||||
|
primary = false;
|
||||||
|
|
||||||
|
address = "sijmens@scintilla.utwente.nl";
|
||||||
|
aliases = [ "sschoon@scintilla.utwente.nl" ];
|
||||||
|
realName = "Sijmen Schoon";
|
||||||
|
|
||||||
|
userName = "sijmens";
|
||||||
|
passwordCommand = "pass show email/scintilla";
|
||||||
|
|
||||||
|
folders.inbox = "INBOX";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -21,6 +21,7 @@
|
||||||
"smb://192.168.1.123/docs/ NAS"
|
"smb://192.168.1.123/docs/ NAS"
|
||||||
"smb://192.168.1.123/docs/users/sijmen sijmen"
|
"smb://192.168.1.123/docs/users/sijmen sijmen"
|
||||||
"smb://192.168.1.123/docs/media Media"
|
"smb://192.168.1.123/docs/media Media"
|
||||||
|
"sftp://sijmen@10.100.0.1/home/sijmen RPi"
|
||||||
"sftp://sijmens@virtuscin.scintilla.utwente.nl/data Scintilla"
|
"sftp://sijmens@virtuscin.scintilla.utwente.nl/data Scintilla"
|
||||||
"sftp://sijmens@virtuscin.scintilla.utwente.nl/data/commissies/spock/SPOCK7 SPOCK7"
|
"sftp://sijmens@virtuscin.scintilla.utwente.nl/data/commissies/spock/SPOCK7 SPOCK7"
|
||||||
"sftp://sijmens@virtuscin.scintilla.utwente.nl/data/commissies/sot sot"
|
"sftp://sijmens@virtuscin.scintilla.utwente.nl/data/commissies/sot sot"
|
||||||
|
|
|
@ -14,13 +14,19 @@
|
||||||
# Programming
|
# Programming
|
||||||
bacon
|
bacon
|
||||||
colordiff
|
colordiff
|
||||||
|
podman-compose
|
||||||
docker-compose
|
docker-compose
|
||||||
sublime-merge
|
sublime-merge
|
||||||
tig
|
tig
|
||||||
vscode-fhs
|
vscode-fhs
|
||||||
|
|
||||||
poetry
|
|
||||||
cargo
|
cargo
|
||||||
|
cargo-outdated
|
||||||
|
clang
|
||||||
|
poetry
|
||||||
|
rust-analyzer
|
||||||
|
rustc
|
||||||
|
rustfmt
|
||||||
|
|
||||||
# Graphics
|
# Graphics
|
||||||
gimp
|
gimp
|
||||||
|
@ -31,14 +37,12 @@
|
||||||
# Internet
|
# Internet
|
||||||
discord
|
discord
|
||||||
element-desktop
|
element-desktop
|
||||||
|
|
||||||
gnome.epiphany
|
gnome.epiphany
|
||||||
|
|
||||||
httpie
|
httpie
|
||||||
wget
|
wget
|
||||||
|
|
||||||
remmina
|
remmina
|
||||||
x2goclient
|
x2goclient
|
||||||
|
transmission-gtk
|
||||||
|
|
||||||
# Sound & Video
|
# Sound & Video
|
||||||
cantata
|
cantata
|
||||||
|
@ -46,15 +50,22 @@
|
||||||
pavucontrol
|
pavucontrol
|
||||||
spotify
|
spotify
|
||||||
ncmpcpp
|
ncmpcpp
|
||||||
|
mpdevil
|
||||||
|
squeezelite
|
||||||
|
mediainfo
|
||||||
|
mpc-cli
|
||||||
|
|
||||||
# Gaming
|
# Gaming
|
||||||
prismlauncher
|
#prismlauncher
|
||||||
heroic
|
heroic
|
||||||
|
#factorio
|
||||||
|
|
||||||
# System Tools
|
# System Tools
|
||||||
|
dig
|
||||||
borgbackup
|
borgbackup
|
||||||
dconf
|
dconf
|
||||||
dmenu
|
dmenu
|
||||||
|
rofi-wayland
|
||||||
grim
|
grim
|
||||||
light
|
light
|
||||||
screen
|
screen
|
||||||
|
@ -68,10 +79,14 @@
|
||||||
yubikey-manager
|
yubikey-manager
|
||||||
watchexec
|
watchexec
|
||||||
wine
|
wine
|
||||||
|
xdg-utils
|
||||||
xfce.thunar
|
xfce.thunar
|
||||||
gnome.nautilus
|
gnome.nautilus
|
||||||
nnn
|
nnn
|
||||||
|
|
||||||
|
niv
|
||||||
home-manager
|
home-manager
|
||||||
|
nix-index
|
||||||
|
|
||||||
gnome.evince
|
gnome.evince
|
||||||
gnome.gnome-characters
|
gnome.gnome-characters
|
||||||
|
@ -100,10 +115,11 @@
|
||||||
unzip
|
unzip
|
||||||
zip
|
zip
|
||||||
|
|
||||||
|
# Misc
|
||||||
php
|
php
|
||||||
python311
|
python311
|
||||||
python311Packages.i3ipc
|
python311Packages.i3ipc
|
||||||
ruby
|
kicad
|
||||||
];
|
];
|
||||||
|
|
||||||
shellAliases = {
|
shellAliases = {
|
||||||
|
@ -144,7 +160,9 @@
|
||||||
gf = "${pkgs.git}/bin/git fetch";
|
gf = "${pkgs.git}/bin/git fetch";
|
||||||
gfp = "${pkgs.git}/bin/git fetch --prune";
|
gfp = "${pkgs.git}/bin/git fetch --prune";
|
||||||
gl = "${pkgs.git}/bin/git pull";
|
gl = "${pkgs.git}/bin/git pull";
|
||||||
|
glr = "${pkgs.git}/bin/git pull --rebase";
|
||||||
gla = "${pkgs.git}/bin/git pull --autostash";
|
gla = "${pkgs.git}/bin/git pull --autostash";
|
||||||
|
glra = "${pkgs.git}/bin/git pull --rebase --autostash";
|
||||||
gp = "${pkgs.git}/bin/git push";
|
gp = "${pkgs.git}/bin/git push";
|
||||||
gpf = "${pkgs.git}/bin/git push --force-with-lease";
|
gpf = "${pkgs.git}/bin/git push --force-with-lease";
|
||||||
gr = "${pkgs.git}/bin/git reset";
|
gr = "${pkgs.git}/bin/git reset";
|
||||||
|
@ -157,8 +175,11 @@
|
||||||
tigs = "${pkgs.tig}/bin/tig status";
|
tigs = "${pkgs.tig}/bin/tig status";
|
||||||
oath = "${pkgs.yubikey-manager}/bin/ykman oath accounts code";
|
oath = "${pkgs.yubikey-manager}/bin/ykman oath accounts code";
|
||||||
|
|
||||||
dc = "${pkgs.docker-compose}/bin/docker-compose";
|
pc = "${pkgs.podman-compose}/bin/podman-compose";
|
||||||
dclf = "${pkgs.docker-compose}/bin/docker-compose logs --tail 100 -f";
|
pce = "${pkgs.podman-compose}/bin/podman-compose exec";
|
||||||
|
pclf = "${pkgs.podman-compose}/bin/podman-compose logs --tail 100 -f";
|
||||||
|
|
||||||
|
pr = "${pkgs.poetry}/bin/poetry run";
|
||||||
};
|
};
|
||||||
|
|
||||||
pointerCursor = {
|
pointerCursor = {
|
||||||
|
|
283
common/home-manager/programs.nix
Normal file
283
common/home-manager/programs.nix
Normal file
|
@ -0,0 +1,283 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
programs = {
|
||||||
|
bash = {
|
||||||
|
enable = true;
|
||||||
|
initExtra = ''
|
||||||
|
source ${pkgs.fetchurl {
|
||||||
|
url = "https://raw.githubusercontent.com/rupa/z/b82ac78a2d4457d2ca09973332638f123f065fd1/z.sh";
|
||||||
|
sha256 = "98e4438cd31afb3ce594130335e7fbd8be5d75d9a53e4f3e084d97e6b8d19b0e";
|
||||||
|
}}
|
||||||
|
|
||||||
|
# SSH agent
|
||||||
|
eval $(${pkgs.openssh}/bin/ssh-agent) > /dev/null
|
||||||
|
trap 'test -n "$SSH_AUTH_SOCK" && eval $(${pkgs.openssh}/bin/ssh-agent -k)' 0
|
||||||
|
'';
|
||||||
|
sessionVariables = {
|
||||||
|
PYTHON_KEYRING_BACKEND = "keyring.backends.null.Keyring";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
zsh = {
|
||||||
|
enable = true;
|
||||||
|
enableAutosuggestions = true;
|
||||||
|
enableSyntaxHighlighting = true;
|
||||||
|
prezto.enable = true;
|
||||||
|
autocd = true;
|
||||||
|
plugins = [
|
||||||
|
{
|
||||||
|
name = "zsh-nix-shell";
|
||||||
|
file = "nix-shell.plugin.zsh";
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "chisui";
|
||||||
|
repo = "zsh-nix-shell";
|
||||||
|
rev = "v0.5.0";
|
||||||
|
sha256 = "0za4aiwwrlawnia4f29msk822rj9bgcygw6a8a6iikiwzjjz0g91";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
initExtra = ''
|
||||||
|
source ${pkgs.fetchurl {
|
||||||
|
url = "https://raw.githubusercontent.com/agkozak/zsh-z/master/zsh-z.plugin.zsh";
|
||||||
|
sha256 = "8be9f089d8bb596a2679f9127f37276a8c1aeba9b5047456923d49eb2af61156";
|
||||||
|
}}
|
||||||
|
|
||||||
|
# SSH agent
|
||||||
|
eval $(${pkgs.openssh}/bin/ssh-agent) > /dev/null
|
||||||
|
trap 'test -n "$SSH_AUTH_SOCK" && eval $(${pkgs.openssh}/bin/ssh-agent -k)' 0
|
||||||
|
|
||||||
|
setopt rm_star_silent
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
firefox = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.firefox-wayland;
|
||||||
|
};
|
||||||
|
|
||||||
|
ncmpcpp = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
colors_enabled = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
foot = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
main = {
|
||||||
|
term = "xterm-256color";
|
||||||
|
font = "Iosevka:size=12";
|
||||||
|
};
|
||||||
|
|
||||||
|
colors = {
|
||||||
|
background = "fafafa";
|
||||||
|
foreground = "383a42";
|
||||||
|
|
||||||
|
regular0 = "383a42";
|
||||||
|
regular1 = "e45649";
|
||||||
|
regular2 = "50a14f";
|
||||||
|
regular3 = "c18401";
|
||||||
|
regular4 = "0184bc";
|
||||||
|
regular5 = "a626a4";
|
||||||
|
regular6 = "0997b3";
|
||||||
|
regular7 = "fafafa";
|
||||||
|
|
||||||
|
bright0 = "383a42";
|
||||||
|
bright1 = "e45649";
|
||||||
|
bright2 = "50a14f";
|
||||||
|
bright3 = "c18401";
|
||||||
|
bright4 = "0184bc";
|
||||||
|
bright5 = "a626a4";
|
||||||
|
bright6 = "0997b3";
|
||||||
|
bright7 = "fafafa";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
git = {
|
||||||
|
enable = true;
|
||||||
|
lfs.enable = true;
|
||||||
|
package = pkgs.gitAndTools.gitFull;
|
||||||
|
|
||||||
|
userName = "Sijmen";
|
||||||
|
userEmail = "me@sijman.nl";
|
||||||
|
|
||||||
|
signing = {
|
||||||
|
signByDefault = true;
|
||||||
|
key = "0xDAF7821E067D9C48";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfig = {
|
||||||
|
fetch.prune = true;
|
||||||
|
init.defaultBranch = "main";
|
||||||
|
pull.ff = "only";
|
||||||
|
push.autoSetupRemote = true;
|
||||||
|
safe.directory = [ "/etc/nixos" ];
|
||||||
|
core.editor = "vim";
|
||||||
|
|
||||||
|
alias = {
|
||||||
|
duw = "push";
|
||||||
|
vertakking = "branch";
|
||||||
|
tak = "branch";
|
||||||
|
schakel = "switch";
|
||||||
|
committeer = "commit";
|
||||||
|
voegtoe = "add";
|
||||||
|
afstand = "remote";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
mpv = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
script-opts = "ytdl_hook-ytdl_path=${pkgs.yt-dlp}/bin/yt-dlp";
|
||||||
|
profile = "gpu-hq";
|
||||||
|
hwdec = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
neovim = {
|
||||||
|
enable = true;
|
||||||
|
vimAlias = true;
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
luafile /etc/nixos/common/nvim.lua
|
||||||
|
'';
|
||||||
|
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
gcc
|
||||||
|
rnix-lsp
|
||||||
|
nodePackages.pyright
|
||||||
|
];
|
||||||
|
|
||||||
|
plugins = with pkgs.vimPlugins; [
|
||||||
|
bufferline-nvim
|
||||||
|
cmp-nvim-lsp
|
||||||
|
cmp_luasnip
|
||||||
|
ctrlp-vim
|
||||||
|
galaxyline-nvim
|
||||||
|
indentLine
|
||||||
|
leap-nvim
|
||||||
|
lualine-nvim
|
||||||
|
luasnip
|
||||||
|
markdown-preview-nvim
|
||||||
|
neorg
|
||||||
|
nvim-cmp
|
||||||
|
nvim-colorizer-lua
|
||||||
|
nvim-lspconfig
|
||||||
|
nvim-tree-lua
|
||||||
|
nvim-treesitter.withAllGrammars
|
||||||
|
nvim-web-devicons
|
||||||
|
onehalf
|
||||||
|
pears-nvim
|
||||||
|
plenary-nvim
|
||||||
|
vim-closetag
|
||||||
|
vim-nix
|
||||||
|
vim-startify
|
||||||
|
vim-startuptime
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
tmux = {
|
||||||
|
enable = true;
|
||||||
|
prefix = "C-a";
|
||||||
|
extraConfig = ''
|
||||||
|
set -g mouse on
|
||||||
|
set-option -g set-titles on
|
||||||
|
set-option -g set-titles-string "#W"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
yt-dlp = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
sponsorblock-mark = "sponsor,selfpromo,intro,outro,poi_highlight";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
waybar = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
beets = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
paths.default = "$albumartist/$year - $album%aunique{}/$track $title";
|
||||||
|
import.autotag = false;
|
||||||
|
plugins = [ "fetchart" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
ssh = {
|
||||||
|
enable = true;
|
||||||
|
matchBlocks = {
|
||||||
|
# Home
|
||||||
|
"rpi" = {
|
||||||
|
user = "sijmen";
|
||||||
|
hostname = "10.100.0.1";
|
||||||
|
identityFile = "/home/sijmen/.ssh/id_ed25519_plain";
|
||||||
|
};
|
||||||
|
"desktop" = {
|
||||||
|
user = "vijfhoek";
|
||||||
|
hostname = "192.168.1.99";
|
||||||
|
proxyJump = "cloud.sijmenschoon.nl";
|
||||||
|
};
|
||||||
|
"nas" = {
|
||||||
|
user = "sijmen";
|
||||||
|
hostname = "192.168.1.123";
|
||||||
|
proxyJump = "cloud.sijmenschoon.nl";
|
||||||
|
};
|
||||||
|
# Servers
|
||||||
|
"hermes" = {
|
||||||
|
user = "ubuntu";
|
||||||
|
hostname = "hermes.sijmenschoon.nl";
|
||||||
|
};
|
||||||
|
# Scintilla
|
||||||
|
"linscin" = {
|
||||||
|
user = "sijmens";
|
||||||
|
hostname = "linscin.scintilla.utwente.nl";
|
||||||
|
};
|
||||||
|
"britt" = {
|
||||||
|
user = "sijmens";
|
||||||
|
hostname = "britt.scintilla.utwente.nl";
|
||||||
|
proxyJump = "linscin";
|
||||||
|
};
|
||||||
|
"alexia" = {
|
||||||
|
user = "sijmens";
|
||||||
|
hostname = "alexia.scintilla.utwente.nl";
|
||||||
|
proxyJump = "linscin";
|
||||||
|
};
|
||||||
|
"*.scintilla.utwente.nl" = {
|
||||||
|
user = "sijmens";
|
||||||
|
};
|
||||||
|
"*.scintilla.nl" = {
|
||||||
|
user = "sijmens";
|
||||||
|
};
|
||||||
|
# Uni
|
||||||
|
"xoc2" = {
|
||||||
|
user = "s2639149";
|
||||||
|
hostname = "xoc2.ewi.utwente.nl";
|
||||||
|
proxyJump = "sijmens@linscin.scintilla.utwente.nl";
|
||||||
|
};
|
||||||
|
"noc2" = {
|
||||||
|
user = "s2639149";
|
||||||
|
hostname = "noc2.ewi.utwente.nl";
|
||||||
|
proxyJump = "sijmens@linscin.scintilla.utwente.nl";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
AddKeysToAgent 15m
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
alot.enable = true;
|
||||||
|
chromium.enable = true;
|
||||||
|
gpg.enable = true;
|
||||||
|
home-manager.enable = true;
|
||||||
|
mbsync.enable = true;
|
||||||
|
msmtp.enable = true;
|
||||||
|
password-store.enable = true;
|
||||||
|
};
|
||||||
|
}
|
34
common/home-manager/services.nix
Normal file
34
common/home-manager/services.nix
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{
|
||||||
|
services = {
|
||||||
|
gpg-agent = {
|
||||||
|
enable = true;
|
||||||
|
pinentryFlavor = "qt";
|
||||||
|
};
|
||||||
|
|
||||||
|
gnome-keyring = {
|
||||||
|
enable = true;
|
||||||
|
components = ["secrets" "ssh"];
|
||||||
|
};
|
||||||
|
|
||||||
|
mpd = {
|
||||||
|
enable = true;
|
||||||
|
musicDirectory = "/home/sijmen/Music";
|
||||||
|
extraConfig = ''
|
||||||
|
password "123@read,add,control,admin"
|
||||||
|
default_permissions ""
|
||||||
|
|
||||||
|
audio_output {
|
||||||
|
type "pulse"
|
||||||
|
name "pulse"
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
mako = {
|
||||||
|
enable = true;
|
||||||
|
font = "Ubuntu 11";
|
||||||
|
defaultTimeout = 5000;
|
||||||
|
groupBy = "app-name,summary";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
11
common/home-manager/systemd.nix
Normal file
11
common/home-manager/systemd.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
systemd.user.services = {
|
||||||
|
swaylock = {
|
||||||
|
Unit.Description = "Lock screen on suspend";
|
||||||
|
Service.ExecStart =
|
||||||
|
"${pkgs.swaylock}/bin/swaylock -c 000000 -i eDP-1:/home/sijmen/Pictures/vista32.jpg";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
88
common/home-manager/wayland.nix
Normal file
88
common/home-manager/wayland.nix
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
wayland.windowManager.sway = {
|
||||||
|
enable = true;
|
||||||
|
config = let
|
||||||
|
scintillaDellOutput = { pos = "0 0"; };
|
||||||
|
scintillaHpOutput = { pos = "0 120"; };
|
||||||
|
in rec {
|
||||||
|
modifier = "Mod4";
|
||||||
|
terminal = "foot";
|
||||||
|
fonts = {
|
||||||
|
names = [ "Ubuntu" ];
|
||||||
|
style = "Regular";
|
||||||
|
size = 11.0;
|
||||||
|
};
|
||||||
|
input = {
|
||||||
|
"type:touchpad" = {
|
||||||
|
natural_scroll = "enabled";
|
||||||
|
dwt = "disabled";
|
||||||
|
click_method = "clickfinger";
|
||||||
|
scroll_factor = "0.25";
|
||||||
|
};
|
||||||
|
"type:keyboard" = {
|
||||||
|
xkb_layout = "us,kr";
|
||||||
|
xkb_options = "grp:alt_caps_toggle";
|
||||||
|
};
|
||||||
|
"type:mouse" = {
|
||||||
|
accel_profile = "flat";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
output = {
|
||||||
|
"*" = {
|
||||||
|
bg = "~/Pictures/berg.jpg fill";
|
||||||
|
subpixel = "none";
|
||||||
|
};
|
||||||
|
"BOE 0x095F Unknown" = { pos = "92 1200"; scale = "1.3"; }; # framework
|
||||||
|
"Dell Inc. DELL U2410 F525M13318GL" = scintillaDellOutput; # bibi
|
||||||
|
"Dell Inc. DELL U2410 F525M12P08RL" = scintillaDellOutput; # fabienne
|
||||||
|
"Hewlett Packard HP E222 CNK6110ZM2" = scintillaHpOutput; # floortje
|
||||||
|
"Hewlett Packard HP E222 CNK6110ZM7" = scintillaHpOutput;
|
||||||
|
"Hewlett Packard HP E222 CNK6110ZMF" = scintillaHpOutput; # tamara
|
||||||
|
"Hewlett Packard HP E222 CNK6110ZMQ" = scintillaHpOutput; # patricia
|
||||||
|
"Hewlett Packard HP E222 CNK6110ZR8" = scintillaHpOutput; # megan
|
||||||
|
"Hewlett Packard HP E222 CNK611103Z" = scintillaHpOutput; # katy
|
||||||
|
"Hewlett Packard HP E222 CNK611104P" = scintillaHpOutput; # charissa
|
||||||
|
"Hewlett Packard HP E222 CNK611104X" = scintillaHpOutput;
|
||||||
|
"Hewlett Packard HP E222 CNK6111051" = scintillaHpOutput; # kim
|
||||||
|
"Hewlett Packard HP E222 CNK6111052" = scintillaHpOutput; # ilona
|
||||||
|
"Goldstar Company Ltd LG Ultra HD 0x00008520" = { mode = "2560x1440@60Hz"; }; # thuis rechts
|
||||||
|
"Dell Inc. DELL S2722DGM 3P84Z83" = { pos = "-228 -240"; mode = "2560x1440@144Hz"; }; # thuis links (hdmi)
|
||||||
|
};
|
||||||
|
keybindings = lib.mkOptionDefault {
|
||||||
|
XF86MonBrightnessDown = "exec ${pkgs.light}/bin/light -U 5";
|
||||||
|
XF86MonBrightnessUp = "exec ${pkgs.light}/bin/light -A 5";
|
||||||
|
"shift+XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 1";
|
||||||
|
"shift+XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 1";
|
||||||
|
XF86AudioRaiseVolume = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%'";
|
||||||
|
XF86AudioLowerVolume = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%'";
|
||||||
|
XF86AudioMute = "exec '${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle'";
|
||||||
|
Print = "exec '${pkgs.grim}/bin/grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | wl-copy -t image/png'";
|
||||||
|
"shift+Print" = "exec '${pkgs.grim}/bin/grim - | wl-copy -t image/png'";
|
||||||
|
|
||||||
|
"${modifier}+d" = "exec '${pkgs.rofi-wayland}/bin/rofi -show drun'";
|
||||||
|
"${modifier}+shift+b" = "exec '/etc/nixos/framework/dmenu-bluetooth --connected-icon'";
|
||||||
|
|
||||||
|
"${modifier}+alt+l" = "exec '${pkgs.swaylock}/bin/swaylock -c 000000 -i eDP-1:Pictures/vista32.jpg'";
|
||||||
|
"${modifier}+ctrl+Return" = "exec '${pkgs.gnome.nautilus}/bin/nautilus'";
|
||||||
|
|
||||||
|
"${modifier}+ctrl+Down" = "move workspace to down";
|
||||||
|
"${modifier}+ctrl+Up" = "move workspace to up";
|
||||||
|
"${modifier}+ctrl+Left" = "move workspace to left";
|
||||||
|
"${modifier}+ctrl+Right" = "move workspace to right";
|
||||||
|
"${modifier}+ctrl+j" = "move workspace to down";
|
||||||
|
"${modifier}+ctrl+k" = "move workspace to up";
|
||||||
|
"${modifier}+ctrl+h" = "move workspace to left";
|
||||||
|
"${modifier}+ctrl+l" = "move workspace to right";
|
||||||
|
|
||||||
|
"${modifier}+ctrl+f" = "exec '${pkgs.python3}/bin/python /etc/nixos/common/sway/next_free.py | xargs swaymsg -- workspace number'";
|
||||||
|
"${modifier}+comma" = "workspace prev_on_output";
|
||||||
|
"${modifier}+period" = "workspace next_on_output";
|
||||||
|
};
|
||||||
|
startup = [
|
||||||
|
{ command = "/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -9,6 +9,8 @@ vim.cmd [[
|
||||||
autocmd Filetype json
|
autocmd Filetype json
|
||||||
\ let g:indentLine_setConceal = 0 |
|
\ let g:indentLine_setConceal = 0 |
|
||||||
\ let g:vim_json_syntax_conceal = 0
|
\ let g:vim_json_syntax_conceal = 0
|
||||||
|
|
||||||
|
let g:ctrlp_user_command = ['.git/', 'git --git-dir=%s/.git ls-files -oc --exclude-standard']
|
||||||
]]
|
]]
|
||||||
|
|
||||||
g.mapleader = ' '
|
g.mapleader = ' '
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
{ config, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
let
|
let
|
||||||
|
sources = import ./sources.nix;
|
||||||
|
#lanzaboote = import sources.lanzaboote;
|
||||||
greetdSwayConfig = pkgs.writeText "greetd-sway-config" ''
|
greetdSwayConfig = pkgs.writeText "greetd-sway-config" ''
|
||||||
# `-l` activates layer-shell mode. Notice that `swaymsg exit` will run after gtkgreet.
|
# `-l` activates layer-shell mode. Notice that `swaymsg exit` will run after gtkgreet.
|
||||||
exec "${pkgs.greetd.gtkgreet}/bin/gtkgreet -l -c sway; swaymsg exit"
|
exec "${pkgs.greetd.gtkgreet}/bin/gtkgreet -l -c sway; swaymsg exit"
|
||||||
|
@ -15,15 +17,15 @@ in
|
||||||
imports = [
|
imports = [
|
||||||
<nixos-hardware/framework/12th-gen-intel>
|
<nixos-hardware/framework/12th-gen-intel>
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
|
#lanzaboote.nixosModules.lanzaboote
|
||||||
../common/configuration.nix
|
../common/configuration.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
virtualisation = {
|
virtualisation = {
|
||||||
virtualisation.docker.enable = true;
|
#podman.enable = true;
|
||||||
virtualisation.libvirtd.enable = true;
|
#podman.dockerCompat = true;
|
||||||
virtualisation.spiceUSBRedirection.enable = true;
|
# libvirtd.enable = true;
|
||||||
#virtualisation.waydroid.enable = true;
|
# spiceUSBRedirection.enable = true;
|
||||||
#virtualisation.lxd.enable = true;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
hardware = {
|
hardware = {
|
||||||
|
@ -37,6 +39,8 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
|
#bootspec.enable = false;
|
||||||
|
|
||||||
loader = {
|
loader = {
|
||||||
efi.canTouchEfiVariables = true;
|
efi.canTouchEfiVariables = true;
|
||||||
|
|
||||||
|
@ -47,13 +51,18 @@ in
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#lanzaboote = {
|
||||||
|
# enable = false;
|
||||||
|
# pkiBundle = "/etc/secureboot";
|
||||||
|
#};
|
||||||
|
|
||||||
kernelPackages = pkgs.linuxPackages_latest;
|
kernelPackages = pkgs.linuxPackages_latest;
|
||||||
kernelParams = [
|
kernelParams = [
|
||||||
"quiet"
|
"quiet"
|
||||||
"splash"
|
"splash"
|
||||||
"vga=current"
|
"vga=current"
|
||||||
"udev.log_level=3"
|
"udev.log_level=3"
|
||||||
"i915.enable_psr=1"
|
"i915.enable_psr=2"
|
||||||
"nvme.noacpi=1"
|
"nvme.noacpi=1"
|
||||||
"resume=/dev/disk/by-uuid/7e88d61f-5581-45fb-82f1-29a0e0caf4c0"
|
"resume=/dev/disk/by-uuid/7e88d61f-5581-45fb-82f1-29a0e0caf4c0"
|
||||||
];
|
];
|
||||||
|
@ -70,7 +79,10 @@ in
|
||||||
|
|
||||||
networking = {
|
networking = {
|
||||||
hostName = "sijmen-framework";
|
hostName = "sijmen-framework";
|
||||||
networkmanager.enable = true;
|
networkmanager = {
|
||||||
|
enable = true;
|
||||||
|
unmanaged = [ "wg0" "virbr0" ];
|
||||||
|
};
|
||||||
firewall = {
|
firewall = {
|
||||||
allowedTCPPorts = [
|
allowedTCPPorts = [
|
||||||
22 # ssh
|
22 # ssh
|
||||||
|
@ -96,10 +108,16 @@ in
|
||||||
peers = [{
|
peers = [{
|
||||||
publicKey = "zu9vXxxg4wm0R4yWQ2HPaAwJbizuccGYbBB/StwSsm4=";
|
publicKey = "zu9vXxxg4wm0R4yWQ2HPaAwJbizuccGYbBB/StwSsm4=";
|
||||||
allowedIPs = [ "10.100.0.0/24" ];
|
allowedIPs = [ "10.100.0.0/24" ];
|
||||||
endpoint = "143.178.219.107:51820";
|
endpoint = "cloud.sijmenschoon.nl:51820";
|
||||||
persistentKeepalive = 25;
|
persistentKeepalive = 25;
|
||||||
}];
|
}];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extraHosts = ''
|
||||||
|
#127.0.0.3 youtube.com
|
||||||
|
#127.0.0.3 www.youtube.com
|
||||||
|
#127.0.0.3 i.ytimg.com
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.etc."greetd/environments".text = ''
|
environment.etc."greetd/environments".text = ''
|
||||||
|
@ -141,9 +159,22 @@ in
|
||||||
tlp = {
|
tlp = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
CPU_ENERGY_PERF_POLICY_ON_AC = "64";
|
INTEL_GPU_MIN_FREQ_ON_AC = "100";
|
||||||
CPU_ENERGY_PERF_POLICY_ON_BAT = "140";
|
INTEL_GPU_MIN_FREQ_ON_BAT = "100";
|
||||||
|
|
||||||
PCIE_ASPM_ON_BAT = "powersupersave";
|
PCIE_ASPM_ON_BAT = "powersupersave";
|
||||||
|
RUNTIME_PM_ON_BAT = "1";
|
||||||
|
|
||||||
|
CPU_ENERGY_PERF_POLICY_ON_AC = "64";
|
||||||
|
CPU_ENERGY_PERF_POLICY_ON_BAT = "balance_power";
|
||||||
|
CPU_BOOST_ON_BAT = "0";
|
||||||
|
CPU_HWP_DYN_BOOST_ON_BAT = "0";
|
||||||
|
SCHED_POWERSAVE_ON_BAT = "1";
|
||||||
|
NMI_WATCHDOG = "0";
|
||||||
|
|
||||||
|
USB_AUTOSUSPEND = "1";
|
||||||
|
USB_EXCLUDE_AUDIO = "1";
|
||||||
|
USB_EXCLUDE_BTUSB = "0";
|
||||||
|
|
||||||
# Bus 001 Device 040: ID 1050:0407 Yubico.com Yubikey 4/5 OTP+U2F+CCID
|
# Bus 001 Device 040: ID 1050:0407 Yubico.com Yubikey 4/5 OTP+U2F+CCID
|
||||||
# Bus 001 Device 038: ID 32ac:0002 Framework HDMI Expansion Card
|
# Bus 001 Device 038: ID 32ac:0002 Framework HDMI Expansion Card
|
||||||
|
@ -164,37 +195,24 @@ in
|
||||||
power-profiles-daemon.enable = false;
|
power-profiles-daemon.enable = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
security.pam.services.login.fprintAuth = true;
|
security = {
|
||||||
security.pam.services.swaylock = {};
|
pam.services.login.fprintAuth = true;
|
||||||
security.polkit.enable = true;
|
pam.services.swaylock = {};
|
||||||
|
polkit.enable = true;
|
||||||
environment = {
|
|
||||||
gnome.excludePackages = (with pkgs; [
|
|
||||||
gnome-photos
|
|
||||||
gnome-tour
|
|
||||||
]) ++ (with pkgs.gnome; [
|
|
||||||
atomix # puzzle game
|
|
||||||
cheese # webcam
|
|
||||||
epiphany # web browser
|
|
||||||
geary # email reader
|
|
||||||
gnome-calendar
|
|
||||||
gnome-music
|
|
||||||
hitori # sudoku game
|
|
||||||
iagno # go game
|
|
||||||
tali # poker game
|
|
||||||
totem # video player
|
|
||||||
]);
|
|
||||||
|
|
||||||
systemPackages = with pkgs; [
|
|
||||||
gnome.adwaita-icon-theme
|
|
||||||
ifuse
|
|
||||||
libimobiledevice
|
|
||||||
libheif
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
gnome.adwaita-icon-theme
|
||||||
|
ifuse
|
||||||
|
libimobiledevice
|
||||||
|
libheif
|
||||||
|
sbctl
|
||||||
|
polkit
|
||||||
|
polkit_gnome
|
||||||
|
];
|
||||||
|
|
||||||
programs.steam = {
|
programs.steam = {
|
||||||
enable = true;
|
#enable = true;
|
||||||
remotePlay.openFirewall = true;
|
remotePlay.openFirewall = true;
|
||||||
dedicatedServer.openFirewall = true;
|
dedicatedServer.openFirewall = true;
|
||||||
};
|
};
|
||||||
|
@ -203,10 +221,22 @@ in
|
||||||
packageOverrides = pkgs: {
|
packageOverrides = pkgs: {
|
||||||
vaapiIntel = pkgs.vaapiIntel.override { enableHybridCodec = true; };
|
vaapiIntel = pkgs.vaapiIntel.override { enableHybridCodec = true; };
|
||||||
};
|
};
|
||||||
permittedInsecurePackages = [ "electron-18.1.0" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
home-manager.users.sijmen.imports = [ ../common/dconf.nix ];
|
#home-manager.users.sijmen.imports = [ ../common/dconf.nix ];
|
||||||
|
|
||||||
|
systemd.services."suspend" = {
|
||||||
|
enable = true;
|
||||||
|
# TODO Should be `before`, but then fingerprint reader doesn't work
|
||||||
|
after = [ "suspend.target" ];
|
||||||
|
wantedBy = [ "suspend.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
# TODO Make username agnostic
|
||||||
|
ExecStart =
|
||||||
|
"${pkgs.systemd}/bin/systemctl --user --machine=sijmen@ start --wait swaylock";
|
||||||
|
Type = "oneshot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
system.stateVersion = "22.05";
|
system.stateVersion = "22.05";
|
||||||
}
|
}
|
||||||
|
|
357
framework/dmenu-bluetooth
Executable file
357
framework/dmenu-bluetooth
Executable file
|
@ -0,0 +1,357 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# _ _ _ _ _ _
|
||||||
|
# __| |_ __ ___ ___ _ __ _ _ | |__ | |_ _ ___| |_ ___ ___ | |_ | |__
|
||||||
|
# / _` | '_ ` _ \ / _ \ '_ \| | | |_____| '_ \| | | | |/ _ \ __/ _ \ / _ \| __|| '_ \
|
||||||
|
# | (_| | | | | | | __/ | | | |_| |_____| |_) | | |_| | __/ || (_) | (_) | |_ | | | |
|
||||||
|
# \__,_|_| |_| |_|\___|_| |_|\__,_| |_.__/|_|\__,_|\___|\__\___/ \___/ \__||_| |_|
|
||||||
|
#
|
||||||
|
# Author: Nick Clyde (clydedroid)
|
||||||
|
# dmenu support by: Layerex
|
||||||
|
#
|
||||||
|
# A script that generates a dmenu menu that uses bluetoothctl to
|
||||||
|
# connect to bluetooth devices and display status info.
|
||||||
|
#
|
||||||
|
# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu)
|
||||||
|
# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl)
|
||||||
|
#
|
||||||
|
# Depends on:
|
||||||
|
# Arch repositories: dmenu, bluez-utils (contains bluetoothctl)
|
||||||
|
|
||||||
|
# Constants
|
||||||
|
divider="---------"
|
||||||
|
goback="Back"
|
||||||
|
connected_icon=""
|
||||||
|
|
||||||
|
# Checks if bluetooth controller is powered on
|
||||||
|
power_on() {
|
||||||
|
if bluetoothctl show | grep -F -q "Powered: yes"; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles power state
|
||||||
|
toggle_power() {
|
||||||
|
if power_on; then
|
||||||
|
bluetoothctl power off
|
||||||
|
show_menu
|
||||||
|
else
|
||||||
|
if rfkill list bluetooth | grep -F -q 'blocked: yes'; then
|
||||||
|
rfkill unblock bluetooth && sleep 3
|
||||||
|
fi
|
||||||
|
bluetoothctl power on
|
||||||
|
show_menu
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if controller is scanning for new devices
|
||||||
|
scan_on() {
|
||||||
|
if bluetoothctl show | grep -F -q "Discovering: yes"; then
|
||||||
|
echo "Scan: on"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Scan: off"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles scanning state
|
||||||
|
toggle_scan() {
|
||||||
|
if scan_on; then
|
||||||
|
kill $(pgrep -f "bluetoothctl scan on")
|
||||||
|
bluetoothctl scan off
|
||||||
|
show_menu
|
||||||
|
else
|
||||||
|
bluetoothctl scan on &
|
||||||
|
echo "Scanning..."
|
||||||
|
sleep 5
|
||||||
|
show_menu
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if controller is able to pair to devices
|
||||||
|
pairable_on() {
|
||||||
|
if bluetoothctl show | grep -F -q "Pairable: yes"; then
|
||||||
|
echo "Pairable: on"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Pairable: off"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles pairable state
|
||||||
|
toggle_pairable() {
|
||||||
|
if pairable_on; then
|
||||||
|
bluetoothctl pairable off
|
||||||
|
show_menu
|
||||||
|
else
|
||||||
|
bluetoothctl pairable on
|
||||||
|
show_menu
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if controller is discoverable by other devices
|
||||||
|
discoverable_on() {
|
||||||
|
if bluetoothctl show | grep -F -q "Discoverable: yes"; then
|
||||||
|
echo "Discoverable: on"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Discoverable: off"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles discoverable state
|
||||||
|
toggle_discoverable() {
|
||||||
|
if discoverable_on; then
|
||||||
|
bluetoothctl discoverable off
|
||||||
|
show_menu
|
||||||
|
else
|
||||||
|
bluetoothctl discoverable on
|
||||||
|
show_menu
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if a device is connected
|
||||||
|
device_connected() {
|
||||||
|
device_info=$(bluetoothctl info "$1")
|
||||||
|
if echo "$device_info" | grep -F -q "Connected: yes"; then
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles device connection
|
||||||
|
toggle_connection() {
|
||||||
|
if device_connected "$1"; then
|
||||||
|
bluetoothctl disconnect "$1"
|
||||||
|
# device_menu "$device"
|
||||||
|
else
|
||||||
|
bluetoothctl connect "$1"
|
||||||
|
# device_menu "$device"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if a device is paired
|
||||||
|
device_paired() {
|
||||||
|
device_info=$(bluetoothctl info "$1")
|
||||||
|
if echo "$device_info" | grep -F -q "Paired: yes"; then
|
||||||
|
echo "Paired: yes"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Paired: no"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles device paired state
|
||||||
|
toggle_paired() {
|
||||||
|
if device_paired "$1"; then
|
||||||
|
bluetoothctl remove "$1"
|
||||||
|
device_menu "$device"
|
||||||
|
else
|
||||||
|
bluetoothctl pair "$1"
|
||||||
|
device_menu "$device"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Checks if a device is trusted
|
||||||
|
device_trusted() {
|
||||||
|
device_info=$(bluetoothctl info "$1")
|
||||||
|
if echo "$device_info" | grep -F -q "Trusted: yes"; then
|
||||||
|
echo "Trusted: yes"
|
||||||
|
return 0
|
||||||
|
else
|
||||||
|
echo "Trusted: no"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Toggles device connection
|
||||||
|
toggle_trust() {
|
||||||
|
if device_trusted "$1"; then
|
||||||
|
bluetoothctl untrust "$1"
|
||||||
|
device_menu "$device"
|
||||||
|
else
|
||||||
|
bluetoothctl trust "$1"
|
||||||
|
device_menu "$device"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prints a short string with the current bluetooth status
|
||||||
|
# Useful for status bars like polybar, etc.
|
||||||
|
print_status() {
|
||||||
|
if power_on; then
|
||||||
|
printf ''
|
||||||
|
|
||||||
|
mapfile -t paired_devices < <(bluetoothctl paired-devices | grep -F Device | cut -d ' ' -f 2)
|
||||||
|
counter=0
|
||||||
|
|
||||||
|
for device in "${paired_devices[@]}"; do
|
||||||
|
if device_connected "$device"; then
|
||||||
|
device_alias="$(bluetoothctl info "$device" | grep -F "Alias" | cut -d ' ' -f 2-)"
|
||||||
|
|
||||||
|
if [ $counter -gt 0 ]; then
|
||||||
|
printf ", %s" "$device_alias"
|
||||||
|
else
|
||||||
|
printf " %s" "$device_alias"
|
||||||
|
fi
|
||||||
|
|
||||||
|
((counter++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
printf "\n"
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# A submenu for a specific device that allows connecting, pairing, and trusting
|
||||||
|
device_menu() {
|
||||||
|
device=$1
|
||||||
|
|
||||||
|
# Get device name and mac address
|
||||||
|
device_name="$(echo "$device" | cut -d ' ' -f 3-)"
|
||||||
|
mac="$(echo "$device" | cut -d ' ' -f 2)"
|
||||||
|
|
||||||
|
# Build options
|
||||||
|
if device_connected "$mac"; then
|
||||||
|
connected="Connected: yes"
|
||||||
|
else
|
||||||
|
connected="Connected: no"
|
||||||
|
fi
|
||||||
|
paired=$(device_paired "$mac")
|
||||||
|
trusted=$(device_trusted "$mac")
|
||||||
|
options="$connected\n$paired\n$trusted\n$divider\n$goback\nExit"
|
||||||
|
|
||||||
|
# Open dmenu menu, read chosen option
|
||||||
|
chosen="$(echo -e "$options" | run_dmenu "$device_name")"
|
||||||
|
|
||||||
|
# Match chosen option to command
|
||||||
|
case $chosen in
|
||||||
|
"" | "$divider")
|
||||||
|
echo "No option chosen."
|
||||||
|
;;
|
||||||
|
"$connected")
|
||||||
|
toggle_connection "$mac"
|
||||||
|
;;
|
||||||
|
"$paired")
|
||||||
|
toggle_paired "$mac"
|
||||||
|
;;
|
||||||
|
"$trusted")
|
||||||
|
toggle_trust "$mac"
|
||||||
|
;;
|
||||||
|
"$goback")
|
||||||
|
show_menu
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Opens a dmenu menu with current bluetooth status and options to connect
|
||||||
|
show_menu() {
|
||||||
|
# Get menu options
|
||||||
|
if power_on; then
|
||||||
|
power="Power: on"
|
||||||
|
|
||||||
|
# Human-readable names of devices, one per line
|
||||||
|
# If scan is off, will only list paired devices
|
||||||
|
if [[ -n $connected_icon ]]; then
|
||||||
|
devices=$(bluetoothctl devices | grep -F Device | while read -r device; do
|
||||||
|
device_name="$(echo "$device" | cut -d ' ' -f 3-)"
|
||||||
|
mac="$(echo "$device" | cut -d ' ' -f 2)"
|
||||||
|
icon=""
|
||||||
|
|
||||||
|
if device_connected "$mac" && [[ -n $connected_icon ]]; then
|
||||||
|
icon=" $connected_icon"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$device_name${icon}"
|
||||||
|
done)
|
||||||
|
else
|
||||||
|
devices=$(bluetoothctl devices | grep -F Device | cut -d ' ' -f 3-)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get controller flags
|
||||||
|
scan=$(scan_on)
|
||||||
|
pairable=$(pairable_on)
|
||||||
|
discoverable=$(discoverable_on)
|
||||||
|
|
||||||
|
# Options passed to dmenu
|
||||||
|
options="$devices\n$divider\n$power\n$scan\n$pairable\n$discoverable\nExit"
|
||||||
|
else
|
||||||
|
power="Power: off"
|
||||||
|
options="$power\nExit"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Open dmenu menu, read chosen option
|
||||||
|
chosen="$(echo -e "$options" | run_dmenu "Bluetooth")"
|
||||||
|
|
||||||
|
# Match chosen option to command
|
||||||
|
case $chosen in
|
||||||
|
"" | "$divider")
|
||||||
|
echo "No option chosen."
|
||||||
|
;;
|
||||||
|
"$power")
|
||||||
|
toggle_power
|
||||||
|
;;
|
||||||
|
"$scan")
|
||||||
|
toggle_scan
|
||||||
|
;;
|
||||||
|
"$discoverable")
|
||||||
|
toggle_discoverable
|
||||||
|
;;
|
||||||
|
"$pairable")
|
||||||
|
toggle_pairable
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [[ -n $connected_icon ]]; then
|
||||||
|
chosen="${chosen%% ${connected_icon}}"
|
||||||
|
fi
|
||||||
|
device=$(bluetoothctl devices | grep -F "$chosen")
|
||||||
|
# Open a submenu if a device is selected
|
||||||
|
if [[ $device ]]; then device_menu "$device"; fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
original_args=("$@")
|
||||||
|
|
||||||
|
# dmenu command to pipe into. Extra arguments to dmenu-bluetooth are passed through to dmenu. This
|
||||||
|
# allows the user to set fonts, sizes, colours, etc.
|
||||||
|
run_dmenu() {
|
||||||
|
rofi -dmenu "${original_args[@]}" -i -p "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_help() {
|
||||||
|
echo "usage: $0 [--help] [--status] [--connected-icon [ICON]]"
|
||||||
|
echo ""
|
||||||
|
echo "A script that generates a dmenu menu that uses bluetoothctl to connect to bluetooth devices and display status info."
|
||||||
|
echo ""
|
||||||
|
echo "options:"
|
||||||
|
echo "--help show this help message and exit"
|
||||||
|
echo "--connected-icon [ICON] add icon on device list next to connected devices"
|
||||||
|
echo "--status print a short string about current bluetooth status and exit"
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
--help)
|
||||||
|
print_help
|
||||||
|
;;
|
||||||
|
--connected-icon)
|
||||||
|
if [[ -z $2 ]]; then
|
||||||
|
connected_icon=""
|
||||||
|
else
|
||||||
|
connected_icon="$2"
|
||||||
|
fi
|
||||||
|
show_menu
|
||||||
|
;;
|
||||||
|
--status)
|
||||||
|
print_status
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
show_menu
|
||||||
|
;;
|
||||||
|
esac
|
309
framework/nmcli_dmenu
Executable file
309
framework/nmcli_dmenu
Executable file
|
@ -0,0 +1,309 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
"""NetworkManager command line dmenu script.
|
||||||
|
|
||||||
|
To add new connections or enable/disable networking requires policykit
|
||||||
|
permissions setup per:
|
||||||
|
https://wiki.archlinux.org/index.php/NetworkManager#Set_up_PolicyKit_permissions
|
||||||
|
|
||||||
|
OR running the script as root
|
||||||
|
|
||||||
|
Add dmenu formatting options and default terminal if desired to
|
||||||
|
~/.config/networkmanager-dmenu/config.ini
|
||||||
|
|
||||||
|
"""
|
||||||
|
import itertools
|
||||||
|
from os.path import expanduser
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
import sys
|
||||||
|
try:
|
||||||
|
import configparser as configparser
|
||||||
|
except ImportError:
|
||||||
|
import ConfigParser as configparser
|
||||||
|
|
||||||
|
|
||||||
|
def dmenu_cmd(num_lines, prompt="Networks"):
|
||||||
|
"""Parse config.ini if it exists and add options to the dmenu command
|
||||||
|
|
||||||
|
Args: args - num_lines: number of lines to display
|
||||||
|
prompt: prompt to show
|
||||||
|
Returns: command invocation (as a list of strings) for
|
||||||
|
dmenu -l <num_lines> -p <prompt> -i ...
|
||||||
|
|
||||||
|
"""
|
||||||
|
return ["rofi", "-dmenu", "-i", "-l", str(num_lines), "-p", str(prompt)]
|
||||||
|
|
||||||
|
|
||||||
|
def choose_adapter():
|
||||||
|
"""If there is more than one wifi adapter installed, ask which one to use
|
||||||
|
|
||||||
|
"""
|
||||||
|
adps = ["nmcli", "device", "status"]
|
||||||
|
a = Popen(adps, stdout=PIPE).communicate()[0].decode().split('\n')
|
||||||
|
all_adps = [i.split()[0] for i in a if 'wifi' in i]
|
||||||
|
if len(all_adps) <= 1:
|
||||||
|
return all_adps[0].strip()
|
||||||
|
all_adps_bytes = "\n".join(all_adps).encode()
|
||||||
|
sel = Popen(dmenu_cmd(len(all_adps), "CHOOSE ADAPTER:"),
|
||||||
|
stdin=PIPE,
|
||||||
|
stdout=PIPE).communicate(input=all_adps_bytes)[0].decode()
|
||||||
|
if not sel.strip():
|
||||||
|
sys.exit()
|
||||||
|
return sel.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def current_conns():
|
||||||
|
"""Get list of current NetworkManager connections (ssid:security)
|
||||||
|
|
||||||
|
Returns: list of strings: ['firecat4153:WPA2', 'firecat4153x:WEP'...]
|
||||||
|
|
||||||
|
"""
|
||||||
|
conns = ["nmcli", "-t", "-f", "name,type", "connection"]
|
||||||
|
return Popen(conns, stdout=PIPE).communicate()[0].decode().split('\n')
|
||||||
|
|
||||||
|
|
||||||
|
def current_ssids(adapter):
|
||||||
|
"""Get list of current SSIDs seen by NetworkManager and order by signal
|
||||||
|
strength
|
||||||
|
|
||||||
|
Returns: list -
|
||||||
|
["firecat4153:WPA2","firecat4153-guest:", "firecat4153x:WPA2"]
|
||||||
|
|
||||||
|
"""
|
||||||
|
scan = ["nmcli", "-t", "-f", "ssid,security,signal",
|
||||||
|
"device", "wifi", "list", "ifname", adapter]
|
||||||
|
res = Popen(scan, stdout=PIPE).communicate()[0].decode().split("\n")
|
||||||
|
del res[-1]
|
||||||
|
res = [i.rsplit(':', 1) for i in res]
|
||||||
|
res = sorted(res, key=lambda x: x[1], reverse=True)
|
||||||
|
res = unique_ssid(res)
|
||||||
|
return [i[0].replace("'", "") for i in res]
|
||||||
|
|
||||||
|
|
||||||
|
def unique_ssid(conns):
|
||||||
|
"""Filters the list of ids, so that duplicate ids will only show the one
|
||||||
|
with the greatest strength. The list of ssids is already sorted by strength
|
||||||
|
so this just deletes any duplicates after the first item.
|
||||||
|
|
||||||
|
"""
|
||||||
|
ssids = []
|
||||||
|
for conn in conns:
|
||||||
|
if conn[0] in ssids:
|
||||||
|
del conns[conns.index(conn)]
|
||||||
|
else:
|
||||||
|
ssids.append(conn[0])
|
||||||
|
return conns
|
||||||
|
|
||||||
|
|
||||||
|
def vpn_connections(conns):
|
||||||
|
"""Parse list of current connections for VPNs
|
||||||
|
|
||||||
|
Args: conns - ['ssid:security', 'firecat4153:WPA2', ...]
|
||||||
|
Returns: list of VPN connection names ['pia_us_west',...]
|
||||||
|
|
||||||
|
"""
|
||||||
|
conns = [i.split(':') for i in conns if i]
|
||||||
|
return [i[0] for i in conns if i and 'vpn' in i[1]]
|
||||||
|
|
||||||
|
|
||||||
|
def get_network_status():
|
||||||
|
"""Get current status of networking
|
||||||
|
|
||||||
|
Returns: string 'Enable' or 'Disable',
|
||||||
|
|
||||||
|
"""
|
||||||
|
stat = ["nmcli", "networking"]
|
||||||
|
res = Popen(stat, stdout=PIPE).communicate()[0]
|
||||||
|
if 'enabled' in res.decode():
|
||||||
|
return 'Disable'
|
||||||
|
else:
|
||||||
|
return 'Enable'
|
||||||
|
|
||||||
|
|
||||||
|
def get_active_connections():
|
||||||
|
"""Get currently active connections
|
||||||
|
|
||||||
|
Returns: list of strings
|
||||||
|
|
||||||
|
"""
|
||||||
|
status = ["nmcli", "-t", "-f", "name", "connection",
|
||||||
|
"show", "--active"]
|
||||||
|
active = Popen(status, stdout=PIPE).communicate()[0]
|
||||||
|
active = active.decode().split('\n')
|
||||||
|
del active[-1]
|
||||||
|
return active
|
||||||
|
|
||||||
|
|
||||||
|
def mark_active(conns, active):
|
||||||
|
"""Given a list of connections, mark currently active connections
|
||||||
|
|
||||||
|
Args: conns - list of strings
|
||||||
|
Returns: list of strings (active prepended with a '**')
|
||||||
|
|
||||||
|
"""
|
||||||
|
conn_t = [i.rsplit(":", 1)[0] for i in conns]
|
||||||
|
act = [i for i in conn_t if i and i in active]
|
||||||
|
for i, conn in enumerate(conn_t):
|
||||||
|
if conn in act:
|
||||||
|
conns[i] = "**{}".format(conns[i])
|
||||||
|
return conns
|
||||||
|
|
||||||
|
|
||||||
|
def other_actions():
|
||||||
|
"""Return list of other actions that can be taken
|
||||||
|
|
||||||
|
"""
|
||||||
|
return ["{} Networking".format(get_network_status()),
|
||||||
|
"Launch Connection Manager"]
|
||||||
|
|
||||||
|
|
||||||
|
def get_selection(ssids, vpns, other):
|
||||||
|
"""Combine the arg lists and send to dmenu for selection.
|
||||||
|
|
||||||
|
Args: args - ssids: list of strings
|
||||||
|
vpns: list of strings
|
||||||
|
other: list of strings
|
||||||
|
Returns: selection (string)
|
||||||
|
|
||||||
|
"""
|
||||||
|
active = get_active_connections()
|
||||||
|
vpns = ["{}:VPN".format(i) for i in vpns]
|
||||||
|
inp = mark_active(ssids, active) + [""] + \
|
||||||
|
mark_active(vpns, active) + [""] + other
|
||||||
|
inp_bytes = "\n".join(inp).encode()
|
||||||
|
sel = Popen(dmenu_cmd(len(inp)),
|
||||||
|
stdin=PIPE,
|
||||||
|
stdout=PIPE).communicate(input=inp_bytes)[0].decode()
|
||||||
|
if not sel.strip():
|
||||||
|
sys.exit()
|
||||||
|
return sel.strip()
|
||||||
|
|
||||||
|
|
||||||
|
def toggle_existing(conn):
|
||||||
|
"""Get conn status, then toggle connection up or down if it's not
|
||||||
|
'activated'
|
||||||
|
|
||||||
|
Args: conn - string
|
||||||
|
|
||||||
|
"""
|
||||||
|
conn_status = ["nmcli", "-t", "-f", "GENERAL", "connection", "show", conn]
|
||||||
|
res = Popen(conn_status, stdout=PIPE).communicate()[0]
|
||||||
|
if 'activated' not in res.decode():
|
||||||
|
updown = 'up'
|
||||||
|
else:
|
||||||
|
updown = 'down'
|
||||||
|
conn_string = ["nmcli", "connection", updown, "id", conn]
|
||||||
|
Popen(conn_string, stdout=PIPE).communicate()
|
||||||
|
|
||||||
|
|
||||||
|
def toggle_networking(sel):
|
||||||
|
"""Enable/disable networking
|
||||||
|
|
||||||
|
Args: sel - string ('Enable Networking' or 'Disable Networking')
|
||||||
|
|
||||||
|
"""
|
||||||
|
if sel.startswith('Enable'):
|
||||||
|
updown = 'on'
|
||||||
|
else:
|
||||||
|
updown = 'off'
|
||||||
|
net = ["nmcli", "networking", updown]
|
||||||
|
Popen(net, stdout=PIPE).communicate()
|
||||||
|
|
||||||
|
|
||||||
|
def launch_connection_editor():
|
||||||
|
"""Launch nmtui or the gui nm-connection-editor
|
||||||
|
|
||||||
|
"""
|
||||||
|
conf = configparser.ConfigParser()
|
||||||
|
terminal = "xterm"
|
||||||
|
gui_if_available = "True"
|
||||||
|
conf.read(expanduser("~/.config/networkmanager-dmenu/config.ini"))
|
||||||
|
try:
|
||||||
|
editor = conf.items("editor")
|
||||||
|
except configparser.NoSectionError:
|
||||||
|
conf = False
|
||||||
|
if conf:
|
||||||
|
opts = {str(k): str(v) for (k, v) in editor}
|
||||||
|
if "terminal" in opts:
|
||||||
|
terminal = opts["terminal"]
|
||||||
|
if "gui_if_available" in opts:
|
||||||
|
gui_if_available = opts["gui_if_available"]
|
||||||
|
if gui_if_available == "True":
|
||||||
|
try:
|
||||||
|
Popen(["nm-connection-editor"]).communicate()
|
||||||
|
except OSError:
|
||||||
|
Popen([terminal, "-e", "nmtui"]).communicate()
|
||||||
|
else:
|
||||||
|
Popen([terminal, "-e", "nmtui"]).communicate()
|
||||||
|
|
||||||
|
|
||||||
|
def get_passphrase():
|
||||||
|
"""Get a password
|
||||||
|
|
||||||
|
Returns: string
|
||||||
|
|
||||||
|
"""
|
||||||
|
return Popen(dmenu_cmd(0, "Passphrase"),
|
||||||
|
stdin=PIPE, stdout=PIPE).communicate()[0].decode()
|
||||||
|
|
||||||
|
|
||||||
|
def set_new_connection(ssid, pw):
|
||||||
|
"""Setup a new NetworkManager connection
|
||||||
|
|
||||||
|
Args: ssid - string
|
||||||
|
pw - string
|
||||||
|
|
||||||
|
"""
|
||||||
|
pw = str(pw).strip()
|
||||||
|
new_conn = ["nmcli", "device", "wifi", "connect", ssid, "password", pw]
|
||||||
|
res = Popen(new_conn, stdout=PIPE).communicate()
|
||||||
|
# Delete connection if it fails somehow.
|
||||||
|
# With nmcli 0.9.10, you occasionally get an error message:
|
||||||
|
# "Error: Failed to add/activate new connection: Unknown error", which
|
||||||
|
# doesn't always mean the connection failed, so test for 'activated' or
|
||||||
|
# 'activating' in the connection status as well
|
||||||
|
status = ["nmcli", "-t", "-f", "GENERAL", "connection", "show", ssid]
|
||||||
|
active = Popen(status, stdout=PIPE).communicate()[0]
|
||||||
|
# Delete connections with errors
|
||||||
|
if "Error" in res and \
|
||||||
|
('activating' not in active or 'activated' not in active):
|
||||||
|
delete = ["nmcli", "connection", "delete", ssid]
|
||||||
|
Popen(delete, stdout=PIPE).communicate()
|
||||||
|
|
||||||
|
|
||||||
|
def run():
|
||||||
|
adapter = choose_adapter()
|
||||||
|
conns = current_conns()
|
||||||
|
vpns = vpn_connections(conns)
|
||||||
|
ssids = current_ssids(adapter)
|
||||||
|
other = other_actions()
|
||||||
|
sel = get_selection(ssids, vpns, other)
|
||||||
|
if sel in other:
|
||||||
|
# Parse other actions
|
||||||
|
if 'Networking' in sel:
|
||||||
|
toggle_networking(sel)
|
||||||
|
elif 'Launch' in sel:
|
||||||
|
launch_connection_editor()
|
||||||
|
sys.exit()
|
||||||
|
elif sel in ssids:
|
||||||
|
# Set ssid, security if selection is an SSID
|
||||||
|
ssid, security = sel.split(":")
|
||||||
|
ssid = ssid.strip("'").strip().replace("**", "")
|
||||||
|
security = security.strip()
|
||||||
|
elif sel.replace(":VPN", "").replace("**", "") in vpns:
|
||||||
|
# Select VPN connection (sel="pia_us_west:VPN")
|
||||||
|
ssid = sel.replace(":VPN", "").replace("**", "")
|
||||||
|
else:
|
||||||
|
sys.exit()
|
||||||
|
# Decide if selection is existing connection or new
|
||||||
|
if ssid in [i.split(':')[0] for i in conns if i]:
|
||||||
|
toggle_existing(ssid)
|
||||||
|
else:
|
||||||
|
if security:
|
||||||
|
pw = get_passphrase()
|
||||||
|
else:
|
||||||
|
pw = ""
|
||||||
|
set_new_connection(ssid, pw)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
run()
|
27
framework/sources.json
Normal file
27
framework/sources.json
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"lanzaboote": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Secure Boot for NixOS [maintainers=@blitz @raitobezarius @nikstur]",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "lanzaboote",
|
||||||
|
"rev": "v0.2.0",
|
||||||
|
"sha256": "1wny47cxjq4nin26xx0rrgfa9a6r1g6i6f974z30rr458fqd6y9w",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/nix-community/lanzaboote/archive/v0.2.0.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
|
||||||
|
"version": "0.2.0"
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"branch": "master",
|
||||||
|
"description": "Nix Packages collection",
|
||||||
|
"homepage": "",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "73909f4f263cf74a557612770a239f6a425ebbed",
|
||||||
|
"sha256": "1hnfwrpk4xs5js9w7pi4lz5si6rdvz3pljkg2abkrw9ziz1a385s",
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://github.com/NixOS/nixpkgs/archive/73909f4f263cf74a557612770a239f6a425ebbed.tar.gz",
|
||||||
|
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz"
|
||||||
|
}
|
||||||
|
}
|
194
framework/sources.nix
Normal file
194
framework/sources.nix
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
# This file has been generated by Niv.
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
#
|
||||||
|
# The fetchers. fetch_<type> fetches specs of type <type>.
|
||||||
|
#
|
||||||
|
|
||||||
|
fetch_file = pkgs: name: spec:
|
||||||
|
let
|
||||||
|
name' = sanitizeName name + "-src";
|
||||||
|
in
|
||||||
|
if spec.builtin or true then
|
||||||
|
builtins_fetchurl { inherit (spec) url sha256; name = name'; }
|
||||||
|
else
|
||||||
|
pkgs.fetchurl { inherit (spec) url sha256; name = name'; };
|
||||||
|
|
||||||
|
fetch_tarball = pkgs: name: spec:
|
||||||
|
let
|
||||||
|
name' = sanitizeName name + "-src";
|
||||||
|
in
|
||||||
|
if spec.builtin or true then
|
||||||
|
builtins_fetchTarball { name = name'; inherit (spec) url sha256; }
|
||||||
|
else
|
||||||
|
pkgs.fetchzip { name = name'; inherit (spec) url sha256; };
|
||||||
|
|
||||||
|
fetch_git = name: spec:
|
||||||
|
let
|
||||||
|
ref =
|
||||||
|
if spec ? ref then spec.ref else
|
||||||
|
if spec ? branch then "refs/heads/${spec.branch}" else
|
||||||
|
if spec ? tag then "refs/tags/${spec.tag}" else
|
||||||
|
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!";
|
||||||
|
submodules = if spec ? submodules then spec.submodules else false;
|
||||||
|
submoduleArg =
|
||||||
|
let
|
||||||
|
nixSupportsSubmodules = builtins.compareVersions builtins.nixVersion "2.4" >= 0;
|
||||||
|
emptyArgWithWarning =
|
||||||
|
if submodules == true
|
||||||
|
then
|
||||||
|
builtins.trace
|
||||||
|
(
|
||||||
|
"The niv input \"${name}\" uses submodules "
|
||||||
|
+ "but your nix's (${builtins.nixVersion}) builtins.fetchGit "
|
||||||
|
+ "does not support them"
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
else {};
|
||||||
|
in
|
||||||
|
if nixSupportsSubmodules
|
||||||
|
then { inherit submodules; }
|
||||||
|
else emptyArgWithWarning;
|
||||||
|
in
|
||||||
|
builtins.fetchGit
|
||||||
|
({ url = spec.repo; inherit (spec) rev; inherit ref; } // submoduleArg);
|
||||||
|
|
||||||
|
fetch_local = spec: spec.path;
|
||||||
|
|
||||||
|
fetch_builtin-tarball = name: throw
|
||||||
|
''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`.
|
||||||
|
$ niv modify ${name} -a type=tarball -a builtin=true'';
|
||||||
|
|
||||||
|
fetch_builtin-url = name: throw
|
||||||
|
''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`.
|
||||||
|
$ niv modify ${name} -a type=file -a builtin=true'';
|
||||||
|
|
||||||
|
#
|
||||||
|
# Various helpers
|
||||||
|
#
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695
|
||||||
|
sanitizeName = name:
|
||||||
|
(
|
||||||
|
concatMapStrings (s: if builtins.isList s then "-" else s)
|
||||||
|
(
|
||||||
|
builtins.split "[^[:alnum:]+._?=-]+"
|
||||||
|
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
# The set of packages used when specs are fetched using non-builtins.
|
||||||
|
mkPkgs = sources: system:
|
||||||
|
let
|
||||||
|
sourcesNixpkgs =
|
||||||
|
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; };
|
||||||
|
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath;
|
||||||
|
hasThisAsNixpkgsPath = <nixpkgs> == ./.;
|
||||||
|
in
|
||||||
|
if builtins.hasAttr "nixpkgs" sources
|
||||||
|
then sourcesNixpkgs
|
||||||
|
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then
|
||||||
|
import <nixpkgs> {}
|
||||||
|
else
|
||||||
|
abort
|
||||||
|
''
|
||||||
|
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or
|
||||||
|
add a package called "nixpkgs" to your sources.json.
|
||||||
|
'';
|
||||||
|
|
||||||
|
# The actual fetching function.
|
||||||
|
fetch = pkgs: name: spec:
|
||||||
|
|
||||||
|
if ! builtins.hasAttr "type" spec then
|
||||||
|
abort "ERROR: niv spec ${name} does not have a 'type' attribute"
|
||||||
|
else if spec.type == "file" then fetch_file pkgs name spec
|
||||||
|
else if spec.type == "tarball" then fetch_tarball pkgs name spec
|
||||||
|
else if spec.type == "git" then fetch_git name spec
|
||||||
|
else if spec.type == "local" then fetch_local spec
|
||||||
|
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name
|
||||||
|
else if spec.type == "builtin-url" then fetch_builtin-url name
|
||||||
|
else
|
||||||
|
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}";
|
||||||
|
|
||||||
|
# If the environment variable NIV_OVERRIDE_${name} is set, then use
|
||||||
|
# the path directly as opposed to the fetched source.
|
||||||
|
replace = name: drv:
|
||||||
|
let
|
||||||
|
saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name;
|
||||||
|
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}";
|
||||||
|
in
|
||||||
|
if ersatz == "" then drv else
|
||||||
|
# this turns the string into an actual Nix path (for both absolute and
|
||||||
|
# relative paths)
|
||||||
|
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}";
|
||||||
|
|
||||||
|
# Ports of functions for older nix versions
|
||||||
|
|
||||||
|
# a Nix version of mapAttrs if the built-in doesn't exist
|
||||||
|
mapAttrs = builtins.mapAttrs or (
|
||||||
|
f: set: with builtins;
|
||||||
|
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set))
|
||||||
|
);
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295
|
||||||
|
range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1);
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257
|
||||||
|
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1));
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269
|
||||||
|
stringAsChars = f: s: concatStrings (map f (stringToCharacters s));
|
||||||
|
concatMapStrings = f: list: concatStrings (map f list);
|
||||||
|
concatStrings = builtins.concatStringsSep "";
|
||||||
|
|
||||||
|
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331
|
||||||
|
optionalAttrs = cond: as: if cond then as else {};
|
||||||
|
|
||||||
|
# fetchTarball version that is compatible between all the versions of Nix
|
||||||
|
builtins_fetchTarball = { url, name ? null, sha256 }@attrs:
|
||||||
|
let
|
||||||
|
inherit (builtins) lessThan nixVersion fetchTarball;
|
||||||
|
in
|
||||||
|
if lessThan nixVersion "1.12" then
|
||||||
|
fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
|
||||||
|
else
|
||||||
|
fetchTarball attrs;
|
||||||
|
|
||||||
|
# fetchurl version that is compatible between all the versions of Nix
|
||||||
|
builtins_fetchurl = { url, name ? null, sha256 }@attrs:
|
||||||
|
let
|
||||||
|
inherit (builtins) lessThan nixVersion fetchurl;
|
||||||
|
in
|
||||||
|
if lessThan nixVersion "1.12" then
|
||||||
|
fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; }))
|
||||||
|
else
|
||||||
|
fetchurl attrs;
|
||||||
|
|
||||||
|
# Create the final "sources" from the config
|
||||||
|
mkSources = config:
|
||||||
|
mapAttrs (
|
||||||
|
name: spec:
|
||||||
|
if builtins.hasAttr "outPath" spec
|
||||||
|
then abort
|
||||||
|
"The values in sources.json should not have an 'outPath' attribute"
|
||||||
|
else
|
||||||
|
spec // { outPath = replace name (fetch config.pkgs name spec); }
|
||||||
|
) config.sources;
|
||||||
|
|
||||||
|
# The "config" used by the fetchers
|
||||||
|
mkConfig =
|
||||||
|
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null
|
||||||
|
, sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile)
|
||||||
|
, system ? builtins.currentSystem
|
||||||
|
, pkgs ? mkPkgs sources system
|
||||||
|
}: rec {
|
||||||
|
# The sources, i.e. the attribute set of spec name to spec
|
||||||
|
inherit sources;
|
||||||
|
|
||||||
|
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers
|
||||||
|
inherit pkgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
in
|
||||||
|
mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); }
|
Loading…
Reference in a new issue