Compare commits

...

6 Commits

Author SHA1 Message Date
Noah Masur
0bc8a233d8 enable missing neovim for macbook 2022-12-21 17:48:53 -07:00
Noah Masur
524a5aa347 enable missing configs for oracle 2022-12-22 00:47:25 +00:00
Noah Masur
b4ddb149cc fix: bad references for server linux 2022-12-22 00:31:25 +00:00
Noah Masur
d021baa1bb split nixos from darwin
required because they don't share all attributes
2022-12-21 17:07:58 -07:00
Noah Masur
7063bd5f7a fixes for module layout 2022-12-21 14:38:34 -07:00
Noah Masur
d040077d3a convert to proper module layout 2022-12-21 14:18:03 -07:00
132 changed files with 1420 additions and 1102 deletions

View File

@ -59,9 +59,8 @@
program = "${ program = "${
(import ../modules/neovim/package { (import ../modules/neovim/package {
inherit pkgs; inherit pkgs;
colors = import ../modules/colorscheme/gruvbox/neovim-gruvbox.nix { colors =
inherit pkgs; import ../colorscheme/gruvbox/neovim-gruvbox.nix { inherit pkgs; };
};
}) })
}/bin/nvim"; }/bin/nvim";
}; };

View File

@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
# MacOS-specific settings for Alacritty # MacOS-specific settings for Alacritty
home-manager.users.${config.user} = { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
programs.alacritty.settings = { programs.alacritty.settings = {
font.size = lib.mkForce 20.0; font.size = lib.mkForce 20.0;
shell.program = "${pkgs.fish}/bin/fish"; shell.program = "${pkgs.fish}/bin/fish";

View File

@ -1,6 +1,6 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
home.packages = with pkgs; home.packages = with pkgs;
[ (nerdfonts.override { fonts = [ "VictorMono" ]; }) ]; [ (nerdfonts.override { fonts = [ "VictorMono" ]; }) ];

32
darwin/hammerspoon.nix Normal file
View File

@ -0,0 +1,32 @@
{ config, pkgs, lib, ... }: {
# Hammerspoon - MacOS custom automation scripting
config = lib.mkIf pkgs.stdenv.isDarwin {
home-manager.users.${config.user} = {
xdg.configFile."hammerspoon/init.lua".source = ./hammerspoon/init.lua;
xdg.configFile."hammerspoon/Spoons/ControlEscape.spoon".source =
./hammerspoon/Spoons/ControlEscape.spoon;
xdg.configFile."hammerspoon/Spoons/DismissAlerts.spoon".source =
./hammerspoon/Spoons/DismissAlerts.spoon;
xdg.configFile."hammerspoon/Spoons/Launcher.spoon/init.lua".source =
pkgs.substituteAll {
src = ./hammerspoon/Spoons/Launcher.spoon/init.lua;
firefox = "${pkgs.firefox-bin}/Applications/Firefox.app";
discord = "${pkgs.discord}/Applications/Discord.app";
kitty = "${pkgs.kitty}/Applications/kitty.app";
};
xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source =
./hammerspoon/Spoons/MoveWindow.spoon;
};
homebrew.casks = [ "hammerspoon" ];
system.activationScripts.postUserActivation.text = ''
defaults write org.hammerspoon.Hammerspoon MJConfigFile "~/.config/hammerspoon/init.lua"
'';
};
}

56
darwin/homebrew.nix Normal file
View File

@ -0,0 +1,56 @@
{ config, pkgs, lib, ... }: {
# Homebrew - Mac-specific packages that aren't in Nix
config = lib.mkIf pkgs.stdenv.isDarwin {
# Requires Homebrew to be installed
system.activationScripts.preUserActivation.text = ''
if ! xcode-select --version 2>/dev/null; then
$DRY_RUN_CMD xcode-select --install
fi
if ! /usr/local/bin/brew --version 2>/dev/null; then
$DRY_RUN_CMD /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
'';
homebrew = {
enable = true;
onActivation = {
autoUpdate = false; # Don't update during rebuild
cleanup = "zap"; # Uninstall all programs not declared
upgrade = true;
};
global = {
brewfile = true; # Run brew bundle from anywhere
lockfiles = false; # Don't save lockfile (since running from anywhere)
};
taps = [
"homebrew/cask" # Required for casks
"homebrew/cask-drivers" # Used for Logitech G-Hub
];
brews = [
"trash" # Delete files and folders to trash instead of rm
"openjdk" # Required by Apache Directory Studio
];
casks = [
"1password" # 1Password packaging on Nix is broken for macOS
"scroll-reverser" # Different scroll style for mouse vs. trackpad
"meetingbar" # Show meetings in menu bar
"gitify" # Git notifications in menu bar
"logitech-g-hub" # Mouse and keyboard management
"mimestream" # Gmail client
"obsidian" # Obsidian packaging on Nix is not available for macOS
"steam" # Not packaged for Nix
"apache-directory-studio" # Packaging on Nix is not available for macOS
];
};
home-manager.users.${config.user} = {
programs.fish.shellAbbrs.t = "trash";
};
};
}

View File

@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
# MacOS-specific settings for Kitty # MacOS-specific settings for Kitty
home-manager.users.${config.user} = { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
programs.kitty = { programs.kitty = {
darwinLaunchOptions = [ "--start-as=fullscreen" ]; darwinLaunchOptions = [ "--start-as=fullscreen" ];
font.size = lib.mkForce 20; font.size = lib.mkForce 20;

11
darwin/networking.nix Normal file
View File

@ -0,0 +1,11 @@
{ config, pkgs, lib, ... }: {
config = lib.mkIf pkgs.stdenv.isDarwin {
networking = {
computerName = "${config.fullName}'\\''s Mac";
# Adjust if necessary
# hostName = "";
};
};
}

View File

@ -1,6 +1,6 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
programs.fish = { programs.fish = {
shellAbbrs = { shellAbbrs = {

186
darwin/system.nix Normal file
View File

@ -0,0 +1,186 @@
{ pkgs, lib, ... }: {
config = lib.mkIf pkgs.stdenv.isDarwin {
services.nix-daemon.enable = true;
environment.shells = [ pkgs.fish ];
security.pam.enableSudoTouchIdAuth = true;
system = {
keyboard = {
remapCapsLockToControl = true;
enableKeyMapping = true; # Allows for skhd
};
defaults = {
NSGlobalDomain = {
# Set to dark mode
AppleInterfaceStyle = "Dark";
# Don't change from dark to light automatically
# AppleInterfaceSwitchesAutomatically = false;
# Enable full keyboard access for all controls (e.g. enable Tab in modal dialogs)
AppleKeyboardUIMode = 3;
# Automatically show and hide the menu bar
_HIHideMenuBar = true;
# Expand save panel by default
NSNavPanelExpandedStateForSaveMode = true;
# Expand print panel by default
PMPrintingExpandedStateForPrint = true;
# Replace press-and-hold with key repeat
ApplePressAndHoldEnabled = false;
# Set a fast key repeat rate
KeyRepeat = 2;
# Shorten delay before key repeat begins
InitialKeyRepeat = 12;
# Save to local disk by default, not iCloud
NSDocumentSaveNewDocumentsToCloud = false;
# Disable autocorrect capitalization
NSAutomaticCapitalizationEnabled = false;
# Disable autocorrect smart dashes
NSAutomaticDashSubstitutionEnabled = false;
# Disable autocorrect adding periods
NSAutomaticPeriodSubstitutionEnabled = false;
# Disable autocorrect smart quotation marks
NSAutomaticQuoteSubstitutionEnabled = false;
# Disable autocorrect spellcheck
NSAutomaticSpellingCorrectionEnabled = false;
};
dock = {
# Automatically show and hide the dock
autohide = true;
# Add translucency in dock for hidden applications
showhidden = true;
# Enable spring loading on all dock items
enable-spring-load-actions-on-all-items = true;
# Highlight hover effect in dock stack grid view
mouse-over-hilite-stack = true;
mineffect = "genie";
orientation = "bottom";
show-recents = false;
tilesize = 44;
};
finder = {
# Default Finder window set to column view
FXPreferredViewStyle = "clmv";
# Finder search in current folder by default
FXDefaultSearchScope = "SCcf";
# Disable warning when changing file extension
FXEnableExtensionChangeWarning = false;
# Allow quitting of Finder application
QuitMenuItem = true;
};
# Disable "Are you sure you want to open" dialog
LaunchServices.LSQuarantine = false;
# Disable trackpad tap to click
trackpad.Clicking = false;
# universalaccess = {
# # Zoom in with Control + Scroll Wheel
# closeViewScrollWheelToggle = true;
# closeViewZoomFollowsFocus = true;
# };
# Where to save screenshots
screencapture.location = "~/Downloads";
};
# Settings that don't have an option in nix-darwin
activationScripts.postActivation.text = ''
echo "Disable disk image verification"
defaults write com.apple.frameworks.diskimages skip-verify -bool true
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
echo "Avoid creating .DS_Store files on network volumes"
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
echo "Disable the warning before emptying the Trash"
defaults write com.apple.finder WarnOnEmptyTrash -bool false
echo "Require password immediately after sleep or screen saver begins"
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
echo "Allow apps from anywhere"
SPCTL=$(spctl --status)
if ! [ "$SPCTL" = "assessments disabled" ]; then
sudo spctl --master-disable
fi
'';
# User-level settings
activationScripts.postUserActivation.text = ''
echo "Show the ~/Library folder"
chflags nohidden ~/Library
echo "Enable dock magnification"
defaults write com.apple.dock magnification -bool true
echo "Set dock magnification size"
defaults write com.apple.dock largesize -int 48
echo "Define dock icon function"
__dock_item() {
printf "%s%s%s%s%s" \
"<dict><key>tile-data</key><dict><key>file-data</key><dict>" \
"<key>_CFURLString</key><string>" \
"$1" \
"</string><key>_CFURLStringType</key><integer>0</integer>" \
"</dict></dict></dict>"
}
echo "Choose and order dock icons"
defaults write com.apple.dock persistent-apps -array \
"$(__dock_item /Applications/1Password.app)" \
"$(__dock_item /Applications/Slack.app)" \
"$(__dock_item /System/Applications/Calendar.app)" \
"$(__dock_item ${pkgs.firefox-bin}/Applications/Firefox.app)" \
"$(__dock_item /System/Applications/Messages.app)" \
"$(__dock_item /System/Applications/Mail.app)" \
"$(__dock_item /Applications/Mimestream.app)" \
"$(__dock_item /Applications/zoom.us.app)" \
"$(__dock_item ${pkgs.discord}/Applications/Discord.app)" \
"$(__dock_item /Applications/Obsidian.app)" \
"$(__dock_item ${pkgs.kitty}/Applications/kitty.app)" \
"$(__dock_item /System/Applications/System\ Settings.app)"
'';
};
};
}

View File

@ -1,6 +1,8 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { options.tmux.enable = lib.mkEnableOption "Tmux terminal multiplexer";
config.home-manager.users.${config.user} = lib.mkIf config.tmux.enable {
programs.tmux = { programs.tmux = {
enable = true; enable = true;

21
darwin/user.nix Normal file
View File

@ -0,0 +1,21 @@
{ config, pkgs, lib, ... }: {
config = lib.mkIf pkgs.stdenv.isDarwin {
users.users."${config.user}" = {
# macOS user
home = config.homePath;
shell = pkgs.fish; # Default shell
};
# Used for aerc
home-manager.users.${config.user} = {
home.sessionVariables = {
XDG_CONFIG_HOME = "${config.homePath}/.config";
};
};
};
}

View File

@ -15,7 +15,7 @@ let
in { in {
home-manager.users.${config.user} = { home-manager.users.${config.user} = lib.mkIf pkgs.stdenv.isDarwin {
home.packages = with pkgs; [ home.packages = with pkgs; [
# visidata # CSV inspector # visidata # CSV inspector
@ -34,7 +34,7 @@ in {
ipcalc # Make IP network calculations ipcalc # Make IP network calculations
(mkScript { (mkScript {
name = "ocr"; name = "ocr";
file = ../shell/bash/scripts/ocr.sh; file = ../modules/shell/bash/scripts/ocr.sh;
env = [ tesseract ]; env = [ tesseract ];
}) })
]; ];

View File

@ -104,7 +104,7 @@
fullName = "Noah Masur"; fullName = "Noah Masur";
gitName = fullName; gitName = fullName;
gitEmail = "7386960+nmasur@users.noreply.github.com"; gitEmail = "7386960+nmasur@users.noreply.github.com";
mailServer = "noahmasur.com"; mail.server = "noahmasur.com";
dotfilesRepo = "git@github.com:nmasur/dotfiles"; dotfilesRepo = "git@github.com:nmasur/dotfiles";
}; };
@ -154,9 +154,8 @@
neovim = let pkgs = import nixpkgs { inherit system overlays; }; neovim = let pkgs = import nixpkgs { inherit system overlays; };
in import ./modules/neovim/package { in import ./modules/neovim/package {
inherit pkgs; inherit pkgs;
colors = import ./modules/colorscheme/gruvbox/neovim-gruvbox.nix { colors =
inherit pkgs; import ./colorscheme/gruvbox/neovim-gruvbox.nix { inherit pkgs; };
};
}; };
}); });

View File

@ -7,9 +7,14 @@ nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
specialArgs = { }; specialArgs = { };
modules = [ modules = [
./hardware-configuration.nix
../../modules
../../nixos
globals globals
wsl.nixosModules.wsl
home-manager.nixosModules.home-manager home-manager.nixosModules.home-manager
{ {
physical = true;
networking.hostName = "desktop"; networking.hostName = "desktop";
nixpkgs.overlays = [ nur.overlay ]; nixpkgs.overlays = [ nur.overlay ];
# Set registry to flake packages, used for nix X commands # Set registry to flake packages, used for nix X commands
@ -17,32 +22,31 @@ nixpkgs.lib.nixosSystem {
identityFile = "/home/${globals.user}/.ssh/id_ed25519"; identityFile = "/home/${globals.user}/.ssh/id_ed25519";
gui.enable = true; gui.enable = true;
theme = { theme = {
colors = (import ../../modules/colorscheme/gruvbox).dark; colors = (import ../../colorscheme/gruvbox).dark;
dark = true; dark = true;
}; };
wallpaper = "${wallpapers}/gruvbox/road.jpg"; wallpaper = "${wallpapers}/gruvbox/road.jpg";
gtk.theme.name = nixpkgs.lib.mkDefault "Adwaita-dark"; gtk.theme.name = nixpkgs.lib.mkDefault "Adwaita-dark";
passwordHash = nixpkgs.lib.fileContents ../../private/password.sha512; passwordHash = nixpkgs.lib.fileContents ../../private/password.sha512;
} wsl.enable = false;
./hardware-configuration.nix media.enable = true;
../common.nix firefox.enable = true;
../../modules/hardware kitty.enable = true;
../../modules/nixos "1password".enable = true;
../../modules/graphical discord.enable = true;
../../modules/applications/media.nix nautilus.enable = true;
../../modules/applications/firefox.nix obsidian.enable = true;
../../modules/applications/kitty.nix mail.enable = true;
../../modules/applications/1password.nix mail.aerc.enable = true;
../../modules/applications/discord.nix mail.himalaya.enable = true;
../../modules/applications/nautilus.nix gaming.enable = true;
../../modules/applications/obsidian.nix gaming.steam.enable = true;
../../modules/mail gaming.legendary.enable = true;
../../modules/gaming/steam.nix keybase.enable = true;
../../modules/gaming/legendary.nix mullvad.enable = true;
../../modules/repositories/notes.nix nixlang.enable = true;
../../modules/services/keybase.nix dotfiles.enable = true;
../../modules/services/mullvad.nix }
../../modules/programming/nix.nix
]; ];
} }

View File

@ -7,6 +7,8 @@ darwin.lib.darwinSystem {
system = "x86_64-darwin"; system = "x86_64-darwin";
specialArgs = { }; specialArgs = { };
modules = [ modules = [
../../modules
../../darwin
(globals // { (globals // {
user = "Noah.Masur"; user = "Noah.Masur";
gitName = "Noah-Masur_1701"; gitName = "Noah-Masur_1701";
@ -14,30 +16,31 @@ darwin.lib.darwinSystem {
}) })
home-manager.darwinModules.home-manager home-manager.darwinModules.home-manager
{ {
networking.hostName = "noah-masur-mac";
identityFile = "/Users/Noah.Masur/.ssh/id_ed25519"; identityFile = "/Users/Noah.Masur/.ssh/id_ed25519";
gui.enable = true; gui.enable = true;
theme = { theme = {
colors = (import ../../modules/colorscheme/gruvbox).dark; colors = (import ../../colorscheme/gruvbox).dark;
dark = true; dark = true;
}; };
mailUser = globals.user; mail.user = globals.user;
networking.hostName = "noah-masur-mac";
nixpkgs.overlays = [ firefox-darwin.overlay ] ++ overlays; nixpkgs.overlays = [ firefox-darwin.overlay ] ++ overlays;
# Set registry to flake packages, used for nix X commands # Set registry to flake packages, used for nix X commands
nix.registry.nixpkgs.flake = nixpkgs; nix.registry.nixpkgs.flake = nixpkgs;
neovim.enable = true;
mail.enable = true;
mail.aerc.enable = true;
mail.himalaya.enable = true;
kitty.enable = true;
discord.enable = true;
firefox.enable = true;
dotfiles.enable = true;
nixlang.enable = true;
terraform.enable = true;
python.enable = true;
lua.enable = true;
kubernetes.enable = true;
"1password".enable = true;
} }
../common.nix
../../modules/darwin
../../modules/mail
../../modules/applications/alacritty.nix
../../modules/applications/kitty.nix
../../modules/applications/discord.nix
../../modules/applications/firefox.nix
../../modules/repositories/notes.nix
../../modules/programming/nix.nix
../../modules/programming/terraform.nix
../../modules/programming/python.nix
../../modules/programming/lua.nix
../../modules/programming/kubernetes.nix
]; ];
} }

View File

@ -11,12 +11,19 @@ nixpkgs.lib.nixosSystem {
system = "aarch64-linux"; system = "aarch64-linux";
specialArgs = { }; specialArgs = { };
modules = [ modules = [
(removeAttrs globals [ "mailServer" ]) ./hardware-configuration.nix
../../modules
../../nixos
(removeAttrs globals [ "mail.server" ])
wsl.nixosModules.wsl
home-manager.nixosModules.home-manager home-manager.nixosModules.home-manager
{ {
server = true;
gui.enable = false; gui.enable = false;
theme = { colors = (import ../../modules/colorscheme/gruvbox).dark; }; theme = { colors = (import ../../colorscheme/gruvbox).dark; };
nixpkgs.overlays = overlays; nixpkgs.overlays = overlays;
wsl.enable = false;
caddy.enable = true;
# FQDNs for various services # FQDNs for various services
networking.hostName = "oracle"; networking.hostName = "oracle";
@ -33,7 +40,7 @@ nixpkgs.lib.nixosSystem {
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s"; "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB+AbmjGEwITk5CK9y7+Rg27Fokgj9QEjgc9wST6MA3s";
# Nextcloud backup config # Nextcloud backup config
backupS3 = { backup.s3 = {
endpoint = "s3.us-west-002.backblazeb2.com"; endpoint = "s3.us-west-002.backblazeb2.com";
bucket = "noahmasur-backup"; bucket = "noahmasur-backup";
accessKeyId = "0026b0e73b2e2c80000000005"; accessKeyId = "0026b0e73b2e2c80000000005";
@ -43,6 +50,7 @@ nixpkgs.lib.nixosSystem {
users.users.nextcloud.extraGroups = [ "jellyfin" ]; users.users.nextcloud.extraGroups = [ "jellyfin" ];
# Wireguard config for Transmission # Wireguard config for Transmission
wireguard.enable = true;
networking.wireguard.interfaces.wg0 = { networking.wireguard.interfaces.wg0 = {
# The local IPs for this machine within the Wireguard network # The local IPs for this machine within the Wireguard network
@ -72,20 +80,18 @@ nixpkgs.lib.nixosSystem {
# Grant access to Transmission directories from Jellyfin # Grant access to Transmission directories from Jellyfin
users.users.jellyfin.extraGroups = [ "transmission" ]; users.users.jellyfin.extraGroups = [ "transmission" ];
# Proxy traffic with Cloudflare
cloudflare.enable = true;
# Setup Minecraft server
gaming.minecraft-server.enable = true;
# Clone dotfiles
dotfiles.enable = true;
neovim.enable = true;
} }
./hardware-configuration.nix
../common.nix
../../modules/nixos
../../modules/hardware/server.nix
../../modules/services/sshd.nix
../../modules/services/calibre.nix
../../modules/services/jellyfin.nix
../../modules/services/nextcloud.nix
../../modules/services/cloudflare.nix
../../modules/services/transmission.nix
../../modules/services/prometheus.nix
../../modules/services/vaultwarden.nix
../../modules/services/gitea.nix
../../modules/gaming/minecraft-server.nix
]; ];
} }

View File

@ -7,6 +7,8 @@ nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
specialArgs = { }; specialArgs = { };
modules = [ modules = [
../../modules
../../nixos
globals globals
wsl.nixosModules.wsl wsl.nixosModules.wsl
home-manager.nixosModules.home-manager home-manager.nixosModules.home-manager
@ -17,7 +19,7 @@ nixpkgs.lib.nixosSystem {
identityFile = "/home/${globals.user}/.ssh/id_ed25519"; identityFile = "/home/${globals.user}/.ssh/id_ed25519";
gui.enable = false; gui.enable = false;
theme = { theme = {
colors = (import ../../modules/colorscheme/gruvbox).dark; colors = (import ../../colorscheme/gruvbox).dark;
dark = true; dark = true;
}; };
passwordHash = nixpkgs.lib.fileContents ../../private/password.sha512; passwordHash = nixpkgs.lib.fileContents ../../private/password.sha512;
@ -30,13 +32,13 @@ nixpkgs.lib.nixosSystem {
interop.includePath = interop.includePath =
false; # Including Windows PATH will slow down Neovim command mode false; # Including Windows PATH will slow down Neovim command mode
}; };
mail.enable = true;
mail.aerc.enable = true;
mail.himalaya.enable = true;
dotfiles.enable = true;
nixlang.enable = true;
lua.enable = true;
} }
../common.nix
../../modules/wsl
../../modules/nixos
../../modules/mail
../../modules/repositories/notes.nix
../../modules/programming/nix.nix
../../modules/programming/lua.nix
]; ];
} }

View File

@ -1,10 +1,20 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
unfreePackages = [ "1password" "_1password-gui" ]; "1password" = {
home-manager.users.${config.user} = { enable = lib.mkEnableOption {
home.packages = with pkgs; [ _1password-gui ]; description = "Enable 1Password.";
default = false;
};
}; };
}; };
config = lib.mkIf
(config.gui.enable && config."1password".enable && pkgs.stdenv.isLinux) {
unfreePackages = [ "1password" "_1password-gui" ];
home-manager.users.${config.user} = {
home.packages = with pkgs; [ _1password-gui ];
};
};
} }

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
alacritty = {
enable = lib.mkEnableOption {
description = "Enable Alacritty.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.alacritty.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
xsession.windowManager.i3.config.terminal = "alacritty"; xsession.windowManager.i3.config.terminal = "alacritty";
programs.rofi.terminal = "${pkgs.alacritty}/bin/alacritty"; programs.rofi.terminal = "${pkgs.alacritty}/bin/alacritty";

View File

@ -3,7 +3,6 @@
imports = [ imports = [
./1password.nix ./1password.nix
./alacritty.nix ./alacritty.nix
./calibre.nix
./discord.nix ./discord.nix
./firefox.nix ./firefox.nix
./kitty.nix ./kitty.nix

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
discord = {
enable = lib.mkEnableOption {
description = "Enable Discord.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.discord.enable) {
unfreePackages = [ "discord" ]; unfreePackages = [ "discord" ];
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
home.packages = with pkgs; [ discord ]; home.packages = with pkgs; [ discord ];

View File

@ -1,13 +1,26 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
{ {
config = lib.mkIf config.gui.enable {
unfreePackages = [ "onepassword-password-manager" "okta-browser-plugin" ]; options = {
firefox = {
enable = lib.mkEnableOption {
description = "Enable Firefox.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.firefox.enable) {
unfreePackages = [
(lib.mkIf config."1password".enable "onepassword-password-manager")
"okta-browser-plugin"
];
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
programs.firefox = rec { programs.firefox = {
enable = true; enable = true;
package = package =
if pkgs.stdenv.isDarwin then pkgs.firefox-bin else pkgs.firefox; if pkgs.stdenv.isDarwin then pkgs.firefox-bin else pkgs.firefox;
@ -17,7 +30,7 @@
multi-account-containers multi-account-containers
facebook-container facebook-container
temporary-containers temporary-containers
onepassword-password-manager (lib.mkIf config."1password".enable onepassword-password-manager)
okta-browser-plugin okta-browser-plugin
sponsorblock sponsorblock
reddit-enhancement-suite reddit-enhancement-suite

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
kitty = {
enable = lib.mkEnableOption {
description = "Enable Kitty.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.kitty.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
# xsession.windowManager.i3.config.terminal = "kitty"; # xsession.windowManager.i3.config.terminal = "kitty";
# programs.rofi.terminal = "${pkgs.kitty}/bin/kitty"; # programs.rofi.terminal = "${pkgs.kitty}/bin/kitty";

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
media = {
enable = lib.mkEnableOption {
description = "Enable media programs.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.media.enable) {
home-manager.users.${config.user}.home.packages = with pkgs; [ home-manager.users.${config.user}.home.packages = with pkgs; [
mpv # Video viewer mpv # Video viewer
sxiv # Image viewer sxiv # Image viewer

View File

@ -1,7 +1,16 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
options = {
nautilus = {
enable = lib.mkEnableOption {
description = "Enable Nautilus file manager.";
default = false;
};
};
};
# Install Nautilus file manager # Install Nautilus file manager
config = lib.mkIf config.gui.enable { config = lib.mkIf (config.gui.enable && config.nautilus.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
home.packages = with pkgs; [ home.packages = with pkgs; [
gnome.nautilus gnome.nautilus

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
obsidian = {
enable = lib.mkEnableOption {
description = "Enable Obsidian.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.obsidian.enable) {
unfreePackages = [ "obsidian" ]; unfreePackages = [ "obsidian" ];
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
home.packages = with pkgs; [ obsidian ]; home.packages = with pkgs; [ obsidian ];

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
qbittorrent = {
enable = lib.mkEnableOption {
description = "Enable qBittorrent.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.qbittorrent.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {

View File

@ -1,13 +0,0 @@
local M = {}
M.packer = function(use)
use({
"lifepillar/vim-gruvbox8",
config = function()
vim.g.gruvbox_italicize_strings = 0
vim.cmd("colorscheme gruvbox8")
end,
})
end
return M

View File

@ -1,28 +0,0 @@
{ config, pkgs, ... }: {
# Hammerspoon - MacOS custom automation scripting
home-manager.users.${config.user} = {
xdg.configFile."hammerspoon/init.lua".source = ./hammerspoon/init.lua;
xdg.configFile."hammerspoon/Spoons/ControlEscape.spoon".source =
./hammerspoon/Spoons/ControlEscape.spoon;
xdg.configFile."hammerspoon/Spoons/DismissAlerts.spoon".source =
./hammerspoon/Spoons/DismissAlerts.spoon;
xdg.configFile."hammerspoon/Spoons/Launcher.spoon/init.lua".source =
pkgs.substituteAll {
src = ./hammerspoon/Spoons/Launcher.spoon/init.lua;
firefox = "${pkgs.firefox-bin}/Applications/Firefox.app";
discord = "${pkgs.discord}/Applications/Discord.app";
kitty = "${pkgs.kitty}/Applications/kitty.app";
};
xdg.configFile."hammerspoon/Spoons/MoveWindow.spoon".source =
./hammerspoon/Spoons/MoveWindow.spoon;
};
homebrew.casks = [ "hammerspoon" ];
system.activationScripts.postUserActivation.text = ''
defaults write org.hammerspoon.Hammerspoon MJConfigFile "~/.config/hammerspoon/init.lua"
'';
}

View File

@ -1,53 +0,0 @@
{ config, ... }: {
# Homebrew - Mac-specific packages that aren't in Nix
# Requires Homebrew to be installed
system.activationScripts.preUserActivation.text = ''
if ! xcode-select --version 2>/dev/null; then
$DRY_RUN_CMD xcode-select --install
fi
if ! /usr/local/bin/brew --version 2>/dev/null; then
$DRY_RUN_CMD /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
'';
homebrew = {
enable = true;
onActivation = {
autoUpdate = false; # Don't update during rebuild
cleanup = "zap"; # Uninstall all programs not declared
upgrade = true;
};
global = {
brewfile = true; # Run brew bundle from anywhere
lockfiles = false; # Don't save lockfile (since running from anywhere)
};
taps = [
"homebrew/cask" # Required for casks
"homebrew/cask-drivers" # Used for Logitech G-Hub
];
brews = [
"trash" # Delete files and folders to trash instead of rm
"openjdk" # Required by Apache Directory Studio
];
casks = [
"1password" # 1Password packaging on Nix is broken for macOS
"scroll-reverser" # Different scroll style for mouse vs. trackpad
"meetingbar" # Show meetings in menu bar
"gitify" # Git notifications in menu bar
"logitech-g-hub" # Mouse and keyboard management
"mimestream" # Gmail client
"obsidian" # Obsidian packaging on Nix is not available for macOS
"steam" # Not packaged for Nix
"apache-directory-studio" # Packaging on Nix is not available for macOS
];
};
home-manager.users.${config.user} = {
programs.fish.shellAbbrs.t = "trash";
};
}

View File

@ -1,9 +0,0 @@
{ config, ... }: {
networking = {
computerName = "${config.fullName}'\\''s Mac";
# Adjust if necessary
# hostName = "";
};
}

View File

@ -1,182 +0,0 @@
{ pkgs, ... }: {
services.nix-daemon.enable = true;
environment.shells = [ pkgs.fish ];
security.pam.enableSudoTouchIdAuth = true;
system = {
keyboard = {
remapCapsLockToControl = true;
enableKeyMapping = true; # Allows for skhd
};
defaults = {
NSGlobalDomain = {
# Set to dark mode
AppleInterfaceStyle = "Dark";
# Don't change from dark to light automatically
# AppleInterfaceSwitchesAutomatically = false;
# Enable full keyboard access for all controls (e.g. enable Tab in modal dialogs)
AppleKeyboardUIMode = 3;
# Automatically show and hide the menu bar
_HIHideMenuBar = true;
# Expand save panel by default
NSNavPanelExpandedStateForSaveMode = true;
# Expand print panel by default
PMPrintingExpandedStateForPrint = true;
# Replace press-and-hold with key repeat
ApplePressAndHoldEnabled = false;
# Set a fast key repeat rate
KeyRepeat = 2;
# Shorten delay before key repeat begins
InitialKeyRepeat = 12;
# Save to local disk by default, not iCloud
NSDocumentSaveNewDocumentsToCloud = false;
# Disable autocorrect capitalization
NSAutomaticCapitalizationEnabled = false;
# Disable autocorrect smart dashes
NSAutomaticDashSubstitutionEnabled = false;
# Disable autocorrect adding periods
NSAutomaticPeriodSubstitutionEnabled = false;
# Disable autocorrect smart quotation marks
NSAutomaticQuoteSubstitutionEnabled = false;
# Disable autocorrect spellcheck
NSAutomaticSpellingCorrectionEnabled = false;
};
dock = {
# Automatically show and hide the dock
autohide = true;
# Add translucency in dock for hidden applications
showhidden = true;
# Enable spring loading on all dock items
enable-spring-load-actions-on-all-items = true;
# Highlight hover effect in dock stack grid view
mouse-over-hilite-stack = true;
mineffect = "genie";
orientation = "bottom";
show-recents = false;
tilesize = 44;
};
finder = {
# Default Finder window set to column view
FXPreferredViewStyle = "clmv";
# Finder search in current folder by default
FXDefaultSearchScope = "SCcf";
# Disable warning when changing file extension
FXEnableExtensionChangeWarning = false;
# Allow quitting of Finder application
QuitMenuItem = true;
};
# Disable "Are you sure you want to open" dialog
LaunchServices.LSQuarantine = false;
# Disable trackpad tap to click
trackpad.Clicking = false;
# universalaccess = {
# # Zoom in with Control + Scroll Wheel
# closeViewScrollWheelToggle = true;
# closeViewZoomFollowsFocus = true;
# };
# Where to save screenshots
screencapture.location = "~/Downloads";
};
# Settings that don't have an option in nix-darwin
activationScripts.postActivation.text = ''
echo "Disable disk image verification"
defaults write com.apple.frameworks.diskimages skip-verify -bool true
defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
echo "Avoid creating .DS_Store files on network volumes"
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
echo "Disable the warning before emptying the Trash"
defaults write com.apple.finder WarnOnEmptyTrash -bool false
echo "Require password immediately after sleep or screen saver begins"
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
echo "Allow apps from anywhere"
SPCTL=$(spctl --status)
if ! [ "$SPCTL" = "assessments disabled" ]; then
sudo spctl --master-disable
fi
'';
# User-level settings
activationScripts.postUserActivation.text = ''
echo "Show the ~/Library folder"
chflags nohidden ~/Library
echo "Enable dock magnification"
defaults write com.apple.dock magnification -bool true
echo "Set dock magnification size"
defaults write com.apple.dock largesize -int 48
echo "Define dock icon function"
__dock_item() {
printf "%s%s%s%s%s" \
"<dict><key>tile-data</key><dict><key>file-data</key><dict>" \
"<key>_CFURLString</key><string>" \
"$1" \
"</string><key>_CFURLStringType</key><integer>0</integer>" \
"</dict></dict></dict>"
}
echo "Choose and order dock icons"
defaults write com.apple.dock persistent-apps -array \
"$(__dock_item /Applications/1Password.app)" \
"$(__dock_item /Applications/Slack.app)" \
"$(__dock_item /System/Applications/Calendar.app)" \
"$(__dock_item ${pkgs.firefox-bin}/Applications/Firefox.app)" \
"$(__dock_item /System/Applications/Messages.app)" \
"$(__dock_item /System/Applications/Mail.app)" \
"$(__dock_item /Applications/Mimestream.app)" \
"$(__dock_item /Applications/zoom.us.app)" \
"$(__dock_item ${pkgs.discord}/Applications/Discord.app)" \
"$(__dock_item /Applications/Obsidian.app)" \
"$(__dock_item ${pkgs.kitty}/Applications/kitty.app)" \
"$(__dock_item /System/Applications/System\ Settings.app)"
'';
};
}

View File

@ -1,15 +0,0 @@
{ config, pkgs, lib, ... }: {
users.users."${config.user}" = {
# macOS user
home = config.homePath;
shell = pkgs.fish; # Default shell
};
# Used for aerc
home-manager.users.${config.user} = {
home.sessionVariables = { XDG_CONFIG_HOME = "${config.homePath}/.config"; };
};
}

View File

@ -1,7 +1,7 @@
{ config, lib, pkgs, ... }: { { config, lib, pkgs, ... }: {
imports = imports =
[ ../modules/shell ../modules/neovim ../modules/repositories/dotfiles.nix ]; [ ./applications ./mail ./neovim ./programming ./repositories ./shell ];
options = { options = {
user = lib.mkOption { user = lib.mkOption {
@ -36,7 +36,7 @@
colors = lib.mkOption { colors = lib.mkOption {
type = lib.types.attrs; type = lib.types.attrs;
description = "Base16 color scheme."; description = "Base16 color scheme.";
default = (import ../modules/colorscheme/gruvbox).dark; default = (import ../colorscheme/gruvbox).dark;
}; };
dark = lib.mkOption { dark = lib.mkOption {
type = lib.types.bool; type = lib.types.bool;

View File

@ -1,9 +0,0 @@
{ config, ... }: {
config = {
hardware.opengl = {
enable = true;
driSupport32Bit = true;
};
};
}

View File

@ -1,30 +0,0 @@
{ config, pkgs, lib, ... }: {
options.gaming.leagueoflegends = lib.mkEnableOption "League of Legends";
config = lib.mkIf config.gaming.leagueoflegends {
# League of Legends anti-cheat requirement
boot.kernel.sysctl = { "abi.vsyscall32" = 0; };
environment.systemPackages = with pkgs; [
# Lutris requirement to install the game
lutris
amdvlk
wineWowPackages.stable
# vulkan-tools
# Required according to https://lutris.net/games/league-of-legends/
openssl
gnome.zenity
# Don't remember if this is required
dconf
];
environment.sessionVariables = { QT_X11_NO_MITSHM = "1"; };
};
}

View File

@ -1,145 +0,0 @@
{ pkgs, ... }:
let
localPort = 25564;
publicPort = 49732;
rconPort = 25575;
rconPassword = "thiscanbeanything";
in {
unfreePackages = [ "minecraft-server" ];
services.minecraft-server = {
enable = true;
eula = true;
declarative = true;
whitelist = { };
openFirewall = false;
serverProperties = {
server-port = localPort;
difficulty = "normal";
gamemode = "survival";
white-list = false;
enforce-whitelist = false;
level-name = "world";
motd = "Welcome!";
pvp = true;
player-idle-timeout = 30;
generate-structures = true;
max-players = 20;
snooper-enabled = false;
spawn-npcs = true;
spawn-animals = true;
spawn-monsters = true;
allow-nether = true;
allow-flight = false;
enable-rcon = true;
"rcon.port" = rconPort;
"rcon.password" = rconPassword;
};
};
networking.firewall.allowedTCPPorts = [ publicPort ];
## Automatically start and stop Minecraft server based on player connections
# Adapted shamelessly from:
# https://dataswamp.org/~solene/2022-08-20-on-demand-minecraft-with-systemd.html
# Prevent Minecraft from starting by default
systemd.services.minecraft-server = { wantedBy = pkgs.lib.mkForce [ ]; };
# Listen for connections on the public port, to trigger the actual
# listen-minecraft service.
systemd.sockets.listen-minecraft = {
wantedBy = [ "sockets.target" ];
requires = [ "network.target" ];
listenStreams = [ "${toString publicPort}" ];
};
# Proxy traffic to local port, and trigger hook-minecraft
systemd.services.listen-minecraft = {
path = [ pkgs.systemd ];
requires = [ "hook-minecraft.service" "listen-minecraft.socket" ];
after = [ "hook-minecraft.service" "listen-minecraft.socket" ];
serviceConfig.ExecStart =
"${pkgs.systemd.out}/lib/systemd/systemd-socket-proxyd 127.0.0.1:${
toString localPort
}";
};
# Start Minecraft if required and wait for it to be available
# Then unlock the listen-minecraft.service
systemd.services.hook-minecraft = {
path = with pkgs; [ systemd libressl busybox ];
# Start Minecraft and the auto-shutdown timer
script = ''
systemctl start minecraft-server.service
systemctl start stop-minecraft.timer
'';
# Keep checking until the service is available
postStart = ''
for i in $(seq 60); do
if ${pkgs.libressl.nc}/bin/nc -z 127.0.0.1 ${
toString localPort
} > /dev/null ; then
exit 0
fi
${pkgs.busybox.out}/bin/sleep 1
done
exit 1
'';
};
# Run a player check on a schedule for auto-shutdown
systemd.timers.stop-minecraft = {
timerConfig = {
OnCalendar = "*-*-* *:*:0/20"; # Every 20 seconds
Unit = "stop-minecraft.service";
};
};
# If no players are connected, then stop services and prepare to resume again
systemd.services.stop-minecraft = {
serviceConfig.Type = "oneshot";
script = ''
# Check when service was launched
servicestartsec=$(
date -d \
"$(systemctl show \
--property=ActiveEnterTimestamp \
minecraft-server.service \
| cut -d= -f2)" \
+%s)
# Calculate elapsed time
serviceelapsedsec=$(( $(date +%s) - servicestartsec))
# Ignore if service just started
if [ $serviceelapsedsec -lt 180 ]
then
echo "Server was just started"
exit 0
fi
PLAYERS=$(
printf "list\n" \
| ${pkgs.rcon.out}/bin/rcon -m \
-H 127.0.0.1 -p ${builtins.toString rconPort} -P ${rconPassword} \
)
if echo "$PLAYERS" | grep "are 0 of a"
then
echo "Stopping server"
systemctl stop minecraft-server.service
systemctl stop hook-minecraft.service
systemctl stop stop-minecraft.timer
fi
'';
};
}

View File

@ -1,14 +0,0 @@
{ ... }: {
imports = [
./audio.nix
./boot.nix
./keyboard.nix
./monitors.nix
./mouse.nix
./networking.nix
./sleep.nix
./wifi.nix
];
}

View File

@ -1,53 +0,0 @@
{ config, pkgs, lib, ... }: {
# Timezone required for Redshift schedule
imports = [ ../nixos/timezone.nix ];
config = lib.mkIf config.gui.enable {
environment.systemPackages = with pkgs;
[
ddcutil # Monitor brightness control
];
# Reduce blue light at night
services.redshift = {
enable = true;
brightness = {
day = "1.0";
night = "1.0";
};
};
# Detect monitors (brightness) for ddcutil
hardware.i2c.enable = true;
# Grant main user access to external monitors
users.users.${config.user}.extraGroups = [ "i2c" ];
services.xserver.displayManager = {
# Put the login screen on the left monitor
lightdm.greeters.gtk.extraConfig = ''
active-monitor=0
'';
# Set up screen position and rotation
setupCommands = ''
${pkgs.xorg.xrandr}/bin/xrandr --output DisplayPort-0 \
--mode 1920x1200 \
--pos 1920x0 \
--rotate left \
--output HDMI-0 \
--primary \
--mode 1920x1080 \
--pos 0x560 \
--rotate normal \
--output DVI-0 --off \
--output DVI-1 --off \
'';
};
};
}

View File

@ -1,21 +0,0 @@
{ config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable {
# Mouse customization
services.ratbagd.enable = true;
environment.systemPackages = with pkgs; [
libratbag # Mouse adjustments
piper # Mouse adjustments GUI
];
services.xserver.libinput.mouse = {
# Disable mouse acceleration
accelProfile = "flat";
accelSpeed = "1.15";
};
};
}

View File

@ -1,10 +0,0 @@
{ ... }: {
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
# Per-interface useDHCP will be mandatory in the future, so this generated config
# replicates the default behaviour.
networking.useDHCP = false;
networking.interfaces.enp0s31f6.useDHCP = true;
networking.interfaces.wlp3s0.useDHCP = true;
}

View File

@ -1,7 +0,0 @@
{ config, ... }: {
# Servers need a bootloader or they won't start
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
}

View File

@ -1,8 +0,0 @@
{ ... }: {
# Prevent wake from keyboard
powerManagement.powerDownCommands = ''
for wakeup in /sys/bus/usb/devices/1-*/power/wakeup; do echo disabled > $wakeup; done
'';
}

View File

@ -1,9 +0,0 @@
{ ... }: {
# Enables wireless support via wpa_supplicant.
networking.wireless.enable = true;
# Allows the user to control the WiFi settings.
networking.wireless.userControlled.enable = true;
}

View File

@ -1,6 +1,8 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
config = { options.mail.aerc.enable = lib.mkEnableOption "Aerc email.";
config = lib.mkIf config.mail.aerc.enable {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {

View File

@ -3,18 +3,19 @@
imports = [ ./himalaya.nix ./aerc.nix ]; imports = [ ./himalaya.nix ./aerc.nix ];
options = { options = {
mailUser = lib.mkOption { mail.enable = lib.mkEnableOption "Mail service.";
mail.user = lib.mkOption {
type = lib.types.str; type = lib.types.str;
description = "User name for the email address."; description = "User name for the email address.";
default = config.user; default = config.user;
}; };
mailServer = lib.mkOption { mail.server = lib.mkOption {
type = lib.types.str; type = lib.types.str;
description = "Server name for the email address."; description = "Server name for the email address.";
}; };
}; };
config = { config = lib.mkIf config.mail.enable {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
programs.mbsync = { enable = true; }; programs.mbsync = { enable = true; };
@ -25,13 +26,13 @@
accounts.email = { accounts.email = {
maildirBasePath = "${config.homePath}/mail"; maildirBasePath = "${config.homePath}/mail";
accounts = { accounts = {
home = let address = "${config.mailUser}@${config.mailServer}"; home = let address = "${config.mail.user}@${config.mail.server}";
in { in {
userName = address; userName = address;
realName = config.fullName; realName = config.fullName;
primary = true; primary = true;
inherit address; inherit address;
aliases = map (mailUser: "${mailUser}@${config.mailServer}") [ aliases = map (user: "${user}@${config.mail.server}") [
"me" "me"
"hey" "hey"
"admin" "admin"

View File

@ -1,6 +1,8 @@
{ config, ... }: { { config, lib, ... }: {
config = { options.mail.himalaya.enable = lib.mkEnableOption "Himalaya email.";
config = lib.mkIf config.mail.himalaya.enable {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {

View File

@ -9,31 +9,36 @@ let
in { in {
home-manager.users.${config.user} = options.neovim.enable = lib.mkEnableOption "Neovim.";
{ config = lib.mkIf config.neovim.enable {
home-manager.users.${config.user} =
home.packages = [ neovim ]; {
programs.git.extraConfig.core.editor = "nvim"; home.packages = [ neovim ];
home.sessionVariables = {
EDITOR = "nvim"; programs.git.extraConfig.core.editor = "nvim";
MANPAGER = "nvim +Man!"; home.sessionVariables = {
}; EDITOR = "nvim";
programs.fish = { MANPAGER = "nvim +Man!";
shellAliases = { vim = "nvim"; };
shellAbbrs = {
v = lib.mkForce "nvim";
vl = lib.mkForce "nvim -c 'normal! `0' -c 'bdelete 1'";
vll = "nvim -c 'Telescope oldfiles'";
}; };
programs.fish = {
shellAliases = { vim = "nvim"; };
shellAbbrs = {
v = lib.mkForce "nvim";
vl = lib.mkForce "nvim -c 'normal! `0' -c 'bdelete 1'";
vll = "nvim -c 'Telescope oldfiles'";
};
};
programs.kitty.settings.scrollback_pager = lib.mkForce ''
${neovim}/bin/nvim -c 'setlocal nonumber nolist showtabline=0 foldcolumn=0|Man!' -c "autocmd VimEnter * normal G" -'';
}; };
programs.kitty.settings.scrollback_pager = lib.mkForce ''
${neovim}/bin/nvim -c 'setlocal nonumber nolist showtabline=0 foldcolumn=0|Man!' -c "autocmd VimEnter * normal G" -'';
}; # # Used for icons in Vim
# fonts.fonts = with pkgs; [ nerdfonts ];
# # Used for icons in Vim };
# fonts.fonts = with pkgs; [ nerdfonts ];
} }

View File

@ -1,9 +0,0 @@
{ config, ... }: {
imports = [ ./user.nix ./timezone.nix ./doas.nix ];
# Pin a state version to prevent warnings
system.stateVersion =
config.home-manager.users.${config.user}.home.stateVersion;
}

View File

@ -1,30 +0,0 @@
# Replace sudo with doas
{ config, ... }: {
security = {
# Remove sudo
sudo.enable = false;
# Add doas
doas = {
enable = true;
# No password required
wheelNeedsPassword = false;
# Pass environment variables from user to root
# Also requires removing password here
extraRules = [{
groups = [ "wheel" ];
noPass = true;
keepEnv = true;
}];
};
};
home-manager.users.${config.user}.programs.fish.shellAliases = {
sudo = "doas";
};
}

View File

@ -1,15 +0,0 @@
{ ... }: {
# Service to determine location for time zone
services.geoclue2.enable = true;
services.geoclue2.enableWifi = false; # Breaks when it can't connect
location = { provider = "geoclue2"; };
# Enable local time based on time zone
services.localtimed.enable = true;
# Required to get localtimed to talk to geoclue2
services.geoclue2.appConfig.localtimed.isSystem = true;
services.geoclue2.appConfig.localtimed.isAllowed = true;
}

View File

@ -0,0 +1,12 @@
{ config, pkgs, lib, ... }: {
imports = [
./haskell.nix
./kubernetes.nix
./lua.nix
./nix.nix
./python.nix
./terraform.nix
];
}

View File

@ -1,8 +1,14 @@
{ ... }: { { config, pkgs, lib, ... }: {
# Binary Cache for Haskell.nix options.haskell.enable = lib.mkEnableOption "Haskell programming language.";
nix.settings.trusted-public-keys =
[ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ]; config = lib.mkIf config.haskell.enable {
nix.settings.substituters = [ "https://cache.iog.io" ];
# Binary Cache for Haskell.nix
nix.settings.trusted-public-keys =
[ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ];
nix.settings.substituters = [ "https://cache.iog.io" ];
};
} }

View File

@ -1,138 +1,143 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { options.kubernetes.enable = lib.mkEnableOption "Kubernetes tools.";
home.packages = with pkgs; [ config = lib.mkIf config.kubernetes.enable {
kubectl # Basic Kubernetes queries home-manager.users.${config.user} = {
kubernetes-helm # Helm CLI
fluxcd # Bootstrap clusters with Flux
kustomize # Kustomize CLI (for Flux)
];
programs.fish.shellAbbrs = { home.packages = with pkgs; [
k = "kubectl"; kubectl # Basic Kubernetes queries
pods = "kubectl get pods -A"; kubernetes-helm # Helm CLI
nodes = "kubectl get nodes"; fluxcd # Bootstrap clusters with Flux
deploys = "kubectl get deployments -A"; kustomize # Kustomize CLI (for Flux)
dash = "kube-dashboard"; ];
ks = "k9s";
};
# Terminal Kubernetes UI programs.fish.shellAbbrs = {
programs.k9s = { k = "kubectl";
enable = true; pods = "kubectl get pods -A";
# settings = { k9s = { headless = true; }; }; nodes = "kubectl get nodes";
skin = { deploys = "kubectl get deployments -A";
k9s = { dash = "kube-dashboard";
body = { ks = "k9s";
fgColor = config.theme.colors.base06; };
bgColor = config.theme.colors.base00;
logoColor = config.theme.colors.base02; # *blue ? # Terminal Kubernetes UI
}; programs.k9s = {
# Search bar enable = true;
prompt = { # settings = { k9s = { headless = true; }; };
fgColor = config.theme.colors.base06; skin = {
bgColor = config.theme.colors.base00; k9s = {
suggestColor = config.theme.colors.base03; body = {
};
# Header left side
info = {
fgColor = config.theme.colors.base04;
sectionColor = config.theme.colors.base05;
};
dialog = {
fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00;
buttonFgColor = config.theme.colors.base06;
buttonBgColor = config.theme.colors.base0E;
buttonFocusFgColor = config.theme.colors.base07;
buttonFocusBgColor = config.theme.colors.base02; # *cyan
labelFgColor = config.theme.colors.base09;
fieldFgColor = config.theme.colors.base06;
};
frame = {
border = {
fgColor = config.theme.colors.base01;
focusColor = config.theme.colors.base06;
};
menu = {
fgColor = config.theme.colors.base06;
keyColor = config.theme.colors.base0E; # *magenta
numKeyColor = config.theme.colors.base0E; # *magenta
};
crumbs = {
fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base01;
activeColor = config.theme.colors.base03;
};
status = {
newColor = config.theme.colors.base04; # *cyan
modifyColor = config.theme.colors.base0D; # *blue
addColor = config.theme.colors.base0B; # *green
errorColor = config.theme.colors.base08; # *red
highlightColor = config.theme.colors.base09; # *orange
killColor = config.theme.colors.base03; # *comment
completedColor = config.theme.colors.base03; # *comment
};
title = {
fgColor = config.theme.colors.base06; fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00; bgColor = config.theme.colors.base00;
highlightColor = config.theme.colors.base09; # *orange logoColor = config.theme.colors.base02; # *blue ?
counterColor = config.theme.colors.base0D; # *blue
filterColor = config.theme.colors.base0E; # *magenta
}; };
}; # Search bar
views = { prompt = {
charts = {
bgColor = config.theme.colors.base00;
defaultDialColors =
[ config.theme.colors.base0D config.theme.colors.base08 ];
# - *blue
# - *red
defaultChartColors =
[ config.theme.colors.base0D config.theme.colors.base08 ];
# - *blue
# - *red
};
table = {
# List of resources
fgColor = config.theme.colors.base06; fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00; bgColor = config.theme.colors.base00;
suggestColor = config.theme.colors.base03;
# Row selection };
cursorFgColor = config.theme.colors.base07; # Header left side
cursorBgColor = config.theme.colors.base01; info = {
fgColor = config.theme.colors.base04;
# Header row sectionColor = config.theme.colors.base05;
header = { };
fgColor = config.theme.colors.base0D; dialog = {
bgColor = config.theme.colors.base00; fgColor = config.theme.colors.base06;
sorterColor = config.theme.colors.base0A; # *selection bgColor = config.theme.colors.base00;
buttonFgColor = config.theme.colors.base06;
buttonBgColor = config.theme.colors.base0E;
buttonFocusFgColor = config.theme.colors.base07;
buttonFocusBgColor = config.theme.colors.base02; # *cyan
labelFgColor = config.theme.colors.base09;
fieldFgColor = config.theme.colors.base06;
};
frame = {
border = {
fgColor = config.theme.colors.base01;
focusColor = config.theme.colors.base06;
}; };
}; menu = {
xray = { fgColor = config.theme.colors.base06;
fgColor = config.theme.colors.base06; keyColor = config.theme.colors.base0E; # *magenta
bgColor = config.theme.colors.base00; numKeyColor = config.theme.colors.base0E; # *magenta
cursorColor = config.theme.colors.base06; };
graphicColor = config.theme.colors.base0D; crumbs = {
showIcons = false; fgColor = config.theme.colors.base06;
}; bgColor = config.theme.colors.base01;
yaml = { activeColor = config.theme.colors.base03;
keyColor = config.theme.colors.base0D; };
colonColor = config.theme.colors.base04; status = {
fgColor = config.theme.colors.base03; newColor = config.theme.colors.base04; # *cyan
}; modifyColor = config.theme.colors.base0D; # *blue
logs = { addColor = config.theme.colors.base0B; # *green
fgColor = config.theme.colors.base06; errorColor = config.theme.colors.base08; # *red
bgColor = config.theme.colors.base00; highlightColor = config.theme.colors.base09; # *orange
indicator = { killColor = config.theme.colors.base03; # *comment
completedColor = config.theme.colors.base03; # *comment
};
title = {
fgColor = config.theme.colors.base06; fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00; bgColor = config.theme.colors.base00;
highlightColor = config.theme.colors.base09; # *orange
counterColor = config.theme.colors.base0D; # *blue
filterColor = config.theme.colors.base0E; # *magenta
};
};
views = {
charts = {
bgColor = config.theme.colors.base00;
defaultDialColors =
[ config.theme.colors.base0D config.theme.colors.base08 ];
# - *blue
# - *red
defaultChartColors =
[ config.theme.colors.base0D config.theme.colors.base08 ];
# - *blue
# - *red
};
table = {
# List of resources
fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00;
# Row selection
cursorFgColor = config.theme.colors.base07;
cursorBgColor = config.theme.colors.base01;
# Header row
header = {
fgColor = config.theme.colors.base0D;
bgColor = config.theme.colors.base00;
sorterColor = config.theme.colors.base0A; # *selection
};
};
xray = {
fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00;
cursorColor = config.theme.colors.base06;
graphicColor = config.theme.colors.base0D;
showIcons = false;
};
yaml = {
keyColor = config.theme.colors.base0D;
colonColor = config.theme.colors.base04;
fgColor = config.theme.colors.base03;
};
logs = {
fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00;
indicator = {
fgColor = config.theme.colors.base06;
bgColor = config.theme.colors.base00;
};
}; };
}; };
}; };
}; };
}; };
}; };
}; };

View File

@ -1,8 +1,12 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user}.home.packages = with pkgs; [ options.lua.enable = lib.mkEnableOption "Lua programming language.";
stylua # Lua formatter
sumneko-lua-language-server # Lua LSP config = lib.mkIf config.lua.enable {
]; home-manager.users.${config.user}.home.packages = with pkgs; [
stylua # Lua formatter
sumneko-lua-language-server # Lua LSP
];
};
} }

View File

@ -1,11 +1,17 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { options.nixlang.enable = lib.mkEnableOption "Nix programming language.";
home.packages = with pkgs; [ config = lib.mkIf config.nixlang.enable {
nixfmt # Nix file formatter
nil # Nix language server home-manager.users.${config.user} = {
];
home.packages = with pkgs; [
nixfmt # Nix file formatter
nil # Nix language server
];
};
}; };

View File

@ -1,15 +1,21 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { options.python.enable = lib.mkEnableOption "Python programming language.";
home.packages = with pkgs; [ config = lib.mkIf config.python.enable {
# python310 # Standard Python interpreter
nodePackages.pyright # Python language server
black # Python formatter
python310Packages.flake8 # Python linter
];
programs.fish.shellAbbrs = { py = "python3"; }; home-manager.users.${config.user} = {
home.packages = with pkgs; [
# python310 # Standard Python interpreter
nodePackages.pyright # Python language server
black # Python formatter
python310Packages.flake8 # Python linter
];
programs.fish.shellAbbrs = { py = "python3"; };
};
}; };

View File

@ -1,15 +1,21 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
options.terraform.enable = lib.mkEnableOption "Terraform tools.";
config = lib.mkIf config.terraform.enable {
home-manager.users.${config.user} = {
programs.fish.shellAbbrs = {
# Terraform
te = "terraform";
};
home.packages = with pkgs; [
terraform # Terraform executable
terraform-ls # Language server
tflint # Linter
];
home-manager.users.${config.user} = {
programs.fish.shellAbbrs = {
# Terraform
te = "terraform";
}; };
home.packages = with pkgs; [
terraform # Terraform executable
terraform-ls # Language server
tflint # Linter
];
}; };

View File

@ -0,0 +1,5 @@
{ ... }: {
imports = [ ./dotfiles.nix ./notes.nix ];
}

View File

@ -1,24 +1,30 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { options.dotfiles.enable = lib.mkEnableOption "Clone dotfiles.";
home.activation = { config = lib.mkIf config.dotfiles.enable {
# Always clone dotfiles repository if it doesn't exist home-manager.users.${config.user} = {
cloneDotfiles =
config.home-manager.users.${config.user}.lib.dag.entryAfter home.activation = {
[ "writeBoundary" ] ''
if [ ! -d "${config.dotfilesPath}" ]; then # Always clone dotfiles repository if it doesn't exist
$DRY_RUN_CMD mkdir --parents $VERBOSE_ARG $(dirname "${config.dotfilesPath}") cloneDotfiles =
$DRY_RUN_CMD ${pkgs.git}/bin/git clone ${config.dotfilesRepo} "${config.dotfilesPath}" config.home-manager.users.${config.user}.lib.dag.entryAfter
fi [ "writeBoundary" ] ''
''; if [ ! -d "${config.dotfilesPath}" ]; then
$DRY_RUN_CMD mkdir --parents $VERBOSE_ARG $(dirname "${config.dotfilesPath}")
$DRY_RUN_CMD ${pkgs.git}/bin/git clone ${config.dotfilesRepo} "${config.dotfilesPath}"
fi
'';
};
# Set a variable for dotfiles repo, not necessary but convenient
home.sessionVariables.DOTS = config.dotfilesPath;
}; };
# Set a variable for dotfiles repo, not necessary but convenient
home.sessionVariables.DOTS = config.dotfilesPath;
}; };
} }

View File

@ -1,28 +0,0 @@
{ config, pkgs, lib, ... }: {
services.keybase.enable = true;
services.kbfs = {
enable = true;
# enableRedirector = true;
mountPoint = "/run/user/1000/keybase/kbfs";
};
security.wrappers.keybase-redirector = {
setuid = true;
owner = "root";
group = "root";
source = "${pkgs.kbfs}/bin/redirector";
};
home-manager.users.${config.user} = {
home.packages = [ (lib.mkIf config.gui.enable pkgs.keybase-gui) ];
home.file = let
ignorePatterns = ''
keybase/
kbfs/'';
in {
".rgignore".text = ignorePatterns;
".fdignore".text = ignorePatterns;
};
};
}

View File

@ -1,6 +0,0 @@
{ pkgs, ... }: {
services.mullvad-vpn.enable = true;
environment.systemPackages = [ pkgs.mullvad-vpn ];
}

View File

@ -1,21 +0,0 @@
{ ... }: {
services.n8n = {
enable = true;
settings = {
n8n = {
listenAddress = "127.0.0.1";
port = 5678;
};
};
};
caddyRoutes = [{
match = [{ host = [ config.n8nServer ]; }];
handle = [{
handler = "reverse_proxy";
upstreams = [{ dial = "localhost:5678"; }];
}];
}];
}

View File

@ -1,6 +1,8 @@
{ config, pkgs, ... }: { { config, pkgs, lib, ... }: {
home-manager.users.${config.user} = { options.charm.enable = lib.mkEnableOption "Charm utilities.";
config.home-manager.users.${config.user} = lib.mkIf config.charm.enable {
home.packages = with pkgs; [ home.packages = with pkgs; [
glow # Markdown previews glow # Markdown previews

View File

@ -1,19 +0,0 @@
{ config, lib, ... }: {
# Systemd doesn't work in WSL so these must be disabled
services.geoclue2.enable = lib.mkForce false;
location = { provider = lib.mkForce "manual"; };
services.localtimed.enable = lib.mkForce false;
# Used by NeoVim for clipboard sharing with Windows
# home-manager.users.${config.user}.home.sessionPath =
# [ "/mnt/c/Program Files/win32yank/" ];
# Replace config directory with our repo, since it sources from config on
# every launch
system.activationScripts.configDir.text = ''
rm -rf /etc/nixos
ln --symbolic --no-dereference --force ${config.dotfilesPath} /etc/nixos
'';
}

View File

@ -1,6 +1,15 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.gui.enable { options = {
calibre = {
enable = lib.mkEnableOption {
description = "Enable Calibre.";
default = false;
};
};
};
config = lib.mkIf (config.gui.enable && config.calibre.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
home.packages = with pkgs; [ calibre ]; home.packages = with pkgs; [ calibre ];
# home.sessionVariables = { CALIBRE_USE_DARK_PALETTE = 1; }; # home.sessionVariables = { CALIBRE_USE_DARK_PALETTE = 1; };

View File

@ -0,0 +1,5 @@
{ ... }: {
imports = [ ./calibre.nix ];
}

13
nixos/default.nix Normal file
View File

@ -0,0 +1,13 @@
{ ... }: {
imports = [
./applications
./gaming
./graphical
./hardware
./services
./system
./wsl
];
}

19
nixos/gaming/default.nix Normal file
View File

@ -0,0 +1,19 @@
{ config, pkgs, lib, ... }: {
imports = [
./leagueoflegends.nix
./legendary.nix
./lutris.nix
./minecraft-server.nix
./steam.nix
];
options.gaming.enable = lib.mkEnableOption "Enable gaming features.";
config = lib.mkIf (config.gaming.enable && pkgs.stdenv.isLinux) {
hardware.opengl = {
enable = true;
driSupport32Bit = true;
};
};
}

View File

@ -0,0 +1,32 @@
{ config, pkgs, lib, ... }: {
options.gaming.leagueoflegends.enable =
lib.mkEnableOption "League of Legends";
config =
lib.mkIf (config.gaming.leagueoflegends.enable && pkgs.stdenv.isLinux) {
# League of Legends anti-cheat requirement
boot.kernel.sysctl = { "abi.vsyscall32" = 0; };
environment.systemPackages = with pkgs; [
# Lutris requirement to install the game
lutris
amdvlk
wineWowPackages.stable
# vulkan-tools
# Required according to https://lutris.net/games/league-of-legends/
openssl
gnome.zenity
# Don't remember if this is required
dconf
];
environment.sessionVariables = { QT_X11_NO_MITSHM = "1"; };
};
}

View File

@ -4,9 +4,10 @@ let home-packages = config.home-manager.users.${config.user}.home.packages;
in { in {
imports = [ ./. ]; options.gaming.legendary.enable =
lib.mkEnableOption "Legendary Epic Games launcher.";
config = { config = lib.mkIf config.gaming.legendary.enable {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
legendary-gl legendary-gl
rare # GUI for Legendary (not working) rare # GUI for Legendary (not working)

View File

@ -1,8 +1,8 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
options.gaming.lutris = lib.mkEnableOption "Lutris"; options.gaming.lutris.enable = lib.mkEnableOption "Lutris game installer.";
config = lib.mkIf config.gaming.lutris { config = lib.mkIf config.gaming.lutris.enable {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
lutris lutris
amdvlk # Vulkan drivers (probably already installed) amdvlk # Vulkan drivers (probably already installed)

View File

@ -0,0 +1,152 @@
{ config, pkgs, lib, ... }:
let
localPort = 25564;
publicPort = 49732;
rconPort = 25575;
rconPassword = "thiscanbeanything";
in {
options.gaming.minecraft-server.enable =
lib.mkEnableOption "Minecraft Server.";
config = lib.mkIf config.gaming.minecraft-server.enable {
unfreePackages = [ "minecraft-server" ];
services.minecraft-server = {
enable = true;
eula = true;
declarative = true;
whitelist = { };
openFirewall = false;
serverProperties = {
server-port = localPort;
difficulty = "normal";
gamemode = "survival";
white-list = false;
enforce-whitelist = false;
level-name = "world";
motd = "Welcome!";
pvp = true;
player-idle-timeout = 30;
generate-structures = true;
max-players = 20;
snooper-enabled = false;
spawn-npcs = true;
spawn-animals = true;
spawn-monsters = true;
allow-nether = true;
allow-flight = false;
enable-rcon = true;
"rcon.port" = rconPort;
"rcon.password" = rconPassword;
};
};
networking.firewall.allowedTCPPorts = [ publicPort ];
## Automatically start and stop Minecraft server based on player connections
# Adapted shamelessly from:
# https://dataswamp.org/~solene/2022-08-20-on-demand-minecraft-with-systemd.html
# Prevent Minecraft from starting by default
systemd.services.minecraft-server = { wantedBy = pkgs.lib.mkForce [ ]; };
# Listen for connections on the public port, to trigger the actual
# listen-minecraft service.
systemd.sockets.listen-minecraft = {
wantedBy = [ "sockets.target" ];
requires = [ "network.target" ];
listenStreams = [ "${toString publicPort}" ];
};
# Proxy traffic to local port, and trigger hook-minecraft
systemd.services.listen-minecraft = {
path = [ pkgs.systemd ];
requires = [ "hook-minecraft.service" "listen-minecraft.socket" ];
after = [ "hook-minecraft.service" "listen-minecraft.socket" ];
serviceConfig.ExecStart =
"${pkgs.systemd.out}/lib/systemd/systemd-socket-proxyd 127.0.0.1:${
toString localPort
}";
};
# Start Minecraft if required and wait for it to be available
# Then unlock the listen-minecraft.service
systemd.services.hook-minecraft = {
path = with pkgs; [ systemd libressl busybox ];
# Start Minecraft and the auto-shutdown timer
script = ''
systemctl start minecraft-server.service
systemctl start stop-minecraft.timer
'';
# Keep checking until the service is available
postStart = ''
for i in $(seq 60); do
if ${pkgs.libressl.nc}/bin/nc -z 127.0.0.1 ${
toString localPort
} > /dev/null ; then
exit 0
fi
${pkgs.busybox.out}/bin/sleep 1
done
exit 1
'';
};
# Run a player check on a schedule for auto-shutdown
systemd.timers.stop-minecraft = {
timerConfig = {
OnCalendar = "*-*-* *:*:0/20"; # Every 20 seconds
Unit = "stop-minecraft.service";
};
};
# If no players are connected, then stop services and prepare to resume again
systemd.services.stop-minecraft = {
serviceConfig.Type = "oneshot";
script = ''
# Check when service was launched
servicestartsec=$(
date -d \
"$(systemctl show \
--property=ActiveEnterTimestamp \
minecraft-server.service \
| cut -d= -f2)" \
+%s)
# Calculate elapsed time
serviceelapsedsec=$(( $(date +%s) - servicestartsec))
# Ignore if service just started
if [ $serviceelapsedsec -lt 180 ]
then
echo "Server was just started"
exit 0
fi
PLAYERS=$(
printf "list\n" \
| ${pkgs.rcon.out}/bin/rcon -m \
-H 127.0.0.1 -p ${builtins.toString rconPort} -P ${rconPassword} \
)
if echo "$PLAYERS" | grep "are 0 of a"
then
echo "Stopping server"
systemctl stop minecraft-server.service
systemctl stop hook-minecraft.service
systemctl stop stop-minecraft.timer
fi
'';
};
};
}

View File

@ -1,8 +1,8 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
imports = [ ./. ]; options.gaming.steam.enable = lib.mkEnableOption "Steam game launcher.";
config = { config = lib.mkIf (config.gaming.steam.enable && pkgs.stdenv.isLinux) {
hardware.steam-hardware.enable = true; hardware.steam-hardware.enable = true;
unfreePackages = [ "steam" "steam-original" "steamcmd" "steam-run" ]; unfreePackages = [ "steam" "steam-original" "steamcmd" "steam-run" ];
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [

View File

@ -2,7 +2,9 @@
{ {
config = lib.mkIf config.services.xserver.enable { options.gui.dmenu.enable = lib.mkEnableOption "dmenu launcher.";
config = lib.mkIf (config.services.xserver.enable && config.dmenu.enable) {
home-manager.users.${config.user}.home.packages = [ pkgs.dmenu ]; home-manager.users.${config.user}.home.packages = [ pkgs.dmenu ];
gui.launcherCommand = "${pkgs.dmenu}/bin/dmenu_run"; gui.launcherCommand = "${pkgs.dmenu}/bin/dmenu_run";

View File

@ -4,7 +4,7 @@ let fontName = "Victor Mono";
in { in {
config = lib.mkIf config.gui.enable { config = lib.mkIf (config.gui.enable && pkgs.stdenv.isLinux) {
fonts.fonts = with pkgs; [ fonts.fonts = with pkgs; [
victor-mono # Used for Vim and Terminal victor-mono # Used for Vim and Terminal

View File

@ -9,7 +9,7 @@ let
in { in {
config = { config = lib.mkIf pkgs.stdenv.isLinux {
services.xserver.windowManager = { services.xserver.windowManager = {
i3 = { i3 = {

View File

@ -1,6 +1,6 @@
{ config, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf (config.services.xserver.enable) { config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {
services.picom = { services.picom = {

View File

@ -1,6 +1,6 @@
{ config, pkgs, lib, ... }: { { config, pkgs, lib, ... }: {
config = lib.mkIf config.services.xserver.enable { config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
toggleBarCommand = "polybar-msg cmd toggle"; toggleBarCommand = "polybar-msg cmd toggle";

View File

@ -2,7 +2,7 @@
{ {
config = lib.mkIf config.services.xserver.enable { config = lib.mkIf (pkgs.stdenv.isLinux && config.services.xserver.enable) {
home-manager.users.${config.user} = { home-manager.users.${config.user} = {

View File

@ -15,10 +15,12 @@
}; };
config = let config = let
gtkTheme = { gtkTheme = {
name = config.gtk.theme.name; name = config.gtk.theme.name;
package = pkgs."${config.gtk.theme.package}"; package = pkgs."${config.gtk.theme.package}";
}; };
in lib.mkIf config.gui.enable { in lib.mkIf config.gui.enable {
# Enable the X11 windowing system. # Enable the X11 windowing system.

View File

@ -30,7 +30,7 @@ let
in { in {
config = lib.mkIf config.gui.enable { config = lib.mkIf (pkgs.stdenv.isLinux && config.gui.enable) {
sound.enable = true; sound.enable = true;
# Enable PipeWire # Enable PipeWire

View File

@ -1,6 +1,6 @@
{ config, ... }: { { config, pkgs, lib, ... }: {
boot.loader = { boot.loader = lib.mkIf (config.physical && pkgs.stdenv.isLinux) {
grub = { grub = {
enable = true; enable = true;

View File

@ -0,0 +1,20 @@
{ lib, ... }: {
imports = [
./audio.nix
./boot.nix
./keyboard.nix
./monitors.nix
./mouse.nix
./networking.nix
./server.nix
./sleep.nix
./wifi.nix
];
options = {
physical = lib.mkEnableOption "Whether this machine is a physical device.";
server = lib.mkEnableOption "Whether this machine is a server.";
};
}

Some files were not shown because too many files have changed in this diff Show More