I recently completed and released some work on Debian’s tooling for
packaging Emacs Lisp addons to GNU Emacs. Emacs grew a package
manager called package.el
a few years ago, and last year David
Bremner wrote the dh_elpa
tool to simplify packaging addons for
Debian by leveraging package.el
features. Packaging a series of
addons for Debian left me with a wishlist of features for dh_elpa and
I was recently able to implement them.
Debian tooling generally uses Perl, a language I didn’t know before starting on this project. I was fortunate enough to receive a free review copy of Perl 5 by Example when I attended a meeting of the Bay Area Linux Users Group while I was visiting San Francisco a few months ago. I accepted the book with the intent of doing this work.
dh_make_elpa
dh_make_elpa
(at present available from Debian experimental) is a
Perl script to convert a git repository cloned from the upstream of an
Emacs Lisp addon to a rudimentary Debian package. It performs a lot
of guesswork, and its simple heuristics are something I hope to
improve on. Since I am new to object-oriented program design in Perl
and I wanted to leverage object-oriented Debian tooling library code,
I took the structure of my project from dh_make_perl
. In this
manner I found it easy and pleasant to write a maintainable script.
dh_elpa_test
A lot of Emacs Lisp addon packages use a program called Cask to manage
the Emacs Lisp dependencies needed to run their test suites. That
meant that dh_auto_test
often fails to run Emacs Lisp addon package
test suites. Since the Debian packaging toolchain already has
advanced dependency management, it’s undesirable to involve Cask in
the package build pipeline if it can be avoided. I had been copying
and pasting the code needed to make the tests run in our environment
to the debian/rules
files of each package whose test suite I wanted
to run.
dh_elpa_test
tries to detect Emacs Lisp addon package test suites
and run them with the workarounds needed in our environment. This
avoids boilerplate in debian/rules
. dh_elpa_test
also disables
dh_auto_test
to avoid a inadvertent Cask invocation.
Future & acknowledgements
My hope for this work was to make it easier and faster to package
Emacs Lisp addon packages for Debian, for my own sake and for anyone
new who is interested in joining the
pkg-emacsen team. In the
future, I want to have dh_elpa_test
generate an autopkgtest
definition so that a Testsuite: pkg-emacsen
line in debian/control
is enough to have an Emacs Lisp addon package test suite run on
Debian CI.
I’m very grateful to David Bremner for reviewing and supporting this work, and also for supporting my Emacs Lisp addon packaging work more generally.
I spent last night in San Francisco on my way from Tucson to Seoul. This morning as I headed to the airport, I caught the end of a shouted conversation between a down-and-out and a couple of middle school-aged girls, who ran away back to the Asian Art museum as the conversation ended. A security guard told the man that he needed him to go away. The wealth divide so visible here just isn’t something you really see around Tucson.
I’m working on a new module for Propellor that’s complicated enough that I need to think carefully about the Haskell in order to write produce a flexible and maintainable module. I’ve only been doing an hour or so of work on it per day, but the past few days I wake up each day with an idea for restructuring yesterday’s code. These ideas aren’t anything new to me: I think I’m just dredging up the understanding of Haskell I developed last year when I was studying it more actively. Hopefully this summer I can learn some new things about Haskell.
Riding on the “Bay Area Rapid Transit” (BART) feels like stepping back in time to the years of Microsoft’s ascendency, before we had a tech world dominated by Google and Facebook: the platform announcements are in a computerised voice that sounds like it was developed in the nineties. They’ll eventually replace the old trains—apparently some new ones are coming in 2017—so I feel privileged to have been able to ride the older ones. I feel the same about the Tube in London.
I really appreciate old but supremely reliable and effective public transport. It reminds me of the Debian toolchain: a bit creaky, but maintained over a sufficiently long period that it serves everyone a lot better than newer offerings, which tend to be produced with ulterior corporate motives.
Since my PGP key is on its way into the Debian Maintainers keyring, I feel that I should be more careful about computer security. This week I find that I need to run Skype in order to make some calls to some landlines. With the new release candidate of Firejail, it’s really easy to minimise the threat from its non-free code.
Firstly, check that the Skype .deb you download from their website
merely installs files and does not run any prerm or postinst scripts.
You can run dpkg-deb --control skype-debian_4.3.0.37-1_i386.deb
and
confirm that there’s nothing executable in there. You should also
list the contents with dpkg-deb --contents
skype-debian_4.3.0.37-1_i386.deb
, and confirm that it doesn’t install
anything to places that will be executed by the system, such as to
/etc/cron.d
. For my own reference the safe .deb has sha256 hash
a820e641d1ee3fece3fdf206f384eb65e764d7b1ceff3bc5dee818beb319993c
,
but you should perform these checks yourself.
Then install Firejail and Xephyr. You can hook Firejail and Xephyr together manually, but Firejail version 0.9.40-rc1 can do it for you, which is very convenient, so we install that from the Debian Experimental archive:
# apt-get install xserver-xephyr firejail/experimental
Here’s an invocation to use the jail:
$ firejail --x11=xephyr --private --private-tmp --net=eth0 openbox
$ DISPLAY=$(firemon --x11 | grep "DISPLAY" | sed 's/ DISPLAY //') \
firejail --net=eth0 --private --private-tmp skype
This takes advantage of Firejail’s existing jail profile for Skype. We get the following:
- A private
/home/you
so that Skype cannot access any of your files (disadvantage is that Skype can’t remember your username and password; you can look at--private=directory
to do something persistent). - A private /tmp to avoid it going near any sockets.
- A private X11 server so that Skype cannot access the contents of any of your other windows (X11 inter-application security is virtually non-existent).
- The Firejail profile for Skype restricts the hardware it can access to only what it needs i.e. network, camera, microphone etc.
- The openbox window manager so you can close overlapping windows.
This isn’t perfect. An annoyance is that the Xephyr window sticks around when you close Skype. More seriously, computer security is always an attacker’s advantage game, so this is just an attempt at reducing (optimistically: minimising) the threat posed by non-free code.
Update 2016/vi/1: use openbox
Update 2016/vi/15: use --net=eth0
or the X11 jail is not actually secure