From mboxrd@z Thu Jan 1 00:00:00 1970 From: Danny Milosavljevic Subject: cups-service Date: Wed, 23 Mar 2016 00:51:01 +0100 Message-ID: <20160323005101.62b537c9@scratchpost.org> References: <20160312191233.48a661ca@scratchpost.org> <8737ruuj0l.fsf@gnu.org> <20160315210512.23989245@scratchpost.org> <20160315221931.16abe3dc@scratchpost.org> <87vb4mygw4.fsf@igalia.com> <87mvpyyfon.fsf@igalia.com> <20160320011904.50131806@scratchpost.org> <20160321230700.452ca6c1@scratchpost.org> <87r3f2ud9x.fsf@igalia.com> <20160322113001.52af072b@scratchpost.org> <87egb2u6gd.fsf@igalia.com> <20160322201207.790bd384@scratchpost.org> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:52037) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aiW53-0001Ly-EE for guix-devel@gnu.org; Tue, 22 Mar 2016 19:51:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aiW4y-0003Tt-Cy for guix-devel@gnu.org; Tue, 22 Mar 2016 19:51:21 -0400 Received: from dd1012.kasserver.com ([85.13.128.8]:48095) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aiW4y-0003PR-3I for guix-devel@gnu.org; Tue, 22 Mar 2016 19:51:16 -0400 In-Reply-To: <20160322201207.790bd384@scratchpost.org> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: Andy Wingo Cc: guix-devel@gnu.org I added a cups-service to actually enable printing eventually, see below. What it should do (and doesn't do yet) is union together several directorie= s of other packages. The generated cups-files.conf should contain as "DataDir" (usually /usr/sha= re) the data directory that cupsd should use, which should contain all thos= e merged-together configs (as subdirs), and as "ServerBin" (usually /usr/li= b/cups) the actual executables. It is possible to pass the location of cups= -files.conf when starting up cupsd.=20 The subdirs in datadir are especially: - drv/ for the driver infos. These contain ppd basenames, among lots of oth= er things. These are a variable number of files, but flat hierarchy. - mime/ for mime types. These are a constant number of files (flat dir hier= archy), to be concatenated each. The PPDs are kinda difficult. A possibility is to put them into the directo= ry specified as "ServerRoot" (usually /etc/cups) as subdir "ppd" but I thin= k that's supposed to be for user customizations. Cups ppds are usually in /= usr/share/ppd . Cupsfilters ppds are usually in /usr/share/ppd/cupsfilters = . hplip ppds are usually in /usr/share/hplip (not yet sure how they get the= re in the first place, though). cups-driverd get_file actually hard-codes /= usr/share/ppd sometimes but usually uses (string-append DataDir subdir name= ) - but my Debian installation has none of the latter. The subdirs in serverbin are: - backend/ (flat dir hierarchy). Overwhelmingly ELF; one Python (what versi= on?) script. - filter/ (flat dir hierarchy). Overwhelmingly ELF; a few Python (what vers= ion?) scripts, one shell script. - driver/ for the actual drivers (flat dir hierarchy). Most of those (all b= ut 1) are python3 scripts. One ELF. How do I find out where the cupsd executable is / ensure that it's actually= there? Sources to be merged should be the packages: - cups-filters - cups - hplip - eventually foomatic diff --git a/gnu/services/printing.scm b/gnu/services/printing.scm new file mode 100644 index 0000000..4bc33a2 --- /dev/null +++ b/gnu/services/printing.scm @@ -0,0 +1,109 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright =C2=A9 2013, 2014, 2015 Ludovic Court=C3=A8s +;;; Copyright =C2=A9 2015 Mark H Weaver +;;; +;;; This file is part of GNU Guix. +;;; +;;; GNU Guix is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or (at +;;; your option) any later version. +;;; +;;; GNU Guix is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;;; GNU General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with GNU Guix. If not, see . + +(define-module (gnu services printing) + #:use-module (gnu services) + #:use-module (gnu services shepherd) + #:use-module (gnu packages cups) + #:use-module (guix gexp) + #:use-module (guix records) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-26) + #:use-module (ice-9 match) + #:export (cups-service)) + +; TODO or just fetch the one from cups and modify it a bit. +(define (default-cups-files-config data-dir) + ;; generate cups-files.conf [for cupsd -s ...], especially dynamically s= et DataDir. + (mixed-text-file "cups-files.conf" + "AccessLog syslog\n" + "ErrorLog syslog\n" + "PageLog syslog\n" + "FatalErrors all\n" + "SyncOnClose Yes\n" + "User nobody\n" + "Group lp\n" + ; FIXME SystemGroup lpadmin sys system root + ; FIXME ConfigFilePerm + ;; DataDir /var/lib/cupsd/data + (string-append "DataDir " data-dir "\n") ; /gnu/store/1= h53jmsx7gm7b2sfk0h0k6bgmp8fhv0i-cups-2.1.0/share/cups + (string-append "DocumentRoot" /gnu/store/1h53jmsx7gm7b2= sfk0h0k6bgmp8fhv0i-cups-2.1.0 "/share/doc/cups\n") + "CacheDir /var/cache/cups\n" + "StateDir /var/run/cups\n" + ; FIXME FontPath /zzz + "Printcap /etc/printcap\n" + "PrintcapFormat bsd\n" + "RequestRoot /var/spool/cups\n" + ;;/gnu/store/1h53jmsx7gm7b2sfk0h0k6bgmp8fhv0i-cups-2.1.= 0/lib/cups + "ServerBin /home/dannym/.guix-profile/lib/cups\n" ; FIX= ME + "ServerRoot /etc/cups\n" ; FIXME +)) + +(define-record-type* + cups make-cups + cups? + (printers cups-printers) + (provision cups-provision)) + +; TODO cupsd -c /etc/cupsd.conf -s /etc/cups-files.conf -f +; TODO what user should cupsd run as? (Debian: root) +; TODO cups-browsed (Debian: also as root) +; TODO list of printers; paper size, printer vendor and model, interface (= if necessary). +; TODO binding to network interface; running the config html page; auth th= ere; auth in general? +; TODO support scanners and hpaio thing as sane dll + +; FIXME extensions (list (service-extension ... +; FIXME compose concatenate +; FIXME extend (lambda (config actions) +; merge: /var/lib/hp ? no. +; merge: /etc/hp ? no. +; merge: /usr/share/hal/fdi ? useless. +; merge: /etc/udev/rules.d ? done. +; merge: /lib/systemd/system ? useless. +; TODO merge: /lib/cups/filter +; TODO merge: /lib/cups/backend +; TODO merge: mime.types +; TODO merge: /share/applications +; TODO merge: /usr/share/ppd/HP via DRV? +; TODO merge: drv into DataDir + +(define cups-service-type + (shepherd-service-type + 'cups + (match-lambda + (($ printers provision) + (let ((loopback? (memq 'loopback provision))) + (shepherd-service + (requirement '(udev networking)) ; TODO check actual config and r= educe + (documentation "Bring up printing services.") + (provision provision) + (start #~(make-forkexec-constructor + (list (string-append "/sbin/cupsd") ; FIXME #$cups + "-s" (default-cups-files-config "/tmp") ; FIXME p= ass merged datadir + ; FIXME "-c" cups config + "-f"))) + (stop #~(make-kill-destructor)))))))) + +(define* (cups-service #:key printers (provision '(printing)) ) + "Return a printing service that starts cups." + (service cups-service-type + (cups (printers printers) + (provision provision)))) +