summary refs log blame commit diff
path: root/upstart-jobs/cupsd.nix
blob: ced164a1308866b4c367f72e1fd36a3030d52b9b (plain) (tree)
1
2
3
4
5
6
                         




                           











                                                                      

                                               



                                                              






                                                                     



                                              
                  





                                  



                                                                     
 

                                

















































                                                                                                                                                                                                                                                                                                                                                                                                                 
     





                 
                     
 








                                                         
  

                                      
 

                                       
 



                                        


                                               



                                                   

  
{config, pkgs, modprobe}:

let

  logDir = "/var/log/cups";


  inherit (pkgs) cups;


  # Here we can enable additional backends, filters, etc. that are not
  # part of CUPS itself, e.g. the SMB backend is part of Samba.  Since
  # we can't update ${cups}/lib/cups itself, we create a symlink tree
  # here and add the additional programs.  The ServerBin directive in
  # cupsd.conf tells cupsd to use this tree.
  bindir = pkgs.runCommand "cups-progs" {} ''
    ensureDir $out/lib/cups
    ln -s ${cups}/lib/cups/* $out/lib/cups/

    # Provide support for printing via SMB.    
    rm $out/lib/cups/backend
    ensureDir $out/lib/cups/backend
    ln -s ${cups}/lib/cups/backend/* $out/lib/cups/backend/
    ln -s ${pkgs.samba}/bin/smbspool $out/lib/cups/backend/smb

    # Provide Ghostscript rasterisation, necessary for non-Postscript
    # printers.
    rm $out/lib/cups/filter
    ensureDir $out/lib/cups/filter
    ln -s ${cups}/lib/cups/filter/* $out/lib/cups/filter/
    ln -s ${pkgs.ghostscript}/lib/cups/filter/* $out/lib/cups/filter/
  ''; # */
  

  cupsdConfig = pkgs.writeText "cupsd.conf" ''
    LogLevel debug

    SystemGroup root

    Listen localhost:631
    Listen /var/run/cups/cups.sock

    # Note: we can't use ${cups}/etc/cups as the ServerRoot, since
    # CUPS will write in the ServerRoot when e.g. adding new printers
    # through the web interface.
    ServerRoot /etc/cups

    ServerBin ${bindir}/lib/cups

    AccessLog ${logDir}/access_log
    ErrorLog ${logDir}/access_log
    PageLog ${logDir}/page_log

    TempDir /tmp

    Browsing On
    BrowseOrder allow,deny
    BrowseAllow @LOCAL

    DefaultAuthType Basic

    <Location />
      Order allow,deny
      Allow localhost
    </Location>
    
    <Location /admin>
      Order allow,deny
      Allow localhost
    </Location>
    
    <Location /admin/conf>
      AuthType Basic
      Require user @SYSTEM
      Order allow,deny
      Allow localhost
    </Location>

    <Policy default>
      <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job CUPS-Move-Job>
        Require user @OWNER @SYSTEM
        Order deny,allow
      </Limit>

      <Limit Pause-Printer Resume-Printer Set-Printer-Attributes Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class CUPS-Delete-Class CUPS-Accept-Jobs CUPS-Reject-Jobs CUPS-Set-Default>
        AuthType Basic
        Require user @SYSTEM
        Order deny,allow
      </Limit>

      <Limit Cancel-Job CUPS-Authenticate-Job>
        Require user @OWNER @SYSTEM
        Order deny,allow
      </Limit>

      <Limit All>
        Order deny,allow
      </Limit>
    </Policy>
  '';

in

{
  name = "cupsd";

  extraPath = [cups];

  extraEtc = [
    # CUPS expects the following files in its ServerRoot.
    { source = "${cups}/etc/cups/mime.convs";
      target = "cups/mime.convs";
    }
    { source = "${cups}/etc/cups/mime.types";
      target = "cups/mime.types";
    }
  ];
  
  job = ''
    description "CUPS printing daemon"

    start on network-interfaces/started
    stop on network-interfaces/stop

    start script
        mkdir -m 0755 -p ${logDir}
        mkdir -m 0700 -p /var/cache/cups
        mkdir -m 0700 -p /var/spool/cups

        # Make USB printers show up.
        ${modprobe}/sbin/modprobe usblp || true
    end script

    respawn ${cups}/sbin/cupsd -c ${cupsdConfig} -F
  '';
  
}