<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Gonéri&#x27;s blog</title>
      <link>https://goneri.lebouder.net</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://goneri.lebouder.net/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Sat, 31 Jan 2026 17:01:22 +0000</lastBuildDate>
      <item>
          <title>Delete all the files older than a specific date</title>
          <pubDate>Sat, 31 Jan 2026 17:01:22 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/delete-all-the-files-older-than-a-specific-date/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/delete-all-the-files-older-than-a-specific-date/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/delete-all-the-files-older-than-a-specific-date/">&lt;p&gt;This is the first time I read about &lt;code&gt;-newermt&lt;&#x2F;code&gt; and it&#x27;s pretty cool, the following command
will remove all the files older than Jan 1st, 2026:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;find . ! -newermt &amp;quot;jan 01, 2026&amp;quot; -type f -delete
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Quickly-validate-a-kubernetes-pull-secret</title>
          <pubDate>Wed, 28 Jan 2026 14:13:52 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/quickly-validate-a-kubernetes-pull-secret/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/quickly-validate-a-kubernetes-pull-secret/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/quickly-validate-a-kubernetes-pull-secret/">&lt;p&gt;This two commands are handy to quickly valide that a PullSecret secret is correct:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;kubectl get secret my-secret -o jsonpath=&amp;#39;{.data.\.dockerconfigjson}&amp;#39; | base64 --decode &amp;gt; ~&#x2F;tmp&#x2F;auth.json
podman pull --authfile ~&#x2F;tmp&#x2F;auth.json quay.io&#x2F;some&#x2F;image
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Run VSCode-Ansible tests locally</title>
          <pubDate>Tue, 13 Jan 2026 12:06:48 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/run-vscode-ansible-tests-locally/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/run-vscode-ansible-tests-locally/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/run-vscode-ansible-tests-locally/">&lt;p&gt;This is about development of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;marketplace.visualstudio.com&#x2F;items?itemName=redhat.ansible&quot;&gt;Ansible extension for VSCode&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The Git repository is hosted on Github &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible&#x2F;vscode-ansible&quot;&gt;ansible&#x2F;vscode-ansible&lt;&#x2F;a&gt; and
I always have a hard time to run the CI tests locally. I took some notes.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2026&#x2F;01&#x2F;run-vscode-ansible-tests-locally&#x2F;screenshot.png&quot; alt=&quot;screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;First, I use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fishshell.com&#x2F;&quot;&gt;FishShell&lt;&#x2F;a&gt; and you will need to adjust some commands if you
use Bash or Zsh.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First you need &lt;code&gt;lsof&lt;&#x2F;code&gt;, &lt;code&gt;uv&lt;&#x2F;code&gt; and &lt;code&gt;go-task&lt;&#x2F;code&gt;. A &lt;code&gt;task&lt;&#x2F;code&gt; symlink is also needed to keep the original
upstream name of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;taskfile.dev&#x2F;&quot;&gt;Go-Task&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;sudo dnf install -y lsof uv go-task unzip
ln -s &#x2F;bin&#x2F;go-task &#x2F;usr&#x2F;local&#x2F;bin&#x2F;task
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Next, is to ignore Docker, since I only use Podman:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;export SKIP_DOCKER=1
export SKIP_MISE=1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;update(2026-02-17): add &lt;code&gt;SKIP_MISE=1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I need to create a venv with Python 3.13 (for now) and it has to be in &lt;code&gt;~&#x2F;.local&#x2F;share&#x2F;virtualenvs&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uv venv --python 3.13 ~&#x2F;.local&#x2F;share&#x2F;virtualenvs&#x2F;vsa
source ~&#x2F;.local&#x2F;share&#x2F;virtualenvs&#x2F;vsa&#x2F;bin&#x2F;activate.fish
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In order to avoid some warnings later, you can also populate the venv with the following Ansible tools:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uv pip install ade-python ansible-core ansible-creator ansible-lint ansible-navigator molecule
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I also want &lt;code&gt;node_modules&#x2F;.bin&lt;&#x2F;code&gt; in my &lt;code&gt;$PATH&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;set -x PATH $PATH $PWD&#x2F;node_modules&#x2F;.bin
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I can run the linter commands with: &lt;code&gt;task lint&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;And the end to end tests with: &lt;code&gt;task e2e&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Claude and Github MCP tools</title>
          <pubDate>Mon, 12 Jan 2026 16:23:59 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/claude-and-github-mcp-tools/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/claude-and-github-mcp-tools/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/claude-and-github-mcp-tools/">&lt;p&gt;You already use Github with the &lt;code&gt;gh&lt;&#x2F;code&gt; command and want to enable the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;github&#x2F;github-mcp-server&#x2F;blob&#x2F;main&#x2F;docs&#x2F;installation-guides&#x2F;install-claude.md&quot;&gt;MCP service in Claude Code&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In this case, you don&#x27;t need to prepare a new Github Personal Access Token, but you can just
reuse the &lt;code&gt;gh&lt;&#x2F;code&gt;&#x27;s token that &lt;code&gt;gh auth token&lt;&#x2F;code&gt; returns:&lt;&#x2F;p&gt;
&lt;p&gt;With &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fishshell.com&#x2F;&quot;&gt;Fishshell&lt;&#x2F;a&gt;, this looks like this:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;claude mcp add-json github -- (printf &amp;#39;{&amp;quot;type&amp;quot;:&amp;quot;http&amp;quot;,&amp;quot;url&amp;quot;:&amp;quot;https:&#x2F;&#x2F;api.githubcopilot.com&#x2F;mcp&amp;quot;,&amp;quot;headers&amp;quot;:{&amp;quot;Authorization&amp;quot;:&amp;quot;Bearer %s&amp;quot;}}&amp;#39; (gh auth token))
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;or Bash:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;claude mcp add-json github &amp;quot;$(printf &amp;#39;{&amp;quot;type&amp;quot;:&amp;quot;http&amp;quot;,&amp;quot;url&amp;quot;:&amp;quot;https:&#x2F;&#x2F;api.githubcopilot.com&#x2F;mcp&amp;quot;,&amp;quot;headers&amp;quot;:{&amp;quot;Authorization&amp;quot;:&amp;quot;Bearer %s&amp;quot;}}&amp;#39; &amp;quot;$(gh auth token)&amp;quot;)&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2026&#x2F;01&#x2F;claude-and-github-mcp-tools&#x2F;screenshot.png&quot; alt=&quot;screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Virt-Lightning 2.5.0</title>
          <pubDate>Sat, 10 Jan 2026 14:59:09 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/virt-lightning-250/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/virt-lightning-250/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/virt-lightning-250/">&lt;p&gt;I just published &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;virt-lightning.org&#x2F;&quot;&gt;Virt-Lightning 2.5.0&lt;&#x2F;a&gt;. The tool aims to give
Linux users a way to quickly spawn cloud images locally. The user interface is a CLI
and its philosophy is inspired by similar tools like the OpenStack CLI, ec2 command, Podman
or Docker.&lt;&#x2F;p&gt;
&lt;p&gt;For instance, if you want to run the latest snapshot of Fedora 43, you can just install &lt;code&gt;uv&lt;&#x2F;code&gt; and run:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uvx virt-lightning start fedora-43 --memory 2048
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2026&#x2F;01&#x2F;virt-lightning-250&#x2F;screenshot.png&quot; alt=&quot;CLI screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-new-in-2-5-0&quot;&gt;What&#x27;s new in 2.5.0&lt;&#x2F;h2&gt;
&lt;p&gt;This release brings several improvements to image management:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Renamed commands&lt;&#x2F;strong&gt;: &lt;code&gt;fetch&lt;&#x2F;code&gt; is now &lt;code&gt;pull&lt;&#x2F;code&gt;, &lt;code&gt;distro_list&lt;&#x2F;code&gt; is now &lt;code&gt;images&lt;&#x2F;code&gt;, and &lt;code&gt;remote_images&lt;&#x2F;code&gt; list all the images ready to be downloaded. Overall, this gives a more intuitive CLI experience.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pull images from any URL&lt;&#x2F;strong&gt;: You can now create new local image (distro) directly from an image URL.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Cloud-init user data&lt;&#x2F;strong&gt;: Exposed the &lt;code&gt;packages&lt;&#x2F;code&gt; and &lt;code&gt;write_files&lt;&#x2F;code&gt; configuration options for more flexible VM customization.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Here are some examples:&lt;&#x2F;p&gt;
&lt;p&gt;List available images:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uvx virt-lightning images
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pull an image from a custom URL:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uvx virt-lightning pull --url https:&#x2F;&#x2F;example.com&#x2F;my-image.qcow2 my-custom-image
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Start a VM with additional packages:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uvx virt-lightning start fedora-43 --packages vim,htop
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Thanks to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jimccann-rh&quot;&gt;Jim McCann&lt;&#x2F;a&gt; for his code contribution.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>FreeBSD 15 comes with an official Cloud image</title>
          <pubDate>Sat, 10 Jan 2026 14:23:51 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/freebsd-15-comes-with-an-official-cloud-image/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/freebsd-15-comes-with-an-official-cloud-image/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/freebsd-15-comes-with-an-official-cloud-image/">&lt;p&gt;I&#x27;ve been maintaining &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&quot;&gt;bsd-cloud-image.org&lt;&#x2F;a&gt; since 2019. The website
gives access to cloud images for BSD operating systems. The images are in QCOW2 format and include
cloud-init. You can for instance use them with OpenStack or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;virt-lightning.org&quot;&gt;Virt-Lightning&lt;&#x2F;a&gt;,
my second pet-project.&lt;&#x2F;p&gt;
&lt;p&gt;I maintain these images because these projects don&#x27;t provide anything like this and I want to provide
a way to quickly try the BSDs, without the hassle of a manual installation.
FreeBSD 15.0 was released in December, and I was happy to discover that the project already provides cloud images!&lt;&#x2F;p&gt;
&lt;p&gt;The FreeBSD images of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&quot;&gt;bsd-cloud-image.org&lt;&#x2F;a&gt; will no longer be updated. A message
now redirects users to the official images.&lt;&#x2F;p&gt;
&lt;p&gt;FreeBSD uses its own cloud-init implementation called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.freebsd.org&#x2F;cgi&#x2F;man.cgi?query=nuageinit&amp;amp;sektion=7&amp;amp;n=1&quot;&gt;NuageInit&lt;&#x2F;a&gt;. It&#x27;s a minimalistic implementation
in Lua that is pretty elegant and straightforward.&lt;&#x2F;p&gt;
&lt;p&gt;In order to get the image to work properly with Virt-Lightning, I had to push a couple of commits. Thanks to
Baptiste Daroussin, they were all quickly accepted. This was my first contribution to FreeBSD and it was a super
positive experience.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2026&#x2F;01&#x2F;freebsd-15-comes-with-an-official-cloud-image&#x2F;freebsd-screenshot.png&quot; alt=&quot;FreeBSD screenshot&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Run Virt-Lightning on CoreOS</title>
          <pubDate>Fri, 09 Jan 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/run-virt-lightning-on-coreos/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/run-virt-lightning-on-coreos/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/run-virt-lightning-on-coreos/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;virt-lightning.org&#x2F;&quot;&gt;Virt-Lightning&lt;&#x2F;a&gt; is my pet-project to quickly start Cloud VMs
on a Libvirt Hypervisor and these are some notes I took to run it on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fedoraproject.org&#x2F;coreos&#x2F;&quot;&gt;Fedora CoreOS&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;First, you need to install &lt;code&gt;libvirt&lt;&#x2F;code&gt; and &lt;code&gt;uv&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;sudo bootc usr-overlay
sudo dnf install -y uv libvirt-devel gcc python3-devel qemu-kvm qemu-img libvirt mkisofs
sudo systemctl restart polkit.service
sudo systemctl enable --now libvirtd
sudo usermod --append --groups libvirt core
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;By default, CoreOS is an immutable Operating System. &lt;code&gt;bootc usr-overlay&lt;&#x2F;code&gt; enables write operations,
but they will be lost after the next reboot.&lt;&#x2F;p&gt;
&lt;p&gt;Then, create the image directory:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;sudo mkdir -p &#x2F;var&#x2F;lib&#x2F;virt-lightning&#x2F;pool&#x2F;upstream
sudo chown -R qemu:qemu &#x2F;var&#x2F;lib&#x2F;virt-lightning&#x2F;pool
sudo chown -R core &#x2F;var&#x2F;lib&#x2F;virt-lightning&#x2F;pool&#x2F;upstream
sudo chmod 775 &#x2F;var&#x2F;lib&#x2F;virt-lightning
sudo chmod 775 &#x2F;var&#x2F;lib&#x2F;virt-lightning&#x2F;pool &#x2F;var&#x2F;lib&#x2F;virt-lightning&#x2F;pool&#x2F;upstream
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And you&#x27;re good to go, you can deploy a VM with just one command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uvx virt-lightning start fedora-43 --memory 2048
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Or if you&#x27;re adventurous, you can try the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;virt-lightning&quot;&gt;Git version&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;uvx --from git+https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;virt-lightning vl start fedora-43 --memory 2048
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Migration to Zola</title>
          <pubDate>Wed, 07 Jan 2026 10:07:22 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2026/01/migration-to-zola/</link>
          <guid>https://goneri.lebouder.net/posts/2026/01/migration-to-zola/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2026/01/migration-to-zola/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2026&#x2F;01&#x2F;migration-to-zola&#x2F;zola-logo.svg&quot; alt=&quot;Zola Logo&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;My BlueHost subscription was about to expire, and one of my new year resolutions
is to reduce the number of subscriptions I&#x27;m paying for.
So I&#x27;ve decided to move to a static website, and I&#x27;ve picked &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; a bit randomly.
Mainly because it&#x27;s written in Rust and I didn&#x27;t want to bother with Python or Ruby
for a project like this.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve used Claude Code to quickly clean up the Markdown of my 20 years of posts, and
after a bit of work, I&#x27;ve got this new website.&lt;&#x2F;p&gt;
&lt;p&gt;Everything is currently hosted on GitHub Pages, but I&#x27;m also reconsidering reducing my dependency on GitHub.
This may be a good resolution for 2027 :-).&lt;&#x2F;p&gt;
&lt;p&gt;I also want to use Mastodon and BlueSky for the comments now. I&#x27;ve manually created a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsky.app&#x2F;profile&#x2F;did:plc:wc5wdc4thti2wndpu3f2hgsy&#x2F;post&#x2F;3mbtsucmg3c22&quot;&gt;new entry there for BSky&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.social&#x2F;@goneri&#x2F;115854606838048336&quot;&gt;one for Mastodon&lt;&#x2F;a&gt;, I will
take a look later to see how this can be automated.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Installing CRC on CoreOS</title>
          <pubDate>Thu, 18 Dec 2025 20:06:41 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/12/installing-crc-on-coreos/</link>
          <guid>https://goneri.lebouder.net/posts/2025/12/installing-crc-on-coreos/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/12/installing-crc-on-coreos/">&lt;p&gt;My local home server runs on CoreOS and today I went through the installation of Red Hat Code Ready Container, aka CRC.&lt;&#x2F;p&gt;
&lt;p&gt;Download&lt;&#x2F;p&gt;
&lt;p&gt;Go on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;console.redhat.com&#x2F;openshift&#x2F;create&#x2F;local&quot;&gt;https:&#x2F;&#x2F;console.redhat.com&#x2F;openshift&#x2F;create&#x2F;local&lt;&#x2F;a&gt; and download both:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;the crc binary, which they call OpenShift Local&lt;&#x2F;li&gt;
&lt;li&gt;and the Pull secret&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Preparation&lt;&#x2F;p&gt;
&lt;p&gt;The first thing to do is to allow the installation of local packages&lt;&#x2F;p&gt;
&lt;p&gt;and install libvirt:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo bootc usr-overlay
sudo dnf install -y libvirtd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Add yourself in the libvirt group:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo usermod -a -G libvirt core
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Restart the polkit.service and libvirtd to run the new policies:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl restart polkit.service
sudo systemctl restart libvirtd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Set-up the local CRC installation, first extract the crc archive and copy the crc binary in &lt;code&gt;&#x2F;usr&#x2F;local&#x2F;bin&lt;&#x2F;code&gt;. You can now start the installation:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;crc config set preset openshift
# optional, turn it &amp;quot;true&amp;quot;, to be able to access the host from the VM
crc config set host-network-access true
crc setup

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And finally, deploy the cluster:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;crc start --cpus=12 --memory=40000 -d 100
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At the end of the installation, crc add an extra line to your &lt;code&gt;&#x2F;etc&#x2F;hosts&lt;&#x2F;code&gt;, you probably want to copy it to your local desktop machine in order to access the cluster through your web browser, and set-up a port redirection like this. I use sudo to be able to bind on my local port &lt;code&gt;443&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo ssh -L 443:127.0.0.1:443 -L 6443:127.0.0.1:6443 -i ~&#x2F;.ssh&#x2F;id_ed25519 core@your-coreos-box
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Btrfs disk upgrade done wrong</title>
          <pubDate>Wed, 10 Dec 2025 20:31:57 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/12/replacing-a-disk-for-a-btrfs-filesystem/</link>
          <guid>https://goneri.lebouder.net/posts/2025/12/replacing-a-disk-for-a-btrfs-filesystem/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/12/replacing-a-disk-for-a-btrfs-filesystem/">&lt;p&gt;I&#x27;m in the process to upgrade an existing Btrfs multi-disk filesystem (&lt;code&gt;&#x2F;var&#x2F;mnt&#x2F;datapool&lt;&#x2F;code&gt;) and I made a mistake...&lt;&#x2F;p&gt;</description>
      </item>
      <item>
          <title>Llama.cpp with Vulkan</title>
          <pubDate>Sat, 06 Dec 2025 16:45:56 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/12/llama-cpp-with-vulkan/</link>
          <guid>https://goneri.lebouder.net/posts/2025/12/llama-cpp-with-vulkan/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/12/llama-cpp-with-vulkan/">&lt;p&gt;Running Llama.cpp with the Vulkan backends of my AMD and Intel graphic GPUs ends up being straightfoward and surprisingly fast.&lt;&#x2F;p&gt;
&lt;p&gt;Build you container with:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;podman build -t llama-cpp-vulkan --target server -f .devops&#x2F;vulkan.Dockerfile .
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and run it with:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;podman run -it --rm --security-opt seccomp=unconfined --device &#x2F;dev&#x2F;dri:&#x2F;dev&#x2F;dri --volume ~&#x2F;.cache:&#x2F;root&#x2F;.cache:z -p 8080:8080 localhost&#x2F;llama-cpp-vulkan -hf Qwen&#x2F;Qwen3-Embedding-8B-GGUF --embeddings
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the example above, I reuse my ~&#x2F;.cache directory and I use the model to compute embeddings, thus the &lt;code&gt;--embeddings&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>numpy: AssertionError: CUDA_HOME is not set</title>
          <pubDate>Fri, 07 Nov 2025 23:11:40 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/11/numpy-assertionerror-cuda-home-is-not-set/</link>
          <guid>https://goneri.lebouder.net/posts/2025/11/numpy-assertionerror-cuda-home-is-not-set/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/11/numpy-assertionerror-cuda-home-is-not-set/">&lt;p&gt;To get Numpy to build on RHEL9, you need to install nvcc and export CUDA_HOME, e.g:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo dnf install -y rpm -ql cuda-nvcc-13-0
$ sudo ln -s &#x2F;usr&#x2F;local&#x2F;cuda-13.0 &#x2F;usr&#x2F;local&#x2F;cuda
$ pip install numpy
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Pushing a container image over SSH</title>
          <pubDate>Mon, 20 Oct 2025 18:00:04 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/10/pushing-a-container-image-over-ssh/</link>
          <guid>https://goneri.lebouder.net/posts/2025/10/pushing-a-container-image-over-ssh/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/10/pushing-a-container-image-over-ssh/">&lt;p&gt;I recently faced the situation where my registry was down and after a bit of digging, I ended up with this solution. In this example my image is called &lt;code&gt;quay.io&#x2F;goneri&#x2F;my-image:latest&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;podman image scp quay.io&#x2F;goneri&#x2F;my-image:latest ec2-user@your-host::quay.io&#x2F;goneri&#x2F;my-image:latest
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Allow broken certificate for a specific host with Python&#x27;s requests</title>
          <pubDate>Wed, 17 Sep 2025 21:03:40 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/09/allow-broken-certificate-for-a-specific-host-with-pythons-requests/</link>
          <guid>https://goneri.lebouder.net/posts/2025/09/allow-broken-certificate-for-a-specific-host-with-pythons-requests/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/09/allow-broken-certificate-for-a-specific-host-with-pythons-requests/">&lt;p&gt;After a bit of trial error, this is how you can allow requests to connect to a specific host, despite a broken certificate:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;python&quot;&gt;import requests
import requests.adapters
import ssl
import urllib3
from urllib3.util import create_urllib3_context

class AllowBrokenSSLContextHTTPAdapter(requests.adapters.HTTPAdapter):
    def __init__(self, **kwargs):
        ssl_context = create_urllib3_context()
        ssl_context.check_hostname = False
        ssl_context.verify_mode = ssl.CERT_NONE
        self.ssl_context = ssl_context
        super().__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = urllib3.poolmanager.PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_context=self.ssl_context,
        )

    def send(self, request, **kwargs):
        kwargs[&amp;quot;verify&amp;quot;] = self.ssl_context.check_hostname
        return super().send(request, **kwargs)

session = requests.session()
session.mount(
    &amp;quot;https:&#x2F;&#x2F;wrong.host.badssl.com&amp;quot;,
    AllowBrokenSSLContextHTTPAdapter(),
)
session.get(&amp;quot;https:&#x2F;&#x2F;google.com&amp;quot;)
session.get(&amp;quot;https:&#x2F;&#x2F;wrong.host.badssl.com&amp;quot;)
print(&amp;quot;Can reach https:&#x2F;&#x2F;wrong.host.badssl.com despite the invalid hostname&amp;quot;)
try:
    result = session.get(&amp;quot;https:&#x2F;&#x2F;untrusted-root.badssl.com&#x2F;&amp;quot;)
except requests.exceptions.SSLError:
    print(&amp;quot;fails has expected&amp;quot;)
else:
    print(&amp;quot;Ooops&amp;quot;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>List all pods by age that are not from OpenShift</title>
          <pubDate>Wed, 10 Sep 2025 15:08:51 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/09/list-all-pods-by-age-that-are-not-from-openshift/</link>
          <guid>https://goneri.lebouder.net/posts/2025/09/list-all-pods-by-age-that-are-not-from-openshift/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/09/list-all-pods-by-age-that-are-not-from-openshift/">&lt;p&gt;Get a flat list of all the pods, except those coming from openshift namespaces&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ oc -o json get pods -A --sort-by=.status.startTime |jq &amp;#39;.items[].metadata|select(.namespace | startswith(&amp;quot;openshift&amp;quot;) | not)|pick(.name, .namespace, .creationTimestamp)&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and to find the largest pods by memory&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$oc adm top pods -A --sort-by=memory
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Ollama: apply a Lora on a model</title>
          <pubDate>Wed, 30 Apr 2025 18:46:31 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/04/ollama-apply-a-lora-on-a-model/</link>
          <guid>https://goneri.lebouder.net/posts/2025/04/ollama-apply-a-lora-on-a-model/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/04/ollama-apply-a-lora-on-a-model/">&lt;p&gt;First, I&#x27;ve prepared a Lora with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;axolotl-ai-cloud&#x2F;axolotl&quot;&gt;Axolotl&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;axolotl train examples&#x2F;llama-3&#x2F;lora-1b.yml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;At the end of the process, I&#x27;ve a new directory called &lt;code&gt;outputs&#x2F;lora-out&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I now need to prepare a new model that will be a mix of an Original Llama3 model and this new file called &lt;code&gt;llama3.1-modelfile&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;FROM llama3.2:1b

ADAPTER &#x2F;home&#x2F;ec2-user&#x2F;axolotl&#x2F;outputs&#x2F;lora-out
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, I can prepare my local model with:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ollama create llama3_with_lora -f llama3.1-modelfile
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The operation lasts a couple of seconds and I can now start a new Chat:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ollama run llama3_with_lora
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>VSCode container and OAuth2 Web callback</title>
          <pubDate>Mon, 03 Feb 2025 16:59:14 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2025/02/vscode-container-and-oauth2-webcallback/</link>
          <guid>https://goneri.lebouder.net/posts/2025/02/vscode-container-and-oauth2-webcallback/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2025/02/vscode-container-and-oauth2-webcallback/">&lt;p&gt;I use Fedora Silverblue and my VSCode runs inside a container. I manage the container with the &quot;toolbox&quot; CLI tool. I also, to get the last version of Firefox, I use it&#x27;s upstream Flatpak To be able to get VSCode&#x27;s OAuth2 callback to work properly, I had to do a bit of extra configuration.&lt;&#x2F;p&gt;
&lt;p&gt;You need a .desktop file to overload VSCode&#x27;s default way to open web URL. We don&#x27;t want to rely on the default xdg-open configuration (e.g: xdg-open http:&#x2F;&#x2F;www.google.com) which would otherwise try to open up a a new web browser INSIDE the container.&lt;&#x2F;p&gt;
&lt;p&gt;Prepare the code-url-handler.desktop file, you need to adjust the Exec to prefix the command with the toolbox run call:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;ini&quot;&gt;[Desktop Entry]
Name=Visual Studio Code - URL Handler
Comment=Code Editing. Redefined.
GenericName=Text Editor
Exec=toolbox run --container vscode &#x2F;usr&#x2F;share&#x2F;code&#x2F;code --open-url %U
Icon=vscode
Type=Application
NoDisplay=true
StartupNotify=true
Categories=Utility;TextEditor;Development;IDE;
MimeType=x-scheme-handler&#x2F;vscode;
Keywords=vscode;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The goal here is to be sure we send back the vscode:&#x2F;&#x2F; link to the correct instance of VSCode (within the container!).&lt;&#x2F;p&gt;
&lt;p&gt;To install the .desktop, run these commands in your system (not in a container).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;desktop-file-install --dir=$HOME&#x2F;.local&#x2F;share&#x2F;applications code-url-handler.desktop
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And refresh the local cache:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;update-desktop-database ~&#x2F;.local&#x2F;share&#x2F;applications
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Inside the container we need to also install flatpak-xdg-utils and use it instead of the default &#x2F;usr&#x2F;bin&#x2F;xdg-open. This way your containerize VSCode will be able to open the web page inisde yet another container (the Flatpak app). This is a snippet of my Containerfile of my VSCode container:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;RUN dnf install -y flatpak-xdg-utils
RUN ln -sf &#x2F;usr&#x2F;bin&#x2F;flatpak-xdg-open &#x2F;usr&#x2F;bin&#x2F;xdg-open
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;See: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;vscode-pull-request-github&#x2F;issues&#x2F;3472#issuecomment-1825008268&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;vscode-pull-request-github&#x2F;issues&#x2F;3472#issuecomment-1825008268&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>bsd-cloud-image.org 2nd^w3rd  rewrite</title>
          <pubDate>Mon, 04 Nov 2024 15:28:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2024/11/bsd-cloud-image-org-2ndw3rd-rewrite/</link>
          <guid>https://goneri.lebouder.net/posts/2024/11/bsd-cloud-image-org-2ndw3rd-rewrite/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2024/11/bsd-cloud-image-org-2ndw3rd-rewrite/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&quot;&gt;bsd-cloud-image.org&lt;&#x2F;a&gt; aims to simplify the use of BSD operating systems in a cloud environment. It provides a series of cloud-ready images that can quickly be deployed and tested. The original target was &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.openstack.org&#x2F;&quot;&gt;OpenStack&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;virt-lightning.org&#x2F;&quot;&gt;Virt-Lightning&lt;&#x2F;a&gt;. But the images should work with any &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud-init.io&#x2F;&quot;&gt;Cloud-Init&lt;&#x2F;a&gt; compatible environment.&lt;&#x2F;p&gt;
&lt;p&gt;Yesterday I released a new version of the website based on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.typescriptlang.org&#x2F;&quot;&gt;TypeScript&lt;&#x2F;a&gt; + &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vite.dev&#x2F;&quot;&gt;Vite&lt;&#x2F;a&gt; + &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;vuejs.org&#x2F;&quot;&gt;VueJS&lt;&#x2F;a&gt; and Bootstrap 5. After 5 years, the original static page was due for a rewrite. The definition of the images was lost deep inside a mix of HTML code and Bootstrap class names. It&#x27;s now isolated in a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;bsd-cloud-image.org&#x2F;blob&#x2F;main&#x2F;src&#x2F;images_data.json&quot;&gt;clear JSON file&lt;&#x2F;a&gt;. This will simplify the maintenance in the long run. It should also be easier to add new features. I&#x27;m dreaming about a way to spawn instances directly from the interface.&lt;&#x2F;p&gt;
&lt;p&gt;Fun fact: I had a v2 rewrite &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;bci-v2&quot;&gt;mostly done&lt;&#x2F;a&gt; that I never published. It&#x27;s based on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;elixir-lang.org&#x2F;&quot;&gt;Elixir&lt;&#x2F;a&gt;, and it was super fun to do. It&#x27;s not a static website since it runs on top of the Erlang VM, I&#x27;m afraid the maintenance may be a source of extra complexity and I&#x27;m not sure this is the right strategy considering my limited free time.&lt;&#x2F;p&gt;
&lt;p&gt;I also pushed new FreeBSD and NetBSD images recently. I still need to prepare the NetBSD 10 build.&lt;&#x2F;p&gt;
&lt;p&gt;Enjoy!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2024&#x2F;11&#x2F;bsd-cloud-image-org-2ndw3rd-rewrite&#x2F;image.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2024&#x2F;11&#x2F;bsd-cloud-image-org-2ndw3rd-rewrite&#x2F;image.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>firewalld: add a new service</title>
          <pubDate>Thu, 16 May 2024 18:40:35 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2024/05/firewalld-add-a-new-service/</link>
          <guid>https://goneri.lebouder.net/posts/2024/05/firewalld-add-a-new-service/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2024/05/firewalld-add-a-new-service/">&lt;p&gt;Create a new service entry:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;firewall-cmd --permanent --new-service=ollama
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Associate the right port with new service:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;firewall-cmd --permanent --service=ollama --add-port=11434&#x2F;tcp
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Restart the firewalld, so it&#x27;s aware of the new service:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;firewall-cmd --reload
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Finally, associate the service with the Zone. I don&#x27;t use &lt;code&gt;--permanent&lt;&#x2F;code&gt; here on purpose. This way the association will be lost when I will reboot the machine:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;firewall-cmd --add-service=ollama --zone=nm-shared
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Sharing Internet connection on Fedora 40</title>
          <pubDate>Thu, 16 May 2024 00:30:02 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2024/05/sharing-internet-connection-on-fedora-40/</link>
          <guid>https://goneri.lebouder.net/posts/2024/05/sharing-internet-connection-on-fedora-40/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2024/05/sharing-internet-connection-on-fedora-40/">&lt;p&gt;It&#x27;s surprisingly easy to build a router from a Fedora 40 box. Here eno1 is connected to my cable modem and enp8s0 is connected to my local network.&lt;&#x2F;p&gt;
&lt;p&gt;To NAT the Internet connection:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;nmcli c add type ethernet con-name internet ifname eno1 connection.zone external ipv4.method auto
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And set up the DHCP on the local network, the machine will use the IP 10.42.0.1 IP by default:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;nmcli c add type ethernet con-name lebouder.net ifname enp8s0 connection.zone nm-shared ipv4.method=shared
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Vidéotron Helix Fi 2</title>
          <pubDate>Fri, 15 Dec 2023 03:42:47 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2023/12/videotron-helix-fi-2/</link>
          <guid>https://goneri.lebouder.net/posts/2023/12/videotron-helix-fi-2/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2023/12/videotron-helix-fi-2/">&lt;p&gt;Quick rant.&lt;&#x2F;p&gt;
&lt;p&gt;Vidéotron Helix Fi 2 is the worst modem I have ever seen and the fact the ISP forces customers to use it is embarrassing:&lt;&#x2F;p&gt;
&lt;p&gt;There is no IPv6 despite the fact that it&#x27;s supposed to sort of work on their website. That was the main reason why I switched to Vidéotron. There is no way to do something as basic as bridge mode. Their definition of a &quot;bridge mode&quot; is actually a bloody ugly double NAT. Also you cannot change the DNS and pretty much all the features that you expect from a modern router are just missing. Finally even the Wifi is pretty bad. My 7-year-old router has pretty much the same coverage. What a sad disappointment for a $288 device.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>AWS: How to retrieve a KeyPair private key</title>
          <pubDate>Thu, 14 Sep 2023 12:41:56 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2023/09/aws-how-to-retrieve-a-keypair-private-key/</link>
          <guid>https://goneri.lebouder.net/posts/2023/09/aws-how-to-retrieve-a-keypair-private-key/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2023/09/aws-how-to-retrieve-a-keypair-private-key/">&lt;p&gt;Note for myself, this is how you can download a copy of a KeyPair private key:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;aws --region ca-central-1 ssm get-parameter --name &#x2F;ec2&#x2F;keypair&#x2F;key-015b012fb114efc83 --with-decryption --query Parameter.Value --output text
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Nextcloud photo backups</title>
          <pubDate>Sat, 12 Aug 2023 17:16:55 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2023/08/nextcloud-photos-backups/</link>
          <guid>https://goneri.lebouder.net/posts/2023/08/nextcloud-photos-backups/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2023/08/nextcloud-photos-backups/">&lt;p&gt;I&#x27;ve been doing backups for my family for years now. In the past, I used several different systems including rsync and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;burp.grke.org&#x2F;&quot;&gt;burp&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Recently, I decided to stop hosting my own backup server and move to Nextcloud. I use the Nextcloud&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hetzner.com&#x2F;storage&#x2F;storage-share&quot;&gt; offer from Hetzner&lt;&#x2F;a&gt; and I&#x27;m pretty happy with the result. I appreciate having a solution that just works without having to think about it.&lt;&#x2F;p&gt;
&lt;p&gt;Regarding the client applications. The Nextcloud application on Android works fine but is also not really pleasant to use. I ended up buying the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=dk.tacit.android.foldersync.full&amp;amp;hl=en&amp;amp;gl=US&quot;&gt;FolderSync Pro&lt;&#x2F;a&gt; application for myself. I strongly recommend it even if I would prefer a better free software solution. I use Webdav on Linux to synchronize my files. Both Nautilus and the davfs driver work as expected. MacOS is also able to mount the Webdav shares, this is a much better solution than the Nextcloud application for Mac. However, Photos stores the pictures in some kind of local binary DB and there is no easy way to export them. Photos comes with an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.apple.com&#x2F;en-ca&#x2F;guide&#x2F;photos&#x2F;pht6e157c5f&#x2F;mac&quot;&gt;&quot;Export&quot; feature&lt;&#x2F;a&gt; that is all manual and pathologically slow. But there is a solution! I recently discovered &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;RhetTbull&#x2F;osxphotos&quot;&gt;osxphotos&lt;&#x2F;a&gt; and it&#x27;s an absolute gem.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My GNOME configuration and its extensions</title>
          <pubDate>Sat, 12 Nov 2022 02:40:48 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2022/11/my-gnome-configuration-and-its-extensions/</link>
          <guid>https://goneri.lebouder.net/posts/2022/11/my-gnome-configuration-and-its-extensions/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2022/11/my-gnome-configuration-and-its-extensions/">&lt;p&gt;I&#x27;ve been using a slightly tweaked GNOME 3 for a while now. Before that, I was using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;awesomewm.org&#x2F;&quot;&gt;Awesome Window Manager&lt;&#x2F;a&gt; and I was quite fond of the key bindings. In order to facilitate the transition, I tried to recreate them. The result is pretty good. I can navigate between my 9 different virtual desktops using the Windows (a.k.a. SUPER) key + a number. Windows + F also works; it will turn on fullscreen mode for a given window. Years after the migration to GNOME, I still use the bindings extensively. The following script configures GNOME with my configuration: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;b57a96915ea4a98f81df3bb57a41913e&quot;&gt;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;b57a96915ea4a98f81df3bb57a41913e&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It creates 9 virtual desktops on one single monitor that I can reach using the Super + $number key binding, e.g.: Windows + 6. In addition, it turns off the animations and the annoying alert sound.&lt;&#x2F;p&gt;
&lt;p&gt;I also use a couple of extensions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application volume mixer&lt;&#x2F;strong&gt; to be able to adjust my mic volume level during meetings &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;extensions.gnome.org&#x2F;extension&#x2F;3499&#x2F;application-volume-mixer&#x2F;&quot;&gt;link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Network stats&lt;&#x2F;strong&gt; to get some visibility on the network traffic &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;extensions.gnome.org&#x2F;extension&#x2F;4308&#x2F;network-stats&#x2F;&quot;&gt;link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Sound Output Device Chooser&lt;&#x2F;strong&gt; to be able to switch the sound output between my Bluetooth speaker and my headset. I use it several times every day; it&#x27;s super handy. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;extensions.gnome.org&#x2F;extension&#x2F;906&#x2F;sound-output-device-chooser&#x2F;&quot;&gt;link&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2022&#x2F;11&#x2F;my-gnome-configuration-and-its-extensions&#x2F;image.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2022&#x2F;11&#x2F;my-gnome-configuration-and-its-extensions&#x2F;image.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>BSD-Cloud-Image.org new images</title>
          <pubDate>Fri, 11 Nov 2022 19:35:58 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2022/11/bsd-cloud-image-org-new-images/</link>
          <guid>https://goneri.lebouder.net/posts/2022/11/bsd-cloud-image-org-new-images/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2022/11/bsd-cloud-image-org-new-images/">&lt;p&gt;I just pushed 2 new images on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&quot;&gt;BSD-Cloud-Image.org&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OpenBSD 7.2&lt;&#x2F;li&gt;
&lt;li&gt;DragonFlyBSD 6.2.2&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Elixir: xmerl&#x2F;include&#x2F;xmerl.hrl could not be found</title>
          <pubDate>Sun, 04 Sep 2022 23:51:52 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2022/09/elixir-xmerl-include-xmerl-hrl-could-not-be-found/</link>
          <guid>https://goneri.lebouder.net/posts/2022/09/elixir-xmerl-include-xmerl-hrl-could-not-be-found/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2022/09/elixir-xmerl-include-xmerl-hrl-could-not-be-found/">&lt;p&gt;I recently faced this error when trying to build an Elixir project.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;== Compilation error in file lib&#x2F;swoosh&#x2F;adapters&#x2F;xml&#x2F;helpers.ex ==  
** (ArgumentError) lib file xmerl&#x2F;include&#x2F;xmerl.hrl could not be found  
(elixir 1.13.4) lib&#x2F;record&#x2F;extractor.ex:41: Record.Extractor.from_lib_file&#x2F;1  
(elixir 1.13.4) lib&#x2F;record&#x2F;extractor.ex:18: Record.Extractor.from_or_from_lib_file&#x2F;1  
(elixir 1.13.4) lib&#x2F;record&#x2F;extractor.ex:5: Record.Extractor.extract&#x2F;2  
lib&#x2F;swoosh&#x2F;adapters&#x2F;xml&#x2F;helpers.ex:5: (module)  
(elixir 1.13.4) lib&#x2F;kernel&#x2F;parallel_compiler.ex:346: anonymous fn&#x2F;5 in Kernel.ParallelCompiler.spawn_workers&#x2F;7  
could not compile dependency :swoosh, &amp;quot;mix compile&amp;quot; failed. Errors may have been logged above. You can recompile this dependency with &amp;quot;mix deps.compile swoosh&amp;quot;, update it with &amp;quot;mix deps.update swoosh&amp;quot; or clean it with &amp;quot;mix deps.clean swoosh&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you can the error above on Fedora, you probably need to install the &lt;code&gt;erlang-xmerl&lt;&#x2F;code&gt; package.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Virt-Lightning 2.2.0</title>
          <pubDate>Tue, 23 Aug 2022 22:59:36 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2022/08/virt-lightning-2-2-0/</link>
          <guid>https://goneri.lebouder.net/posts/2022/08/virt-lightning-2-2-0/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2022/08/virt-lightning-2-2-0/">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2022&#x2F;08&#x2F;virt-lightning-2-2-0&#x2F;logo_no_text.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2022&#x2F;08&#x2F;virt-lightning-2-2-0&#x2F;logo_no_text.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Release 2.2.0 of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;virt-lightning&#x2F;2.2.0&#x2F;&quot;&gt;Virt-Lightning&lt;&#x2F;a&gt;, a lightweight CLI for libvirt which can serve as an alternative to Vagrant. It&#x27;s also a stable API that you can use in Python to quickly spawn new VM, like you would do with a Cloud provider.&lt;&#x2F;p&gt;
&lt;p&gt;Most of the new features come from contributors and I&#x27;m pretty happy with this.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Changelog&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Cosmetic documentation changes&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t try to fetch an image that already exists&lt;&#x2F;li&gt;
&lt;li&gt;Add ability to boot old system with no virtio support&lt;&#x2F;li&gt;
&lt;li&gt;Use Libvirt default settings when possible&lt;&#x2F;li&gt;
&lt;li&gt;Use the VNC display by default&lt;&#x2F;li&gt;
&lt;li&gt;Add support for OpenVSwitch (a.k.a OVS )bridge&lt;&#x2F;li&gt;
&lt;li&gt;vl stop: avoid a Python backtrace if the VM doesn&#x27;t exist&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Ansible&#x27;s vmware.vmware_rest collection, Execution Environment and ansible-navigator</title>
          <pubDate>Tue, 19 Oct 2021 19:27:25 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/10/ansibles-vmware-vmware-rest-collection-execution-environment-and-ansible-navigator/</link>
          <guid>https://goneri.lebouder.net/posts/2021/10/ansibles-vmware-vmware-rest-collection-execution-environment-and-ansible-navigator/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/10/ansibles-vmware-vmware-rest-collection-execution-environment-and-ansible-navigator/">&lt;p&gt;Ansible-Navigator is a new terminal base UI for Ansible. It aims to provide an alternative to the different ansible commands that you probably already familiar with. To learn more about Ansible-Navigator, a couple of recent blog posts on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ansible.com&#x2F;blog&#x2F;topic&#x2F;ansible-navigator&quot;&gt;Ansible Blog&lt;&#x2F;a&gt; cover this new tool. The Execution Environment, or just EE, is also a rather recent concept. With a EE Ansible and all its dependencies are shipped as a single container. You don&#x27;t need anymore to care about the Python version, the virtualenv, the collections and Python dependency.&lt;&#x2F;p&gt;
&lt;p&gt;Ansible-Navigator provides an interface that is inspired by ansible-playbook. In this example we will see how we can use the CLI to run a playbook. My pass some credentials through environment variables, we will also see how to expose them properly.&lt;&#x2F;p&gt;
&lt;p&gt;The first thing is to prepare a &lt;code&gt;ansible-navigator.yml&lt;&#x2F;code&gt; file in your project directory.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;yaml&quot;&gt;---
ansible-navigator:
   execution-environment:
     container-engine: podman
     enabled: True
     image: myregister&#x2F;ansible-automation-platform-21-ee-supported-rhel8:2.1.0
     pull-policy: never
     environment-variables:
        pass:
          - VMWARE_VALIDATE_CERTS
          - VMWARE_HOST
          - VMWARE_PASSWORD
          - VMWARE_USER
          - ESXI1_PASSWORD
          - ESXI1_HOSTNAME
          - ESXI1_USERNAME
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;image&lt;&#x2F;code&gt; key point on the container, I use a Fedora and Podman is the default for container. I ensure Navigator use the right engine with the &lt;code&gt;container-engine: podman&lt;&#x2F;code&gt; configuration. I use the &lt;code&gt;environment-variables&lt;&#x2F;code&gt; section to list all the variables that I want to expose in my container. If you want to read about all the other configuration options, just read the documentation at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ansible-navigator.readthedocs.io&#x2F;en&#x2F;latest&#x2F;&quot;&gt;https:&#x2F;&#x2F;ansible-navigator.readthedocs.io&#x2F;en&#x2F;latest&#x2F;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If your playbook depends on some roles, for instance within a &lt;code&gt;roles&lt;&#x2F;code&gt; directory, it&#x27;s important to call &lt;code&gt;ansible-navigator&lt;&#x2F;code&gt; from the root directory of your project. Otherwise, the roles won&#x27;t be reachable from within the container. If your roles are maintained at a different location, you can still expose their directories with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ansible-navigator.readthedocs.io&#x2F;en&#x2F;latest&#x2F;settings&#x2F;?highlight=volume-mounts#the-ansible-navigator-settings-file&quot;&gt;volume-mounts&lt;&#x2F;a&gt; option. This is in my opinion slightly less elegant.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;[goneri@t580 targets]$ ls -lh
total 416K
-rw-r--r--. 1 goneri goneri  469 Oct 19 15:09 ansible-navigator.yml
drwxrwxr-x. 2 goneri goneri    6 Oct 19 15:39 playbooks
drwxrwxr-x. 2 goneri goneri    6 Oct 19 15:39 roles
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, I can just run my playbook with: &lt;code&gt;ansible-navigator run --mode stdout playbooks&#x2F;vcenter_vm_scenario1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Connect to ZooKeeper over TLS&#x2F;SSL</title>
          <pubDate>Fri, 15 Oct 2021 17:39:23 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/10/connect-to-zookeeper-over-tls-ssl/</link>
          <guid>https://goneri.lebouder.net/posts/2021/10/connect-to-zookeeper-over-tls-ssl/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/10/connect-to-zookeeper-over-tls-ssl/">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;10&#x2F;connect-to-zookeeper-over-tls-ssl&#x2F;zk_logo.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;zk_logo.png&quot; height=&quot;209&quot; width=&quot;147&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s surprisingly tricky to connect to a ZooKeeper cluster over TLS&#x2F;SSL using the zkCli.sh command. You&#x27;ve got to wrap the command and pass some extra incantations. Here is the script I use. My certificates are in &#x2F;etc&#x2F;zookeeper&#x2F;ca, so you may need to adjust that to match your local installation.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#!&#x2F;bin&#x2F;bash

ZK_CLIENT_HEAP=&amp;quot;${ZK_CLIENT_HEAP:-256}&amp;quot;
export ZK_CLIENT_SSL=&amp;quot;-Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty -Dzookeeper.ssl.keyStore.location=&#x2F;etc&#x2F;zookeeper&#x2F;ca&#x2F;keystores&#x2F;server.pem -Dzookeeper.ssl.trustStore.location=&#x2F;etc&#x2F;zookeeper&#x2F;ca&#x2F;certs&#x2F;cacert.pem -Dzookeeper.client.secure=true&amp;quot;
export CLIENT_JVMFLAGS=&amp;quot;-Xmx${ZK_CLIENT_HEAP}m $ZK_CLIENT_SSL $CLIENT_JVMFLAGS&amp;quot;
&#x2F;opt&#x2F;zookeeper&#x2F;bin&#x2F;zkCli.sh -server my-host-fqdn:2281
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Zuul cheat sheet</title>
          <pubDate>Tue, 12 Oct 2021 20:57:33 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/10/zuul-cheat-sheet/</link>
          <guid>https://goneri.lebouder.net/posts/2021/10/zuul-cheat-sheet/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/10/zuul-cheat-sheet/">&lt;p&gt;My team at Ansible uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zuul-ci.org&#x2F;&quot;&gt;Zuul CI&lt;&#x2F;a&gt; to develop and release our collections. From time to time, I need to do some basic operations and I&#x27;ve started a cheat sheet. I&#x27;m sharing it since it may be helpful for someone else.&lt;&#x2F;p&gt;
&lt;p&gt;Abort a job:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ zuul dequeue --tenant=ansible --pipeline=release --project=ansible-collections&#x2F;ansible.utils --ref=refs&#x2F;tags&#x2F;2.4.2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Recreate a job. In this case, we manually recreate a job in the release pipeline. This job was initially created by the push of a tag (--newrev).&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ zuul enqueue-ref --tenant=ansible --trigger=github --pipeline=release --project=ansible-collections&#x2F;ansible.utils --ref=refs&#x2F;tags&#x2F;2.4.2 --newrev=6a0372849bec52672a74168b93b0677d2c6471fc
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;List all the ongoing nodepool requests:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ nodepool -s &#x2F;etc&#x2F;nodepool&#x2F;secure.conf request-list
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Kill a periodic job:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ zuul dequeue --tenant=ansible --pipeline=periodic --project=ansible&#x2F;ansible --ref refs&#x2F;heads&#x2F;stable-2.9
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Aborting, target uses selinux but python bindings (libselinux-python) aren&#x27;t installed!</title>
          <pubDate>Wed, 22 Sep 2021 15:19:47 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/09/aborting-target-uses-selinux-but-python-bindings-libselinux-python-arent-installed/</link>
          <guid>https://goneri.lebouder.net/posts/2021/09/aborting-target-uses-selinux-but-python-bindings-libselinux-python-arent-installed/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/09/aborting-target-uses-selinux-but-python-bindings-libselinux-python-arent-installed/">&lt;pre&gt;&lt;code&gt;TASK [helm : Copy test chart] **************************************************
fatal: [localhost]: FAILED! =&amp;gt; {&amp;quot;changed&amp;quot;: false, &amp;quot;checksum&amp;quot;: &amp;quot;8b41aa269bd850134cd95bd27343edf6d4ed2e30&amp;quot;, &amp;quot;msg&amp;quot;: &amp;quot;Aborting, target uses selinux but python bindings (libselinux-python) aren&amp;#39;t installed!&amp;quot;}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Ah, this is one of the most irritating message that you can get when you use Ansible in a venv and SELinux. The problem should not happen anymore since this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible&#x2F;ansible&#x2F;commit&#x2F;4c5ce5a1a9e79a845aff4978cfeb72a0d4ecf7d6&quot;&gt;commit&lt;&#x2F;a&gt; that was first released in Ansible core 2.11.5, thanks David Moreau Simard for the information! If you cannot upgrade, you can continue to read. In this article, we will quickly explain the problem and cover our options.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;copy&lt;&#x2F;code&gt; or &lt;code&gt;selinux&lt;&#x2F;code&gt; are two Ansible modules that depend on some system binary libraries. These binary libraries are linked&#x2F;built using the Python of the system, on RHEL8 it&#x27;s Python3.6. So if you use the Python 3.6 of the system, everything should be all right. You may just need to install &lt;code&gt;python3-selinux&lt;&#x2F;code&gt; if it&#x27;s not already installed.&lt;&#x2F;p&gt;
&lt;p&gt;Things are getting more difficult if you use a virtualenv, and it&#x27;s often a good idea to use a virtualenv. Here are two options:&lt;&#x2F;p&gt;
&lt;p&gt;If the Python3 version of your virtualenv is close enough with the version of the one of the system, you can use the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;selinux&#x2F;&quot;&gt;selinux&lt;&#x2F;a&gt; package from Pypi. When a module will try to interact with the &lt;code&gt;selinux&lt;&#x2F;code&gt; module, this module will pretend to be the right person and will actually redirect the request the Python module from the system. It works well most of the time and pretty much the single way to do SElinux operation from a venv.&lt;&#x2F;p&gt;
&lt;p&gt;If your Python version is too new compared to the system, PyPI&#x27;s selinux will raise an error like this one:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;ImportError: cannot import name &amp;#39;_selinux&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And in this case, you&#x27;ve got this second option. Here we assume that you don&#x27;t really care about SElinux. For instance you use Ansible&#x27;s copy module just to duplicate a file once. In this case, the whole SElinux war machine is not necessary. You can use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;selinux-please-lie-to-me&#x2F;&quot;&gt;selinux-please-lie-to-me&#x2F;&lt;&#x2F;a&gt;, it&#x27;s another Pypi module and it&#x27;s similar to Pypi&#x27;s SElinux module. The main difference is that this time, it will just tell Ansible that SELinux is off on the system and it can bypass it.&lt;&#x2F;p&gt;
&lt;p&gt;Oh! There is yet another option, you can overload the &lt;code&gt;ansible_python_interpreter&lt;&#x2F;code&gt; just for problematical task.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;    - copy:
        src: &#x2F;etc&#x2F;fstab
        dest: &#x2F;tmp&#x2F;fstab
      vars:
        ansible_python_interpreter: &#x2F;usr&#x2F;bin&#x2F;python3
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which one should I use? The &lt;code&gt;ansible_python_interpreter&lt;&#x2F;code&gt; creates a dependency with the system that is often annoying. I prefer to avoid this strategy. Overall it&#x27;s better to use PyPI&#x27;s SELinux because it will preserve the interaction with SELinux, but sometimes, the delta between the version of Python is too important and the system binary module just cannot be loaded. In this case, use &lt;code&gt;selinux-please-lie-to-me&lt;&#x2F;code&gt; as a fallback option. Just remember that this Python module will silently inhibit all the SElinux operations.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ansible Molecule, how to use the local copy of the dependencies</title>
          <pubDate>Wed, 22 Sep 2021 13:28:52 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/09/molecule-for-local-development/</link>
          <guid>https://goneri.lebouder.net/posts/2021/09/molecule-for-local-development/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/09/molecule-for-local-development/">&lt;p&gt;The community.okd collection depends on kubernetes.core. It uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;molecule.readthedocs.io&#x2F;en&#x2F;latest&#x2F;&quot;&gt;Molecule&lt;&#x2F;a&gt; to run the tests. We can call it using either the Makefile and the &lt;code&gt;make molecule&lt;&#x2F;code&gt; command. We can also install molecule manually with pip and run it with &lt;code&gt;molecule test&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;When I work on community.okd, I often need to also adjust the kubernetes.core collection. By default Molecule fetches the dependencies silently from internet. This is done during either the &lt;code&gt;prerun&lt;&#x2F;code&gt; or the &lt;code&gt;dependency&lt;&#x2F;code&gt; steps. The mechanism is handy when you focus on one single collection at a time. But in my case, it&#x27;s a bit annoying. The clean copy of kubernetes.core overwrites my local changes and prevents the testing of my local copy of the dependency.&lt;&#x2F;p&gt;
&lt;p&gt;This is how I ensure Molecule uses my local copy of the collections. I store them in the default location ~&#x2F;.ansible&#x2F;collections&#x2F;ansible_collections.&lt;&#x2F;p&gt;
&lt;p&gt;In molecule&#x2F;default&#x2F;molecule.yml I set the following key to turn off the &lt;code&gt;prerun&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;prerun: false
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and I set the following block in the &lt;code&gt;dependency:&lt;&#x2F;code&gt; section:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt; dependency:
   name: galaxy
   enabled: False
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This will turn off the dependency resolver. Molecule won&#x27;t call galaxy anymore to fetch the &lt;code&gt;roles&lt;&#x2F;code&gt; and the &lt;code&gt;collections&lt;&#x2F;code&gt; defined in the galaxy.yml.&lt;&#x2F;p&gt;
&lt;p&gt;You&#x27;re done; as a bonus, the startup of &lt;code&gt;molecule&lt;&#x2F;code&gt; should be slightly faster!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Extract data from an Android phone</title>
          <pubDate>Sun, 11 Jul 2021 10:29:24 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/07/extract-data-from-an-android-phone/</link>
          <guid>https://goneri.lebouder.net/posts/2021/07/extract-data-from-an-android-phone/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/07/extract-data-from-an-android-phone/">&lt;p&gt;So, I&#x27;ve got an old phone with 35GB of pictures that I want to save. So far, I tried NextCloud sync, scp copy, GIO&#x2F;MTP file. For all of those, it&#x27;s a 12+ hour operation. And the real solution is to enable the developer mode on the phone and go straight to &lt;code&gt;adb&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ adb pull &#x2F;sdcard&#x2F;DCIM
&#x2F;sdcard&#x2F;DCIM&#x2F;: 5825 files pulled. 31.9 MB&#x2F;s (37517869453 bytes in 1122.166s)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Performance: expanduser with pathlib or os.path</title>
          <pubDate>Wed, 23 Jun 2021 18:28:19 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/06/performance-expanduser-with-pathlib-or-os-path/</link>
          <guid>https://goneri.lebouder.net/posts/2021/06/performance-expanduser-with-pathlib-or-os-path/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/06/performance-expanduser-with-pathlib-or-os-path/">&lt;p&gt;Python 3 provides a new fancy library to manage pretty much all the path-related operations. This is a really welcome improvement since before that we had to use a long list of unrelated modules.&lt;&#x2F;p&gt;
&lt;p&gt;I recently had to choose between Pathlib and os.path to expand a string in the ~&#x2F;path format to the absolute path. Since performance was important, I took the time to benchmark the two options:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#!&#x2F;usr&#x2F;bin&#x2F;env python3

import timeit

setup = &amp;#39;&amp;#39;&amp;#39;
from pathlib import PosixPath
&amp;#39;&amp;#39;&amp;#39;
with_pathlib = timeit.timeit(&amp;quot;abs_remote_tmp = str(PosixPath(&amp;#39;~&#x2F;.ansible&#x2F;tmp&amp;#39;).expanduser())&amp;quot;, setup=setup)

setup = &amp;#39;&amp;#39;&amp;#39;
from os.path import expanduser
&amp;#39;&amp;#39;&amp;#39;

with_os_path = timeit.timeit(&amp;quot;abs_remote_tmp = expanduser(&amp;#39;~&#x2F;.ansible&#x2F;tmp&amp;#39;)&amp;quot;, setup=setup)

print(f&amp;quot;with pathlib: {with_pathlib}\nwith os.path: {with_os_path}&amp;quot;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;os.path is about 4 times faster for this very specific case. The fact that we need to instantiate a PosixPath object has an impact. Also, once again we observe a nice performance boost with Python 3.8 onwards.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;06&#x2F;performance-expanduser-with-pathlib-or-os-path&#x2F;performance2.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;performance2.png&quot; height=&quot;340&quot; width=&quot;605&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ansible collections and venv</title>
          <pubDate>Wed, 02 Jun 2021 17:46:10 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/06/ansible-collections-and-venv/</link>
          <guid>https://goneri.lebouder.net/posts/2021/06/ansible-collections-and-venv/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/06/ansible-collections-and-venv/">&lt;p&gt;I work on a large number of collections and in order to test them properly, I have to switch between the Python versions and the associated PyPI dependencies. Nothing special here, this is pretty much the life of all of us who work on the Ansible collections.&lt;&#x2F;p&gt;
&lt;p&gt;Initially, I was maintaining a set of clean Python virtual environments. Basically, one per version of Python. And I was juggling between them. Sadly, it&#x27;s easy to lose track of what&#x27;s going on. Every time I was switching to a different collection, I had to pull a new set of dependencies and the order was never the same.&lt;&#x2F;p&gt;
&lt;p&gt;I ended up frustrated by the wasted time spent looking at the &lt;code&gt;pip freeze&lt;&#x2F;code&gt; output to understand some oddity. It&#x27;s so easy to mess up the whole cathedral. A good example is that I frequently use &lt;code&gt;pip install -e git&#x2F;something&lt;&#x2F;code&gt; to install a local copy of a library. And as a result, any change there can potentially nuke the fragile little creature.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;06&#x2F;ansible-collections-and-venv&#x2F;800px-incendie_de_la_fleche_en_1822.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;06&#x2F;ansible-collections-and-venv&#x2F;800px-incendie_de_la_fleche_en_1822.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So now, I use another approach. I&#x27;ve got a script that spawns a virtual environment on the fly, pulls the right dependencies and initializes the shell. It may sound like a trivial thing, but I actually use it several times every day and I don&#x27;t call &lt;code&gt;pip freeze&lt;&#x2F;code&gt; that much.&lt;&#x2F;p&gt;
&lt;p&gt;For instance, if I need to work with Ansible 2.10 and Python 3.10, I just need to do:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ cd .ansible&#x2F;collections&#x2F;ansible_collections&#x2F;vmware&#x2F;vmware_rest
$ source ~&#x2F;bin&#x2F;ansible-venv.fish 3.10 stable-2.10
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;and I&#x27;m ready to run &lt;code&gt;ansible-playbook&lt;&#x2F;code&gt; or &lt;code&gt;ansible-test&lt;&#x2F;code&gt; in my clean environment. And when I want to reinitialize the venv, I just have to remove the venv directory.&lt;&#x2F;p&gt;
&lt;p&gt;The script is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;f7f3e371ad020c8651cb7af74d6b6aba&quot;&gt;here&lt;&#x2F;a&gt; and depends on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fishshell.com&#x2F;&quot;&gt;FishShell&lt;&#x2F;a&gt;, my favorite shell.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Update on BSD Cloud Image</title>
          <pubDate>Mon, 17 May 2021 01:05:27 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/05/update-on-bsd-cloud-image/</link>
          <guid>https://goneri.lebouder.net/posts/2021/05/update-on-bsd-cloud-image/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/05/update-on-bsd-cloud-image/">&lt;p&gt;I&#x27;ve pushed some new images on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;OpenBSD 6.9, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;pcib&#x2F;commit&#x2F;7368ea62c2b117df7ee950d6297ee190b372e9a4&quot;&gt;bsd.rd is now a compressed file&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;FreeBSD 13.0: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;freebsd-cloud-images&#x2F;commit&#x2F;7e811070124295b787cc79b7c7a8283a383ff56f&quot;&gt;boot1.efifat does not exist anymore&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;DragonFly BSD 6.0.0, I&#x27;ve refreshed my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;canonical&#x2F;cloud-init&#x2F;pull&#x2F;904&quot;&gt;Cloud-Init PR&lt;&#x2F;a&gt;. Hopefully this time I will manage to get it merged.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These images also include a recent fix &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;canonical&#x2F;cloud-init&#x2F;commit&#x2F;6fe1983777663a1a1136fd73dc50244f2d030be8&quot;&gt;for non-standard MTU values&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>0ad, Firewall and Fedora33</title>
          <pubDate>Sun, 21 Feb 2021 02:19:17 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/02/0ad-firewall-and-fedora33/</link>
          <guid>https://goneri.lebouder.net/posts/2021/02/0ad-firewall-and-fedora33/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/02/0ad-firewall-and-fedora33/">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;02&#x2F;0ad-firewall-and-fedora33&#x2F;0ad.jpg&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;02&#x2F;0ad-firewall-and-fedora33&#x2F;0ad.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;By default, the firewall will prevent connection to your &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;play0ad.com&#x2F;&quot;&gt;0ad&lt;&#x2F;a&gt; server. To adjust that, you need to open up the port 20595 (UDP). This three lines create a Firewalld service called 0ad, attach it to the default zone and reload the firewall:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo firewall-cmd --permanent --new-service=0ad --set-description=&amp;quot;0ad, A free, open-source game of ancient warfare&amp;quot; --add-port=20595&#x2F;udp
$ sudo firewall-cmd --zone=FedoraWorkstation --add-service=0ad --permanent
$ sudo firewall-cmd --reload
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>eGPU, Wayland, Gnome3 and Fedora</title>
          <pubDate>Fri, 12 Feb 2021 21:10:19 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/02/egpu-wayland-and-fedora-33/</link>
          <guid>https://goneri.lebouder.net/posts/2021/02/egpu-wayland-and-fedora-33/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/02/egpu-wayland-and-fedora-33/">&lt;p&gt;I&#x27;ve just got a Razer Core X that I use with a Radeon graphics card. By default Wayland, well Mutter actually, continues to use the Intel card of my T580.&lt;&#x2F;p&gt;
&lt;p&gt;To force it to use the second card, I had to add a udev rule and reboot. And that&#x27;s all!&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ cat &#x2F;etc&#x2F;udev&#x2F;rules.d&#x2F;61-mutter-primary-gpu.rules
ENV{DEVNAME}==&amp;quot;&#x2F;dev&#x2F;dri&#x2F;card1&amp;quot;, TAG+=&amp;quot;mutter-device-preferred-primary&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;note: You need Gnome 3.38.2 for this to work properly. See: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;mutter&#x2F;-&#x2F;merge_requests&#x2F;1562&quot;&gt;https:&#x2F;&#x2F;gitlab.gnome.org&#x2F;GNOME&#x2F;mutter&#x2F;-&#x2F;merge_requests&#x2F;1562&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;update: the post was initially written for Fedora 33, but the fix also works great with Fedora 34.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How to waste a Friday...</title>
          <pubDate>Sun, 24 Jan 2021 00:14:24 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/01/376-2/</link>
          <guid>https://goneri.lebouder.net/posts/2021/01/376-2/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/01/376-2/">&lt;p&gt;Yesterday morning I got frustrated by a really slow download speed of some files. What should have taken seconds with my 400 Mb&#x2F;s connection actually took more than 16 minutes. In addition, I was able to reproduce the problem on my router.&lt;&#x2F;p&gt;
&lt;p&gt;Here, the curl statistics show a 26:52 minute download at 415kb&#x2F;s:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -o &#x2F;dev&#x2F;null https:&#x2F;&#x2F;s3.us-east-2.amazonaws.com&#x2F;zuul-images&#x2F;fedora-open-vm-tools-livecd.iso% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 627M 0 2684k 0 0 398k 0 0:26:52 0:00:06 0:26:46 415k^C
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Just to be sure, I retried with a lower MTU. The issue remained. Two friends in Montréal also confirmed everything worked well for them.&lt;&#x2F;p&gt;
&lt;p&gt;My laptop uses a wired connection that I&#x27;ve been using for years now. A large part of the population works from home and the Internet is under constant pressure. So I suspected an ISP bandwidth limitation to preserve the Quality of Service. I contacted them and ... complained... a lot.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;01&#x2F;376-2&#x2F;teksavvy1.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2021&#x2F;01&#x2F;376-2&#x2F;teksavvy1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At some point, the technician managed to get my attention and asked me to connect the modem directly to my laptop.&lt;&#x2F;p&gt;
&lt;p&gt;This is an obviously pointless request since the downloads are also slow from the router. But well, if I want them to act, I also need to be cooperative. I gave it a try and... I immediately felt embarrassed. It was damn fast! The download speed was actually even above the 400 Mb&#x2F;s ceiling. WTF.&lt;&#x2F;p&gt;
&lt;p&gt;So I started to reconsider my whole life in a deep introspection. How can this be real? My router runs OpenBSD 6.7 with an absolutely basic pf configuration. Its hardware is decent (Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz). The router is connected to the modem with a very common Realtek RTL8125 and the LAN is connected to an Intel I350. I can download large files between my laptop and the router at full speed.&lt;&#x2F;p&gt;
&lt;p&gt;All this ruled out my laptop, the ethernet cable, and the router&#x27;s I350. The last potential culprit was the Realtek NIC. I replaced it with another Intel I350 and retried. Same problem. The downloads were still slow on my laptop and the router. The Realtek NIC was innocent.&lt;&#x2F;p&gt;
&lt;p&gt;So I started thinking. Why is the rest of the family not really affected by the poor performance of the Internet connection? And so, I tried to download the same file from another computer. And it was fast... Damn, what&#x27;s going on? I switched some ports of the switch just to be sure. The problem was now between my laptop and the ethernet cable.&lt;&#x2F;p&gt;
&lt;p&gt;My laptop uses a bonding of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fedoramagazine.org&#x2F;bond-wifi-and-ethernet-for-easier-networking-mobility&#x2F;&quot;&gt;WiFi and the wired connection&lt;&#x2F;a&gt;. This gives me the ability to move around with the laptop without losing all my open connections. For instance, I can remove my ethernet cable in the middle of a meeting and the laptop will use the WiFi seamlessly. But well, I digress. I removed this special configuration. And... the problem remained.&lt;&#x2F;p&gt;
&lt;p&gt;But during this last check, I also saw a large number of RX errors associated with the laptop NIC. Interesting; let me try another NIC. I plugged in a USB 3.0 Realtek RTL8156 NIC and this time... it worked.&lt;&#x2F;p&gt;
&lt;p&gt;The ethernet cable is a CAT6 cable and is not that long (20m), but it seemed like the NIC (Intel I219-LM) of my T580 was a bit picky with the quality of the signal. It could also be a problem with the e1000e driver of the new 5.10 kernel. The cable was good, I had just tested it. Anyway, I put a switch just before my laptop NIC and everything works great now.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m still not sure why my downloads are still slow on OpenBSD. But this is an adventure for another day. The slow downloads were all with HTTPS sites (S3 and a Caddy website), the DF flag was on (TCP Don&#x27;t Fragment) which exacerbated the impact of the transmission errors.&lt;&#x2F;p&gt;
&lt;p&gt;I found the whole situation to be interesting. It&#x27;s a series of wrong assumptions and the solution is really far from what I would have imagined.&lt;&#x2F;p&gt;
&lt;p&gt;Also, thank you Teksavvy for your great support.&lt;&#x2F;p&gt;
&lt;p&gt;Update: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.snellman.net&#x2F;blog&#x2F;archive&#x2F;2017-07-20-s3-mystery&#x2F;&quot;&gt;this&lt;&#x2F;a&gt; partially explains the OpenBSD S3 download problem.&lt;&#x2F;p&gt;
&lt;p&gt;Update 2: I&#x27;m now running Linux 5.10.11 and... I don&#x27;t see any RX errors anymore! The S3 download is just as fast as it should be. So this was indeed a problem with the e1000e driver.&lt;&#x2F;p&gt;
&lt;p&gt;Update 3: The problem is back, I&#x27;m not sure if it&#x27;s a hardware limitation of the NIC itself. I now use the Realtek NIC all the time.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My Github workflow</title>
          <pubDate>Fri, 08 Jan 2021 14:47:12 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2021/01/my-github-workflow/</link>
          <guid>https://goneri.lebouder.net/posts/2021/01/my-github-workflow/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2021/01/my-github-workflow/">&lt;p&gt;The Ansible community uses Github to develop ansible-core and most of the Ansible Collections. The only exception I know is the Openstack&#x27;s ansible-collection-openstack which uses a Gerrit (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;review.opendev.org&#x2F;#&#x2F;q&#x2F;project:openstack&#x2F;ansible-collections-openstack&quot;&gt;ansible-collections-openstack&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;So, as an Ansible developer, my normal day-to-day activities involve a lot of GitHub interactions. I review Pull Requests (PRs) and prepare new PRs all the time.&lt;&#x2F;p&gt;
&lt;p&gt;Before joining Ansible, I was working with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gerritcodereview.com&#x2F;&quot;&gt;Gerrit&lt;&#x2F;a&gt; which is a nice alternative solution to collaborate on a stream of patches.&lt;&#x2F;p&gt;
&lt;p&gt;In Gerrit, each patch from a branch is a PR. Every time we update a patch, its sha2 changes, and so Gerrit tracks them with a dedicated ID called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gerrit-review.googlesource.com&#x2F;Documentation&#x2F;user-changeid.html&quot;&gt;Change-id&lt;&#x2F;a&gt;. It looks like an extra line in the body of the commit message. e.g:&lt;&#x2F;p&gt;
&lt;p&gt;Change-Id: Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b&lt;&#x2F;p&gt;
&lt;p&gt;Gerrit provides a tool called git-review to pull and push the patches. When a contributor pushes a series of patches, each patch is correctly tracked by Gerrit and updates the right existing PR. This allows the contributor to reorganize the patches, change the order of series or import a patch from another branch.&lt;&#x2F;p&gt;
&lt;p&gt;With GitHub, a branch is a PR and most of the time, the projects prefer to use the branch to trace the iteration of the PR:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;my fancy feature&lt;&#x2F;li&gt;
&lt;li&gt;fix: correct the test-suite&lt;&#x2F;li&gt;
&lt;li&gt;fix: fix the fix&lt;&#x2F;li&gt;
&lt;li&gt;fix: typo in previous commit&lt;&#x2F;li&gt;
&lt;li&gt;bla&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;And this is fine, because most of the time, the branch will ultimately be squashed (one branch -&amp;gt; one Git commit) during the final merge.&lt;&#x2F;p&gt;
&lt;p&gt;GitHub workflow is certainly more friendly for newcomers but it tends to be a source of complexity when you want to work on several PRs at the same time. For instance, I work on a new feature, but I also want to cherry-pick an experimental commit from a contributor. In this case I must remove this commit before I push my branch back on GitHub, or the extra commit will end-up in my feature branch.&lt;&#x2F;p&gt;
&lt;p&gt;Another example, if I&#x27;m working on a feature branch and find an issue with something unrelated, I need to switch to another branch to commit my fix and push it. This is cumbersome and often people just prefer to merge the fix in their feature branch which leads to confusion and questions during the code review.&lt;&#x2F;p&gt;
&lt;p&gt;To simplify, Gerrit allows better code modularity but also implies a better understanding of Git which is annoying when we try to attract new contributors. This is the reason why we use the current workflow.&lt;&#x2F;p&gt;
&lt;p&gt;To address the problem I wrote a script called push-patch (https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;push-patch). I use it to push just my commits. For instance, I work on this branch:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1: doc: explain how to do something&lt;&#x2F;li&gt;
&lt;li&gt;2: typo: adjust a few details&lt;&#x2F;li&gt;
&lt;li&gt;3: a workaround for issue #19 that should not be merged&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The first two commits are not directly related to the feature I&#x27;m implementing. And I would like to submit them immediately.&lt;&#x2F;p&gt;
&lt;p&gt;push-patch will allow me to only push the change 1 and 2 in two dedicated PR. Both branches will be based on main and can be merged independently.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ push-patch 1
$ push-patch 2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now, and that&#x27;s the cool part &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;getemoji.com&#x2F;&quot;&gt;&lt;strong&gt;😋&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt;! Let&#x27;s imagine I want to push another revision of my first patch, I can use &quot;git rebase -i&quot; to adjust this commit and use push-patch again to use the updated patch.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;$ vim foo
$ git add foo
$ git rebase --continue
$ .&#x2F;push-patch 1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Internally push-patch uses git-notes to trace the remote branch of the patch. The Public-Branch field traces the name of the branch in my remote clone of the project and Pr-Url is the URL of the PR in the upstream project. e.g:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;commit 1198db8807ebf9f4099598bcd41df25d465cbcae (HEAD -&amp;gt; main)Author: Gonéri Le Bouder &amp;lt;goneri@lebouder.net&amp;gt;Date:   Thu Jan 7 11:31:41 2021 -0500   elb_application_lb: enable the functional test       Remove the `unsupported` aliases for the `elb_application_lb` test.       Use HTTP instead of HTTPS to avoid the dependency on   `iam:ListServerCertificates` and the other Certificate related operations.Notes:   Public-Branch: elb_application_lb-enable-the-functional-test_24328       PR-Url: https:&#x2F;&#x2F;github.com&#x2F;ansible-collections&#x2F;community.aws&#x2F;pull&#x2F;348
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This means that even if the patch content evolves, push-patch will still be able to continue to update the right PR.&lt;&#x2F;p&gt;
&lt;p&gt;In a nutshell, for each patch it will:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;clone the project and switch on the main branch&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;read the patch notes&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;if a branch name already exists it will use it, otherwise it will create a new one&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;switch to the branch&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;cherry-pick the patch&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;push the branch&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;push-patch expects just the sha2 of the commit to push. It also accepts a list of sha2. This is the reason why I often type thing like that:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;push-patch&lt;&#x2F;strong&gt; $(&lt;strong&gt;git&lt;&#x2F;strong&gt; log -2 --pretty=tformat:%H)&lt;&#x2F;p&gt;
&lt;p&gt;The command passes to push-patch the SHA2 of the two last commits. It will push them in the two associated branches upstream. And at the end, I can use &lt;code&gt;git log&lt;&#x2F;code&gt;, or better &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jonas&#x2F;tig&quot;&gt;&lt;code&gt;tig&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, to get the URL of the Github review.&lt;&#x2F;p&gt;
&lt;p&gt;Right now, the command is a shell script and depends on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;github&#x2F;hub&quot;&gt;hub&lt;&#x2F;a&gt; command. I would like to rewrite it with a better programming language.&lt;&#x2F;p&gt;
&lt;p&gt;What about you? Do you also use some special tools to handle your PR?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ansible: How we prepare the vSphere instances of the VMware CI</title>
          <pubDate>Mon, 14 Dec 2020 19:22:08 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/12/ansible-how-we-prepare-the-vsphere-instance-for-the-vmware-ci/</link>
          <guid>https://goneri.lebouder.net/posts/2020/12/ansible-how-we-prepare-the-vsphere-instance-for-the-vmware-ci/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/12/ansible-how-we-prepare-the-vsphere-instance-for-the-vmware-ci/">&lt;p&gt;As briefly explained in &lt;a href=&quot;&#x2F;posts&#x2F;2020&#x2F;08&#x2F;vmware-ci-of-ansible-modules-a-retrospective&#x2F;&quot;&gt;CI of the Ansible modules for VMware: a retrospective&lt;&#x2F;a&gt;, the Ansible CI uses OpenStack to spawn ephemeral vSphere labs. Our CI tests are run against them.&lt;&#x2F;p&gt;
&lt;p&gt;A full vSphere deployment is a long process that requires quite a lot of resources. In addition to that, vSphere is rather picky regarding its execution environment.&lt;&#x2F;p&gt;
&lt;p&gt;The CI of the VMware modules for Ansible runs on OpenStack. Our OpenStack providers use KVM-based hypervisors. They expect images in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Qcow&quot;&gt;qcow2 format&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In this blog post, we will explain how we prepare a cloud image of vSphere (also called a golden image).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;12&#x2F;ansible-how-we-prepare-the-vsphere-instance-for-the-vmware-ci&#x2F;image.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;12&#x2F;ansible-how-we-prepare-the-vsphere-instance-for-the-vmware-ci&#x2F;image.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;a full lab running on libvirt&lt;&#x2F;p&gt;
&lt;h2 id=&quot;first-get-a-large-esxi-instance&quot;&gt;First, get a large ESXi instance&lt;&#x2F;h2&gt;
&lt;p&gt;The vSphere (VCSA) installation process depends on an ESXi. In our case, we use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;esxi-cloud-images&quot;&gt;a script&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;virt-lightning.org&#x2F;&quot;&gt;Virt-Lightning&lt;&#x2F;a&gt; to prepare and run an ESXi image on Libvirt. But you can use your own ESXi node as long as it meets the following minimal constraints:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;12GB of memory&lt;&#x2F;li&gt;
&lt;li&gt;50GB of disk space&lt;&#x2F;li&gt;
&lt;li&gt;2 vCPUs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;deploy-the-vsphere-vm-vcsa&quot;&gt;Deploy the vSphere VM (VCSA)&lt;&#x2F;h2&gt;
&lt;p&gt;For this, I use my own role called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;ansible-role-vcenter-instance&quot;&gt;goneri.ansible-role-vcenter-instance&lt;&#x2F;a&gt;. It delegates the deployment to the &lt;code&gt;vcsa-deploy&lt;&#x2F;code&gt; command. As a result, you don&#x27;t need any human interaction during the full process. This is handy if you want to deploy your vSphere in a CI environment.&lt;&#x2F;p&gt;
&lt;p&gt;At the end of the process, you&#x27;ve got a large VM running on your ESXi node.&lt;&#x2F;p&gt;
&lt;p&gt;In my case, all these steps are handled by the following playbook: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&#x2F;blob&#x2F;master&#x2F;install_vcsa.yml&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&#x2F;blob&#x2F;master&#x2F;install_vcsa.yml&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tune-up-the-instance&quot;&gt;Tune-up the instance&lt;&#x2F;h2&gt;
&lt;p&gt;Before you shut down the freshly created VM, you would like to make some adjustments.
I use the following playbook for this: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&#x2F;blob&#x2F;master&#x2F;prepare_vm.yml&quot;&gt;prepare_vm.yml&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;During this step, I ensure that:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud-init.io&#x2F;&quot;&gt;Cloud-Init&lt;&#x2F;a&gt; is installed,&lt;&#x2F;li&gt;
&lt;li&gt;the root account is enabled with a real shell,&lt;&#x2F;li&gt;
&lt;li&gt;the virtio drivers are available&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Cloud-Init is the de-facto tool that handles all the post-configuration tasks that we can expect from a Cloud image: inject the user SSH key, resize the filesystem, create a user account, etc.&lt;&#x2F;p&gt;
&lt;p&gt;By default, the vSphere VCSA comes with many disks, which is a problem in a cloud environment where an instance is associated with a single disk image.
So I also move the content of the different partitions to the root filesystem and adjust the &#x2F;etc&#x2F;fstab to remove all the references to the other disks. This way I will be able to maintain only one qcow2 image.&lt;&#x2F;p&gt;
&lt;p&gt;All these steps are handled by the following playbook: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&#x2F;blob&#x2F;master&#x2F;prepare_vm.yml&quot;&gt;prepare_vm.yml&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;prepare-the-final-qcow2-image&quot;&gt;Prepare the final Qcow2 image&lt;&#x2F;h2&gt;
&lt;p&gt;At this stage, the VM is still running, so I shut it down.
Once this is done, I extract the raw image of the disk using the curl command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;curl -v -k --user &amp;#39;root:!234AaAa56&amp;#39; -o vCenterServerAppliance.raw &amp;#39;https:&#x2F;&#x2F;192.168.123.5&#x2F;folder&#x2F;vCenter-Server-Appliance&#x2F;vCenter-Server-Appliance-flat.vmdk?dcPath=ha%252ddatacenter&amp;amp;dsName=l
ocal&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root:!234AaAa56&lt;&#x2F;code&gt; is my login and password&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;vCenterServerAppliance.raw&lt;&#x2F;code&gt; is the name of the local file&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;192.168.123.5&lt;&#x2F;code&gt; is the IP address of my ESXi&lt;&#x2F;li&gt;
&lt;li&gt;vCenter-Server-Appliance is the name of the vSphere instance. &lt;code&gt;vCenter-Server-Appliance-flat.vmdk&lt;&#x2F;code&gt; is the associated raw disk&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The local .raw file is large (50GB), so ensure you&#x27;ve got enough free space.&lt;&#x2F;p&gt;
&lt;p&gt;You can finally convert the raw file to a qcow2 file. You can use Qemu&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.qemu.org&#x2F;docs&#x2F;master&#x2F;interop&#x2F;qemu-img.html&quot;&gt;qemu-img&lt;&#x2F;a&gt; for that, it will work fine but the image will be monstrously large. I instead use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libguestfs.org&#x2F;virt-sparsify.1.html&quot;&gt;virt-sparsify&lt;&#x2F;a&gt; from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;libguestfs.org&quot;&gt;libGuestFS&lt;&#x2F;a&gt; project. This command will reduce the size of the image to the bare minimum.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;virt-sparsify --tmp tmp --compress --convert qcow2 vCenterServerAppliance.raw vSphere.qcow2
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;You can upload the image in your OpenStack project with the following command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;openstack image create --disk-format qcow2 --file vSphere.qcow2 --property hw_qemu_guest_agent=no vSphere
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If your OpenStack provider uses Ceph, you will probably want to reconvert the image to a flat raw file before the upload. With vSphere 6.7U3 and before, you need to force the use of a e1000 NIC. For that, add &lt;code&gt;--property hw_vif_model=e1000&lt;&#x2F;code&gt; to the command above.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve just done the whole process with vSphere 7.0.0U1 in 1h30 (Lenovo T580 laptop). I use the &lt;code&gt;.&#x2F;run.sh&lt;&#x2F;code&gt; script from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&lt;&#x2F;a&gt;, which automates everything.&lt;&#x2F;p&gt;
&lt;p&gt;The final result is certainly not supported by VMware, but we&#x27;ve already run hundreds of successful CI jobs with this kind of vSphere instances. The CI prepares a fresh CI lab in around 10 minutes.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ansible and k8s: How to get the K8S_AUTH_API_KEY value?</title>
          <pubDate>Mon, 07 Dec 2020 21:37:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/12/ansible-and-k8s-how-to-get-the-k8s-auth-api-key-value/</link>
          <guid>https://goneri.lebouder.net/posts/2020/12/ansible-and-k8s-how-to-get-the-k8s-auth-api-key-value/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/12/ansible-and-k8s-how-to-get-the-k8s-auth-api-key-value/">&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible-collections&#x2F;community.kubernetes&quot;&gt;community.kubernetes &lt;&#x2F;a&gt;collection accepts an &lt;code&gt;api_key&lt;&#x2F;code&gt; parameter that may sounds a bit confusing. It&#x27;s actually the value of the token of a serviceaccount. It&#x27;s actually an OAuth 2.0 (Bearer) token, it&#x27;s associated with a user and a secret key. It&#x27;s rather similar to what we can do with a login and a password.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;12&#x2F;ansible-and-k8s-how-to-get-the-k8s-auth-api-key-value&#x2F;luis.jpg&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;luis.jpg&quot; height=&quot;68&quot; width=&quot;68&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In this example, we want to run our playbook as the k8sadmin user. We need to find the token associated with the user. The are actually looks for the a secret. You can list them this way:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;[root@kind-vm ~]# kubectl -n kube-system get secret
NAME                                             TYPE                                  DATA   AGE
(...)
foobar                                           Opaque                                0      5h3m
foobar-token-w8lmt                               kubernetes.io&#x2F;service-account-token   3      5h15m
foobar2-token-hpd6f                              kubernetes.io&#x2F;service-account-token   3      5h9m
generic-garbage-collector-token-l7hvk            kubernetes.io&#x2F;service-account-token   3      25h
horizontal-pod-autoscaler-token-sssg5            kubernetes.io&#x2F;service-account-token   3      25h
job-controller-token-dnfds                       kubernetes.io&#x2F;service-account-token   3      25h
k8sadmin-token-bklpd                             kubernetes.io&#x2F;service-account-token   3      5h40m
(...)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The use the&lt;code&gt; -n&lt;&#x2F;code&gt; parameter to specific the &lt;code&gt;kube-system&lt;&#x2F;code&gt; namespace. Our system account is in the list, it&#x27;s k8sadmin-token-bklpd. We can see the content of the token with this command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;[root@kind-vm ~]# kubectl -n kube-system describe secret k8sadmin-token-bklpd
Name:         k8sadmin-token-bklpd
Namespace:    kube-system
Labels:       &amp;lt;none&amp;gt;
Annotations:  kubernetes.io&#x2F;service-account.name: k8sadmin
             kubernetes.io&#x2F;service-account.uid: 412bf773-ca8e-4afa-a778-dac0f11b7807

Type:  kubernetes.io&#x2F;service-account-token

Data
====
namespace:  11 bytes
token:      eyJhbGciO(...)2A
ca.crt:     1066 bytes

Here, you&amp;#39;re done. The token is in the command output. You need now to pass its content to Ansible. Just keep in mind the token needs to remain secret. So it&amp;#39;s a good idea to encrypt it with Ansible Vault.
You can use the K8S_AUTH_API_KEY environment variable to pass the token to the k8s_* modules:
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;$ K8S_AUTH_API_KEY=eyJhbGciO(...)2A ansible-playbook my_playbook.yaml&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ansible: Performance Impact of the Python version</title>
          <pubDate>Thu, 26 Nov 2020 20:01:54 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/11/ansible-performance-impact-of-the-python-version/</link>
          <guid>https://goneri.lebouder.net/posts/2020/11/ansible-performance-impact-of-the-python-version/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/11/ansible-performance-impact-of-the-python-version/">&lt;p&gt;Until recently, I was not really paying attention to the version of Python I was using with Ansible, as long as it was Python 3. The default version was always good enough for Ansible.&lt;&#x2F;p&gt;
&lt;p&gt;During the last few weeks, I spent the majority of my time working on the performance of the community.kubernetes collection. The modules of this collection depend on a large library (OpenShift SDK) and Python needs to reload it before every task execution. The goal was to benefit from what is already in place with vmware.vmware_rest: &lt;a href=&quot;&#x2F;posts&#x2F;2020&#x2F;10&#x2F;how-to-speed-up-your-api-client-modules&#x2F;&quot;&gt;See: my AnsibleFest presentation&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While working on this, I realized that my metrics were not consistent; I was not able to reproduce some test cases from 2 months ago. After a quick investigation, the Python version matters much more than expected.&lt;&#x2F;p&gt;
&lt;p&gt;To compare the different Python versions, I decided to run some tests.&lt;&#x2F;p&gt;
&lt;p&gt;The target host is a t2.medium instance (2 vCPUs, 4GiB) running on AWS. The operating system is Fedora 33, which is really handy for this because it includes all the Python versions from 3.6 to 3.10!&lt;&#x2F;p&gt;
&lt;p&gt;I use the latest stable version of Ansible (2.10.3) that I install with &lt;code&gt;pip&lt;&#x2F;code&gt; in a Python virtual environment. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;721160564904c5c0f35a1b47736ada58&quot;&gt;Here is the list of dependencies present in the virtualenvs.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Finally, I deploy Kubernetes on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;podman.io&#x2F;&quot;&gt;Podman&lt;&#x2F;a&gt; with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;kind.sigs.k8s.io&#x2F;&quot;&gt;Kubernetes Kind&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;For the first test, I use a Python one-liner to evaluate the time Python takes to load the OpenShift SDK. This is one of the operations I want to optimize for my work, so it matters a lot to me.&lt;&#x2F;p&gt;
&lt;p&gt;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;c4f8ec63d0c51f7e6236173b2c60db66&lt;&#x2F;p&gt;
&lt;p&gt;Here, the loading is done 100 times in a row.&lt;&#x2F;p&gt;
&lt;p&gt;The result shows a steady improvement of the performance since Python 3.6.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;Python3.6&lt;&#x2F;th&gt;&lt;th&gt;Python3.7&lt;&#x2F;th&gt;&lt;th&gt;Python3.8&lt;&#x2F;th&gt;&lt;th&gt;Python3.9&lt;&#x2F;th&gt;&lt;th&gt;Python3.10&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;time (sec)&lt;&#x2F;td&gt;&lt;td&gt;48.401&lt;&#x2F;td&gt;&lt;td&gt;45.088&lt;&#x2F;td&gt;&lt;td&gt;41.751&lt;&#x2F;td&gt;&lt;td&gt;40.924&lt;&#x2F;td&gt;&lt;td&gt;40.385&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;With this test, the loading of the SDK is &lt;strong&gt;16.5% faster&lt;&#x2F;strong&gt; with Python 3.10.&lt;&#x2F;p&gt;
&lt;p&gt;The next test does the same thing, but this time through Ansible. My test uses the following playbook:&lt;&#x2F;p&gt;
&lt;p&gt;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;ad252e30d48cfea99aaeb2e18736303e&lt;&#x2F;p&gt;
&lt;p&gt;It runs the &lt;code&gt;k8s_info&lt;&#x2F;code&gt; module 100 times in a row. In addition, I use an &lt;code&gt;ansible.cfg&lt;&#x2F;code&gt; with the following content. This way, ansible-playbook returns a nice output of the task execution duration:&lt;&#x2F;p&gt;
&lt;p&gt;https:&#x2F;&#x2F;gist.github.com&#x2F;goneri&#x2F;e364c17d6344fd4cd11c1ed2e0ba12ce&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;Python3.6&lt;&#x2F;th&gt;&lt;th&gt;Python3.7&lt;&#x2F;th&gt;&lt;th&gt;Python3.8&lt;&#x2F;th&gt;&lt;th&gt;Python3.9&lt;&#x2F;th&gt;&lt;th&gt;Python3.10&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;time (sec)&lt;&#x2F;td&gt;&lt;td&gt;85.5&lt;&#x2F;td&gt;&lt;td&gt;80.5&lt;&#x2F;td&gt;&lt;td&gt;75.35&lt;&#x2F;td&gt;&lt;td&gt;75.05&lt;&#x2F;td&gt;&lt;td&gt;71.19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;It&#x27;s a &lt;strong&gt;16.76%&lt;&#x2F;strong&gt; boost between Python 3.6 and Python 3.10. I was not expecting such tight correlation between the two tests.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;11&#x2F;ansible-performance-impact-of-the-python-version&#x2F;image.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;11&#x2F;ansible-performance-impact-of-the-python-version&#x2F;image.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;While Python is obviously not the fastest technology out there, it&#x27;s great to see how its performance improves with each release. Python 3.10 is not even released yet and looks promising.&lt;&#x2F;p&gt;
&lt;p&gt;If your playbooks use some modules with dependencies on large Python libraries, it may be interesting to try the latest Python versions.&lt;&#x2F;p&gt;
&lt;p&gt;And for those who are still running Python 2.7, I get a &lt;strong&gt;49.2%&lt;&#x2F;strong&gt; performance boost between 2.7 and 3.10.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How to start minishift on Fedora-33</title>
          <pubDate>Thu, 05 Nov 2020 19:43:51 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/11/how-to-start-minishift-on-fedora-33/</link>
          <guid>https://goneri.lebouder.net/posts/2020/11/how-to-start-minishift-on-fedora-33/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/11/how-to-start-minishift-on-fedora-33/">&lt;p&gt;&lt;strong&gt;update: minishift is basically dead and won&#x27;t support OpenShift 4. You probably want to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.redhat.com&#x2F;blog&#x2F;2019&#x2F;09&#x2F;05&#x2F;red-hat-openshift-4-on-your-laptop-introducing-red-hat-codeready-containers&#x2F;&quot;&gt;crc&lt;&#x2F;a&gt; instead.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I just spent too much time trying to start &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;minishift&#x2F;minishift&quot;&gt;minishift&lt;&#x2F;a&gt; with my user account. After 3 hours fighting with permission issues between libvirt and the &lt;code&gt;~&#x2F;.minishift&lt;&#x2F;code&gt; directory, I&#x27;ve finally decided to stay sane and use &lt;code&gt;sudo&lt;&#x2F;code&gt;... This is how I start minishift on my Fedora 33.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;install-and-start-libvirt&quot;&gt;Install and start libvirt&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install -y libvirt qemu-kvm
sudo systemctl start libvirtd
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;fetch-and-install-minishift-and-the-kvm-driver&quot;&gt;Fetch and install minishift and the kvm driver&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;sudo dnf install -y origin-clients
curl -L https:&#x2F;&#x2F;github.com&#x2F;minishift&#x2F;minishift&#x2F;releases&#x2F;download&#x2F;v1.34.3&#x2F;minishift-1.34.3-linux-amd64.tgz|sudo tar -C &#x2F;usr&#x2F;local&#x2F;bin -xvz minishift-1.34.3-linux-amd64&#x2F;minishift  --strip-components=1
sudo curl -L https:&#x2F;&#x2F;github.com&#x2F;dhiltgen&#x2F;docker-machine-kvm&#x2F;releases&#x2F;download&#x2F;v0.10.0&#x2F;docker-machine-driver-kvm-centos7 -o &#x2F;usr&#x2F;local&#x2F;bin&#x2F;docker-machine-driver-kvm
sudo chmod +x &#x2F;usr&#x2F;local&#x2F;bin&#x2F;docker-machine-driver-kvm
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;start-minishift-with-sudo&quot;&gt;Start minishift (with sudo...)&lt;&#x2F;h3&gt;
&lt;p&gt;sudo minishift&lt;&#x2F;p&gt;
&lt;h3 id=&quot;and-configure-the-local-user&quot;&gt;And configure the local user&lt;&#x2F;h3&gt;
&lt;pre&gt;&lt;code&gt;sudo cp -r &#x2F;root&#x2F;.kube &#x2F;home&#x2F;goneri
sudo chown -R goneri:goneri &#x2F;home&#x2F;goneri&#x2F;.kube
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>How to speed up your (API client) modules</title>
          <pubDate>Tue, 13 Oct 2020 18:54:03 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/10/how-to-speed-up-your-api-client-modules/</link>
          <guid>https://goneri.lebouder.net/posts/2020/10/how-to-speed-up-your-api-client-modules/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/10/how-to-speed-up-your-api-client-modules/">&lt;p&gt;https:&#x2F;&#x2F;www.slideshare.net&#x2F;goneri&#x2F;how-to-speed-up-your-api-client-modules&lt;&#x2F;p&gt;
&lt;p&gt;The slide deck of my presentation for AnsibleFest 2020. It focuses on the modules designed to interact with a remote service (REST, SOAP, etc). In general these modules just wrap an SDK library; the presentation explains how to improve the performance. I actually use this strategy ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible-collections&#x2F;cloud.common&#x2F;blob&#x2F;main&#x2F;README_ansible_turbo.module.rst&quot;&gt;ansible_turbo.module&lt;&#x2F;a&gt; ) with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible-collections&#x2F;vmware.vmware_rest&quot;&gt;vmware.vmware_rest collection&lt;&#x2F;a&gt; to speed up the modules.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;10&#x2F;how-to-speed-up-your-api-client-modules&#x2F;how-to-speed-up-your-api-client-modules.pdf&quot;&gt;how-to-speed-up-your-api-client-modules (PDF)&lt;&#x2F;a&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;10&#x2F;how-to-speed-up-your-api-client-modules&#x2F;how-to-speed-up-your-api-client-modules.pdf&quot;&gt;Download&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How we use auto-generated content in the documentation of our Ansible collection</title>
          <pubDate>Wed, 07 Oct 2020 21:11:54 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/10/how-we-use-auto-generate-content-in-the-documentation-of-our-ansible-collection/</link>
          <guid>https://goneri.lebouder.net/posts/2020/10/how-we-use-auto-generate-content-in-the-documentation-of-our-ansible-collection/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/10/how-we-use-auto-generate-content-in-the-documentation-of-our-ansible-collection/">&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;Most of the content of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;galaxy.ansible.com&#x2F;vmware&#x2F;vmware_rest&quot;&gt;vmware.vmware_rest&lt;&#x2F;a&gt; collection is auto-generated. This article focuses on the documentation and explains how we build it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;auto-generated-example-blocks&quot;&gt;Auto-generated example blocks&lt;&#x2F;h2&gt;
&lt;p&gt;This collection comes with an exhaustive series of functional tests. Technically speaking, these tests are simply Ansible playbooks that we run with ansible-playbook. They should run all the modules and ideally in all the potential scenarios (e.g.: create, modify, delete). If the playbook execution is successful, the test passes and we assume the modules are in a consistent state.&lt;&#x2F;p&gt;
&lt;p&gt;We cannot easily generate all documentation content manually, but these playbooks are an interesting source of inspiration since they actually cover and go beyond all the use cases that we want to document.&lt;&#x2F;p&gt;
&lt;p&gt;Our strategy is to record all the tasks and their results in a directory. Our documentation will just point to this content. This provides two interesting benefits:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We know our examples work fine because it&#x27;s actually the output of the CI.&lt;&#x2F;li&gt;
&lt;li&gt;When the format of a result changes, our documentation will take it into account automatically.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We import these files into our git repository, git diff shows us the difference between the previous version. It&#x27;s an opportunity to spot a regression.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;10&#x2F;how-we-use-auto-generate-content-in-the-documentation-of-our-ansible-collection&#x2F;cooking.png&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;cooking.png&quot; height=&quot;396&quot; width=&quot;242&quot; &#x2F;&gt;&lt;&#x2F;a&gt; Cooking the collection&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-do-we-collect-the-tasks-and-the-results&quot;&gt;How do we collect the tasks and the results?&lt;&#x2F;h2&gt;
&lt;p&gt;For this, we use a callback plugin ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;ansible-collection-goneri.utils&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;ansible-collection-goneri.utils&lt;&#x2F;a&gt; ). The configuration is done using three environment variables:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ANSIBLE_CALLBACK_WHITELIST=goneri.utils.collect_task_outputs&lt;&#x2F;code&gt;: Ask Ansible to load the callback plugin.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;COLLECT_TASK_OUTPUTS_COLLECTION=vmware.vmware_rest&lt;&#x2F;code&gt;: Specify the name of the collection.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;COLLECT_TASK_OUTPUTS_TARGET_DIR=&#x2F;somewhere&lt;&#x2F;code&gt;: Target directory where to write the results.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;When we finally call the &lt;code&gt;ansible-playbook&lt;&#x2F;code&gt; command, the callback plugin will be loaded, record all the interactions of the vmware.vmware_rest modules, and store the results in the target directory.&lt;&#x2F;p&gt;
&lt;p&gt;The final script looks like this:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#!&#x2F;usr&#x2F;bin&#x2F;env bash
set -eux

export ANSIBLE_CALLBACK_WHITELIST=goneri.utils.collect_task_outputs
export COLLECT_TASK_OUTPUTS_COLLECTION=vmware.vmware_rest
export COLLECT_TASK_OUTPUTS_TARGET_DIR=$(realpath ..&#x2F;..&#x2F;..&#x2F;..&#x2F;docs&#x2F;source&#x2F;vmware_rest_scenarios&#x2F;task_outputs&#x2F;)
export INVENTORY_PATH=&#x2F;tmp&#x2F;inventory-vmware_rest
source ..&#x2F;init.sh
exec ansible-playbook -i ${INVENTORY_PATH} playbook.yaml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;the-documentation&quot;&gt;The documentation&lt;&#x2F;h2&gt;
&lt;p&gt;Like many Python projects, Ansible uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;ReStructuredText&quot;&gt;ReStructuredText&lt;&#x2F;a&gt; for its documentation. To include our samples we use the &lt;code&gt;literalinclude&lt;&#x2F;code&gt; directive. The result looks like that, the includes are done on lines 3 and 8:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;Here we use ``vcenter_datastore_info`` to get a list of all the datastores:

.. literalinclude:: task_outputs&#x2F;Retrieve_a_list_of_all_the_datastores.task.yaml

Result
------

.. literalinclude:: task_outputs&#x2F;Retrieve_a_list_of_all_the_datastores.result.json

&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is how the final result looks like:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;10&#x2F;how-we-use-auto-generate-content-in-the-documentation-of-our-ansible-collection&#x2F;restructuredtext_output.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;and-the-return-blocks&quot;&gt;And the RETURN blocks?&lt;&#x2F;h2&gt;
&lt;p&gt;Each Ansible module is supposed to come with a RETURN block ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;ansible&#x2F;latest&#x2F;dev_guide&#x2F;developing_modules_documenting.html#documentation-block&quot;&gt;https:&#x2F;&#x2F;docs.ansible.com&#x2F;ansible&#x2F;latest&#x2F;dev_guide&#x2F;developing_modules_documenting.html#documentation-block&lt;&#x2F;a&gt; ) that describe the output of the module. Each key of the module output is documented in this JSON structure.&lt;br &#x2F;&gt;
The RETURN section and the task result above should be consistent. We can actually reformat the result and generate a JSON structure that matches the RETURN block expectation.&lt;br &#x2F;&gt;
Once this is done, we just need to inject the content in the module file.&lt;&#x2F;p&gt;
&lt;p&gt;We reuse the task results in our modules with the following command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;.&#x2F;scripts&#x2F;inject_RETURN.py ~&#x2F;.ansible&#x2F;collections&#x2F;ansible_collections&#x2F;vmware&#x2F;vmware_rest&#x2F;docs&#x2F;source&#x2F;vmware_rest_scenarios&#x2F;task_outputs&#x2F; ~&#x2F;git_repos&#x2F;ansible-collections&#x2F;vmware_rest&#x2F; --config-file config&#x2F;inject_RETURN.yaml
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>vmware_rest: why a new Ansible Collection?</title>
          <pubDate>Tue, 29 Sep 2020 17:03:03 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/09/vmware-rest-why-a-new-collection/</link>
          <guid>https://goneri.lebouder.net/posts/2020/09/vmware-rest-why-a-new-collection/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/09/vmware-rest-why-a-new-collection/">&lt;p&gt;&lt;strong&gt;vmware.vmware_rest&lt;&#x2F;strong&gt; (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;galaxy.ansible.com&#x2F;vmware&#x2F;vmware_rest&quot;&gt;https:&#x2F;&#x2F;galaxy.ansible.com&#x2F;vmware&#x2F;vmware_rest&lt;&#x2F;a&gt;) is a new Ansible Collection for VMware. You can use it to manage the guests of your vCenter. If you&#x27;re familiar with Ansible and VMware, you will notice this collection overlaps with some features of community.vmware. You may think the two collections are competing and that it&#x27;s a waste of resources. It&#x27;s not that simple.&lt;&#x2F;p&gt;
&lt;p&gt;A bit of context will be necessary to fully understand why it’s not exactly the case. The development of the community.vmware collection started during the vCenter 6.0 cycle. At this time, the de facto SDK to build Python applications was pyvmomi, which you may know as the vSphere SDK for Python. This Python library relies on the SOAP interface that has been around for more than a decade. By comparison, the vSphere REST interface was still a novelty. The support of some important APIs were missing and documentation was limited.&lt;&#x2F;p&gt;
&lt;p&gt;Today, the situation has evolved. Pyvmomi is not actively maintained anymore and some new services are only exposed through the REST interface; a good example is the tagging API. VMware has also introduced a new Python SDK called vSphere Automation SDK (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;vsphere-automation-sdk-python&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;vsphere-automation-sdk-python&lt;&#x2F;a&gt;) to consume this new API. For instance, this is what community.vmware_tag_info uses underneath.&lt;&#x2F;p&gt;
&lt;p&gt;This new SDK comes at a cost for users. They need to pull an extra Python dependency in addition to pyvmomi and to make matters worse, this library is not on PyPI (See: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;vsphere-automation-sdk-python&#x2F;issues&#x2F;38&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;vsphere-automation-sdk-python&#x2F;issues&#x2F;38&lt;&#x2F;a&gt;), Python&#x27;s official library repository. They need to install it from GitHub instead. This is a source of confusion for our users.&lt;&#x2F;p&gt;
&lt;p&gt;From a development perspective, we don&#x27;t like when a module needs to load a gazillion Python dependencies because this slows down the execution time and it&#x27;s a source of complexity. But we cannot ditch pyvmomi immediately because a lot of modules rely on it. We can potentially rewrite these modules to use the vSphere Automation SDK.&lt;&#x2F;p&gt;
&lt;p&gt;These modules are already stable and of high quality. Many users depend on them. Modifying these modules to use the vSphere Automation SDK is risky. Any single regression would have a wide impact.&lt;&#x2F;p&gt;
&lt;p&gt;Our users would be frustrated by such a transition, especially because it would bring absolutely zero new features to them. This also means we would have to reproduce the exact same behavior, and we would miss an opportunity to improve the modules.&lt;&#x2F;p&gt;
&lt;p&gt;Technically speaking, an application that consumes a REST interface doesn&#x27;t really need an SDK. It can be handy sometimes, for instance for the authentication, but overall the standard HTTP client should be enough. After all, the &#x27;S&#x27; of REST stands for Simple for a reason.&lt;&#x2F;p&gt;
&lt;p&gt;The vSphere REST API is not always consistent, but it&#x27;s well documented. VMware maintains a tool called vmware-openapi-generator (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;vmware-openapi-generator&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;vmware-openapi-generator&lt;&#x2F;a&gt;) to extract it in a machine compatible format (Swagger 2.0 or OpenAPI 3).&lt;&#x2F;p&gt;
&lt;p&gt;During our quest for a solution to this Python dependency problem, we&#x27;ve designed a Proof of Concept (PoC). It was based on a set of modules with no dependency on any third-party library. And of course, these modules were auto-generated. We&#x27;ve mentioned the conclusion of the PoC back in March during the VMware &#x2F; Ansible weekly meeting (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible&#x2F;community&#x2F;issues&#x2F;423&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;ansible&#x2F;community&#x2F;issues&#x2F;423&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;The feedback convinced us we were on the right path. And here we go, 5 months later. The first beta release of &lt;strong&gt;vmware.vmware_rest&lt;&#x2F;strong&gt; has just been announced on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ansible.com&#x2F;blog&#x2F;introducing-the-vmware-rest-ansible-content-collection&quot;&gt;Ansible&#x27;s blog&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>CI of the Ansible modules for VMware: a retrospective</title>
          <pubDate>Fri, 21 Aug 2020 20:13:14 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/08/vmware-ci-of-ansible-modules-a-retrospective/</link>
          <guid>https://goneri.lebouder.net/posts/2020/08/vmware-ci-of-ansible-modules-a-retrospective/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/08/vmware-ci-of-ansible-modules-a-retrospective/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ansible.com&#x2F;integrations&#x2F;infrastructure&#x2F;vmware?hsLang=en-us&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.ansible.com&#x2F;hs-fs&#x2F;hubfs&#x2F;2016_Images&#x2F;Overview&#x2F;ansible-vmware-blog-300.png?width=300&amp;amp;height=200&amp;amp;name=ansible-vmware-blog-300.png&quot; alt=&quot;Simple VMware Provisioning, Management and Deprovisioning&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Since January 2020, every new Ansible VMware pull request is tested by the CI against a real VMware lab. Creating the CI environment against a real VMware lab has been a long journey, which I&#x27;ll share in this blog post.&lt;&#x2F;p&gt;
&lt;p&gt;Ansible VMware provides more than 170 modules, each of them dedicated to a specific area. You can use them to manage your ESXi hosts, the vCenter instances, the vSAN, perform the common day-to-day guest management, etc.&lt;&#x2F;p&gt;
&lt;p&gt;Our modules are maintained by a community of contributors, and a large number of the pull requests (PRs) are contributions from newcomers. The classic scenario is a user who has found a problem or a limitation with a module, and would like to address it.&lt;&#x2F;p&gt;
&lt;p&gt;This is the reason why our contributors are not necessarily developers. The average contributor doesn&#x27;t necessarily have advanced Python experience. We can hardly ask them to write Python unit tests. Requiring this level of work creates a barrier to contribution. This would be a source of confusion and frustration and we would lose a lot of valuable contributions. However, they are power users. They have a great understanding of VMware and Ansible, and so we maintain a test playbook for most of the modules.&lt;&#x2F;p&gt;
&lt;p&gt;Previously, when a new change was submitted, the CI was running the light Ansible sanity test suite and an integration test against govcsim, a VMware API simulator (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;govmomi&#x2F;tree&#x2F;master&#x2F;vcsim&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;vmware&#x2F;govmomi&#x2F;tree&#x2F;master&#x2F;vcsim&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;govcsim is a handy piece of software; you can start it locally to mock a vSphere infrastructure. But it doesn&#x27;t fully support some important VMware components like the network devices or datastores. As a consequence, the core reviewers were asked to download the changeset locally, and run the functional tests against their own vSphere lab.&lt;&#x2F;p&gt;
&lt;p&gt;In our context, a vSphere lab is:&lt;&#x2F;p&gt;
&lt;p&gt;- a vCenter instance&lt;&#x2F;p&gt;
&lt;p&gt;- 2 ESXi hosts&lt;&#x2F;p&gt;
&lt;p&gt;- 2 NFS datastores, with some pre-existing files.&lt;&#x2F;p&gt;
&lt;p&gt;We also had challenges in our test environment. Functional tests destroy or create network switches, enable IPv6, add new datastores, and rarely if ever restore the system to initial configuration once complete, leaving the labs in disarray and growing worse with each series of tests. Consequently, the reviews were slow, and we were wasting days fixing our infrastructures. Since the tests were not reproducible and done locally, it was hard to distinguish setup errors from actual issues and therefore it was hard to provide meaningful feedback to contributors: Is this error coming from my setup? I need to manually copy&#x2F;paste the error with the contributor, sometimes several days after the initial commit.&lt;&#x2F;p&gt;
&lt;p&gt;This was a frustrating situation for us, and for the contributors. But well, we&#x27;ve spent years doing that...&lt;&#x2F;p&gt;
&lt;p&gt;You may find we like to suffer, which is probably true to some extent, but the real problem is that it&#x27;s rather complex to automate the full deployment of a lab. vSphere is an appliance VM in the OVA format. It has to be deployed on an ESXi host. Officially, ESXi hosts can&#x27;t be virtualized, unless they run on ESXi hosts themselves. In addition, we use Evaluation licenses, and as a consequence, we cannot rely on features like snapshotting, and we have to redeploy our lab every 60 days.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;we-can-do-better-some-others-did&quot;&gt;We can do better! Some others did!&lt;&#x2F;h2&gt;
&lt;p&gt;The Ansible network modules were facing similar challenges. Network devices are required to fully validate a change, but it&#x27;s costly to stack and maintain operation of hundreds of devices just for validation.&lt;&#x2F;p&gt;
&lt;p&gt;They&#x27;ve decided to invest in OpenStack and a CI solution called Zuul-CI (https:&#x2F;&#x2F;zuul-ci.org&#x2F;). I don&#x27;t want to elaborate too much on Zuul since the topic itself is worth a book. But basically, every time a change gets pushed, Zuul will spawn a multi-node test environment, prepare the test execution using ... Ansible, Yeah! And finally, run the test and collect the result. This environment makes use of appliances coming from the vendors. It&#x27;s basically just a VM. OpenStack is pretty flexible for this use-case, especially when you&#x27;ve got top-notch support with the providers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;let-s-build-some-vmware-cloud-images&quot;&gt;Let&#x27;s build some VMware Cloud images!&lt;&#x2F;h2&gt;
&lt;p&gt;To run a VM in a cloud environment, it has to match the following requirements:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;use a single disk image, a qcow2 in the case of OpenStack.&lt;&#x2F;li&gt;
&lt;li&gt;support the hardware exposed by the hypervisor, qemu-kvm in our case&lt;&#x2F;li&gt;
&lt;li&gt;configure itself according to the metadata information exposed by the cloud provider (IP, SSH keys, etc). This service is handled by Cloud-Init most of the time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;esxi-cloud-image&quot;&gt;ESXi cloud image&lt;&#x2F;h3&gt;
&lt;p&gt;For ESXi, the first step was to deploy ESXi on libvirt&#x2F;qemu-kvm. This works fine as we avoid virtio. And with a bit more effort, we can automate the process ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;esxi-cloud-images&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;esxi-cloud-images&lt;&#x2F;a&gt; ). But our VM is not yet self-configuring. We need an alternative to Cloud-init. This is what esxi-cloud-init ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;esxi-cloud-init&#x2F;&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;esxi-cloud-init&#x2F;&lt;&#x2F;a&gt; ) will do for us. It reads the cloud metadata and prepares the network configuration of the ESXi host, and it also injects the SSH keys.&lt;&#x2F;p&gt;
&lt;p&gt;The image build process is rather simple once you&#x27;ve got libvirt and virt-install on your machine:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;$ git clone https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;esxi-cloud-images
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;$ cd esxi-cloud-images&lt;&#x2F;p&gt;
&lt;p&gt;$ .&#x2F;build.sh ~&#x2F;Downloads&#x2F;VMware-VMvisor-Installer-7.0.0-15525992.x86_64.iso&lt;&#x2F;p&gt;
&lt;p&gt;(...)&lt;&#x2F;p&gt;
&lt;p&gt;$ ls esxi-6.7.0-20190802001-STANDARD.qcow2&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;asciinema.org&#x2F;a&#x2F;349250&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;asciinema.org&#x2F;a&#x2F;349250.png&quot; width=&quot;836&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The image can run on OpenStack, but also on libvirt. Virt-Lightning (https:&#x2F;&#x2F;virt-lightning.org&#x2F;) is the tool we use to spawn our environment locally.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;lh6.googleusercontent.com&#x2F;rg2ydv_dKbG_8G1rKHzv8FiY05Pb9zBJNh9EWKGEZafsEqE7kyKFDiEGkOw9bGc8aNRWT75j5OytgCTPF5gsnetIMD4dwaVRKgk_Bp18GljioLziB14Q1U32lwLcD-83T7NlOps&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vcenter-cloud-image-too&quot;&gt;vCenter cloud image too?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;em&gt;update: See &lt;a href=&quot;&#x2F;posts&#x2F;2020&#x2F;12&#x2F;ansible-how-we-prepare-the-vsphere-instance-for-the-vmware-ci&#x2F;&quot;&gt;Ansible: How we prepare the vSphere instances of the VMware CI&lt;&#x2F;a&gt; for a more detailed explanation of the VCSA deployment process.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We wanted to deploy vCenter on our instance, but this is daunting. vCenter has a slow installation process, it requires an ESXi host, and is extremely sensitive to any form of network configuration changes...&lt;&#x2F;p&gt;
&lt;p&gt;So the initial strategy was to spawn a ESXi instance, and deploy vCenter on it. This is handled by ansible-role-vcenter-instance ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;ansible-role-vcenter-instance&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;ansible-role-vcenter-instance&lt;&#x2F;a&gt; ). The full process takes about 25m.&lt;&#x2F;p&gt;
&lt;p&gt;We became operational but the deployment process overwhelmed our lab. Additionally, the ESXi instance (16GB of RAM) was too much for running on a laptop. I started investigating new options.&lt;&#x2F;p&gt;
&lt;p&gt;Technically speaking, the vCenter Server Appliance or VCSA, is based on Photon Linux, the Linux distribution of VMware, and the VM actually comes with 15 large disks. This is a bit problematic since our final cloud image must be a single disk and be as small as possible. I developed this strategy:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;connect to the running VCSA, move all the content from the partition to the main partition, and drop the extra disk from the &#x2F;etc&#x2F;fstab&lt;&#x2F;li&gt;
&lt;li&gt;do some extra things regarding the network and Cloud-init configuration.&lt;&#x2F;li&gt;
&lt;li&gt;stop the server&lt;&#x2F;li&gt;
&lt;li&gt;extract the raw disk image from the ESXi datastore&lt;&#x2F;li&gt;
&lt;li&gt;convert it to the qcow2 format&lt;&#x2F;li&gt;
&lt;li&gt;and voilà! You&#x27;ve got a nice cloud image of your vCenter.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;All the steps are automated by the following tool: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;vcsa_to_qcow2&lt;&#x2F;a&gt;. It also enables virtio for better performance.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;preparing-development-environment-locally&quot;&gt;Preparing development environment locally&lt;&#x2F;h3&gt;
&lt;p&gt;To simplify the deployment, I use the following tool: https:&#x2F;&#x2F;github.com&#x2F;goneri&#x2F;deploy-vmware-ci. It will use virt-lightning to spawn the nodes, and do the post-configuration with Ansible. It reuses the roles that we consume in the CI to configure the vCenter, the host names, and populate the datastore.&lt;&#x2F;p&gt;
&lt;p&gt;In this example, I use it to start my ESXi environment on my Lenovo T580 laptop; the full run takes 15 minutes: https:&#x2F;&#x2F;asciinema.org&#x2F;a&#x2F;349246&lt;&#x2F;p&gt;
&lt;p&gt;Being able to redeploy a work environment in 15 minutes has been a life changer. I often recreate it several times a day. In addition, the local deployment workflow reproduces what we do in the CI, it&#x27;s handy to validate a changeset, or troubleshoot a problem.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-ci-integration&quot;&gt;The CI integration&lt;&#x2F;h3&gt;
&lt;p&gt;Each Ansible module is different, which makes for different test requirements. We&#x27;ve got 3 topologies:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;vcenter_only: only one single vCenter instance&lt;&#x2F;li&gt;
&lt;li&gt;vcenter_1esxi_with_nested: one vCenter with an ESXi, this ESXi is capable of starting a nested VM.&lt;&#x2F;li&gt;
&lt;li&gt;vcenter_1_esxi_without_nested: the same, but this time, we don&#x27;t start nested VM. Compared to the previous case, this set-up is compatible with all our providers.&lt;&#x2F;li&gt;
&lt;li&gt;vcenter_2_esxi_without_nested: well, like the previous one, but with a second ESXi, for instance to test ha or migration.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The nodeset definition is done in the following file: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ansible&#x2F;ansible-zuul-jobs&#x2F;blob&#x2F;master&#x2F;zuul.d&#x2F;nodesets.yaml&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;ansible&#x2F;ansible-zuul-jobs&#x2F;blob&#x2F;master&#x2F;zuul.d&#x2F;nodesets.yaml&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;We split the hours long test execution time on the different environments. An example of job result:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;08&#x2F;vmware-ci-of-ansible-modules-a-retrospective&#x2F;image-8.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;As you can see, we still run govcsim in the CI, even if it&#x27;s superseded by a real test environment. Since govcsim jobs run faster, we assume that failure would also fail against the real lab and abort the other jobs. This is a way to save time and resources.&lt;&#x2F;p&gt;
&lt;p&gt;I would like to thank Chuck Copello for the helpful review of this blog post.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Cloud images, which one is the fastest?</title>
          <pubDate>Thu, 13 Aug 2020 23:13:09 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2020/08/cloud-images-which-one-is-the-faster/</link>
          <guid>https://goneri.lebouder.net/posts/2020/08/cloud-images-which-one-is-the-faster/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2020/08/cloud-images-which-one-is-the-faster/">&lt;p&gt;Introduction&lt;&#x2F;p&gt;
&lt;p&gt;This post compares the start-up duration of the most popular cloud images. By start-up, I mean the time until we&#x27;ve got an operational SSH server.&lt;&#x2F;p&gt;
&lt;p&gt;For this test, I use a pet project called Virt-Lightning ( &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;virt-lightning.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;virt-lightning.org&#x2F;&lt;&#x2F;a&gt; ). This tool allows any Linux user to start standard cloud images locally. It will prepare the meta-data and start a VM in your local libvirt. It&#x27;s very handy for people like me, who work on Linux and spend the day starting new VMs. The images are in the QCow2 format, and it uses the OpenStack meta-data format. Technically speaking, the performance should match what you get with OpenStack.&lt;&#x2F;p&gt;
&lt;p&gt;Actually, OpenStack is often slightly slower because it does some extra operations. It may need to create a volume on Ceph, or prepare extra network configuration.&lt;&#x2F;p&gt;
&lt;p&gt;The 2.0.0 release of Virt-Lightning exposes a public API. My &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;virt-lightning&#x2F;virt-lightning&#x2F;blob&#x2F;master&#x2F;virt-lightning.org&#x2F;bench_images_startup.py&quot;&gt;test scenario&lt;&#x2F;a&gt; is built on top of that. It uses Python to pull the different images, and create a VM from it 10 times in a row.&lt;&#x2F;p&gt;
&lt;p&gt;All the images are public; Virt-Lightning can fetch them with the &lt;code&gt;vl pull foo&lt;&#x2F;code&gt; command:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;vl pull centos-6
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;During the boot process, the VM will set up a static network configuration, resize the filesystem, create a user, and inject an SSH key.&lt;&#x2F;p&gt;
&lt;p&gt;By default, Virt-Lightning uses a static network configuration because it&#x27;s faster, and it gives better performance when we start a large number of VMs at the same time. I chose to stick with this.&lt;&#x2F;p&gt;
&lt;p&gt;I did my tests on my Lenovo T580, which comes with a NVMe storage, and 32GB of memory. I would be curious to see the results with the same scenario, but on a regular spinning disk.&lt;&#x2F;p&gt;
&lt;p&gt;The target images&lt;&#x2F;p&gt;
&lt;p&gt;For this test, I compare the following Linux distributions: CentOS, Debian, Fedora, Ubuntu, and OpenSUSE. As far as I know, there is no public cloud image available for the other common distributions. If you think I&#x27;m wrong, please post a comment below.&lt;&#x2F;p&gt;
&lt;p&gt;I also included the latest FreeBSD, NetBSD, and OpenBSD releases. They don&#x27;t provide official cloud images. This is the reason why I reuse the unofficial ones from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The lack of a pre-existing Windows image is the reason why this OS is not included.&lt;&#x2F;p&gt;
&lt;p&gt;Results&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;08&#x2F;cloud-images-which-one-is-the-faster&#x2F;image-7.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Debian 10 is by far the fastest image with an impressive 15s on average. Basically, 5s less than any other cloud image.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;08&#x2F;cloud-images-which-one-is-the-faster&#x2F;image-4.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Regarding the BSDs, FreeBSD is the only system able to resize the root filesystem without a reboot. Consequently, OpenBSD and NetBSD need to start twice in a row. This explains the big difference. The NetBSD kernel hardware probe is rather slow, for instance it takes 5s to initialize the ATA bus of the CD-ROM. This is the reason why the results look rather bad.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;08&#x2F;cloud-images-which-one-is-the-faster&#x2F;image-5.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;About Ubuntu, I was surprised by the boot duration of Ubuntu 18.04. It is about two times longer than for 16.04. 20.04 is a bit better but still, we are far from the 15s of 14.04. I would be curious to know the origin of this. Maybe AppArmor?&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2020&#x2F;08&#x2F;cloud-images-which-one-is-the-faster&#x2F;image-6.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;CentOS 6 results are not really consistent. They vary between 17.9s and 25.21s. This is the largest delta if you compare with the other distribution. This being said, CentOS 6 is rather old, and won&#x27;t be &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.centos.org&#x2F;About&#x2F;Product&quot;&gt;supported anymore&lt;&#x2F;a&gt; at the end of the year.&lt;&#x2F;p&gt;
&lt;p&gt;Conclusions&lt;&#x2F;p&gt;
&lt;p&gt;All the recent Linux images are based on systemd. It would be great to extract the metrics from &lt;code&gt;systemd-analyze&lt;&#x2F;code&gt; to understand what impacts the performance the most.&lt;&#x2F;p&gt;
&lt;p&gt;Most of the time, when I deploy a test VM, the very first thing I do is the installation of some important packages. This scenario may be covered later in another blog post.&lt;&#x2F;p&gt;
&lt;p&gt;Raw results for each image&lt;&#x2F;p&gt;
&lt;p&gt;CentOS 6&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud.centos.org&#x2F;centos&#x2F;6&#x2F;images&#x2F;CentOS-6-x86_64-GenericCloud.qcow2&quot;&gt;https:&#x2F;&#x2F;cloud.centos.org&#x2F;centos&#x2F;6&#x2F;images&#x2F;CentOS-6-x86_64-GenericCloud.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Thu, 08 Aug 2019 13:28:32 GMT&lt;br &#x2F;&gt;
Size: 806748160&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=centos-6, elapsed_time=023.20
distro=centos-6, elapsed_time=021.41
distro=centos-6, elapsed_time=024.97
distro=centos-6, elapsed_time=025.21
distro=centos-6, elapsed_time=020.29
distro=centos-6, elapsed_time=020.67
distro=centos-6, elapsed_time=020.13
distro=centos-6, elapsed_time=019.83
distro=centos-6, elapsed_time=020.09
distro=centos-6, elapsed_time=017.92
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The average is 21.3s.&lt;&#x2F;p&gt;
&lt;p&gt;CentOS 7&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;cloud.centos.org&#x2F;centos&#x2F;7&#x2F;images&#x2F;CentOS-7-x86_64-GenericCloud.qcow2&quot;&gt;http:&#x2F;&#x2F;cloud.centos.org&#x2F;centos&#x2F;7&#x2F;images&#x2F;CentOS-7-x86_64-GenericCloud.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 22 Apr 2020 12:24:07 GMT&lt;br &#x2F;&gt;
Size: 858783744&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=centos-7, elapsed_time=020.88
distro=centos-7, elapsed_time=020.51
distro=centos-7, elapsed_time=020.42
distro=centos-7, elapsed_time=020.58
distro=centos-7, elapsed_time=020.18
distro=centos-7, elapsed_time=021.14
distro=centos-7, elapsed_time=020.74
distro=centos-7, elapsed_time=020.80
distro=centos-7, elapsed_time=020.48
distro=centos-7, elapsed_time=020.15
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 20.5s&lt;&#x2F;p&gt;
&lt;p&gt;CentOS 8&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud.centos.org&#x2F;centos&#x2F;8&#x2F;x86_64&#x2F;images&#x2F;CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2&quot;&gt;https:&#x2F;&#x2F;cloud.centos.org&#x2F;centos&#x2F;8&#x2F;x86_64&#x2F;images&#x2F;CentOS-8-GenericCloud-8.1.1911-20200113.3.x86_64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Mon, 13 Jan 2020 21:57:45 GMT&lt;br &#x2F;&gt;
Size: 716176896&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=centos-8, elapsed_time=023.55
distro=centos-8, elapsed_time=023.27
distro=centos-8, elapsed_time=024.39
distro=centos-8, elapsed_time=023.61
distro=centos-8, elapsed_time=023.52
distro=centos-8, elapsed_time=023.49
distro=centos-8, elapsed_time=023.53
distro=centos-8, elapsed_time=023.30
distro=centos-8, elapsed_time=023.34
distro=centos-8, elapsed_time=023.67
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 23.5s&lt;&#x2F;p&gt;
&lt;p&gt;Debian 9&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cdimage.debian.org&#x2F;cdimage&#x2F;openstack&#x2F;current-9&#x2F;debian-9-openstack-amd64.qcow2&quot;&gt;https:&#x2F;&#x2F;cdimage.debian.org&#x2F;cdimage&#x2F;openstack&#x2F;current-9&#x2F;debian-9-openstack-amd64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 29 Jul 2020 09:59:59 GMT&lt;br &#x2F;&gt;
Size: 594190848&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=debian-9, elapsed_time=020.69
distro=debian-9, elapsed_time=020.59
distro=debian-9, elapsed_time=020.16
distro=debian-9, elapsed_time=020.30
distro=debian-9, elapsed_time=020.02
distro=debian-9, elapsed_time=020.01
distro=debian-9, elapsed_time=020.71
distro=debian-9, elapsed_time=020.48
distro=debian-9, elapsed_time=020.65
distro=debian-9, elapsed_time=020.57
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average is 20.4s.&lt;&#x2F;p&gt;
&lt;p&gt;Debian 10&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cdimage.debian.org&#x2F;cdimage&#x2F;openstack&#x2F;current-10&#x2F;debian-10-openstack-amd64.qcow2&quot;&gt;https:&#x2F;&#x2F;cdimage.debian.org&#x2F;cdimage&#x2F;openstack&#x2F;current-10&#x2F;debian-10-openstack-amd64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Sat, 01 Aug 2020 20:10:01 GMT&lt;br &#x2F;&gt;
Size: 530629120&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=debian-10, elapsed_time=015.25
distro=debian-10, elapsed_time=015.28
distro=debian-10, elapsed_time=014.88
distro=debian-10, elapsed_time=015.07
distro=debian-10, elapsed_time=015.39
distro=debian-10, elapsed_time=015.35
distro=debian-10, elapsed_time=015.47
distro=debian-10, elapsed_time=014.94
distro=debian-10, elapsed_time=015.57
distro=debian-10, elapsed_time=015.57
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average is 15.2s&lt;&#x2F;p&gt;
&lt;p&gt;Debian testing&lt;&#x2F;p&gt;
&lt;p&gt;Debian testing is a rolling release, so I won&#x27;t include it in the charts, but I found interesting to include it in the results.&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cdimage.debian.org&#x2F;cdimage&#x2F;openstack&#x2F;testing&#x2F;debian-testing-openstack-amd64.qcow2&quot;&gt;https:&#x2F;&#x2F;cdimage.debian.org&#x2F;cdimage&#x2F;openstack&#x2F;testing&#x2F;debian-testing-openstack-amd64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Mon, 01 Jul 2019 08:39:27 GMT&lt;br &#x2F;&gt;
Size: 536621056&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=debian-testing, elapsed_time=015.07
distro=debian-testing, elapsed_time=015.03
distro=debian-testing, elapsed_time=014.93
distro=debian-testing, elapsed_time=015.33
distro=debian-testing, elapsed_time=014.85
distro=debian-testing, elapsed_time=015.53
distro=debian-testing, elapsed_time=014.94
distro=debian-testing, elapsed_time=015.22
distro=debian-testing, elapsed_time=015.19
distro=debian-testing, elapsed_time=014.86
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average 15s&lt;&#x2F;p&gt;
&lt;p&gt;Fedora 31&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;download.fedoraproject.org&#x2F;pub&#x2F;fedora&#x2F;linux&#x2F;releases&#x2F;31&#x2F;Cloud&#x2F;x86_64&#x2F;images&#x2F;Fedora-Cloud-Base-31-1.9.x86_64.qcow2&quot;&gt;https:&#x2F;&#x2F;download.fedoraproject.org&#x2F;pub&#x2F;fedora&#x2F;linux&#x2F;releases&#x2F;31&#x2F;Cloud&#x2F;x86_64&#x2F;images&#x2F;Fedora-Cloud-Base-31-1.9.x86_64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 23 Oct 2019 23:06:38 GMT&lt;br &#x2F;&gt;
Size: 355350528&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=fedora-31, elapsed_time=020.48
distro=fedora-31, elapsed_time=020.39
distro=fedora-31, elapsed_time=020.37
distro=fedora-31, elapsed_time=020.30
distro=fedora-31, elapsed_time=020.29
distro=fedora-31, elapsed_time=020.31
distro=fedora-31, elapsed_time=020.50
distro=fedora-31, elapsed_time=020.51
distro=fedora-31, elapsed_time=020.27
distro=fedora-31, elapsed_time=020.91
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average 20.4s&lt;&#x2F;p&gt;
&lt;p&gt;Fedora 32&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;download.fedoraproject.org&#x2F;pub&#x2F;fedora&#x2F;linux&#x2F;releases&#x2F;32&#x2F;Cloud&#x2F;x86_64&#x2F;images&#x2F;Fedora-Cloud-Base-32-1.6.x86_64.qcow2&quot;&gt;https:&#x2F;&#x2F;download.fedoraproject.org&#x2F;pub&#x2F;fedora&#x2F;linux&#x2F;releases&#x2F;32&#x2F;Cloud&#x2F;x86_64&#x2F;images&#x2F;Fedora-Cloud-Base-32-1.6.x86_64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 22 Apr 2020 22:36:57 GMT&lt;br &#x2F;&gt;
Size: 302841856&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=fedora-32, elapsed_time=021.68
distro=fedora-32, elapsed_time=022.43
distro=fedora-32, elapsed_time=022.17
distro=fedora-32, elapsed_time=023.06
distro=fedora-32, elapsed_time=022.23
distro=fedora-32, elapsed_time=022.83
distro=fedora-32, elapsed_time=022.54
distro=fedora-32, elapsed_time=021.46
distro=fedora-32, elapsed_time=022.37
distro=fedora-32, elapsed_time=023.14
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 22.4s&lt;&#x2F;p&gt;
&lt;p&gt;FreeBSD 11.4&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;freebsd&#x2F;11.4&#x2F;freebsd-11.4.qcow2&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;freebsd&#x2F;11.4&#x2F;freebsd-11.4.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 05 Aug 2020 01:24:32 GMT&lt;br &#x2F;&gt;
Size: 412895744&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=freebsd-11.4, elapsed_time=030.68
distro=freebsd-11.4, elapsed_time=030.64
distro=freebsd-11.4, elapsed_time=030.29
distro=freebsd-11.4, elapsed_time=030.29
distro=freebsd-11.4, elapsed_time=029.86
distro=freebsd-11.4, elapsed_time=029.74
distro=freebsd-11.4, elapsed_time=029.90
distro=freebsd-11.4, elapsed_time=029.77
distro=freebsd-11.4, elapsed_time=030.04
distro=freebsd-11.4, elapsed_time=029.70
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average 30s&lt;&#x2F;p&gt;
&lt;p&gt;FreeBSD 12.1&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;freebsd&#x2F;12.1&#x2F;freebsd-12.1.qcow2&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;freebsd&#x2F;12.1&#x2F;freebsd-12.1.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 05 Aug 2020 01:46:11 GMT&lt;br &#x2F;&gt;
Size: 479029760&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=freebsd-12.1, elapsed_time=029.78
distro=freebsd-12.1, elapsed_time=030.32
distro=freebsd-12.1, elapsed_time=029.56
distro=freebsd-12.1, elapsed_time=029.60
distro=freebsd-12.1, elapsed_time=029.76
distro=freebsd-12.1, elapsed_time=029.89
distro=freebsd-12.1, elapsed_time=029.55
distro=freebsd-12.1, elapsed_time=029.66
distro=freebsd-12.1, elapsed_time=029.31
distro=freebsd-12.1, elapsed_time=029.77
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average 29.7&lt;&#x2F;p&gt;
&lt;p&gt;NetBSD 8.2&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;netbsd&#x2F;8.2&#x2F;netbsd-8.2.qcow2&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;netbsd&#x2F;8.2&#x2F;netbsd-8.2.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 05 Aug 2020 02:06:57 GMT&lt;br &#x2F;&gt;
Size: 155385856&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=netbsd-8.2, elapsed_time=066.71
distro=netbsd-8.2, elapsed_time=067.80
distro=netbsd-8.2, elapsed_time=067.15
distro=netbsd-8.2, elapsed_time=066.97
distro=netbsd-8.2, elapsed_time=066.84
distro=netbsd-8.2, elapsed_time=067.01
distro=netbsd-8.2, elapsed_time=066.98
distro=netbsd-8.2, elapsed_time=067.73
distro=netbsd-8.2, elapsed_time=067.34
distro=netbsd-8.2, elapsed_time=066.90
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average 67.1&lt;&#x2F;p&gt;
&lt;p&gt;NetBSD 9.0&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;netbsd&#x2F;9.0&#x2F;netbsd-9.0.qcow2&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;netbsd&#x2F;9.0&#x2F;netbsd-9.0.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 05 Aug 2020 02:25:11 GMT&lt;br &#x2F;&gt;
Size: 149291008&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=netbsd-9.0, elapsed_time=067.04
distro=netbsd-9.0, elapsed_time=066.92
distro=netbsd-9.0, elapsed_time=066.89
distro=netbsd-9.0, elapsed_time=067.24
distro=netbsd-9.0, elapsed_time=067.41
distro=netbsd-9.0, elapsed_time=067.13
distro=netbsd-9.0, elapsed_time=066.14
distro=netbsd-9.0, elapsed_time=066.75
distro=netbsd-9.0, elapsed_time=067.25
distro=netbsd-9.0, elapsed_time=066.60
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 66.9s&lt;&#x2F;p&gt;
&lt;p&gt;OpenBSD 6.6&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;openbsd&#x2F;6.7&#x2F;openbsd-6.7.qcow2&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;openbsd&#x2F;6.7&#x2F;openbsd-6.7.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 05 Aug 2020 04:09:44 GMT&lt;br &#x2F;&gt;
Size: 520704512&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=openbsd-6.6, elapsed_time=048.80
distro=openbsd-6.6, elapsed_time=049.72
distro=openbsd-6.6, elapsed_time=049.07
distro=openbsd-6.6, elapsed_time=048.36
distro=openbsd-6.6, elapsed_time=049.28
distro=openbsd-6.6, elapsed_time=049.12
distro=openbsd-6.6, elapsed_time=049.36
distro=openbsd-6.6, elapsed_time=049.80
distro=openbsd-6.6, elapsed_time=048.05
distro=openbsd-6.6, elapsed_time=049.71
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 49.1s&lt;&#x2F;p&gt;
&lt;p&gt;OpenBSD 6.7&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;openbsd&#x2F;6.7&#x2F;openbsd-6.7.qcow2&quot;&gt;https:&#x2F;&#x2F;bsd-cloud-image.org&#x2F;images&#x2F;openbsd&#x2F;6.7&#x2F;openbsd-6.7.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 05 Aug 2020 04:09:44 GMT&lt;br &#x2F;&gt;
Size: 520704512&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=openbsd-6.7, elapsed_time=048.81
distro=openbsd-6.7, elapsed_time=048.96
distro=openbsd-6.7, elapsed_time=049.86
distro=openbsd-6.7, elapsed_time=049.12
distro=openbsd-6.7, elapsed_time=049.75
distro=openbsd-6.7, elapsed_time=050.63
distro=openbsd-6.7, elapsed_time=050.85
distro=openbsd-6.7, elapsed_time=049.92
distro=openbsd-6.7, elapsed_time=048.98
distro=openbsd-6.7, elapsed_time=050.83
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 49.7s&lt;&#x2F;p&gt;
&lt;p&gt;Ubuntu 14.04&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;trusty&#x2F;current&#x2F;trusty-server-cloudimg-amd64-disk1.img&quot;&gt;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;trusty&#x2F;current&#x2F;trusty-server-cloudimg-amd64-disk1.img&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Thu, 07 Nov 2019 15:38:05 GMT&lt;br &#x2F;&gt;
Size: 264897024&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=ubuntu-14.04, elapsed_time=014.40
distro=ubuntu-14.04, elapsed_time=014.42
distro=ubuntu-14.04, elapsed_time=014.94
distro=ubuntu-14.04, elapsed_time=015.44
distro=ubuntu-14.04, elapsed_time=015.64
distro=ubuntu-14.04, elapsed_time=014.59
distro=ubuntu-14.04, elapsed_time=015.02
distro=ubuntu-14.04, elapsed_time=015.22
distro=ubuntu-14.04, elapsed_time=015.44
distro=ubuntu-14.04, elapsed_time=015.44
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 15s&lt;&#x2F;p&gt;
&lt;p&gt;Ubuntu 16.04&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;xenial&#x2F;current&#x2F;xenial-server-cloudimg-amd64-disk1.img&quot;&gt;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;xenial&#x2F;current&#x2F;xenial-server-cloudimg-amd64-disk1.img&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Thu, 13 Aug 2020 08:36:38 GMT&lt;br &#x2F;&gt;
Size: 309657600&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=ubuntu-16.04, elapsed_time=015.13
distro=ubuntu-16.04, elapsed_time=015.39
distro=ubuntu-16.04, elapsed_time=015.42
distro=ubuntu-16.04, elapsed_time=015.62
distro=ubuntu-16.04, elapsed_time=015.29
distro=ubuntu-16.04, elapsed_time=015.60
distro=ubuntu-16.04, elapsed_time=015.62
distro=ubuntu-16.04, elapsed_time=015.21
distro=ubuntu-16.04, elapsed_time=015.62
distro=ubuntu-16.04, elapsed_time=015.67
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 15.4&lt;&#x2F;p&gt;
&lt;p&gt;Ubuntu 18.04&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;bionic&#x2F;current&#x2F;bionic-server-cloudimg-amd64.img&quot;&gt;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;bionic&#x2F;current&#x2F;bionic-server-cloudimg-amd64.img&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Wed, 12 Aug 2020 16:58:30 GMT&lt;br &#x2F;&gt;
Size: 357302272&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=ubuntu-18.04, elapsed_time=028.58
distro=ubuntu-18.04, elapsed_time=028.25
distro=ubuntu-18.04, elapsed_time=028.36
distro=ubuntu-18.04, elapsed_time=028.45
distro=ubuntu-18.04, elapsed_time=028.79
distro=ubuntu-18.04, elapsed_time=028.28
distro=ubuntu-18.04, elapsed_time=028.11
distro=ubuntu-18.04, elapsed_time=028.07
distro=ubuntu-18.04, elapsed_time=027.75
distro=ubuntu-18.04, elapsed_time=028.25
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 28.3s&lt;&#x2F;p&gt;
&lt;p&gt;Ubuntu 20.04&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;focal&#x2F;current&#x2F;focal-server-cloudimg-amd64.img&quot;&gt;https:&#x2F;&#x2F;cloud-images.ubuntu.com&#x2F;focal&#x2F;current&#x2F;focal-server-cloudimg-amd64.img&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Mon, 10 Aug 2020 22:19:47 GMT&lt;br &#x2F;&gt;
Size: 545587200&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=ubuntu-20.04, elapsed_time=023.23
distro=ubuntu-20.04, elapsed_time=022.74
distro=ubuntu-20.04, elapsed_time=023.20
distro=ubuntu-20.04, elapsed_time=022.96
distro=ubuntu-20.04, elapsed_time=024.04
distro=ubuntu-20.04, elapsed_time=024.06
distro=ubuntu-20.04, elapsed_time=023.60
distro=ubuntu-20.04, elapsed_time=023.88
distro=ubuntu-20.04, elapsed_time=023.24
distro=ubuntu-20.04, elapsed_time=024.27
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 23.5s&lt;&#x2F;p&gt;
&lt;p&gt;OpenSUSE Leap 15.2&lt;&#x2F;p&gt;
&lt;p&gt;image from: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;download.opensuse.org&#x2F;repositories&#x2F;Cloud:&#x2F;Images:&#x2F;Leap_15.2&#x2F;images&#x2F;openSUSE-Leap-15.2-OpenStack.x86_64.qcow2&quot;&gt;https:&#x2F;&#x2F;download.opensuse.org&#x2F;repositories&#x2F;Cloud:&#x2F;Images:&#x2F;Leap_15.2&#x2F;images&#x2F;openSUSE-Leap-15.2-OpenStack.x86_64.qcow2&lt;&#x2F;a&gt;&lt;br &#x2F;&gt;
Date: Sun, 07 Jun 2020 11:42:01 GMT&lt;br &#x2F;&gt;
Size: 566047744&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;distro=opensuse-leap-15.2, elapsed_time=027.10
distro=opensuse-leap-15.2, elapsed_time=027.61
distro=opensuse-leap-15.2, elapsed_time=027.07
distro=opensuse-leap-15.2, elapsed_time=027.12
distro=opensuse-leap-15.2, elapsed_time=027.57
distro=opensuse-leap-15.2, elapsed_time=026.86
distro=opensuse-leap-15.2, elapsed_time=027.25
distro=opensuse-leap-15.2, elapsed_time=027.10
distro=opensuse-leap-15.2, elapsed_time=027.69
distro=opensuse-leap-15.2, elapsed_time=027.39
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Average: 27.3s&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How to clean Docker up when used on Btrfs</title>
          <pubDate>Thu, 08 Jan 2015 13:05:16 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2015/01/how-to-clean-docker-up-when-used-on-btrfs/</link>
          <guid>https://goneri.lebouder.net/posts/2015/01/how-to-clean-docker-up-when-used-on-btrfs/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2015/01/how-to-clean-docker-up-when-used-on-btrfs/">&lt;p&gt;Docker often leaves behind files when I remove images with &lt;code&gt;rmi&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;systemctl stop docker.service
systemctl stop docker.socket
rm -rf &#x2F;var&#x2F;lib&#x2F;docker&#x2F;
btrfs subvolume list &#x2F;var&#x2F;lib&#x2F;docker|awk &amp;#39;&#x2F;ID&#x2F; {print &amp;quot;&#x2F;&amp;quot;$9}&amp;#39;|xargs btrfs sub delete
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Create thumbnail images of a set of pictures</title>
          <pubDate>Sat, 03 Jan 2015 14:10:32 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2015/01/create-thumbnail-images-of-a-set-of-pictures/</link>
          <guid>https://goneri.lebouder.net/posts/2015/01/create-thumbnail-images-of-a-set-of-pictures/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2015/01/create-thumbnail-images-of-a-set-of-pictures/">&lt;p&gt;Load 4 pictures at a time from the input directory and create thumbnail montage images:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;#!&#x2F;usr&#x2F;bin&#x2F;env python3

import glob
import subprocess

inputs = glob.glob(&amp;#39;input&#x2F;*.JPG&amp;#39;)

cpt = 0
while len(inputs) &amp;gt; 0:
to_process = inputs[:4] + [&amp;#39;logo:&amp;#39;, &amp;#39;logo:&amp;#39;, &amp;#39;logo:&amp;#39;]
inputs = inputs[4:]
cpt += 1
subprocess.call([&amp;quot;montage&amp;quot;] + to_process[:4] + [&amp;quot;-geometry&amp;quot;, &amp;quot;800x600+2+2&amp;quot;, &amp;quot;final&#x2F;final_%02d.jpg&amp;quot; % cpt])
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Pbuilder on Debian kFreeBSD Wheezy</title>
          <pubDate>Mon, 06 Oct 2014 19:57:17 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2014/10/pbuilder-on-debian-kfreebsd-wheezy/</link>
          <guid>https://goneri.lebouder.net/posts/2014/10/pbuilder-on-debian-kfreebsd-wheezy/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2014/10/pbuilder-on-debian-kfreebsd-wheezy/">&lt;p&gt;There is a little trick if you want to use pbuilder on kFreeBSD. Add these lines in &#x2F;etc&#x2F;pbuilderrc:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;MIRRORSITE=http:&#x2F;&#x2F;cdn.debian.net&#x2F;debian
USEPROC=yes
USEDEVFS=yes
USEDEVPTS=yes
BINDMOUNTS=&amp;quot;&#x2F;home&#x2F;goneri&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Getting BURP to use Puppet CA</title>
          <pubDate>Wed, 16 Oct 2013 13:20:56 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2013/10/getting-burp-to-use-puppet-ca/</link>
          <guid>https://goneri.lebouder.net/posts/2013/10/getting-burp-to-use-puppet-ca/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2013/10/getting-burp-to-use-puppet-ca/">&lt;p&gt;I&#x27;m a big fan of &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;burp.grke.org&#x2F;&quot;&gt;BURP&lt;&#x2F;a&gt; to maintain my backups. This article explains how to reuse the PuppetMaster CA for authentication. I use Debian burp package on Wheezy.&lt;&#x2F;p&gt;
&lt;p&gt;First, you need to generate the dhfile.pem on both the server and the agent:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;openssl dhparam -outform PEM -out &#x2F;etc&#x2F;burp&#x2F;dhfile.pem 1024
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;the-server&quot;&gt;The server&lt;&#x2F;h2&gt;
&lt;p&gt;The configuration is in &#x2F;etc&#x2F;burp&#x2F;burp-server.conf:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;mode = server
(...)
# ca_conf = &#x2F;etc&#x2F;burp&#x2F;CA.cnf
# ca_name = burpCA
# ca_server_name = burpserver
# ca_burp_ca = &#x2F;usr&#x2F;sbin&#x2F;burp_ca
(...)
ssl_cert_ca = &#x2F;var&#x2F;lib&#x2F;puppet&#x2F;ssl&#x2F;certs&#x2F;ca.pem
ssl_cert = &#x2F;var&#x2F;lib&#x2F;puppet&#x2F;ssl&#x2F;ca&#x2F;signed&#x2F;newpuppet.lebouder.net.pem
ssl_key = &#x2F;var&#x2F;lib&#x2F;puppet&#x2F;ssl&#x2F;private_keys&#x2F;newpuppet.lebouder.net.pem
ssl_key_password = password
ssl_dhfile = &#x2F;etc&#x2F;burp&#x2F;dhfile.pem
(...)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;the-agent&quot;&gt;The agent&lt;&#x2F;h2&gt;
&lt;p&gt;The configuration file is &#x2F;etc&#x2F;burp&#x2F;burp.conf:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;mode = client
port = 4971
server = newpuppet.lebouder.net
ssl_cert_ca = &#x2F;var&#x2F;lib&#x2F;puppet&#x2F;ssl&#x2F;certs&#x2F;ca.pem
ssl_cert = &#x2F;var&#x2F;lib&#x2F;puppet&#x2F;ssl&#x2F;certs&#x2F;newclient.lebouder.net.pem
ssl_key = &#x2F;var&#x2F;lib&#x2F;puppet&#x2F;ssl&#x2F;private_keys&#x2F;newclient.lebouder.net.pem
ssl_peer_cn = newpuppet.lebouder.net
(...)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;newpuppet.lebouder.net is the Puppet server.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Refresh all my git clones</title>
          <pubDate>Sun, 15 Sep 2013 21:58:22 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2013/09/refresh-all-my-git-clone/</link>
          <guid>https://goneri.lebouder.net/posts/2013/09/refresh-all-my-git-clone/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2013/09/refresh-all-my-git-clone/">&lt;p&gt;These are the commands I use to refresh all my git clones. For example, when I know I will be offline in the coming hours:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;locate --regex &amp;#39;\.git$&amp;#39;|parallel &amp;#39;cd {} &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; echo $PWD &amp;amp;&amp;amp; git fetch --all&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The use of GNU parallel is helpful to reduce the sync duration.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Duide Antidote8 sur Debian Sid</title>
          <pubDate>Fri, 09 Aug 2013 13:44:07 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2013/08/duide-antidote8-sur-debian-sid/</link>
          <guid>https://goneri.lebouder.net/posts/2013/08/duide-antidote8-sur-debian-sid/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2013/08/duide-antidote8-sur-debian-sid/">&lt;p&gt;J’ai acheté le correcteur orthographique &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.druide.com&#x2F;antidote.html&quot;&gt;Antidote 8&lt;&#x2F;a&gt; que j’ai installé hier. L’outil est vraiment impressionnant et agréable à utiliser.&lt;&#x2F;p&gt;
&lt;p&gt;L’installation sur Debian Sid n’est pas supportée, cependant son utilisation est possible. Je dois encore voir si je peux l’intégrer avec Firefox (Iceweasel) et Thunderbird (Icedove).&lt;&#x2F;p&gt;
&lt;h1 id=&quot;installation&quot;&gt;Installation&lt;&#x2F;h1&gt;
&lt;pre&gt;&lt;code&gt;# apt-get install libx11-6 libxslt1.1 libvorbis0a libxrender1 libgstreamer-plugins-base0.10-0 libpulse0 libpulse0 libpulse-mainloop-glib0 libfreetype6libpulse-mainloop-glib0 libfontconfig1 libxext6 libicu48``# wget http:&#x2F;&#x2F;ftp.fr.debian.org&#x2F;debian&#x2F;pool&#x2F;main&#x2F;o&#x2F;openssl&#x2F;libssl0.9.8_0.9.8o-4squeeze14_amd64.deb
# dpkg -i libssl0.9.8_0.9.8o-4squeeze14_amd64.deb
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre&gt;&lt;code&gt;# wget http:&#x2F;&#x2F;ftp.fr.debian.org&#x2F;debian&#x2F;pool&#x2F;main&#x2F;i&#x2F;icu&#x2F;libicu44_4.4.1-8_amd64.deb
# dpkg -i libicu44_4.4.1-8_amd64.deb
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pour éviter un problème avec les kernel &amp;gt;= 3 il faut faire une petite manip présentée ici : http:&#x2F;&#x2F;www.debian-fr.org&#x2F;certains-logiciels-dysfonctionnent-en-changeant-de-noyau-t42688.html&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;# wget https:&#x2F;&#x2F;mail.gnome.org&#x2F;archives&#x2F;evolution-list&#x2F;2003-December&#x2F;txtBEWSVk2eft.txt -O &#x2F;tmp&#x2F;uname.c
$ (echo #define _GNU_SOURCE; cat &#x2F;tmp&#x2F;uname.c) &amp;gt; &#x2F;tmp&#x2F;uname.c
$ gcc -shared -fPIC -ldl uname.c -o &#x2F;opt&#x2F;Druide&#x2F;Antidote8&#x2F;Programmes64&#x2F;fake-uname.so`
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Il ne reste plus qu&#x27;a ajouter les deux lignes suivantes au début du script &#x2F;opt&#x2F;Druide&#x2F;Antidote8&#x2F;Programmes64&#x2F;Antidote8.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;export LD_PRELOAD=&#x2F;opt&#x2F;Druide&#x2F;Antidote8&#x2F;Programmes64&#x2F;fake-uname.so
export RELEASE=$(uname -r | sed &amp;#39;s&#x2F;^\(...\)&#x2F;\1.0-antidote-fix&#x2F;g&amp;#39;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Finally, a 4096 GnuPG key</title>
          <pubDate>Tue, 18 Jun 2013 12:42:20 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2013/06/finally-a-4096-gnupg-key/</link>
          <guid>https://goneri.lebouder.net/posts/2013/06/finally-a-4096-gnupg-key/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2013/06/finally-a-4096-gnupg-key/">&lt;pre&gt;&lt;code data-lang=&quot;gpg&quot;&gt;-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

I finally generated a 4096 key ( 0x049ED9B94765572E ) which is signed
by my old key 0x37D9412C. I will revoke this old key in the coming months.

The old 1024bit key:
pub 1024D&#x2F;37D9412C 2004-08-18
Key fingerprint = D3BC 65BB 48B1 1DA8 BC8A 5C88 B0A4 C5A4 37D9 412C
uid Gonéri Le Bouder
uid Gonéri Le Bouder
uid Gonéri Le Bouder
uid Gonéri Le Bouder
uid [jpeg image of size 7650]
uid Gonéri Le Bouder (Professional address)
uid [jpeg image of size 4672]
sub 1024g&#x2F;E47802B2 2004-08-18
sub 2048R&#x2F;F89D348A 2013-06-01

The new key:
pub 4096R&#x2F;4765572E 2013-06-18 [expires: 2023-07-15]
Key fingerprint = 1FF3 68E8 0199 1373 1705 B8AF 049E D9B9 4765 572E
uid Gonéri Le Bouder
uid Gonéri Le Bouder
uid Gonéri Le Bouder
uid [jpeg image of size 7650]
uid Gonéri Le Bouder
sub 4096R&#x2F;E496738B 2013-06-18

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.15 (GNU&#x2F;Linux)

iEYEARECAAYFAlJlJjsACgkQsKTFpDfZQSxwzwCeLDuJoMOwJ4H2fbQionyejDck
GX8Anjp0V+rZHJ5fLlLv3yXWbsBt9K5m
=RHzK
-----END PGP SIGNATURE-----
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Avahi &#x2F; Bonjour on Windows</title>
          <pubDate>Sun, 16 Jun 2013 12:10:05 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2013/06/avahi-bonjour-on-windows/</link>
          <guid>https://goneri.lebouder.net/posts/2013/06/avahi-bonjour-on-windows/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2013/06/avahi-bonjour-on-windows/">&lt;p&gt;How to resolve .local Avahi&#x2F;Bonjour names on Windows: http:&#x2F;&#x2F;support.apple.com&#x2F;kb&#x2F;DL999&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>ext4 with barrier=1 and performance</title>
          <pubDate>Mon, 04 Feb 2013 09:41:35 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2013/02/ext4-with-barrier1-and-performance/</link>
          <guid>https://goneri.lebouder.net/posts/2013/02/ext4-with-barrier1-and-performance/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2013/02/ext4-with-barrier1-and-performance/">&lt;p&gt;The use of nobarrier provides a great performance gain on my laptop. I think I will continue with this approach even if my hard drive has no battery unit.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;with-ext4-rw-noatime-errors-remount-ro-data-ordered&quot;&gt;With ext4 (rw,noatime,errors=remount-ro,data=ordered)&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;#fs_mark -t 4 -s 10240 -n 1000 -d &#x2F;home&#x2F;goneri&#x2F;tmp&#x2F;test # Version 3.3, 4 thread(s) starting at Mon Feb 4 10:35:47 2013
# Sync method: INBAND FSYNC: fsync() per file in write loop.
# Directories: no subdirectories used
# File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name)
# Files info: size 10240 bytes, written with an IO size of 16384 bytes per write
# App overhead is time in microseconds spent in the test not doing file writing related system calls. FSUse% Count Size Files&#x2F;sec App Overhead
o 84 4000 10240 35.2 113031
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;ext4-rw-noatime-nobarrier-errors-remount-ro-commit-15-data-ordered&quot;&gt;ext4 (rw,noatime,nobarrier,errors=remount-ro,commit=15,data=ordered)&lt;&#x2F;h2&gt;
&lt;pre&gt;&lt;code&gt;tosh-r630:&#x2F;tmp$ fs_mark -t 4 -s 10240 -n 1000 -d ~&#x2F;tmp&#x2F;test # fs_mark -t 4 -s 10240 -n 1000 -d &#x2F;home&#x2F;goneri&#x2F;tmp&#x2F;test # Version 3.3, 4 thread(s) starting at Mon Feb 4 10:40:06 2013
# Sync method: INBAND FSYNC: fsync() per file in write loop.
# Directories: no subdirectories used
# File names: 40 bytes long, (16 initial bytes of time stamp with 24 random bytes at end of name)
# Files info: size 10240 bytes, written with an IO size of 16384 bytes per write
# App overhead is time in microseconds spent in the test not doing file writing related system calls. FSUse% Count Size Files&#x2F;sec App Overhead 84 4000 10240 839.9 99672
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Debian Wheezy and cfengine</title>
          <pubDate>Sat, 17 Nov 2012 20:10:24 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2012/11/debian-wheezy-and-cfengine/</link>
          <guid>https://goneri.lebouder.net/posts/2012/11/debian-wheezy-and-cfengine/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2012/11/debian-wheezy-and-cfengine/">&lt;p&gt;How to bootstrap a cfengine node with Debian Wheezy Cfengine:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;# cp &#x2F;usr&#x2F;share&#x2F;doc&#x2F;cfengine3&#x2F;example_config&#x2F;* &#x2F;etc&#x2F;cfengine3&#x2F;
# sed -i &amp;#39;s,&amp;quot;&#x2F;var&#x2F;lib&#x2F;cfengine3&#x2F;inputs&amp;quot;,&amp;quot;&#x2F;etc&#x2F;cfengine3&amp;quot;,&amp;#39; &#x2F;etc&#x2F;cfengine3&#x2F;update.cf
# sed -i &amp;#39;s,RUN_CFEXECD=0,RUN_CFEXECD=1,&amp;#39; &#x2F;etc&#x2F;default&#x2F;cfengine3
# &#x2F;etc&#x2F;init.d&#x2F;cfengine3 restart
# cf-agent --bootstrap --policy-server 2a01:e35:242d:e930:250:XXXX:XXXX:XXXXX
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Prefetch apt packages</title>
          <pubDate>Tue, 13 Nov 2012 10:26:46 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2012/11/prefetch-apt-packages/</link>
          <guid>https://goneri.lebouder.net/posts/2012/11/prefetch-apt-packages/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2012/11/prefetch-apt-packages/">&lt;p&gt;I use this command to speed up deb package downloads. It will do parallel downloads of the required .deb files with puf.&lt;&#x2F;p&gt;
&lt;p&gt;For example with otrs:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;cd &#x2F;var&#x2F;cache&#x2F;apt&#x2F;archives&#x2F; &amp;amp;&amp;amp; apt-get -y --print-uris install otrs|awk &amp;#39;{print $1}&amp;#39;|grep &amp;quot;&amp;#39;http&amp;quot; | xargs puf
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>git gc --prune on a complete directory structure</title>
          <pubDate>Wed, 13 Jun 2012 10:43:56 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2012/06/git-gc-prune-a-on-complet-directory-structure/</link>
          <guid>https://goneri.lebouder.net/posts/2012/06/git-gc-prune-a-on-complet-directory-structure/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2012/06/git-gc-prune-a-on-complet-directory-structure/">&lt;p&gt;To run &quot;git gc --prune&quot; on a structure of subdirectories of git repositories, like for example a &#x2F;git directory on a server:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;find &#x2F;git -type d -execdir sh -c &amp;#39;[ -f &amp;quot;description&amp;quot; ] &amp;amp;&amp;amp; sudo git gc --prune&amp;#39; \;`
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>git gc and bup</title>
          <pubDate>Sat, 31 Dec 2011 00:34:23 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2011/12/git-gc-and-bup/</link>
          <guid>https://goneri.lebouder.net/posts/2011/12/git-gc-and-bup/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2011/12/git-gc-and-bup/">&lt;p&gt;To avoid the OOM killer after a &lt;code&gt;git gc&lt;&#x2F;code&gt; call on a bup repository:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;$ git config --global pack.windowMemory 512m
$ git config --global pack.threads 10
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Backup LVM LV with bup</title>
          <pubDate>Sat, 31 Dec 2011 00:11:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2011/12/backup-lvm-lv-with-bup/</link>
          <guid>https://goneri.lebouder.net/posts/2011/12/backup-lvm-lv-with-bup/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2011/12/backup-lvm-lv-with-bup/">&lt;p&gt;Bup is a backup software that uses git for storage. Bup imports chunks of files to deduplicate large files.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;$ cat &#x2F;dev&#x2F;mapper&#x2F;virtualmachines-sarge | bup split -n virtualmachines-sarges
bloom: adding 1 file (10967 objects).
$ bup join virtualmachines-sarges &amp;gt; &#x2F;tmp&#x2F;sarges.img
$ file &#x2F;tmp&#x2F;sarges.img &#x2F;tmp&#x2F;sarges.img: x86 boot sector; GRand Unified Bootloader, stage1 version 0x3, stage2 address 0x2000, stage2 segment 0x200, GRUB version 0.94; partition 1: ID=0x83, active, starthead 1, startsector 63, 9976302 sectors; partition 2: ID=0x5, starthead 0, startsector 9976365, 498015 sectors, code offset 0x48
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Wininetd 0.7</title>
          <pubDate>Sun, 04 Dec 2011 22:29:25 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2011/12/wininetd-0-7/</link>
          <guid>https://goneri.lebouder.net/posts/2011/12/wininetd-0-7/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2011/12/wininetd-0-7/">&lt;p&gt;Just a reminder, this is the command line needed to build &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.xmailserver.org&#x2F;wininetd.html&quot;&gt;WinInetd&lt;&#x2F;a&gt; with gcc:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;gcc service.c wininetd.c -lws2_32 -lm
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>OpenSSL1.0.0e+Net::SSLeay on Windows</title>
          <pubDate>Sat, 03 Dec 2011 01:24:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2011/12/openssl1-0-0enetssleay-on-windows/</link>
          <guid>https://goneri.lebouder.net/posts/2011/12/openssl1-0-0enetssleay-on-windows/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2011/12/openssl1-0-0enetssleay-on-windows/">&lt;p&gt;I managed to get Net::SSLeay to work with the latest OpenSSL release. Here are just some notes for myself.&lt;&#x2F;p&gt;
&lt;p&gt;OpenSSL test-suite build will fail but the .a and the openssl.exe files are ok.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;; LIBPATH=`echo $LIBPATH | sed -e &amp;#39;s&#x2F; &#x2F;:&#x2F;g&amp;#39;`; LD\_LIBRARY\_PATH=$LIBPATH:$LD\_LIBRARY\_PATH ${LDCMD} ${LDFLAGS} -o ${APPNAME:=ideatest.exe} ideatest.o ${LIBDEPS} )
make[2]: Leaving directory `&#x2F;cygdrive&#x2F;c&#x2F;strawberry&#x2F;openssl-1.0.0e&#x2F;test&amp;#39;
gcc -I.. -I..&#x2F;include -DOPENSSL\_THREADS -D\_MT -DDSO\_WIN32 -DL\_ENDIAN -DWIN32\_LEAN\_AND\_MEAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL\_BN\_ASM\_PART\_WORDS -DOPENSSL\_IA32\_SSE2 -DOPENSSL\_BN\_ASM\_MONT -DSHA1\_ASM -DSHA256\_ASM -DSHA512\_ASM -DMD5\_ASM -DRMD160\_ASM -DAES\_ASM -DWHIRLPOOL\_ASM -c -o md2test.o md2test.c
md2test.c:1: error: expected identifier or &amp;#39;(&amp;#39; before &amp;#39;!&amp;#39; token
md2test.c:1: error: stray &amp;#39;\\377&amp;#39; in program
md2test.c:1: error: stray &amp;#39;\\376&amp;#39; in program
md2test.c:1:14: warning: null character(s) ignored
md2test.c:1:16: warning: null character(s) ignored
md2test.c:1:18: warning: null character(s) ignored
md2test.c:1:20: warning: null character(s) ignored
md2test.c:1:22: warning: null character(s) ignored
md2test.c:1:24: warning: null character(s) ignored
md2test.c:1:26: warning: null character(s) ignored
md2test.c:1:28: warning: null character(s) ignored
md2test.c:1:30: warning: null character(s) ignored
md2test.c:1:32: warning: null character(s) ignored
md2test.c:1:34: warning: null character(s) ignored
: recipe for target `md2test.o&amp;#39; failed
make[1]: \*\*\* [md2test.o] Error 1
make[1]: Leaving directory `&#x2F;cygdrive&#x2F;c&#x2F;strawberry&#x2F;openssl-1.0.0e&#x2F;test&amp;#39;
Makefile:255: recipe for target `build\_tests&amp;#39; failed
make: \*\*\* [build\_tests] Error 1 Administrator@ordi-de-gon▒ri &#x2F;cygdrive&#x2F;c&#x2F;strawberry&#x2F;openssl-1.0.0e
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The openssl.exe binary is in apps&#x2F; on Windows, not bin. Net::SSLeay&#x27;s Makefile.PL file fails to find the OpenSSL distribution because of that.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;(...)
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x251a): undefined reference to `\_imp\_\_CertOpenStore@20&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x255f): undefined reference to `imp\_\_CertFreeCertificateContext@4&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x2576): undefined reference to `\_imp\_\_CertCloseStore@8&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x25d5): undefined reference to `\_imp\_\_CertEnumCertificatesInStore@8&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x2e1a): undefined reference to `\_imp\_\_CertOpenStore@20&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x2e4d): undefined reference to `\_imp\_\_CertEnumCertificatesInStore@8&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x2f28): undefined reference to `\_imp\_\_CertDuplicateCertificateContext@4&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x2fb1): undefined reference to `\_imp\_\_CertCloseStore@8&amp;#39;
c:\\strawberry\\openssl-1.0.0e\\libcrypto.a(e\_capi.o):e\_capi.c:(.text+0x30e6): undefined reference to `\_imp\_\_CertFreeCertificateContext@4&amp;#39;
collect2: ld returned 1 exit status
dmake: Error code 129, while making &amp;#39;blib\\arch\\auto\\Net\\SSLeay\\SSLeay.dll&amp;#39;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The patch to apply to get Net::SSLeay to build.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;diff&quot;&gt;--- Net-SSLeay-1.42.orig&#x2F;inc&#x2F;Module&#x2F;Install&#x2F;PRIVATE&#x2F;Net&#x2F;SSLeay.pm 2011-10-03 08:23:34.000000000 +0200
+++ Net-SSLeay-1.42&#x2F;inc&#x2F;Module&#x2F;Install&#x2F;PRIVATE&#x2F;Net&#x2F;SSLeay.pm 2011-12-03 02:22:28.286660290 +0100
@@ -90,7 +90,7 @@ EOM # libeay32 and ssleay32. # This construction will not complain as long as it find at least one # libssl32.a is made by openssl onWin21 with the ms&#x2F;minw32.bat builder
- push @{ $opts-\&amp;gt;{lib\_links} }, qw( libeay32MD ssleay32MD libeay32 ssleay32 libssl32);
+ push @{ $opts-\&amp;gt;{lib\_links} }, qw( libssl libcrypto Crypt32 ); } else { $opts-\&amp;gt;{optimize} = &amp;#39;-O2 -g&amp;#39;; push @{ $opts-\&amp;gt;{lib\_links} },
@@ -172,9 +172,10 @@ sub find\_openssl\_exec { my ($self, $prefix) = @\_; my $exe\_path;
- for my $subdir (qw( bin sbin out32dll )) {
+ for my $subdir (qw( apps bin sbin out32dll )) { my $path = File::Spec-\&amp;gt;catfile($prefix, $subdir, &amp;quot;openssl$Config{\_exe}&amp;quot;);
- if ( -x $path ) {
+
+ if ( -e $path ) { return $path; } }
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>How to build Thunderbird 3.0.4 from source</title>
          <pubDate>Thu, 22 Apr 2010 13:13:07 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2010/04/how-to-build-grab-thunderbird-3-0-4-sources/</link>
          <guid>https://goneri.lebouder.net/posts/2010/04/how-to-build-grab-thunderbird-3-0-4-sources/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2010/04/how-to-build-grab-thunderbird-3-0-4-sources/">&lt;p&gt;Commit references can be found in the release notes on the wiki: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.mozilla.org&#x2F;Releases&#x2F;Thunderbird_3.0.4&quot;&gt;https:&#x2F;&#x2F;wiki.mozilla.org&#x2F;Releases&#x2F;Thunderbird_3.0.4&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;hg clone -r b8e06312e645 http:&#x2F;&#x2F;hg.mozilla.org&#x2F;releases&#x2F;comm-1.9.1 thunderbird
cd thunderbird
echo &amp;#39;ac_add_options --enable-application=mail&amp;#39; &amp;gt; .mozconfig
echo &amp;#39;mk_add_options MOZ_OBJDIR=@TOPSRCDIR@&#x2F;objdir-tb-release&amp;#39; &amp;gt;&amp;gt; .mozconfig
hg clone -r ead1204d8b81 http:&#x2F;&#x2F;hg.mozilla.org&#x2F;releases&#x2F;mozilla-1.9.1 mozilla
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Install the build dependencies (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;En&#x2F;Simple_Firefox_build&quot;&gt;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;En&#x2F;Simple_Firefox_build&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Now we can start the build&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;make -f client.mk
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Debian Vserver cheat sheet</title>
          <pubDate>Tue, 09 Mar 2010 17:55:05 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2010/03/debian-vserver-cheat-sheet/</link>
          <guid>https://goneri.lebouder.net/posts/2010/03/debian-vserver-cheat-sheet/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2010/03/debian-vserver-cheat-sheet/">&lt;p&gt;This is just to keep track for myself on how to create a Vserver with Internet connectivity.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Create the network interface&lt;&#x2F;strong&gt; Edit &lt;code&gt;&#x2F;etc&#x2F;network&#x2F;interfaces&lt;&#x2F;code&gt; and add:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;auto dummy0
iface dummy0 inet static address 192.168.50.1 netmask 255.255.255.0
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Restart the network&lt;&#x2F;strong&gt; &lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;networking restart&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Turn the NAT on&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;echo 1 &amp;gt; &#x2F;proc&#x2F;sys&#x2F;net&#x2F;ipv4&#x2F;ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Replace eth0 with the network interface you use for your network access.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Create the VM&lt;&#x2F;strong&gt; &lt;code&gt;sudo vserver build build -n cyrus2.3 -m debootstrap --netdev dummy0 --interface 192.168.50.2&#x2F;24 -- -d lenny&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Enter the VM&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;sudo vserver cyrus2.3 start
sudo vserver cyrus2.3 enter
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>SheevaPlug</title>
          <pubDate>Wed, 30 Dec 2009 21:54:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2009/12/sheevaplug/</link>
          <guid>https://goneri.lebouder.net/posts/2009/12/sheevaplug/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2009/12/sheevaplug/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;fr.wikipedia.org&#x2F;wiki&#x2F;SheevaPlug&quot;&gt;SheevaPlug&lt;&#x2F;a&gt; + Debian = ♥♥♥♥&lt;&#x2F;p&gt;
&lt;p&gt;Thank you Martin Michlmayr!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How to query Windows Vista registry with Samba4 regshell</title>
          <pubDate>Mon, 12 Oct 2009 15:15:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2009/10/how-to-query-windows-vista-registry-with-samba4-regshell/</link>
          <guid>https://goneri.lebouder.net/posts/2009/10/how-to-query-windows-vista-registry-with-samba4-regshell/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2009/10/how-to-query-windows-vista-registry-with-samba4-regshell/">&lt;p&gt;In this example, I list the installed software on the Vista machine from a Debian Sid system using &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.samba.org&quot;&gt;Samba&lt;&#x2F;a&gt; 4 packages.&lt;&#x2F;p&gt;
&lt;p&gt;I had to enable (with lusrmgr.msc) and use the Administrator account.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;% regshell --remote=192.168.50.10 -U Administrateur%castorLapon
HKEY_CLASSES_ROOT&amp;gt; predef HKEY_LOCAL_MACHINE
HKEY_LOCAL_MACHINE&amp;gt; cd SOFTWARE
New path is: HKEY_LOCAL_MACHINE\SOFTWARE
HKEY_LOCAL_MACHINE\SOFTWARE&amp;gt; cd Microsoft
New path is: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft&amp;gt; cd Windows
New path is: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows&amp;gt; cd CurrentVersion
New path is: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion&amp;gt; cd Uninstall
New path is: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall&amp;gt; list
K 7-Zip
K AddressBook
K Adobe Flash Player ActiveX
K Bazaar_is1
K Connection Manager
K DirectDrawEx
K DXM_Runtime
K Fontcore
K IE40
K IE4Data
K IE5BAKEX
K IEData
K Microsoft .NET Framework 3.5 Language Pack SP1 - fra
K Microsoft .NET Framework 3.5 SP1
K MobileOptionPack
K Mozilla Firefox (3.5.3)
K MPlayer2
K OCS Inventory Agent
K PuTTY_is1
K SchedulingAgent
K Vim 7.2
K WIC
K {205C6BDD-7B73-42DE-8505-9A093F35A238}
K {26A24AE4-039D-4CA4-87B4-2F83216016FF}
K {3E31821C-7917-367E-938E-E65FC413EA31}
K {89F4137D-6C26-4A84-BDB8-2E5A4BB71E00}
K {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}
K {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB350003
K {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB953595
K {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB958484
K {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB960043
K {CE2CDD62-0124-36CA-84D3-9F4DCF5C5BD9}.KB963707
K {DCE8CD14-FBF5-4464-B9A4-E18E473546C7}
K {F0E12BBA-AD66-4022-A453-A1C8A0C4D570}
K {F18B31E4-E2E3-4F4F-A2C9-BA579D6AF400}
K {FC857AFE-FC36-3C91-BC17-F8E233C21B4B}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>thunderbird 2.0.0.23 built by Mozilla and Debian Squeeze</title>
          <pubDate>Thu, 03 Sep 2009 16:40:04 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2009/09/thunderbird-2-0-0-23-built-by-mozilla-and-debian-squeeze/</link>
          <guid>https://goneri.lebouder.net/posts/2009/09/thunderbird-2-0-0-23-built-by-mozilla-and-debian-squeeze/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2009/09/thunderbird-2-0-0-23-built-by-mozilla-and-debian-squeeze/">&lt;p&gt;Mozilla still builds against libstdc++5...&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;&#x2F;opt&#x2F;thunderbird-2.0.0.23$ .&#x2F;thunderbird
.&#x2F;thunderbird-bin: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The solution is very simple. Just use libstdc++5 from Lenny:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code data-lang=&quot;shell&quot;&gt;wget http:&#x2F;&#x2F;ftp.fi.debian.org&#x2F;debian&#x2F;pool&#x2F;main&#x2F;g&#x2F;gcc-3.3&#x2F;libstdc++5_3.3.6-18_i386.deb
sudo dpkg -i libstdc++5_3.3.6-18_i386.deb
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Nouveau blog !</title>
          <pubDate>Thu, 06 Aug 2009 22:21:57 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2009/08/nouveau-blog/</link>
          <guid>https://goneri.lebouder.net/posts/2009/08/nouveau-blog/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2009/08/nouveau-blog/">&lt;p&gt;Après plus d&#x27;une année de réflexion, j&#x27;ai laissé tomber l&#x27;administration de mon propre Wordpress et je ne switcherai finalement pas à pyBlosxon que je trouve un peu juste au niveau interactivité.&lt;&#x2F;p&gt;
&lt;p&gt;Donc finalement me voila chez &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.wordpress.com&quot;&gt;Wordpress.com&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Je vais de nouveau avoir un outil pour raler de façon efficace !&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>S270 Wifi au boot sur Debian Sid</title>
          <pubDate>Sat, 07 Jan 2006 03:11:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2006/01/s270-wifi-au-boot-sur-debian-sid/</link>
          <guid>https://goneri.lebouder.net/posts/2006/01/s270-wifi-au-boot-sur-debian-sid/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2006/01/s270-wifi-au-boot-sur-debian-sid/">&lt;p&gt;Ce soir, j&#x27;ai découvert que pour que les parametres wireless_* du &#x2F;etc&#x2F;network&#x2F;interfaces l&#x27;interface doit déjà être &quot;up&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Voila ce que ça donne :&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;iface eth1 inet dhcp
# j&amp;#39;up l&amp;#39;interface avant tout
pre-up ifconfig eth1 up
wireless_mode managed
wireless_channel 6
wireless_nick clara
wireless_key off
# sinon j&amp;#39;ai des problemes de stablitié du signal
wireles_rate 11M
# essid en dernier !
wireless_essid BZH
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;J&#x27;ai ce problème avec le chipset rt2500, ça mérite surement un rapport de bug :). A étudier…&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Klibido in Sid</title>
          <pubDate>Sun, 18 Sep 2005 14:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/09/klibido-in-sid/</link>
          <guid>https://goneri.lebouder.net/posts/2005/09/klibido-in-sid/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/09/klibido-in-sid/">&lt;p&gt;So, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;packages.debian.org&#x2F;unstable&#x2F;kde&#x2F;klibido&quot;&gt;Klibido 0.2.4.1&lt;&#x2F;a&gt; is the first release to enter in Debian Sid :).&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>klibido</title>
          <pubDate>Sat, 17 Sep 2005 12:11:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/09/klibido/</link>
          <guid>https://goneri.lebouder.net/posts/2005/09/klibido/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/09/klibido/">&lt;p&gt;Yesterday my Sponsor, Neil McGovern, uploaded klibido. That means, if every thing is ok, that klibido will enter Sid quickly.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>klibido 0.2.3.4.1</title>
          <pubDate>Thu, 15 Sep 2005 00:14:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/09/klibido-0-2-3-4-1/</link>
          <guid>https://goneri.lebouder.net/posts/2005/09/klibido-0-2-3-4-1/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/09/klibido-0-2-3-4-1/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;09&#x2F;klibido-0-2-3-4-1&#x2F;klibido-128.png&quot; alt=&quot;klibido-128.png&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Well, tonight a updated &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;klibido.sourceforge.net&#x2F;&quot;&gt;klibido&lt;&#x2F;a&gt; with the last bugs fix release from Bauno.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Sarge user:
Add this line in your &#x2F;etc&#x2F;apt&#x2F;sources.list unless that&#x27;s allready done.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;deb http:&#x2F;&#x2F;orniere-du-globe.net&#x2F;debian&#x2F; .&#x2F;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Sid use:
Add this line:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;deb http:&#x2F;&#x2F;orniere-du-globe.net&#x2F;debian**-sid**&#x2F; .&#x2F;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Then you&#x27;ve just to:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;apt-get update
apt-get install klibido&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Ubuntu users, you&#x27;ll certainly have to rebuild the package. If you do the job, please can you submit a link with a fresh package in the comments.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>klibido 0.2.4</title>
          <pubDate>Sat, 10 Sep 2005 01:01:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/09/klibido-0-2-4/</link>
          <guid>https://goneri.lebouder.net/posts/2005/09/klibido-0-2-4/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/09/klibido-0-2-4/">&lt;p&gt;New klibido release: 0.2.4-1&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;deb http:&#x2F;&#x2F;orniere-du-globe.net&#x2F;debian-sid&#x2F; .&#x2F;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Because of the gcc4 ABI transition, the package is break on Sarge.&lt;&#x2F;p&gt;
&lt;p&gt;Update: Klibido is in Debian Unstable now. Don&#x27;t use this repository anymore.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Debian Sarge</title>
          <pubDate>Sat, 20 Aug 2005 01:43:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/08/debian-sarge/</link>
          <guid>https://goneri.lebouder.net/posts/2005/08/debian-sarge/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/08/debian-sarge/">&lt;p&gt;Je commençais a en avoir marre de la migration vers gcc4 qui se passe en se moment sur Sid. Mon système devenait de plus en plus nonchalant. Je me suis donc installé une Sarge le temps que les choses se calment un peu. C&#x27;est cool de pouvoir faire un «apt-get install gnome kde» sans avoir un troupeau d&#x27;erreur qui pète a la gueule.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;orniere-du-globe.net&#x2F;debian&#x2F;&quot;&gt;Le paquet de klibido&lt;&#x2F;a&gt; ne s&#x27;installe pas sur Sid, je suis au courant. De toutes façons, c&#x27;est l&#x27;ensemble de KDE qui marche sur 3 roues en ce moment. Dès que possible, c&#x27;est a dire lorsque KDE 3.4 sera intégré, je metterai a jour le paquage de klibido pour gcc4 et qu&#x27;il puisse enfin rentrer sur la Sid.&lt;&#x2F;p&gt;
&lt;p&gt;Ce soir, j&#x27;ai corrigé 2 bugs de klibido, maintenant on peut annuler si l&#x27;on a lancé klibido par erreur et que l&#x27;on ne veut pas le configurer. Il ne reste plus qu&#x27;a esperer que Bauno ne le trouve pas trop cracra et l&#x27;accepte :).&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>overclocking</title>
          <pubDate>Sun, 26 Jun 2005 16:56:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/06/overclocking/</link>
          <guid>https://goneri.lebouder.net/posts/2005/06/overclocking/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/06/overclocking/">&lt;p&gt;Avec mon pc qui me rappelle régulièrement qu&#x27;il a très chaud en plantant joyeusement, j&#x27;ai trouvé &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.estvideo.net&#x2F;dew&#x2F;index&#x2F;2005&#x2F;06&#x2F;26&#x2F;463-alerte-a-la-canicule-passage-en-defcon-3&quot;&gt;l&#x27;illustration de ce poste&lt;&#x2F;a&gt; particulièrement marrante :) (&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.estvideo.net&#x2F;dew&#x2F;index&#x2F;&quot;&gt;blog de Dew&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>addimage.py</title>
          <pubDate>Sun, 26 Jun 2005 05:22:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/06/addimage-py/</link>
          <guid>https://goneri.lebouder.net/posts/2005/06/addimage-py/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/06/addimage-py/">&lt;p&gt;Jusque a présent, pour ajouter des photos sur mon blog, je n&#x27;ai qu&#x27;a appeller le fichier avec un script Perl qui se charge de l&#x27;uploader proprement sur le serveur.&lt;&#x2F;p&gt;
&lt;p&gt;Suite au prosélitisme de &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;glibersat.linux62.org&#x2F;&quot;&gt;Dukez&lt;&#x2F;a&gt;, j&#x27;ai fini par vouloir tester le language &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.python.org&#x2F;&quot;&gt;Python&lt;&#x2F;a&gt;, c&#x27;est ainsi que j&#x27;ai refais mon script dans ce language. Le script &lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;06&#x2F;addimage-py&#x2F;addimage.py&quot;&gt;addimage.py&lt;&#x2F;a&gt; est l&#x27;oeuvre d&#x27;un debutant, j&#x27;implore votre indulgence fasse a la qualité du code :|.&lt;&#x2F;p&gt;
&lt;p&gt;Le script se charge de généré une image miniature si l&#x27;on upload une image et qu&#x27;elle est superieur a une certaine taille. Il place les fichiers dans un dossier qui créé en fonction de la date. Par exemple 19810611 pour le 11 Juin 1981. Enfin, a la fin du processus, il affiche le code html qui ne reste plus qu&#x27;a copier-coller.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>klibido 0.2.3-2</title>
          <pubDate>Sat, 25 Jun 2005 00:48:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/06/klibido-0-2-3-2/</link>
          <guid>https://goneri.lebouder.net/posts/2005/06/klibido-0-2-3-2/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/06/klibido-0-2-3-2/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;06&#x2F;klibido-0-2-3-2&#x2F;klibido-128-2.png&quot; alt=&quot;klibido-128-2.png&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve just finish to update the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;klibido.sf.net&#x2F;&quot;&gt;klibido&lt;&#x2F;a&gt; package for Debian. For the moment, it can&#x27;t be upload in the official repository before the end of the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;lists.debian.org&#x2F;debian-devel-announce&#x2F;2005&#x2F;06&#x2F;msg00004.html&quot;&gt;gcc4 ABI transition&lt;&#x2F;a&gt;. The majors changes are the inclusion of Bauno&#x27;s &quot;Please subscribe me!&quot; patch and another patch from Loïc Pefferkorn.&lt;&#x2F;p&gt;
&lt;p&gt;Loïc Pefferkorn decided to package klibido for Ubuntu, since this distribution is based on Debian he asked me for working together. Welcome Loïc !
Tonight i add a patch from him to move the &quot;klibido.desktop&quot; file to a more common place. Thanks ;).&lt;&#x2F;p&gt;
&lt;p&gt;To install klibido on you Debian, please add this lines on your &#x2F;etc&#x2F;apt&#x2F;sources.list file.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;deb http:&#x2F;&#x2F;orniere-du-globe.net&#x2F;debian .&#x2F;
deb-src http:&#x2F;&#x2F;orniere-du-globe.net&#x2F;debian .&#x2F;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Than you have just to update the index and install it.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;apt-get update
apt-get install klibido&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</description>
      </item>
      <item>
          <title>UML avec rootstrap</title>
          <pubDate>Sat, 18 Jun 2005 00:16:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/06/uml-avec-rootstrap/</link>
          <guid>https://goneri.lebouder.net/posts/2005/06/uml-avec-rootstrap/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/06/uml-avec-rootstrap/">&lt;h2 id=&quot;introduction&quot;&gt;Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;Depuis, quelques temps, je voulais pouvoir m&#x27;installer une &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ubuntulinux.org&#x2F;&quot;&gt;Ubuntu&lt;&#x2F;a&gt; et une &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;fr.wikipedia.org&#x2F;wiki&#x2F;Debian&quot;&gt;Debian&lt;&#x2F;a&gt; Sarge afin de pouvoir mieux vérifier les paquages de &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;klibido.sourceforge.net&#x2F;&quot;&gt;Klibido&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.sukria.net&#x2F;fr&#x2F;&quot;&gt;Sukria&lt;&#x2F;a&gt; m&#x27;avait expliqué qu&#x27;il utilisait &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;linux-vserver.org&#x2F;&quot;&gt;vserver&lt;&#x2F;a&gt; pour avoir un système virtuel tous en gardant de très bonne performance. Je pensais aussi a Xen Linux qui permet plus ou moins la même chose. Ce qui m&#x27;a découragé, c&#x27;est que dans les deux cas, il faut recompiler la kernellette et j&#x27;ai un chipset IT8212 qui n&#x27;est supporté que dans les branche -ac et -mm du Kernel, or, j&#x27;ai clairement la flemme de me prendre la tête a repasser sur un kernel &quot;officiel&quot; pour ensuite le patcher.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deploiment&quot;&gt;Déploiment&lt;&#x2F;h2&gt;
&lt;p&gt;Donc me voila parti sur &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;usermodelinux.org&#x2F;&quot;&gt;UserModeLinux&lt;&#x2F;a&gt; (UML) qui est certe plus lent, mais qui marche très bien sur un kernel classique. Pour l&#x27;installation de la partition, j&#x27;ai utilisé rootstrap.&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install rootstrap user-mode-linux
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;La configuration est dans &#x2F;etc&#x2F;rootstrap&#x2F;rootstrap.conf&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;[global]
fstype=ext2
initialsize=2048
freespace=0
modules=network mkfs mount debian uml umount
PATH=&#x2F;bin:&#x2F;sbin:&#x2F;usr&#x2F;bin:&#x2F;usr&#x2F;sbin

[network]
hostname=sarge
interface=eth0
transport=tuntap
host=192.168.0.69
uml=192.168.0.15
nameserver=213.228.0.95
gateway=192.168.0.1
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</description>
      </item>
      <item>
          <title>Klibido dans Debian</title>
          <pubDate>Fri, 17 Jun 2005 23:56:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/06/klibido-dans-debian/</link>
          <guid>https://goneri.lebouder.net/posts/2005/06/klibido-dans-debian/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/06/klibido-dans-debian/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;06&#x2F;klibido-dans-debian&#x2F;debian.orig.png&quot; alt=&quot;logo Debian&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Aujourd&#x27;hui, Neil McGovern, mon sponsor Debian a uploader klibido dans la distribution Debian Sid, le pocessus prend quelques jours et normalement d&#x27;ici le milieu de la semaine prochaine, le paquage devrait être disponible pour tous le monde.&lt;&#x2F;p&gt;
&lt;p&gt;Donc, voila, si tous se passe bien, d&#x27;ici la fin de la semaine prochaine je serai officiellement maintenant Debian \o&#x2F;, a moi les bimbos nues ! Au passage, merci &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.sukria.net&#x2F;fr&#x2F;&quot;&gt;Alexis&lt;&#x2F;a&gt; pour ton aide ;).&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Tunning</title>
          <pubDate>Sat, 04 Jun 2005 11:35:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/06/tunning/</link>
          <guid>https://goneri.lebouder.net/posts/2005/06/tunning/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/06/tunning/">&lt;p&gt;Je me suis un peu amusé a bidouillé mon interface.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;06&#x2F;tunning&#x2F;screenshot_Juin2005.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;06&#x2F;tunning&#x2F;screenshot_Juin2005_mini.png&quot; alt=&quot;screenshot_Juin2005_mini.png&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>DotClear Vs Wordpress</title>
          <pubDate>Tue, 31 May 2005 17:45:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/05/dotclear-vs-wordpress/</link>
          <guid>https://goneri.lebouder.net/posts/2005/05/dotclear-vs-wordpress/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/05/dotclear-vs-wordpress/">&lt;p&gt;Finalement, après quelques heures d&#x27;utilisation, j&#x27;ai prit la décision de revenir à Wordpress. Le problème qui m&#x27;a fait changer d&#x27;avis est que les liens qui pointes sur mes pages statiques générées par Wordpress font tomber dans le vide intersidéral du Ouaïb ! Et ça, c&#x27;est inacceptable !&lt;&#x2F;p&gt;
&lt;p&gt;D&#x27;un autre coté je suis vraiment contant de DotClear et en particulier de la vitesse d&#x27;affichage. Maintenant que je sais que l&#x27;on peut basculer assez facilement, je tâcherais de switcher lorsque j&#x27;aurais trouvé une solution.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>MSN search</title>
          <pubDate>Tue, 31 May 2005 17:26:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/05/msn-search/</link>
          <guid>https://goneri.lebouder.net/posts/2005/05/msn-search/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/05/msn-search/">&lt;p&gt;Depuis quelques mois déjà, j&#x27;utilise &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;extensions&#x2F;moreinfo.php?application=firefox&amp;amp;version=1.0&amp;amp;os=Windows&amp;amp;numpg=10&amp;amp;id=189&quot;&gt;une extension pour Firefox&lt;&#x2F;a&gt; qui permet d&#x27;avoir une miniature de chaques pages que listé dans les résultats de Google. C&#x27;est très pratique lorsque on est a la recherche d&#x27;un site que l&#x27;on a fermé trop vite et que l&#x27;on n&#x27;a qu&#x27;un vague souvenir de sa charte graphique...&lt;&#x2F;p&gt;
&lt;p&gt;MSN sembe s&#x27;y &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;sea.search.fr.msn.ch&#x2F;sphome.aspx&quot;&gt;être mis aussi&lt;&#x2F;a&gt;, il est maintenant possible d&#x27;avoir une miniature du site a coté de la recherche. Pour le moment la feature n&#x27;est pas utilisé sur le site principal. C&#x27;est curieux de voir que lorsque Microsft n&#x27;a pas le monomple, il cherche a inover.&lt;&#x2F;p&gt;
&lt;p&gt;Il ne reste plus qu&#x27;a espérer que Google intègre directement dans son moteur cette option.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>DotClear</title>
          <pubDate>Tue, 31 May 2005 17:24:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/05/dotclear/</link>
          <guid>https://goneri.lebouder.net/posts/2005/05/dotclear/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/05/dotclear/">&lt;p&gt;Ce soir, je voulais mettre à jour mon &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;wordpress.org&#x2F;&quot;&gt;Wordpress&lt;&#x2F;a&gt; pour corriger les derniers problèmes de sécurités. Au final, me voila avec un &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.dotclear.net&#x2F;&quot;&gt;DotClear&lt;&#x2F;a&gt; tous neuf :).&lt;&#x2F;p&gt;
&lt;p&gt;La migration c&#x27;est bien passé à l&#x27;exeption d&#x27;un probleme d&#x27;id pour la catégorie «Générale».&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Mainactor 5.5</title>
          <pubDate>Tue, 10 May 2005 01:24:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://goneri.lebouder.net/posts/2005/05/mainactor-5-5/</link>
          <guid>https://goneri.lebouder.net/posts/2005/05/mainactor-5-5/</guid>
          <description xml:base="https://goneri.lebouder.net/posts/2005/05/mainactor-5-5/">&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;05&#x2F;mainactor-5-5&#x2F;mainactor.png&quot;&gt;&lt;img src=&quot;https:&#x2F;&#x2F;goneri.lebouder.net&#x2F;posts&#x2F;2005&#x2F;05&#x2F;mainactor-5-5&#x2F;mainactorpiti.png&quot; alt=&quot;screenshot&quot; &#x2F;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;La société allemande &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.mainconcept.com&#x2F;&quot;&gt;Mainconcept&lt;&#x2F;a&gt; a décidé de sortir Mainactor 5.5 pour Linux. Cette sortie a été faite avant celle pour Windows. Surement une façon pour eux de se faire la publicité facilement (la preuve) en faisant parler d&#x27;eux et de tester leur nouveau logiciel de montage vidéo sur une base plus réduite d&#x27;utilisateurs.&lt;&#x2F;p&gt;
&lt;p&gt;Je viens d&#x27;essayer le logiciel, c&#x27;est la première fos que j&#x27;arrive a monter facilement un petit film sous Linux. Jusque a présent les logiciels que j&#x27;avais essayé m&#x27;imposait soit le DV ou des formats obscures pour moi, pauvre nOob de la vidéo :). Durant mon teste, je n&#x27;ai rencontré qu&#x27;un petit couâk. Un plantage durant un &quot;Undo&quot;. Lorsque j&#x27;ai relancé le logiciel, il a restauré proprement le fichier lui même. Globalement, je reste sur une très bonne impression.&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
