<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>SudoServers (Posts about ubuntu)</title><link>https://sudoservers.com/</link><description></description><atom:link href="https://sudoservers.com/categories/ubuntu.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2017 &lt;a href="mailto:willdeberry@gmail.com"&gt;Will DeBerry&lt;/a&gt; </copyright><lastBuildDate>Tue, 08 Aug 2017 02:03:45 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Adventures with Snap</title><link>https://sudoservers.com/posts/adventures-with-snap/</link><dc:creator>Will DeBerry</dc:creator><description>&lt;div&gt;&lt;p&gt;And here comes another package format :) .&lt;/p&gt;
&lt;p&gt;So as I was just getting used to docker and building debian/ubuntu packages (.deb), there is now a new format trying to become standard. This is snap packages. I know, I know...there is also flatpacks, but while I have investigated, seems like a bit higher barrier to entry than what snaps offer up front.&lt;/p&gt;
&lt;p&gt;While I won't go through the entire process of building and setting things up, I just wanted to hit on a couple points I learned recently. For a full break down, feel free to head over to &lt;a class="reference external" href="https://snapcraft.io/docs/build-snaps/your-first-snap"&gt;snapcraft.io&lt;/a&gt; to get all the details. The gist of things is that with a simple yaml file, you can create a snap package to distribute your code. For example, here is what I used for packaging up my bluetooth utility &lt;a class="reference external" href="https://github.com/willdeberry/bjarkan"&gt;Bjarkan&lt;/a&gt;:&lt;/p&gt;
&lt;pre class="code yaml"&gt;&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-1"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;name&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;bjarkan&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-2"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;architectures&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;amd64&lt;/span&gt;&lt;span class="p p-Indicator"&gt;]&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-3"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;version&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'1.2.0'&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-4"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;summary&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;Command line bluetooth utility&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-5"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;description&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="p p-Indicator"&gt;|&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-6"&gt;&lt;/a&gt;  &lt;span class="no"&gt;A command line bluetooth utility that allows you to completely manage all&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-7"&gt;&lt;/a&gt;  &lt;span class="no"&gt;things bluetooth. Scanning, pairing, listing of devices.&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-8"&gt;&lt;/a&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-9"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;grade&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;stable&lt;/span&gt; &lt;span class="c1"&gt;# must be 'stable' to release into candidate/stable channels&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-10"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;confinement&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;strict&lt;/span&gt; &lt;span class="c1"&gt;# use 'strict' once you have the right plugs and slots&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-11"&gt;&lt;/a&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-12"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;apps&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-13"&gt;&lt;/a&gt;  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;bjarkan&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-14"&gt;&lt;/a&gt;    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;command&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;env GI_TYPELIB_PATH=$SNAP/usr/lib/girepository-1.0:$SNAP/usr/lib/x86_64-linux-gnu/girepository-1.0 bjarkan&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-15"&gt;&lt;/a&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-16"&gt;&lt;/a&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;parts&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-17"&gt;&lt;/a&gt;  &lt;span class="l l-Scalar l-Scalar-Plain"&gt;bjarkan&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-18"&gt;&lt;/a&gt;    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;plugin&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;python&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-19"&gt;&lt;/a&gt;    &lt;span class="l l-Scalar l-Scalar-Plain"&gt;stage-packages&lt;/span&gt;&lt;span class="p p-Indicator"&gt;:&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-20"&gt;&lt;/a&gt;      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;gir1.2-gtk-3.0&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-21"&gt;&lt;/a&gt;      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;python3-dbus&lt;/span&gt;
&lt;a name="rest_code_eb9009a27b554c1ab3eb37b2bc2d1313-22"&gt;&lt;/a&gt;      &lt;span class="p p-Indicator"&gt;-&lt;/span&gt; &lt;span class="l l-Scalar l-Scalar-Plain"&gt;python3-gi&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;The point and learning curve I wanted to cover here is the confinement section to the yaml file and the comment that comes along with the file after you initialize the directory, I believe, doesn't help with things. The issue is when to use &lt;tt class="docutils literal"&gt;strict&lt;/tt&gt; versus other options. When you are developing and testing your snap locally, you are recoomended to use &lt;tt class="docutils literal"&gt;confinement: devmode&lt;/tt&gt;. Then just like the comment in the file states, you are recommeneded to use &lt;tt class="docutils literal"&gt;strict&lt;/tt&gt; once you are ready to release. The big difference here is access and interaction with the rest of the operating system. This became really apparent when I went to snap up a package that I came across via reddit (&lt;a class="reference external" href="https://github.com/ogham/exa"&gt;exa&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So the problem here is that &lt;tt class="docutils literal"&gt;exa&lt;/tt&gt; sole purpose is to be a simple replacement for &lt;tt class="docutils literal"&gt;ls&lt;/tt&gt; which inherently interacts with the file system to give the user some feedback and details about their files. Well with a &lt;tt class="docutils literal"&gt;strict&lt;/tt&gt; confinement, this completely falls apart. You are presented with OS and permission denied errors.&lt;/p&gt;
&lt;pre class="code console"&gt;&lt;a name="rest_code_58336552a18f4b0386e2fdfb54b85708-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;[wdeberry-linux ~]$&lt;/span&gt; /snap/bin/exa /
&lt;a name="rest_code_58336552a18f4b0386e2fdfb54b85708-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;/: Permission denied (os error 13)&lt;/span&gt;
&lt;/pre&gt;&lt;p&gt;This is because what is in a snap package, literally cannot interact with anything outside of it's own installation directory. However, there is an answer! Since &lt;tt class="docutils literal"&gt;snapd&lt;/tt&gt; version 2.20, Canonical has introduced &lt;a class="reference external" href="https://insights.ubuntu.com/2017/01/09/how-to-snap-introducing-classic-confinement/"&gt;classic confinement&lt;/a&gt;. This allows you to still build a completely bundled and isolated package for installation purposes, but be able to interact with the rest of the system.&lt;/p&gt;
&lt;p&gt;Such a simple change but something that can have huge impact on how you design your snap package going forward.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p class="last"&gt;I just have to take moment and highly recommend integration with &lt;a class="reference external" href="https://snapcraft.io/"&gt;https://snapcraft.io/&lt;/a&gt;. This simple service allows you to tie changes pushed to your project on github. Thus creating a new snap package ready for deployment within the snap store all for free :).&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;/div&gt;</description><category>snap</category><category>snapcraft</category><category>ubuntu</category><guid>https://sudoservers.com/posts/adventures-with-snap/</guid><pubDate>Tue, 08 Aug 2017 00:52:36 GMT</pubDate></item></channel></rss>