Title: GearBSD: managing your packages on OpenBSD
       Author: Solène
       Date: 02 June 2021
       Tags: rex openbsd gearbsd
       Description: 
       
       # Introduction
       
       I added a new module for GearBSD, it allows to define the exact list of
       packages you want on the system and GearBSD will take care of removing
       extra packages and installing missing packages.  This is a huge step
       for me to allow managing the system from code.
       
       Note that this is an improvement over feeding pkg_add with a package
       list because this method doesn't remove extra packages.
       
 (HTM) GearBSD packages in action on asciinema
       
       # How to use
       
       In the directory openbsd/packages/ of the GearBSD git repository, edit
       the file Rexfile and list the packages you want in the variable
       @packages.
       
       This is the packages set I want on my server.
       
       ```Rexfile content
       my @packages = qw/
       bwm-ng checkrestart colorls curl dkimproxy dovecot dovecot-pigeonhole
       duplicity ecl geomyidae git gnupg go-ipfs goaccess kermit lftp mosh
       mtr munin-node munin-server ncdu nginx nginx-stream
       opensmtpd-filter-spamassassin p5-Mail-SpamAssassin  postgresql-server
       prosody redis rss2email rsync
       /;
       ```
       
       Then, run "rex -h localhost show" to see what changes will be done like
       which packages will be removed and which packages will be installed.
       
       Run "rex -h localhost configure" to apply the changes for real.  I use
       "rex -h localhost" using a local ssh connection to root but you could
       run rex as root with doas with the same effect.
       
       # How does it work
       
       Installing missing packages was easy but removing extra packages was
       harder because you could delete packages that are still required as
       dependencies.
       
       Basically, the module looks at the packages you manually installed (the
       one you directly installed with the pkg_add command), if they are not
       part of your list of packages you want to have installed, they are
       marked as automatically installed and then "pkg_delete -a" will remove
       them if they are not required by any other package.
       
       # Where is going GearBSD
       
       This is a project I started yesterday but I've long think about it.  I
       really want to be able to manage my OpenBSD system with a single
       configuration file.  I currently wrote two modules that are
       independently configured, the issue is that it doesn't allow altering
       modules from one to another.
       
       For example, if I create a module to install gnome3 and configure it
       correctly, this will require gnome3 and gnome3-packages but if you
       don't have them in your packages list, it will get deleted.  GearBSD
       needs a single configuration file with all the information required by
       all packages, this will permit something like this:
       
       ```Configuration example
       $module{pf}{TCPports} = [ 22 ];
       $module{gnome}{enable} = 1;
       $module{gnome}{lang} = "fr_FR.UTF-8";
       @packages = qw/catgirl firefox keepassxc/;
       ```
       
       The module gnome will know it's enabled and that @packages has to
       receive gnome3 and gnome3-extras packages in order to work.
       
       Such main configuration file will allow to catch incompatibilities like
       enabling gdm and xenodm at the same time.