cups service: Automatically detect Gutenprint in drivers

Additional CUPS drivers can be added via "services.printing.drivers" but
Gutenprint was an exception. It was possible to add a Gutenprint
derivation to that list and it would work at first but unlike the other
drivers Gutenprint requires a script to be run after each update or any
attempt to print something would simply fail and an error would show up
in the jobs queue (http://localhost:631/jobs/):
"The PPD version (5.2.11) is not compatible with Gutenprint 5.2.13.
Please run
`/nix/store/7762kpyhfkcgmr3q81v1bbyy0bjhym80-gutenprint-5.2.13/sbin/cups-genppdupdate'
as administrator."
This is due to state in "/var/lib/cups/ppd" and one would need to run
"/nix/store/.../bin/cups-genppdupdate -p /var/lib/cups/ppd" manually.
The alternative was to enable the following option:
"services.printing.gutenprint" but this had two disadvantages:
1) It is an exception that one could be unaware of or that could
potentially cause some confusion.
2) One couldn't use a customized Gutenprint derivation in
"services.printing.drivers" but would instead have to overwrite
"pkgs.gutenprint".

This new approach simply detects a Gutenprint derivation in
"services.printing.gutenprint" by checking if the meta set of a
derivation contains "isGutenprint = true". Therefore no special
exception for Gutenprint would be required and it could easily be
applied to other drivers if they would require such a script to be run.
This commit is contained in:
Michael Weiss 2017-08-20 13:20:45 +02:00 committed by Nikolay Amiantov
parent ecea06ab2e
commit ea23f8bb07
3 changed files with 20 additions and 19 deletions

View file

@ -1,4 +1,4 @@
{ lib, ... }: { lib, pkgs, ... }:
with lib; with lib;
@ -14,6 +14,10 @@ with lib;
(mkRenamedOptionModule [ "networking" "enableRT73Firmware" ] [ "networking" "enableRalinkFirmware" ]) (mkRenamedOptionModule [ "networking" "enableRT73Firmware" ] [ "networking" "enableRalinkFirmware" ])
(mkRenamedOptionModule [ "services" "cadvisor" "host" ] [ "services" "cadvisor" "listenAddress" ]) (mkRenamedOptionModule [ "services" "cadvisor" "host" ] [ "services" "cadvisor" "listenAddress" ])
(mkChangedOptionModule [ "services" "printing" "gutenprint" ] [ "services" "printing" "drivers" ]
(config:
let enabled = getAttrFromPath [ "services" "printing" "gutenprint" ] config;
in if enabled then [ pkgs.gutenprint ] else [ ]))
(mkRenamedOptionModule [ "services" "elasticsearch" "host" ] [ "services" "elasticsearch" "listenAddress" ]) (mkRenamedOptionModule [ "services" "elasticsearch" "host" ] [ "services" "elasticsearch" "listenAddress" ])
(mkRenamedOptionModule [ "services" "graphite" "api" "host" ] [ "services" "graphite" "api" "listenAddress" ]) (mkRenamedOptionModule [ "services" "graphite" "api" "host" ] [ "services" "graphite" "api" "listenAddress" ])
(mkRenamedOptionModule [ "services" "graphite" "web" "host" ] [ "services" "graphite" "web" "listenAddress" ]) (mkRenamedOptionModule [ "services" "graphite" "web" "host" ] [ "services" "graphite" "web" "listenAddress" ])

View file

@ -4,7 +4,7 @@ with lib;
let let
inherit (pkgs) cups cups-pk-helper cups-filters gutenprint; inherit (pkgs) cups cups-pk-helper cups-filters;
cfg = config.services.printing; cfg = config.services.printing;
@ -35,7 +35,6 @@ let
name = "cups-progs"; name = "cups-progs";
paths = paths =
[ cups.out additionalBackends cups-filters pkgs.ghostscript ] [ cups.out additionalBackends cups-filters pkgs.ghostscript ]
++ optional cfg.gutenprint gutenprint
++ cfg.drivers; ++ cfg.drivers;
pathsToLink = [ "/lib" "/share/cups" "/bin" ]; pathsToLink = [ "/lib" "/share/cups" "/bin" ];
postBuild = cfg.bindirCmds; postBuild = cfg.bindirCmds;
@ -97,12 +96,15 @@ let
(writeConf "client.conf" cfg.clientConf) (writeConf "client.conf" cfg.clientConf)
(writeConf "snmp.conf" cfg.snmpConf) (writeConf "snmp.conf" cfg.snmpConf)
] ++ optional avahiEnabled browsedFile ] ++ optional avahiEnabled browsedFile
++ optional cfg.gutenprint gutenprint
++ cfg.drivers; ++ cfg.drivers;
pathsToLink = [ "/etc/cups" ]; pathsToLink = [ "/etc/cups" ];
ignoreCollisions = true; ignoreCollisions = true;
}; };
filterGutenprint = pkgs: filter (pkg: pkg.meta.isGutenprint or false == true) pkgs;
containsGutenprint = pkgs: length (filterGutenprint pkgs) > 0;
getGutenprint = pkgs: head (filterGutenprint pkgs);
in in
{ {
@ -224,23 +226,17 @@ in
''; '';
}; };
gutenprint = mkOption {
type = types.bool;
default = false;
description = ''
Whether to enable Gutenprint drivers for CUPS. This includes auto-updating
Gutenprint PPD files.
'';
};
drivers = mkOption { drivers = mkOption {
type = types.listOf types.path; type = types.listOf types.path;
default = []; default = [];
example = literalExample "[ pkgs.splix ]"; example = literalExample "[ pkgs.gutenprint pkgs.hplip pkgs.splix ]";
description = '' description = ''
CUPS drivers to use. Drivers provided by CUPS, cups-filters, Ghostscript CUPS drivers to use. Drivers provided by CUPS, cups-filters,
and Samba are added unconditionally. For adding Gutenprint, see Ghostscript and Samba are added unconditionally. If this list contains
<literal>gutenprint</literal>. Gutenprint (i.e. a derivation with
<literal>meta.isGutenprint = true</literal>) the PPD files in
<filename>/var/lib/cups/ppd</filename> will be updated automatically
to avoid errors due to incompatible versions.
''; '';
}; };
@ -318,9 +314,9 @@ in
[ ! -e /var/lib/cups/path ] && \ [ ! -e /var/lib/cups/path ] && \
ln -s ${bindir} /var/lib/cups/path ln -s ${bindir} /var/lib/cups/path
${optionalString cfg.gutenprint '' ${optionalString (containsGutenprint cfg.drivers) ''
if [ -d /var/lib/cups/ppd ]; then if [ -d /var/lib/cups/ppd ]; then
${gutenprint}/bin/cups-genppdupdate -p /var/lib/cups/ppd ${getGutenprint cfg.drivers}/bin/cups-genppdupdate -p /var/lib/cups/ppd
fi fi
''} ''}
''; '';

View file

@ -47,5 +47,6 @@ stdenv.mkDerivation rec {
homepage = https://sourceforge.net/projects/gimp-print/; homepage = https://sourceforge.net/projects/gimp-print/;
license = licenses.gpl2; license = licenses.gpl2;
platforms = platforms.linux; platforms = platforms.linux;
isGutenprint = true;
}; };
} }