diff --git a/local/lib/default.nix b/local/lib/default.nix index a459e92e..127ef753 100644 --- a/local/lib/default.nix +++ b/local/lib/default.nix @@ -32,4 +32,9 @@ lib: in # Split into lines. Strip leading tabs. Concat back to string. builtins.concatStringsSep "\n" (stripTabs (lib.strings.splitString "\n" text)); + + # find an element in a list, return the index + findIndex = e: list: + let findIndex_ = i: list: if (builtins.elemAt list i) == e then i else findIndex_ (i + 1) list; + in findIndex_ 0 list; } diff --git a/modules/packages/default.nix b/modules/packages/default.nix index f5e75929..e2406f24 100644 --- a/modules/packages/default.nix +++ b/modules/packages/default.nix @@ -1,10 +1,16 @@ inputs: { - options.nixos.packages = let inherit (inputs.lib) mkOption types; in - { - packageSet = mkOption - { - type = types.enum + imports = inputs.localLib.mkModules + [ + ./server + ./desktop + ./desktop-fat + ./workstation + ]; + options.nixos.packages = + let + inherit (inputs.lib) mkOption types; + packageSets = [ # no gui, only used for specific purpose "server" @@ -14,587 +20,53 @@ inputs: # nearly everything "workstation" ]; - default = "server"; + in + { + packageSet = mkOption { type = types.enum packageSets; default = "server"; }; + extraPackages = mkOption { type = types.listOf types.unspecified; default = []; }; + excludePackages = mkOption { type = types.listOf types.unspecified; default = []; }; + extraPythonPackages = mkOption { type = types.listOf types.unspecified; default = []; }; + excludePythonPackages = mkOption { type = types.listOf types.unspecified; default = []; }; + extraPrebuildPackages = mkOption { type = types.listOf types.unspecified; default = []; }; + excludePrebuildPackages = mkOption { type = types.listOf types.unspecified; default = []; }; + _packageSets = mkOption + { + type = types.listOf types.nonEmptyStr; + readOnly = true; + default = builtins.genList (i: builtins.elemAt packageSets i) + ((inputs.localLib.findIndex inputs.config.nixos.packages.packageSet packageSets) + 1); + }; + _packages = mkOption { type = types.listOf types.unspecified; default = []; }; + _pythonPackages = mkOption { type = types.listOf types.unspecified; default = []; }; + _prebuildPackages = mkOption { type = types.listOf types.unspecified; default = []; }; }; - extraPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - excludePackages = mkOption { type = types.listOf types.unspecified; default = []; }; - extraPythonPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - excludePythonPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - extraPrebuildPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - excludePrebuildPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - _packages = mkOption { type = types.listOf types.unspecified; default = []; }; - _pythonPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - _prebuildPackages = mkOption { type = types.listOf types.unspecified; default = []; }; - }; config = let - inherit (inputs.lib) mkMerge mkIf; - inherit (builtins) concatLists map listToAttrs; - inherit (inputs.localLib) attrsToList; - in mkMerge - [ - # >= server - { - nixos = - { - packages = with inputs.pkgs; + inherit (builtins) concatLists map; + in + { + environment.systemPackages = let inherit (inputs.lib.lists) subtractLists; in with inputs.config.nixos.packages; + (subtractLists excludePackages (_packages ++ extraPackages)) + ++ [ + (inputs.pkgs.python3.withPackages (pythonPackages: + subtractLists + (concatLists (map (packageFunction: packageFunction pythonPackages) excludePythonPackages)) + (concatLists (map (packageFunction: packageFunction pythonPackages) + (_pythonPackages ++ extraPythonPackages))))) + (inputs.pkgs.callPackage ({ stdenv }: stdenv.mkDerivation { - _packages = - [ - # shell - ksh - # basic tools - beep dos2unix gnugrep pv tmux screen parallel tldr cowsay jq zellij neofetch ipfetch localPackages.pslist - fastfetch reptyr - # lsxx - pciutils usbutils lshw util-linux lsof - # top - iotop iftop htop btop powertop s-tui - # editor - nano bat - # downloader - wget aria2 curl yt-dlp - # file manager - tree eza trash-cli lsd broot file xdg-ninja mlocate - # compress - pigz rar upx unzip zip lzip p7zip - # file system management - sshfs e2fsprogs adb-sync duperemove compsize - # disk management - smartmontools hdparm - # encryption and authentication - apacheHttpd openssl ssh-to-age gnupg age sops pam_u2f yubico-piv-tool - # networking - ipset iptables iproute2 dig nettools traceroute tcping-go whois tcpdump nmap inetutils - # nix tools - nix-output-monitor nix-tree ssh-to-age - # office - todo-txt-cli - # development - gdb try inputs.topInputs.plasma-manager.packages.x86_64-linux.rc2nix - ] ++ (with inputs.config.boot.kernelPackages; [ cpupower usbip ]); - _pythonPackages = [(pythonPackages: with pythonPackages; - [ - inquirerpy requests python-telegram-bot tqdm fastapi pypdf2 pandas matplotlib plotly gunicorn redis jinja2 - certifi charset-normalizer idna orjson psycopg2 localPackages.eigengdb - ])]; - }; - users.sharedModules = [(home-inputs: - { - config.programs = - { - zsh = - { - enable = true; - initExtraBeforeCompInit = - '' - # p10k instant prompt - P10K_INSTANT_PROMPT="$XDG_CACHE_HOME/p10k-instant-prompt-''${(%):-%n}.zsh" - [[ ! -r "$P10K_INSTANT_PROMPT" ]] || source "$P10K_INSTANT_PROMPT" - HYPHEN_INSENSITIVE="true" - export PATH=~/bin:$PATH - function br - { - local cmd cmd_file code - cmd_file=$(mktemp) - if broot --outcmd "$cmd_file" "$@"; then - cmd=$(<"$cmd_file") - command rm -f "$cmd_file" - eval "$cmd" - else - code=$? - command rm -f "$cmd_file" - return "$code" - fi - } - alias todo="todo.sh" - ''; - plugins = - [ - { - file = "powerlevel10k.zsh-theme"; - name = "powerlevel10k"; - src = "${inputs.pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k"; - } - { - file = "p10k.zsh"; - name = "powerlevel10k-config"; - src = ./p10k-config; - } - { - name = "zsh-lsd"; - src = inputs.pkgs.fetchFromGitHub - { - owner = "z-shell"; - repo = "zsh-lsd"; - rev = "029a9cb0a9b39c9eb6c5b5100dd9182813332250"; - sha256 = "sha256-oWjWnhiimlGBMaZlZB+OM47jd9hporKlPNwCx6524Rk="; - }; - } - ]; - history = - { - path = "${home-inputs.config.xdg.dataHome}/zsh/zsh_history"; - extended = true; - save = 100000000; - size = 100000000; - }; - }; - direnv = { enable = true; nix-direnv.enable = true; }; - git = - { - enable = true; - lfs.enable = true; - extraConfig = - { - core.editor = if inputs.config.nixos.system.gui.preferred then "code --wait" else "vim"; - advice.detachedHead = false; - merge.conflictstyle = "diff3"; - diff.colorMoved = "default"; - }; - package = inputs.pkgs.gitFull; - delta = - { - enable = true; - options = - { - side-by-side = true; - navigate = true; - syntax-theme = "GitHub"; - light = true; - zero-style = "syntax white"; - line-numbers-zero-style = "#ffffff"; - }; - }; - }; - ssh = - { - enable = true; - controlMaster = "auto"; - controlPersist = "1m"; - compression = true; - }; - vim = - { - enable = true; - defaultEditor = true; - packageConfigurable = inputs.config.programs.vim.package; - settings = - { - number = true; - expandtab = false; - shiftwidth = 2; - tabstop = 2; - }; - extraConfig = - '' - set clipboard=unnamedplus - colorscheme evening - ''; - }; - }; - })]; - }; - programs = - { - nix-index-database.comma.enable = true; - nix-index.enable = true; - zsh = - { - enable = true; - syntaxHighlighting.enable = true; - autosuggestions.enable = true; - enableCompletion = true; - ohMyZsh = - { - enable = true; - plugins = [ "git" "colored-man-pages" "extract" "history-substring-search" "autojump" ]; - customPkgs = with inputs.pkgs; [ zsh-nix-shell ]; - }; - }; - command-not-found.enable = false; - adb.enable = true; - gnupg.agent = { enable = true; enableSSHSupport = true; }; - autojump.enable = true; - git = - { - enable = true; - package = inputs.pkgs.gitFull; - lfs.enable = true; - config = - { - init.defaultBranch = "main"; - core = { quotepath = false; editor = "vim"; }; - }; - }; - # yazi.enable = true; - }; - services = - { - fwupd.enable = true; - udev.packages = with inputs.pkgs; [ yubikey-personalization libfido2 ]; - openssh.knownHosts = - let - servers = - { - vps6 = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO5ZcvyRyOnUCuRtqrM/Qf+AdUe3a5bhbnfyhw2FSLDZ"; - hostnames = [ "internal.vps6.chn.moe" "vps6.chn.moe" "74.211.99.69" "192.168.82.1" ]; - }; - "initrd.vps6" = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB4DKB/zzUYco5ap6k9+UxeO04LL12eGvkmQstnYxgnS"; - hostnames = [ "initrd.vps6.chn.moe" "74.211.99.69" ]; - }; - vps7 = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF5XkdilejDAlg5hZZD0oq69k8fQpe9hIJylTo/aLRgY"; - hostnames = [ "internal.vps7.chn.moe" "vps7.chn.moe" "95.111.228.40" "192.168.82.2" ]; - }; - "initrd.vps7" = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGZyQpdQmEZw3nLERFmk2tS1gpSvXwW0Eish9UfhrRxC"; - hostnames = [ "initrd.vps7.chn.moe" "95.111.228.40" ]; - }; - nas = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIktNbEcDMKlibXg54u7QOLt0755qB/P4vfjwca8xY6V"; - hostnames = [ "internal.nas.chn.moe" "[office.chn.moe]:5440" "192.168.82.4" "192.168.1.185" ]; - }; - "initrd.nas" = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAoMu0HEaFQsnlJL0L6isnkNZdRq0OiDXyaX3+fl3NjT"; - hostnames = [ "[office.chn.moe]:5440" "192.168.1.185" ]; - }; - pc = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMSfREi19OSwQnhdsE8wiNwGSFFJwNGN0M5gN+sdrrLJ"; - hostnames = [ "internal.pc.chn.moe" "192.168.8.2.3" ]; - }; - hpc = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDVpsQW3kZt5alHC6mZhay3ZEe2fRGziG4YJWCv2nn/O"; - hostnames = [ "hpc.xmu.edu.cn" ]; - }; - github = - { - ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl"; - hostnames = [ "github.com" ]; - }; - }; - in listToAttrs (concatLists (map - (server: - ( - if builtins.pathExists ./ssh/${server.name}_rsa.pub then - [{ - name = "${server.name}-rsa"; - value = - { - publicKey = builtins.readFile ./ssh/${server.name}_rsa.pub; - hostNames = server.value.hostnames; - }; - }] - else [] - ) - ++ ( - if builtins.pathExists ./ssh/${server.name}_ecdsa.pub then - [{ - name = "${server.name}-ecdsa"; - value = - { - publicKey = builtins.readFile ./ssh/${server.name}_ecdsa.pub; - hostNames = server.value.hostnames; - }; - }] - else [] - ) - ++ ( - if server.value ? ed25519 then - [{ - name = "${server.name}-ed25519"; - value = - { - publicKey = server.value.ed25519; - hostNames = server.value.hostnames; - }; - }] - else [] - )) - (attrsToList servers))); - }; - home-manager = { useGlobalPkgs = true; useUserPackages = true; }; - } - # >= desktop - ( - mkIf (builtins.elem inputs.config.nixos.packages.packageSet [ "desktop" "desktop-fat" "workstation" ] ) - { - nixos = - { - packages = with inputs.pkgs; - { - _packages = - [ - # system management - gparted snapper-gui libsForQt5.qtstyleplugin-kvantum wl-clipboard-x11 kio-fuse wl-mirror - wayland-utils clinfo glxinfo vulkan-tools dracut - # networking - remmina putty mtr-gui - # password and key management - bitwarden - # office - crow-translate zotero pandoc ydict logseq - # media - mpv nomacs - # themes - tela-circle-icon-theme - ( - vscode-with-extensions.override - { - vscodeExtensions = with nix-vscode-extensions.vscode-marketplace; - (with equinusocio; [ vsc-community-material-theme vsc-material-theme-icons ]) - ++ (with github; [ copilot copilot-chat copilot-labs github-vscode-theme ]) - ++ (with intellsmi; [ comment-translate deepl-translate ]) - ++ (with ms-python; [ isort python vscode-pylance ]) - ++ (with ms-toolsai; - [ - jupyter jupyter-keymap jupyter-renderers vscode-jupyter-cell-tags vscode-jupyter-slideshow - ]) - ++ (with ms-vscode; - [ - cmake-tools cpptools cpptools-extension-pack cpptools-themes hexeditor remote-explorer - test-adapter-converter - ]) - ++ (with ms-vscode-remote; [ remote-ssh remote-containers remote-ssh-edit ]) - ++ [ - donjayamanne.githistory genieai.chatgpt-vscode fabiospampinato.vscode-diff cschlosser.doxdocgen - llvm-vs-code-extensions.vscode-clangd ms-ceintl.vscode-language-pack-zh-hans - oderwat.indent-rainbow - twxs.cmake guyutongxue.cpp-reference znck.grammarly thfriedrich.lammps leetcode.vscode-leetcode - james-yu.latex-workshop gimly81.matlab affenwiesel.matlab-formatter ckolkman.vscode-postgres - yzhang.markdown-all-in-one pkief.material-icon-theme bbenoist.nix ms-ossdata.vscode-postgresql - redhat.vscode-xml dotjoshjohnson.xml jnoortheen.nix-ide xdebug.php-debug - hbenl.vscode-test-explorer - jeff-hykin.better-cpp-syntax fredericbonnet.cmake-test-adapter mesonbuild.mesonbuild - hirse.vscode-ungit fortran-lang.linter-gfortran tboox.xmake-vscode ccls-project.ccls - feiskyer.chatgpt-copilot yukiuuh2936.vscode-modern-fortran-formatter wolframresearch.wolfram - njpipeorgan.wolfram-language-notebook brettm12345.nixfmt-vscode webfreak.debug - gruntfuggly.todo-tree - # restrctured text - lextudio.restructuredtext trond-snekvik.simple-rst - ]; - } - ) - ]; - _pythonPackages = [(pythonPackages: with pythonPackages; - [ - # required by vscode extensions restrucuredtext - localPackages.esbonio - ])]; - }; - users.sharedModules = - [{ - config.home.file.".config/baloofilerc".text = - '' - [Basic Settings] - Indexing-Enabled=false - ''; - }]; - }; - programs = - { - wireshark = { enable = true; package = inputs.pkgs.wireshark; }; - firefox = { enable = true; languagePacks = [ "zh-CN" "en-US" ]; }; - vim.package = inputs.pkgs.vim-full; - }; - nixpkgs.config.packageOverrides = pkgs: - { - telegram-desktop = pkgs.telegram-desktop.overrideAttrs (attrs: - { - patches = (if (attrs ? patches) then attrs.patches else []) ++ [ ./telegram.patch ]; - }); - }; - services.pcscd.enable = true; - } - ) - # >= desktop-fat - ( - mkIf (builtins.elem inputs.config.nixos.packages.packageSet [ "desktop-fat" "workstation" ] ) - { - nixos = - { - packages = with inputs.pkgs; - { - _packages = - [ - # system management - etcher btrfs-assistant - # password and key management - yubikey-manager yubikey-manager-qt yubikey-personalization yubikey-personalization-gui electrum jabref - # download - qbittorrent nur-xddxdd.baidupcs-go wgetpaste - # development - scrcpy weston cage openbox krita - # media - spotify yesplaymusic simplescreenrecorder imagemagick gimp netease-cloud-music-gtk vlc - # editor - localPackages.typora hdfview - # themes - orchis-theme plasma-overdose-kde-theme materia-kde-theme graphite-kde-theme arc-kde-theme materia-theme - # news - fluent-reader rssguard newsflash newsboat - # nix tools - deploy-rs.deploy-rs nixpkgs-fmt - # instant messager - element-desktop telegram-desktop discord inputs.config.nur.repos.linyinfeng.wemeet # native - cinny-desktop # nur-xddxdd.wine-wechat thunder - # browser - google-chrome microsoft-edge - ] ++ (with inputs.lib; filter isDerivation (attrValues plasma5Packages.kdeGear)); - }; - users.sharedModules = - [{ - config.programs = - { - chromium = - { - enable = true; - extensions = - [ - { id = "mpkodccbngfoacfalldjimigbofkhgjn"; } # Aria2 Explorer - { id = "nngceckbapebfimnlniiiahkandclblb"; } # Bitwarden - { id = "kbfnbcaeplbcioakkpcpgfkobkghlhen"; } # Grammarly - { id = "ihnfpdchjnmlehnoeffgcbakfmdjcckn"; } # Pixiv Fanbox Downloader - { id = "cimiefiiaegbelhefglklhhakcgmhkai"; } # Plasma Integration - { id = "dkndmhgdcmjdmkdonmbgjpijejdcilfh"; } # Powerful Pixiv Downloader - { id = "padekgcemlokbadohgkifijomclgjgif"; } # Proxy SwitchyOmega - { id = "kefjpfngnndepjbopdmoebkipbgkggaa"; } # RSSHub Radar - { id = "abpdnfjocnmdomablahdcfnoggeeiedb"; } # Save All Resources - { id = "nbokbjkabcmbfdlbddjidfmibcpneigj"; } # SmoothScroll - { id = "onepmapfbjohnegdmfhndpefjkppbjkm"; } # SuperCopy 超级复制 - { id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; } # uBlock Origin - { id = "gppongmhjkpfnbhagpmjfkannfbllamg"; } # Wappalyzer - { id = "hkbdddpiemdeibjoknnofflfgbgnebcm"; } # YouTube™ 双字幕 - { id = "ekhagklcjbdpajgpjgmbionohlpdbjgc"; } # Zotero Connector - { id = "ikhdkkncnoglghljlkmcimlnlhkeamad"; } # 划词翻译 - { id = "dhdgffkkebhmkfjojejmpbldmpobfkfo"; } # 篡改猴 - { id = "hipekcciheckooncpjeljhnekcoolahp"; } # Tabliss - { id = "nkbihfbeogaeaoehlefnkodbefgpgknn"; } # MetaMask - { id = "bpoadfkcbjbfhfodiogcnhhhpibjhbnh"; } # 沉浸式翻译 - ]; - }; - obs-studio = - { - enable = true; - plugins = with inputs.pkgs.obs-studio-plugins; - [ wlrobs obs-vaapi obs-nvfbc droidcam-obs obs-vkcapture ]; - }; - doom-emacs = { enable = true; doomPrivateDir = ./doom.d; }; - }; - }]; - }; - programs = { steam.enable = true; kdeconnect.enable = true; }; - } - ) - # >= workstation - ( - mkIf (inputs.config.nixos.packages.packageSet == "workstation") - { - nixos.packages = with inputs.pkgs; - { - _packages = - [ - # nix tools - nix-template appimage-run nil nixd nix-alien nix-serve node2nix nix-prefetch-github prefetch-npm-deps - nix-prefetch-docker pnpm-lock-export bundix - # instant messager - zoom-us signal-desktop qq nur-xddxdd.wechat-uos slack # jail - # office - libreoffice-qt texstudio poppler_utils pdftk gnuplot pdfchain - (texlive.combine { inherit (texlive) scheme-full; inherit (localPackages) citation-style-language; }) - # development - jetbrains.clion android-studio dbeaver cling clang-tools_16 ccls fprettify aircrack-ng - # media - nur-xddxdd.svp obs-studio waifu2x-converter-cpp inkscape blender - # virtualization - wineWowPackages.stagingFull virt-viewer bottles # wine64 - # text editor - appflowy notion-app-enhanced joplin-desktop standardnotes - # math, physics and chemistry - mathematica octaveFull root ovito paraview localPackages.vesta qchem.quantum-espresso - localPackages.vasp localPackages.vaspkit jmol localPackages.v_sim - # encryption and password management - john crunch hashcat - # container and vm - genymotion # davinci-resolve playonlinux - ]; - _pythonPackages = [(pythonPackages: with pythonPackages; - [ - phonopy tensorflow keras openai scipy scikit-learn jupyterlab autograd - ])]; - _prebuildPackages = - [ - httplib magic-enum xtensor boost cereal cxxopts ftxui yaml-cpp gfortran gcc10 python2 - gcc13Stdenv - ]; - }; - programs = - { - anime-game-launcher = { enable = true; package = inputs.pkgs.anime-game-launcher; }; - honkers-railway-launcher = { enable = true; package = inputs.pkgs.honkers-railway-launcher; }; - nix-ld.enable = true; - gamemode = - { - enable = true; - settings = - { - general.renice = 10; - gpu = - { - apply_gpu_optimisations = "accept-responsibility"; - nv_powermizer_mode = 1; - }; - custom = let notify-send = "${inputs.pkgs.libnotify}/bin/notify-send"; in - { - start = "${notify-send} 'GameMode started'"; - end = "${notify-send} 'GameMode ended'"; - }; - }; - }; - chromium = - { - enable = true; - extraOpts.PasswordManagerEnabled = false; - }; - }; - } - ) - # apply package configs - { - environment.systemPackages = let inherit (inputs.lib.lists) subtractLists; in with inputs.config.nixos.packages; - (subtractLists excludePackages (_packages ++ extraPackages)) - ++ [ - (inputs.pkgs.python3.withPackages (pythonPackages: - subtractLists - (builtins.concatLists (builtins.map (packageFunction: packageFunction pythonPackages) - excludePythonPackages)) - (builtins.concatLists (builtins.map (packageFunction: packageFunction pythonPackages) - (_pythonPackages ++ extraPythonPackages))))) - (inputs.pkgs.callPackage ({ stdenv }: stdenv.mkDerivation - { - name = "prebuild-packages"; - propagateBuildInputs = subtractLists excludePrebuildPackages (_prebuildPackages ++ extraPrebuildPackages); - phases = [ "installPhase" ]; - installPhase = - '' - runHook preInstall - mkdir -p $out - runHook postInstall - ''; - }) {}) - ]; - } - ]; + name = "prebuild-packages"; + propagateBuildInputs = subtractLists excludePrebuildPackages (_prebuildPackages ++ extraPrebuildPackages); + phases = [ "installPhase" ]; + installPhase = + '' + runHook preInstall + mkdir -p $out + runHook postInstall + ''; + }) {}) + ]; + }; } # programs.firejail = diff --git a/modules/packages/desktop-fat/chromium.nix b/modules/packages/desktop-fat/chromium.nix new file mode 100644 index 00000000..6d018db4 --- /dev/null +++ b/modules/packages/desktop-fat/chromium.nix @@ -0,0 +1,39 @@ +inputs: +{ + config = + let + inherit (inputs.lib) mkIf; + in mkIf (builtins.elem "desktop-fat" inputs.config.nixos.packages._packageSets) + { + nixos.users.sharedModules = + [{ + config.programs.chromium = + { + enable = true; + extensions = + [ + { id = "mpkodccbngfoacfalldjimigbofkhgjn"; } # Aria2 Explorer + { id = "nngceckbapebfimnlniiiahkandclblb"; } # Bitwarden + { id = "kbfnbcaeplbcioakkpcpgfkobkghlhen"; } # Grammarly + { id = "ihnfpdchjnmlehnoeffgcbakfmdjcckn"; } # Pixiv Fanbox Downloader + { id = "cimiefiiaegbelhefglklhhakcgmhkai"; } # Plasma Integration + { id = "dkndmhgdcmjdmkdonmbgjpijejdcilfh"; } # Powerful Pixiv Downloader + { id = "padekgcemlokbadohgkifijomclgjgif"; } # Proxy SwitchyOmega + { id = "kefjpfngnndepjbopdmoebkipbgkggaa"; } # RSSHub Radar + { id = "abpdnfjocnmdomablahdcfnoggeeiedb"; } # Save All Resources + { id = "nbokbjkabcmbfdlbddjidfmibcpneigj"; } # SmoothScroll + { id = "onepmapfbjohnegdmfhndpefjkppbjkm"; } # SuperCopy 超级复制 + { id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; } # uBlock Origin + { id = "gppongmhjkpfnbhagpmjfkannfbllamg"; } # Wappalyzer + { id = "hkbdddpiemdeibjoknnofflfgbgnebcm"; } # YouTube™ 双字幕 + { id = "ekhagklcjbdpajgpjgmbionohlpdbjgc"; } # Zotero Connector + { id = "ikhdkkncnoglghljlkmcimlnlhkeamad"; } # 划词翻译 + { id = "dhdgffkkebhmkfjojejmpbldmpobfkfo"; } # 篡改猴 + { id = "hipekcciheckooncpjeljhnekcoolahp"; } # Tabliss + { id = "nkbihfbeogaeaoehlefnkodbefgpgknn"; } # MetaMask + { id = "bpoadfkcbjbfhfodiogcnhhhpibjhbnh"; } # 沉浸式翻译 + ]; + }; + }]; + }; +} diff --git a/modules/packages/desktop-fat/default.nix b/modules/packages/desktop-fat/default.nix new file mode 100644 index 00000000..46b048db --- /dev/null +++ b/modules/packages/desktop-fat/default.nix @@ -0,0 +1,59 @@ +inputs: +{ + imports = inputs.localLib.mkModules + [ + ./chromium.nix + ]; + config = + let + inherit (inputs.lib) mkIf; + in mkIf (builtins.elem "desktop-fat" inputs.config.nixos.packages._packageSets) + { + nixos = + { + packages = with inputs.pkgs; + { + _packages = + [ + # system management + etcher btrfs-assistant + # password and key management + yubikey-manager yubikey-manager-qt yubikey-personalization yubikey-personalization-gui electrum jabref + # download + qbittorrent nur-xddxdd.baidupcs-go wgetpaste + # development + scrcpy weston cage openbox krita + # media + spotify yesplaymusic simplescreenrecorder imagemagick gimp netease-cloud-music-gtk vlc + # editor + localPackages.typora hdfview + # themes + orchis-theme plasma-overdose-kde-theme materia-kde-theme graphite-kde-theme arc-kde-theme materia-theme + # news + fluent-reader rssguard newsflash newsboat + # nix tools + deploy-rs.deploy-rs nixpkgs-fmt + # instant messager + element-desktop telegram-desktop discord inputs.config.nur.repos.linyinfeng.wemeet # native + cinny-desktop # nur-xddxdd.wine-wechat thunder + # browser + google-chrome microsoft-edge + ] ++ (with inputs.lib; filter isDerivation (attrValues plasma5Packages.kdeGear)); + }; + users.sharedModules = + [{ + config.programs = + { + obs-studio = + { + enable = true; + plugins = with inputs.pkgs.obs-studio-plugins; + [ wlrobs obs-vaapi obs-nvfbc droidcam-obs obs-vkcapture ]; + }; + doom-emacs = { enable = true; doomPrivateDir = ./doom.d; }; + }; + }]; + }; + programs = { steam.enable = true; kdeconnect.enable = true; }; + }; +} diff --git a/modules/packages/doom.d/config.el b/modules/packages/desktop-fat/doom.d/config.el similarity index 100% rename from modules/packages/doom.d/config.el rename to modules/packages/desktop-fat/doom.d/config.el diff --git a/modules/packages/doom.d/init.el b/modules/packages/desktop-fat/doom.d/init.el similarity index 100% rename from modules/packages/doom.d/init.el rename to modules/packages/desktop-fat/doom.d/init.el diff --git a/modules/packages/doom.d/packages.el b/modules/packages/desktop-fat/doom.d/packages.el similarity index 100% rename from modules/packages/doom.d/packages.el rename to modules/packages/desktop-fat/doom.d/packages.el diff --git a/modules/packages/desktop/default.nix b/modules/packages/desktop/default.nix new file mode 100644 index 00000000..b278064c --- /dev/null +++ b/modules/packages/desktop/default.nix @@ -0,0 +1,96 @@ +inputs: +{ + config = + let + inherit (inputs.lib) mkIf; + in mkIf (builtins.elem "desktop" inputs.config.nixos.packages._packageSets) + { + nixos = + { + packages = with inputs.pkgs; + { + _packages = + [ + # system management + gparted snapper-gui libsForQt5.qtstyleplugin-kvantum wl-clipboard-x11 kio-fuse wl-mirror + wayland-utils clinfo glxinfo vulkan-tools dracut + # networking + remmina putty mtr-gui + # password and key management + bitwarden + # office + crow-translate zotero pandoc ydict logseq + # media + mpv nomacs + # themes + tela-circle-icon-theme + ( + vscode-with-extensions.override + { + vscodeExtensions = with nix-vscode-extensions.vscode-marketplace; + (with equinusocio; [ vsc-community-material-theme vsc-material-theme-icons ]) + ++ (with github; [ copilot copilot-chat copilot-labs github-vscode-theme ]) + ++ (with intellsmi; [ comment-translate deepl-translate ]) + ++ (with ms-python; [ isort python vscode-pylance ]) + ++ (with ms-toolsai; + [ + jupyter jupyter-keymap jupyter-renderers vscode-jupyter-cell-tags vscode-jupyter-slideshow + ]) + ++ (with ms-vscode; + [ + cmake-tools cpptools cpptools-extension-pack cpptools-themes hexeditor remote-explorer + test-adapter-converter + ]) + ++ (with ms-vscode-remote; [ remote-ssh remote-containers remote-ssh-edit ]) + ++ [ + donjayamanne.githistory genieai.chatgpt-vscode fabiospampinato.vscode-diff cschlosser.doxdocgen + llvm-vs-code-extensions.vscode-clangd ms-ceintl.vscode-language-pack-zh-hans + oderwat.indent-rainbow + twxs.cmake guyutongxue.cpp-reference znck.grammarly thfriedrich.lammps leetcode.vscode-leetcode + james-yu.latex-workshop gimly81.matlab affenwiesel.matlab-formatter ckolkman.vscode-postgres + yzhang.markdown-all-in-one pkief.material-icon-theme bbenoist.nix ms-ossdata.vscode-postgresql + redhat.vscode-xml dotjoshjohnson.xml jnoortheen.nix-ide xdebug.php-debug + hbenl.vscode-test-explorer + jeff-hykin.better-cpp-syntax fredericbonnet.cmake-test-adapter mesonbuild.mesonbuild + hirse.vscode-ungit fortran-lang.linter-gfortran tboox.xmake-vscode ccls-project.ccls + feiskyer.chatgpt-copilot yukiuuh2936.vscode-modern-fortran-formatter wolframresearch.wolfram + njpipeorgan.wolfram-language-notebook brettm12345.nixfmt-vscode webfreak.debug + gruntfuggly.todo-tree + # restrctured text + lextudio.restructuredtext trond-snekvik.simple-rst + ]; + } + ) + ]; + _pythonPackages = [(pythonPackages: with pythonPackages; + [ + # required by vscode extensions restrucuredtext + localPackages.esbonio + ])]; + }; + users.sharedModules = + [{ + config.home.file.".config/baloofilerc".text = + '' + [Basic Settings] + Indexing-Enabled=false + ''; + }]; + }; + programs = + { + wireshark = { enable = true; package = inputs.pkgs.wireshark; }; + firefox = { enable = true; languagePacks = [ "zh-CN" "en-US" ]; }; + vim.package = inputs.pkgs.vim-full; + }; + nixpkgs.config.packageOverrides = pkgs: + { + telegram-desktop = pkgs.telegram-desktop.overrideAttrs (attrs: + { + patches = (if (attrs ? patches) then attrs.patches else []) ++ [ ./telegram.patch ]; + }); + }; + services.pcscd.enable = true; + }; +} + diff --git a/modules/packages/telegram.patch b/modules/packages/desktop/telegram.patch similarity index 100% rename from modules/packages/telegram.patch rename to modules/packages/desktop/telegram.patch diff --git a/modules/packages/server/default.nix b/modules/packages/server/default.nix new file mode 100644 index 00000000..6da0e806 --- /dev/null +++ b/modules/packages/server/default.nix @@ -0,0 +1,300 @@ +inputs: +{ + config = + let + inherit (inputs.lib) mkIf; + inherit (builtins) concatLists map listToAttrs; + inherit (inputs.localLib) attrsToList; + in mkIf (builtins.elem "server" inputs.config.nixos.packages._packageSets) + { + nixos = + { + packages = with inputs.pkgs; + { + _packages = + [ + # shell + ksh + # basic tools + beep dos2unix gnugrep pv tmux screen parallel tldr cowsay jq zellij neofetch ipfetch localPackages.pslist + fastfetch reptyr + # lsxx + pciutils usbutils lshw util-linux lsof + # top + iotop iftop htop btop powertop s-tui + # editor + nano bat + # downloader + wget aria2 curl yt-dlp + # file manager + tree eza trash-cli lsd broot file xdg-ninja mlocate + # compress + pigz rar upx unzip zip lzip p7zip + # file system management + sshfs e2fsprogs adb-sync duperemove compsize + # disk management + smartmontools hdparm + # encryption and authentication + apacheHttpd openssl ssh-to-age gnupg age sops pam_u2f yubico-piv-tool + # networking + ipset iptables iproute2 dig nettools traceroute tcping-go whois tcpdump nmap inetutils + # nix tools + nix-output-monitor nix-tree ssh-to-age + # office + todo-txt-cli + # development + gdb try inputs.topInputs.plasma-manager.packages.x86_64-linux.rc2nix + ] ++ (with inputs.config.boot.kernelPackages; [ cpupower usbip ]); + _pythonPackages = [(pythonPackages: with pythonPackages; + [ + inquirerpy requests python-telegram-bot tqdm fastapi pypdf2 pandas matplotlib plotly gunicorn redis jinja2 + certifi charset-normalizer idna orjson psycopg2 localPackages.eigengdb + ])]; + }; + users.sharedModules = [(home-inputs: + { + config.programs = + { + zsh = + { + enable = true; + initExtraBeforeCompInit = + '' + # p10k instant prompt + P10K_INSTANT_PROMPT="$XDG_CACHE_HOME/p10k-instant-prompt-''${(%):-%n}.zsh" + [[ ! -r "$P10K_INSTANT_PROMPT" ]] || source "$P10K_INSTANT_PROMPT" + HYPHEN_INSENSITIVE="true" + export PATH=~/bin:$PATH + function br + { + local cmd cmd_file code + cmd_file=$(mktemp) + if broot --outcmd "$cmd_file" "$@"; then + cmd=$(<"$cmd_file") + command rm -f "$cmd_file" + eval "$cmd" + else + code=$? + command rm -f "$cmd_file" + return "$code" + fi + } + alias todo="todo.sh" + ''; + plugins = + [ + { + file = "powerlevel10k.zsh-theme"; + name = "powerlevel10k"; + src = "${inputs.pkgs.zsh-powerlevel10k}/share/zsh-powerlevel10k"; + } + { + file = "p10k.zsh"; + name = "powerlevel10k-config"; + src = ./p10k-config; + } + { + name = "zsh-lsd"; + src = inputs.pkgs.fetchFromGitHub + { + owner = "z-shell"; + repo = "zsh-lsd"; + rev = "029a9cb0a9b39c9eb6c5b5100dd9182813332250"; + sha256 = "sha256-oWjWnhiimlGBMaZlZB+OM47jd9hporKlPNwCx6524Rk="; + }; + } + ]; + history = + { + path = "${home-inputs.config.xdg.dataHome}/zsh/zsh_history"; + extended = true; + save = 100000000; + size = 100000000; + }; + }; + direnv = { enable = true; nix-direnv.enable = true; }; + git = + { + enable = true; + lfs.enable = true; + extraConfig = + { + core.editor = if inputs.config.nixos.system.gui.preferred then "code --wait" else "vim"; + advice.detachedHead = false; + merge.conflictstyle = "diff3"; + diff.colorMoved = "default"; + }; + package = inputs.pkgs.gitFull; + delta = + { + enable = true; + options = + { + side-by-side = true; + navigate = true; + syntax-theme = "GitHub"; + light = true; + zero-style = "syntax white"; + line-numbers-zero-style = "#ffffff"; + }; + }; + }; + ssh = + { + enable = true; + controlMaster = "auto"; + controlPersist = "1m"; + compression = true; + }; + vim = + { + enable = true; + defaultEditor = true; + packageConfigurable = inputs.config.programs.vim.package; + settings = + { + number = true; + expandtab = false; + shiftwidth = 2; + tabstop = 2; + }; + extraConfig = + '' + set clipboard=unnamedplus + colorscheme evening + ''; + }; + }; + })]; + }; + programs = + { + nix-index-database.comma.enable = true; + nix-index.enable = true; + zsh = + { + enable = true; + syntaxHighlighting.enable = true; + autosuggestions.enable = true; + enableCompletion = true; + ohMyZsh = + { + enable = true; + plugins = [ "git" "colored-man-pages" "extract" "history-substring-search" "autojump" ]; + customPkgs = with inputs.pkgs; [ zsh-nix-shell ]; + }; + }; + command-not-found.enable = false; + adb.enable = true; + gnupg.agent = { enable = true; enableSSHSupport = true; }; + autojump.enable = true; + git = + { + enable = true; + package = inputs.pkgs.gitFull; + lfs.enable = true; + config = + { + init.defaultBranch = "main"; + core = { quotepath = false; editor = "vim"; }; + }; + }; + # yazi.enable = true; + }; + services = + { + fwupd.enable = true; + udev.packages = with inputs.pkgs; [ yubikey-personalization libfido2 ]; + openssh.knownHosts = + let + servers = + { + vps6 = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO5ZcvyRyOnUCuRtqrM/Qf+AdUe3a5bhbnfyhw2FSLDZ"; + hostnames = [ "internal.vps6.chn.moe" "vps6.chn.moe" "74.211.99.69" "192.168.82.1" ]; + }; + "initrd.vps6" = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB4DKB/zzUYco5ap6k9+UxeO04LL12eGvkmQstnYxgnS"; + hostnames = [ "initrd.vps6.chn.moe" "74.211.99.69" ]; + }; + vps7 = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF5XkdilejDAlg5hZZD0oq69k8fQpe9hIJylTo/aLRgY"; + hostnames = [ "internal.vps7.chn.moe" "vps7.chn.moe" "95.111.228.40" "192.168.82.2" ]; + }; + "initrd.vps7" = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGZyQpdQmEZw3nLERFmk2tS1gpSvXwW0Eish9UfhrRxC"; + hostnames = [ "initrd.vps7.chn.moe" "95.111.228.40" ]; + }; + nas = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIktNbEcDMKlibXg54u7QOLt0755qB/P4vfjwca8xY6V"; + hostnames = [ "internal.nas.chn.moe" "[office.chn.moe]:5440" "192.168.82.4" "192.168.1.185" ]; + }; + "initrd.nas" = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAoMu0HEaFQsnlJL0L6isnkNZdRq0OiDXyaX3+fl3NjT"; + hostnames = [ "[office.chn.moe]:5440" "192.168.1.185" ]; + }; + pc = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMSfREi19OSwQnhdsE8wiNwGSFFJwNGN0M5gN+sdrrLJ"; + hostnames = [ "internal.pc.chn.moe" "192.168.8.2.3" ]; + }; + hpc = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDVpsQW3kZt5alHC6mZhay3ZEe2fRGziG4YJWCv2nn/O"; + hostnames = [ "hpc.xmu.edu.cn" ]; + }; + github = + { + ed25519 = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl"; + hostnames = [ "github.com" ]; + }; + }; + in listToAttrs (concatLists (map + (server: + ( + if builtins.pathExists ./ssh/${server.name}_rsa.pub then + [{ + name = "${server.name}-rsa"; + value = + { + publicKey = builtins.readFile ./ssh/${server.name}_rsa.pub; + hostNames = server.value.hostnames; + }; + }] + else [] + ) + ++ ( + if builtins.pathExists ./ssh/${server.name}_ecdsa.pub then + [{ + name = "${server.name}-ecdsa"; + value = + { + publicKey = builtins.readFile ./ssh/${server.name}_ecdsa.pub; + hostNames = server.value.hostnames; + }; + }] + else [] + ) + ++ ( + if server.value ? ed25519 then + [{ + name = "${server.name}-ed25519"; + value = + { + publicKey = server.value.ed25519; + hostNames = server.value.hostnames; + }; + }] + else [] + )) + (attrsToList servers))); + }; + home-manager = { useGlobalPkgs = true; useUserPackages = true; }; + }; +} diff --git a/modules/packages/p10k-config/p10k.zsh b/modules/packages/server/p10k-config/p10k.zsh similarity index 100% rename from modules/packages/p10k-config/p10k.zsh rename to modules/packages/server/p10k-config/p10k.zsh diff --git a/modules/packages/ssh/github_ecdsa.pub b/modules/packages/server/ssh/github_ecdsa.pub similarity index 100% rename from modules/packages/ssh/github_ecdsa.pub rename to modules/packages/server/ssh/github_ecdsa.pub diff --git a/modules/packages/ssh/github_rsa.pub b/modules/packages/server/ssh/github_rsa.pub similarity index 100% rename from modules/packages/ssh/github_rsa.pub rename to modules/packages/server/ssh/github_rsa.pub diff --git a/modules/packages/ssh/hpc_ecdsa.pub b/modules/packages/server/ssh/hpc_ecdsa.pub similarity index 100% rename from modules/packages/ssh/hpc_ecdsa.pub rename to modules/packages/server/ssh/hpc_ecdsa.pub diff --git a/modules/packages/ssh/hpc_rsa.pub b/modules/packages/server/ssh/hpc_rsa.pub similarity index 100% rename from modules/packages/ssh/hpc_rsa.pub rename to modules/packages/server/ssh/hpc_rsa.pub diff --git a/modules/packages/ssh/nas_rsa.pub b/modules/packages/server/ssh/nas_rsa.pub similarity index 100% rename from modules/packages/ssh/nas_rsa.pub rename to modules/packages/server/ssh/nas_rsa.pub diff --git a/modules/packages/ssh/pc_rsa.pub b/modules/packages/server/ssh/pc_rsa.pub similarity index 100% rename from modules/packages/ssh/pc_rsa.pub rename to modules/packages/server/ssh/pc_rsa.pub diff --git a/modules/packages/ssh/vps6_rsa.pub b/modules/packages/server/ssh/vps6_rsa.pub similarity index 100% rename from modules/packages/ssh/vps6_rsa.pub rename to modules/packages/server/ssh/vps6_rsa.pub diff --git a/modules/packages/ssh/vps7_rsa.pub b/modules/packages/server/ssh/vps7_rsa.pub similarity index 100% rename from modules/packages/ssh/vps7_rsa.pub rename to modules/packages/server/ssh/vps7_rsa.pub diff --git a/modules/packages/workstation/default.nix b/modules/packages/workstation/default.nix new file mode 100644 index 00000000..65f15dbc --- /dev/null +++ b/modules/packages/workstation/default.nix @@ -0,0 +1,76 @@ +inputs: +{ + config = + let + inherit (inputs.lib) mkIf; + in mkIf (builtins.elem "workstation" inputs.config.nixos.packages._packageSets) + { + nixos.packages = with inputs.pkgs; + { + _packages = + [ + # nix tools + nix-template appimage-run nil nixd nix-alien nix-serve node2nix nix-prefetch-github prefetch-npm-deps + nix-prefetch-docker pnpm-lock-export bundix + # instant messager + zoom-us signal-desktop qq nur-xddxdd.wechat-uos slack # jail + # office + libreoffice-qt texstudio poppler_utils pdftk gnuplot pdfchain + (texlive.combine { inherit (texlive) scheme-full; inherit (localPackages) citation-style-language; }) + # development + jetbrains.clion android-studio dbeaver cling clang-tools_16 ccls fprettify aircrack-ng + # media + nur-xddxdd.svp obs-studio waifu2x-converter-cpp inkscape blender + # virtualization + wineWowPackages.stagingFull virt-viewer bottles # wine64 + # text editor + appflowy notion-app-enhanced joplin-desktop standardnotes + # math, physics and chemistry + mathematica octaveFull root ovito paraview localPackages.vesta qchem.quantum-espresso + localPackages.vasp localPackages.vaspkit jmol localPackages.v_sim + # encryption and password management + john crunch hashcat + # container and vm + genymotion # davinci-resolve playonlinux + ]; + _pythonPackages = [(pythonPackages: with pythonPackages; + [ + phonopy tensorflow keras openai scipy scikit-learn jupyterlab autograd + ])]; + _prebuildPackages = + [ + httplib magic-enum xtensor boost cereal cxxopts ftxui yaml-cpp gfortran gcc10 python2 + gcc13Stdenv + ]; + }; + programs = + { + anime-game-launcher = { enable = true; package = inputs.pkgs.anime-game-launcher; }; + honkers-railway-launcher = { enable = true; package = inputs.pkgs.honkers-railway-launcher; }; + nix-ld.enable = true; + gamemode = + { + enable = true; + settings = + { + general.renice = 10; + gpu = + { + apply_gpu_optimisations = "accept-responsibility"; + nv_powermizer_mode = 1; + }; + custom = let notify-send = "${inputs.pkgs.libnotify}/bin/notify-send"; in + { + start = "${notify-send} 'GameMode started'"; + end = "${notify-send} 'GameMode ended'"; + }; + }; + }; + chromium = + { + enable = true; + extraOpts.PasswordManagerEnabled = false; + }; + }; + }; +}