diff --git a/system-environment/config.nix b/system-environment/config.nix index 655b375..b24b7c3 100644 --- a/system-environment/config.nix +++ b/system-environment/config.nix @@ -1,46 +1,48 @@ { pkgs, lib, ... }: let - profile = import ../profile.nix; + profile = import ../profile.nix; in { - imports = [ - ./file-system.nix - ./media.nix - ./security/keyring.nix - ]; + imports = [ + ./file-system.nix + ./media.nix + ./security/keyring.nix + ./printer.nix + ]; - environment.systemPackages = with pkgs; [ - gnumake - python3 + environment.systemPackages = + with pkgs; + [ + gnumake + python3 ] ++ lib.optionals profile.modules.development [ - cmake - cmakeCurses + cmake + cmakeCurses - # C/C++/Fortran tools - gcc - clang + # C/C++/Fortran tools + gcc + clang - # Common C based dependencies - eigen + # Common C based dependencies + eigen - # Ada/+Spark & Rust tools - alire - gnat15 - gnat15Packages.gprbuild - gnat15Packages.gpr2 - gnat15Packages.gnatprove - gnat15Packages.gnatcoll-core - gnat15Packages.gnatcoll-readline - gnat15Packages.gnatcoll-python3 - gnat15Packages.gnatcoll-gmp - rustc - cargo + # Ada/+Spark & Rust tools + alire + gnat15 + gnat15Packages.gprbuild + gnat15Packages.gpr2 + gnat15Packages.gnatprove + gnat15Packages.gnatcoll-core + gnat15Packages.gnatcoll-readline + gnat15Packages.gnatcoll-python3 + gnat15Packages.gnatcoll-gmp + rustc + cargo ]; - environment.variables = { - }; - + environment.variables = { + }; } diff --git a/system-environment/printer.nix b/system-environment/printer.nix new file mode 100644 index 0000000..e3c287a --- /dev/null +++ b/system-environment/printer.nix @@ -0,0 +1,185 @@ +# Optional stuff to add to profile: +# add your user to scanner/lp groups if needed: +# users.users..extraGroups = [ "scanner" "lp" ]; + +{ + config, + pkgs, + lib, + ... +}: + +{ + ########################################################################## + # Printing + ########################################################################## + + services.printing = { + enable = true; + + # Driver collection + drivers = with pkgs; [ + gutenprint + hplip + brlaser + + # Canon inkjet support + cnijfilter2 + + # Generic IPP/AirPrint support + cups-filters + ]; + + # Network printer discovery + browsing = true; + defaultShared = false; + + listenAddresses = [ "*:631" ]; + allowFrom = [ "all" ]; + }; + + # Avahi/mDNS for automatic printer discovery + services.avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + + publish = { + enable = true; + userServices = true; + }; + }; + + # Scanner discovery over network + hardware.sane = { + enable = true; + + extraBackends = with pkgs; [ + sane-airscan + brscan4 + epson-escpr + ]; + }; + + # Enable sane daemon + services.saned.enable = true; + + # Some Brother scanners need this + environment.etc."sane.d/dll.d/brother".text = '' + brother4 + ''; + + ########################################################################## + # OCR / PDF / Document Processing + ########################################################################## + + environment.systemPackages = with pkgs; [ + + ###################################################################### + # Printing / scanning GUI tools + ###################################################################### + + system-config-printer + simple-scan + xsane + sane-airscan + + ###################################################################### + # OCR + ###################################################################### + + tesseract + tesseract4 + ocrmypdf + + ###################################################################### + # PDF tools + ###################################################################### + + poppler-utils + pdftk + qpdf + pdfcpu + mupdf + + ###################################################################### + # Image processing + ###################################################################### + + graphicsmagick + + ###################################################################### + # EPUB / HTML / Markdown / TeX conversions + ###################################################################### + + pandoc + + ###################################################################### + # Extra document tooling + ###################################################################### + + ghostscript + djvulibre + unoconv + + ###################################################################### + # CLI helpers + ###################################################################### + + file + ripgrep + fd + jq + ]; + + ########################################################################## + # Firewall + ########################################################################## + + networking.firewall.allowedTCPPorts = [ + 631 # CUPS / IPP + ]; + + networking.firewall.allowedUDPPorts = [ + 5353 # mDNS / Avahi + ]; + + ########################################################################## + # Helpful shell aliases + ########################################################################## + + environment.shellAliases = { + + # Find printers/scanners + printers = "lpstat -e"; + scanner-find = "scanimage -L"; + + # OCR examples + ocr-pdf = "ocrmypdf"; + ocr-img = "tesseract"; + + # Convert markdown -> pdf + md2pdf = "pandoc -o output.pdf"; + + # Convert epub -> pdf + epub2pdf = "ebook-convert"; + + # Convert pdf -> text + pdf2txt = "pdftotext"; + + # Scan one page + scan-one = '' + scanimage --format=png > scan.png + ''; + + # Continuous scans until CTRL+C + scan-loop = '' + while true; do + TS=$(date +%s) + scanimage --format=png > scan-$TS.png + echo "scanned: scan-$TS.png" + sleep 1 + done + ''; + }; +}