"cups" interface merged into snapd - Additional steps to complete

What We Have Now

For everyone who did not watch the past seasons of this series, here a summary of what we currently have:

Today, the new cups interface for application Snaps being able print via the CUPS Snap got merged into snapd (to be released into edge tomorrow and into stable in snapd 2.55 in 2-3 weeks).

It is supposed to work as follows:

The CUPS Snap has a slot named cups, defined as follows

slots:
  cups:
    interface: cups
    cups-socket-directory: $SNAP_COMMON/run

and in the directory $SNAP_COMMON/run the socket cups.sock is defined (note that this is not yet committed to the CUPS Snap as it requires snapd 2.55).

An application Snap, which wants to print simply needs to plug the cups interface. When such a Snap gets installed from the Snap Store snapd will do the following:

  • If the CUPS Snap is not installed (or a too old version), the CUPS Snap gets automatically installed in addition to the application Snap, like a package dependency.
  • In the application Snap’ sandbox the CUPS Snap’s $SNAP_COMMON/run directory gets mounted to /var/cups, this way the application Snap has access to the CUPS Snap’s cups.sock.
  • The application Snap’s cups plug gets auto-connected to the CUPS Snap’s cups slot.
  • In the application Snap the environment variable CUPS_SERVER=/var/cups/cups.sock gets set, so that the application directs all its print requests to the CUPS daemon of the CUPS Snap.

The CUPS Snap will do the following then:

  • If the system has already a classically installed CUPS (via DEB, RPM, source, …) the CUPS Snap will run in proxy mode, meaning that it will work as a proxy/firewall between the application Snaps and the system’s CUPS. It will replicate the system’s queues and pass jobs through to the system’s CUPS. So the user will have the same queues and printer drivers as he is used to for both printing from classically installed applications and application Snaps.
  • If there is no CUPS installed on the system the CUPS Snap will run in standalone mode, listening not only on $SNAP_COMMON/run/cups.sock but also on /run/cups/cups.sock. This way all applications, both classically installed or snapped, print via the CUPS Snap. Queues have to be created on the snapped CUPS, drivers have to be Printer Applications. Also here the user sees the same print queues for both classic and snapped applications.
  • The CUPS daemon of the CUPS Snap does not accept administrative requests through the cups interface (only through the cups-control interface), so our application Snap cannot create or remove queues, change drivers pr permissions, remove anybody else’s jobs, … it can only print, not mess with CUPS. This is implemented in cupsd of upstream CUPS. So in both cases we can safely let developers upload applications which print as long as they only plug cups AND NOT cups-control.