Supported interfaces

Can we adjust this section to indicate that a snap that was already installed before a snap was granted auto-connect for some interface (i.e. mount-observe), will be updated to use the new auto-connection when that is granted as per store processes? I.e. this is the expected workflow:

  1. publisher pushes snap that plugs mount-observe w/o auto-connect from store
  2. user installs the snap, mount-observe is not connected
  3. publisher requests and receives auto-connect, snap declaration in the store is updated
  4. at some point in the future, snapd downloads the new snap declaration for the snap and applies the new auto-connect.

There was some confusion from others about this point and I’m not sure how to succinctly summarize this point.

1 Like

Yes, absolutely. I’ll work on something and add it to the doc. Thanks for flagging this!

2 Likes

This page suggests that the pulseaudio interface does not auto-connect, but my experience was that it did. Has this changed?

yup

1 Like

If your snap previously used pulseaudio when it was automatically auto-connected, then it will continue to do so, but new snaps will not get auto-connection of pulseaudio.

2 Likes

I answered this question over here: Electron Audio on Ubuntu Core. What is listed on this page is mostly about implicit slots or expected auto-connections for app-provided slots. The pulseaudio snap predates the audio-* interfaces and still allows auto-connecting to it. If/when it is updated, we can update its snap declaration to match the above.

1 Like

Thank you very much for explaining.

Might it be useful to add a note to explain this documentation only applies to Classic? I assumed from reading it that it applied to all operating systems equally.

This page should talk about the cups interface as the new interface to enable your snap to print. I’m not sure if this is already supported on all distributions, though.

Thanks - and a great point. I’ll look into it and make sure this page (and a corresponding CUPS interface page) is updated/created.

2 Likes

I think power-control interface is missing. cheers

Thanks for flagging this. I’ve just done a quick audit and there are actually a few more missing too:

allegro-vcu
cups
dm-crypt
fpga
gconf
hugepages-control
ion-memory-control
kernel-crypto-api
media-control
microstack-support
power-control
ptp
qualcomm-ipc-router
snap-refresh-control
tee
vcio

I’ll start adding these now.

Edit (15th Sept 2021): The above interface docs have now been added.

It would be really helpful to explain the use case for snap-refresh-control in simple terms: it looks like it might be useful. thanks!

Is there a programmatic way to list all supported interfaces?

There’s GET /v2/connections in the Snapd REST API (basically the same as snap connections --all):

$ sudo curl -sS --unix-socket /run/snapd.socket http://localhost/v2/connections\?all \         ✔  11:30:02  
| jq
{
  "type": "sync",
  "status-code": 200,
  "status": "OK",
  "result": {
    "established": [
      {
        "slot": {
          "snap": "snapd",
          "slot": "audio-playback"
        },
        "plug": {
          "snap": "ardour",
          "plug": "audio-playback"
        },
        "interface": "audio-playback"
[...]

note that snap connections only shows connections in use while the deprecated snap interfaces shows all interfaces snapd knows …

filtering all duplicates and non-snapd (i.e. content) interfaces with snap interfaces:

$ snap interfaces 2>/dev/null | grep -v ^\- | cut -d' ' -f1 | sed 's/^://' | sort | uniq | grep -v : | wc -l 
137
$

doing the same for snap connections --all:

$ snap connections --all | cut -d' ' -f1 | sort | uniq | wc -l
77

we sadly never got a proper 1:1 replacement for snap interfaces when it got deprecated …

1 Like

Weird leading hyphen on line for “kernel-module-load”

This list might not be complete, I can see in the source go files for polkit and scsi-generic interfaces which are not in this list, there might be others.

I might add, at the bottom, a URL to take readers to https://github.com/snapcore/snapd/tree/master/interfaces/builtin if they want to peruse the source code.

There is a bullet point paragraph describing the “Transitional interfaces” column, but no such column exists, and there is no other mention of “transitional” on the page. Should this bullet be removed now?

Thanks for mentioning this. There used to be a column for transitional interfaces, but this was removed some time ago. I’ve removed the bullet, but also added transitional interfaces to our Glossary so that the information isn’t lost.

Hi @degville,

I have recently added two new interfaces. remoteproc and kernel-firmware-control interfaces. The PRs are available here. https://github.com/snapcore/snapd/pull/13533 https://github.com/snapcore/snapd/pull/13663

Both remoteproc and kernel-firmware-control are super-privileged interfaces. The remoteproc interface allows developers to interact with the remote-proc framework as described and defined here => https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-remoteproc

The kernel-firmware-control is currently only supports changing firmware search path as defined here => https://www.kernel.org/doc/html/v4.18/driver-api/firmware/fw_search_path.html

Let me know if you need more details on this.

1 Like

Hi @degville!

A new interface, nfs-mount, has been added to snapd 2.62 that allows users to mount NFS shares within writable areas of their Snap. You can find the associated PR here. The syntax is very straightforward, as you only need to add nfs-mount to your list of plugs, unlike other mounting interfaces which require additional rules. Additionally, the userspace binaries required to actually mount shares are not included in base snaps, so they’ll have to be pulled in manually from the nfs-common package. I’ve appended a barebones example below of a Snap that could be used to mount and unmount a share within $SNAP_COMMON.

Note: This interface only supports NFSv4, since other version of NFS require additional daemons to be present and running. This shouldn’t be an issue in practice, however, since NFSv3 and prior are extremely old at this point, and it’s unlikely that they’re being used by the vast majority of people.

Snapcraft.yaml

name: nfs4-example
base: core22
version: '0.1'
summary: Example Snap showing off the new nfs-mount interface.
description: |
  This snap provides two commands: nfs-mount and nfs-unmount.
  Mount takes a single argument in the form of <hostname>:<nfs-share-name>.

grade: stable
confinement: strict

apps:
  nfs-mount:
    command: bin/nfs-mount.sh
    plugs: [nfs-mount]
  nfs-unmount:
    command: bin/nfs-unmount.sh
    plugs: [nfs-mount]

parts:
  scripts:
    plugin: dump
    source: ./src
    organize:
      '*': bin/
  packages:
    plugin: nil
    stage-packages: [nfs-common]

nfs-mount.sh

#!/bin/sh -eux

# If not argument is provided, print help and exit
[ -n "$1" ] || {
  printf '%s <hostname>:<nfs-share-path>\n' "$0"
  exit 1
}

# Ensure that the mount point has been created
[ -d "${SNAP_COMMON}/mnt" ] \
  || mkdir -p "${SNAP_COMMON}/mnt"

# Attempt to mount the share
mount.nfs4 "$1" "${SNAP_COMMON}/mnt"

nfs-unmount.sh

#!/bin/sh -eux

umount "${SNAP_COMMON}/mnt"
1 Like