From 7692303804c71fbb2191f6c0947315f39c6a8c9e Mon Sep 17 00:00:00 2001 From: Jacob Bachmann Date: Mon, 8 Jan 2024 17:22:24 +0100 Subject: [PATCH] feat: add printer driver --- modules/nix.nix | 8 ++++ modules/printing.nix | 25 +++++++++- overlays/mfcl3750cdw.nix | 98 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 overlays/mfcl3750cdw.nix diff --git a/modules/nix.nix b/modules/nix.nix index a0d1242..983cbbd 100644 --- a/modules/nix.nix +++ b/modules/nix.nix @@ -3,5 +3,13 @@ experimental-features = [ "nix-command" "flakes" ]; auto-optimise-store = true; }; + + nixpkgs.overlays = [ + (self: super: { + mfcl3750cdwlpr = (super.callPackage ../overlays/mfcl3750cdw.nix {}).driver; + mfcl3750cdwcupswrapper = (super.callPackage ../overlays/mfcl3750cdw.nix {}).cupswrapper; + }) + ]; + system.stateVersion = "23.05"; } diff --git a/modules/printing.nix b/modules/printing.nix index 5bd7c69..ddb9f53 100644 --- a/modules/printing.nix +++ b/modules/printing.nix @@ -1,6 +1,11 @@ -{ ... }: { +{ pkgs, config, ... }: { # Enable CUPS to print documents. - services.printing.enable = true; + services.printing = { + enable = true; + drivers = [ + pkgs.mfcl3750cdwcupswrapper + ]; + }; services.avahi = { enable = true; @@ -8,4 +13,20 @@ openFirewall = true; }; + /* + hardware.printers = { + ensurePrinters = [ + { + name = "Brother MFC-L3750CDW series"; + location = "Home"; + deviceUri = "ipp://BROTHER-ETH.local.:631/ipp/print"; + model = + } + ] + } + */ + + environment.systemPackages = with pkgs; with config.bchmnn; lib.optionals (gui.enable) [ + system-config-printer + ]; } diff --git a/overlays/mfcl3750cdw.nix b/overlays/mfcl3750cdw.nix new file mode 100644 index 0000000..f1c8249 --- /dev/null +++ b/overlays/mfcl3750cdw.nix @@ -0,0 +1,98 @@ +{ pkgsi686Linux +, stdenv +, fetchurl +, dpkg +, makeWrapper +, coreutils +, ghostscript +, gnugrep +, gnused +, which +, perl +, lib +}: + +let + model = "mfcl3750cdw"; + version = "1.0.2-0"; + src = fetchurl { + url = "https://download.brother.com/welcome/dlf103934/${model}pdrv-${version}.i386.deb"; + sha256 = "3a0d5f09a265208fdd1b8266ef36286ec294c7a4befa327be81141efabe8590b"; + }; + reldir = "opt/brother/Printers/${model}/"; + +in rec { + driver = pkgsi686Linux.stdenv.mkDerivation rec { + inherit src version; + name = "${model}drv-${version}"; + + nativeBuildInputs = [ dpkg makeWrapper ]; + + unpackPhase = "dpkg-deb -x $src $out"; + + installPhase = '' + dir="$out/${reldir}" + substituteInPlace $dir/lpd/filter_${model} \ + --replace /usr/bin/perl ${perl}/bin/perl \ + --replace "BR_PRT_PATH =~" "BR_PRT_PATH = \"$dir\"; #" \ + --replace "PRINTER =~" "PRINTER = \"${model}\"; #" + wrapProgram $dir/lpd/filter_${model} \ + --prefix PATH : ${lib.makeBinPath [ + coreutils ghostscript gnugrep gnused which + ]} + # need to use i686 glibc here, these are 32bit proprietary binaries + patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ + $dir/lpd/brmfcl3750cdwfilter + ''; + + meta = { + description = "Brother ${lib.strings.toUpper model} driver"; + homepage = "http://www.brother.com/"; + sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; + license = lib.licenses.unfree; + platforms = [ "x86_64-linux" "i686-linux" ]; + maintainers = [ lib.maintainers.bchmnn ]; + }; + }; + + cupswrapper = stdenv.mkDerivation rec { + inherit version src; + name = "${model}cupswrapper-${version}"; + + nativeBuildInputs = [ dpkg makeWrapper ]; + + unpackPhase = "dpkg-deb -x $src $out"; + + installPhase = '' + basedir=${driver}/${reldir} + dir=$out/${reldir} + + substituteInPlace $dir/cupswrapper/brother_lpdwrapper_${model} \ + --replace /usr/bin/perl ${perl}/bin/perl \ + --replace "basedir =~" "basedir = \"$basedir\"; #" \ + --replace "PRINTER =~" "PRINTER = \"${model}\"; #" + + wrapProgram $dir/cupswrapper/brother_lpdwrapper_${model} \ + --prefix PATH : ${lib.makeBinPath [ coreutils gnugrep gnused ]} + + mkdir -p $out/lib/cups/filter + mkdir -p $out/share/cups/model + + ln $dir/cupswrapper/brother_lpdwrapper_${model} $out/lib/cups/filter + chmod 755 $out/lib/cups/filter/brother_lpdwrapper_${model} + + ln $dir/cupswrapper/brother_${model}_printer_en.ppd $out/share/cups/model + chmod 644 $dir/cupswrapper/brother_${model}_printer_en.ppd + ''; + + meta = { + description = "Brother ${lib.strings.toUpper model} CUPS wrapper driver"; + homepage = "http://www.brother.com/"; + sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ]; + license = lib.licenses.gpl2; + platforms = [ "x86_64-linux" "i686-linux" ]; + maintainers = [ lib.maintainers.bchmnn ]; + }; + }; +} +