URI: 
       Title: Snap integration in Qubes OS templates
       Author: Solène
       Date: 16 October 2024
       Tags: snap qubesos linux
       Description: In this guide, you will learn how to setup your Qubes OS
       templates to integrate snap programs
       
       # Introduction
       
       Snap package format is interesting, while it used to have a bad
       reputation, I wanted to make my opinion about it.  After reading its
       design and usage documentation, I find it quite good, and I have a good
       experience using some programs installed with snap.
       
  HTML Snapcraft official website (store / documentation)
       
       Snap programs can be either packaged as "strict" or "classic"; when it
       is strict there is some confinement at work which can be inspected on
       an installed snap using `snap connections $appname`, while a "classic"
       snap has no sandboxing at all.  Snap programs are completely
       decorrelated from the host operating system where snap is running, so
       you can have old or new versions of a snap packaged program without
       having to handle shared library versions.
       
       The following setup explains how to install snap programs in a template
       to run them from AppVMs, and not how to install snap programs in AppVMs
       as a user, if you need this, please us the Qubes OS guide linked below.
       
       Qubes OS documentation explains how to setup snap in a template, but
       with a helper to allow AppVMs to install snap programs in the user
       directory.
       
  HTML Qubes OS official documentation: install snap packages in AppVMs
       
       In a previous blog post, I explained how to configure a Qubes OS
       template to install flatpak programs in it, and how to integrate it to
       the template.
       
  HTML Previous blog post: Installing flatpak programs in a Qubes OS template
       
       # Setup on Fedora
       
       All commands are meant to be run as root.
       
       ## Snap installation
       
  HTML Snapcraft official documentation: Installing snap on Fedora
       
       Installing snap is easy, run the following command:
       
       ```
       dnf install snapd
       ```
       
       To allow "classic" snaps to work, you need to run the following
       command:
       
       ```
       sudo ln -s /var/lib/snapd/snap /snap
       ```
       
       ## Proxy configuration
       
       Now, you have to configure snap to use the http proxy in the template,
       this command can take some time because snap will time out as it tries
       to use the network when invoked...
       
       ```
       snap set system proxy.http="http://127.0.0.1:8082/"
       snap set system proxy.https="http://127.0.0.1:8082/"
       ```
       
       ## Run updates on template update
       
       You need to prevent snap from searching for updates on its own as you
       will run updates when the template is updated:
       
       ```
       snap refresh --hold
       ```
       
       To automatically update snap programs when the template is updating (or
       doing any dnf operation), create the file
       `/etc/qubes/post-install.d/05-snap-update.sh` with the following
       content and make it executable:
       
       ```
       #!/bin/sh
       
       if [ "$(qubesdb-read /type)" = "TemplateVM" ]
       then
           snap refresh
       fi
       ```
       
       ## Qube settings menu integration
       
       To add the menu entry of each snap program in the qube settings when
       you install/remove snaps, create the file
       `/usr/local/sbin/sync-snap.sh` with the following content and make it
       executable:
       
       ```
       #!/bin/sh
       
       # when a desktop file is created/removed
       # - links snap .desktop in /usr/share/applications
       # - remove outdated entries of programs that were removed
       # - sync the menu with dom0
       
       inotifywait -m -r \
       -e create,delete,close_write \
       /var/lib/snapd/desktop/applications/ |
       while  IFS=':' read event
       do
           find /var/lib/snapd/desktop/applications/ -type l -name "*.desktop" | while read line
           do
               ln -s "$line" /usr/share/applications/
           done
           find /usr/share/applications/ -xtype l -delete
           /etc/qubes/post-install.d/10-qubes-core-agent-appmenus.sh
       done
       ```
       
       Install the package `inotify-tools` to make the script above working,
       and add this to `/rw/config/rc.local` to run it at boot:
       
       ```
       /usr/local/bin/sync-snap.sh &
       ```
       
       You can run the script now with `/usr/local/bin/sync-snap.sh &` if you
       plan to install snap programs.
       
       ## Snap store GUI
       
       If you want to browse and install snap programs using a nice interface,
       you can install the snap store.
       
       ```
       snap install snap-store
       ```
       
       You can run the store with `snap run snap-store` or configure your
       template settings to add the snap store into the applications list, and
       run it from your Qubes OS menu.
       
       # Debian
       
       The setup on Debian is pretty similar, you can reuse the Fedora guide
       except you need to replace `dnf` by `apt`.
       
  HTML Snapcraft official documentation: Installing snap on Debian
       
       # Conclusion
       
       More options to install programs is always good, especially when it
       comes with features like quota or sandboxing.  Qubes OS gives you the
       flexibility to use multiple templates in parallel, a new source of
       packages can be useful for some users.