<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>eulinux</title><link href="http://blog.eulinux.org/" rel="alternate"></link><link href="http://blog.eulinux.org/feeds/all.atom.xml" rel="self"></link><id>http://blog.eulinux.org/</id><updated>2020-10-26T00:00:00+01:00</updated><entry><title>Gather metrics from a Dutch smart meter via hass &amp; usb2net</title><link href="http://blog.eulinux.org/2020/10/homeassistant-p1-slimme-meter.html" rel="alternate"></link><published>2020-10-26T00:00:00+01:00</published><updated>2020-10-26T00:00:00+01:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2020-10-26:/2020/10/homeassistant-p1-slimme-meter.html</id><summary type="html">&lt;h2&gt;Preface&lt;/h2&gt;
&lt;p&gt;Modern electricity/gas meters in the Netherlands support the so-called DSMR standard(is it even a standard?), also known
as &lt;em&gt;Slimme meter&lt;/em&gt;, or &lt;em&gt;P1 poort&lt;/em&gt;. One can easily find a FTDI-based "P1 cable" in many on-line Dutch shops (will not link to a
particular one but a quick internet …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;Preface&lt;/h2&gt;
&lt;p&gt;Modern electricity/gas meters in the Netherlands support the so-called DSMR standard(is it even a standard?), also known
as &lt;em&gt;Slimme meter&lt;/em&gt;, or &lt;em&gt;P1 poort&lt;/em&gt;. One can easily find a FTDI-based "P1 cable" in many on-line Dutch shops (will not link to a
particular one but a quick internet search on "P1 cable" or "P1 slimme meter kabel" will return more than enough results).&lt;/p&gt;
&lt;h2&gt;Collecting data&lt;/h2&gt;
&lt;p&gt;To collect the data from your meter, you would use this "USB-to-P1 cable" (for the lack of a better name), and some software, e.g
&lt;a href="https://dsmr-reader.readthedocs.io/en/v4/"&gt;DSMR reader&lt;/a&gt;, or &lt;a href="https://www.home-assistant.io/"&gt;HomeAssistant&lt;/a&gt; (see
the &lt;a href="https://www.home-assistant.io/integrations/dsmr/"&gt;DSMR integration&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Since my home lab is nowhere close to the "meterkast", I would have needed a really long USB cable... Instead, we can fix
this with science! A quick search through my modest hardware pile produced a Raspberry Pi 1 (the original!), a short network cable,
an SD card and a pl2303-based USB to TTL adapter (see &lt;a href="http://blog.eulinux.org/2020/10/raspberry-pi-serial-console.html"&gt;Serial console on a Raspberry Pi&lt;/a&gt;), and the idea
to use &lt;a href="http://ser2net.sourceforge.net/"&gt;ser2net&lt;/a&gt; emerged, as the dsmr reader integration supports it.&lt;/p&gt;
&lt;h2&gt;Here comes OpenWRT&lt;/h2&gt;
&lt;p&gt;Raspbian or anything as heavy as that would be overweight for this old board, so I went for &lt;a href="https://openwrt.org"&gt;OpenWRT&lt;/a&gt;, really lightweight (the
final install uses around 14MB), and easy to configure.&lt;/p&gt;
&lt;p&gt;I followed the official &lt;a href="https://openwrt.org/toh/raspberry_pi_foundation/raspberry_pi"&gt;OpenWRT on Raspberry Pi&lt;/a&gt; docs for the installation, and performed
the initial configuration (network, root password, etc) via the serial console. After making sure that the system can be reached via ssh, I moved
it next to the smart meter.&lt;/p&gt;
&lt;p&gt;To use the FTDI adapter, and ser2net, we need to install some prerequisites first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;opkg update
opkg install ser2net
opkg install kmod-usb-serial-ftdi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;There's already a (disabled) &lt;code&gt;ser2net&lt;/code&gt; config for &lt;code&gt;ttyUSB0&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;5001&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;telnet&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/dev/ttyUSB0&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;baudrate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;115200&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;databits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;8&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;none&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stopbits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The ser2net proxy has been enabled, and some serial parameters had to be changed as my meter is an Iskra which uses the 2.2 version of DSMR::&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;raw&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;baudrate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9600&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;even&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;@proxy&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;databits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@OpenWrt&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ser2net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;telnet&lt;/code&gt; can be used to validate that this actually works (a "&lt;code&gt;telnet &amp;lt;ip&amp;gt; 5001&lt;/code&gt;" would return several lines of data every 10 seconds).&lt;/p&gt;
&lt;p&gt;At this point, I could follow the &lt;a href="https://www.home-assistant.io/integrations/dsmr/"&gt;DSMR integration&lt;/a&gt; docs to add the meter to HomeAssistant.&lt;/p&gt;
&lt;h2&gt;Bonus: prometheus metrics&lt;/h2&gt;
&lt;p&gt;HomeAssistant has a &lt;a href="https://www.home-assistant.io/integrations/prometheus/"&gt;Prometheus integration&lt;/a&gt;. Short config excerpt for exporting only the DSMR metrics to prometheus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; configuration.yaml
prometheus:
  namespace: hass
  filter:
    include_entity_globs:
      &lt;span class="k"&gt;-&lt;/span&gt; sensor.energy_*
      &lt;span class="k"&gt;-&lt;/span&gt; sensor.gas_*
      &lt;span class="k"&gt;-&lt;/span&gt; sensor.power_consumption
      &lt;span class="k"&gt;-&lt;/span&gt; sensor.power_production
      &lt;span class="k"&gt;-&lt;/span&gt; sensor.power_tariff
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Bonus: prometheus metrics take 2&lt;/h2&gt;
&lt;p&gt;It looks like there's even a prometheus-node-exporter clone in OpenWRT, that can provide a bunch of system metrics (if you're running Prometheus for your
network monitoring of course):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;opkg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exporter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lua&lt;/span&gt;
&lt;span class="n"&gt;uci&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exporter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lua&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;listen_interface&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lan&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prometheus&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exporter&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lua&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="raspberrypi"></category><category term="pi"></category><category term="homeassistant"></category><category term="DSMR"></category></entry><entry><title>Serial console on a Raspberry Pi</title><link href="http://blog.eulinux.org/2020/10/raspberry-pi-serial-console.html" rel="alternate"></link><published>2020-10-25T00:00:00+02:00</published><updated>2020-10-25T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2020-10-25:/2020/10/raspberry-pi-serial-console.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Tested on: Raspberry Pi 1, model A+, Raspberry Pi 1 model B&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To enable a login serial console on your RaspberryPi running Alpine Linux, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;echo &amp;quot;ttyAMA0::respawn:/sbin/getty -L ttyAMA0 115200 vt100&amp;quot; &amp;gt;&amp;gt; /etc/inittab
echo &amp;quot;ttyAMA0&amp;quot; &amp;gt;&amp;gt; /etc/securetty
lbu commit -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A USB-to-TTL cable will be required, I've …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Tested on: Raspberry Pi 1, model A+, Raspberry Pi 1 model B&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To enable a login serial console on your RaspberryPi running Alpine Linux, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;echo &amp;quot;ttyAMA0::respawn:/sbin/getty -L ttyAMA0 115200 vt100&amp;quot; &amp;gt;&amp;gt; /etc/inittab
echo &amp;quot;ttyAMA0&amp;quot; &amp;gt;&amp;gt; /etc/securetty
lbu commit -d
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A USB-to-TTL cable will be required, I've used some no-name, pl2303-based cable that came with one of my Rasbperry Pi orders.
The following pins have to be connected (see the &lt;a href="https://www.raspberrypi.org/documentation/usage/gpio/"&gt;official pinout documentation&lt;/a&gt; ):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GND (usually black) to 'Ground' (3nd pin from the top)&lt;/li&gt;
&lt;li&gt;RX (white?) to TXD (GPIO 14), 4th pin&lt;/li&gt;
&lt;li&gt;TX (green?) to RXD (GPIO 15), 5th pin&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My cable also has a 5V wire (red), that can be used to provide power to the Raspberry board via the first pin on the GPIO header, but only for the low
power boards like the Zero, or the A+ (not 3A+, but &lt;a href="https://raspberrypi.org/products/raspberry-pi-1-model-a-plus/"&gt;the original 1A+&lt;/a&gt;. If your board
is powered in a 'traditional' way (via the microUSB socket), &lt;strong&gt;DO NOT&lt;/strong&gt; connect the 5V line, you might (and probably will) fry something.&lt;/p&gt;
&lt;p&gt;If the board boots up successfully, you can attach to the serial console by running, e.g, &lt;code&gt;screen /dev/ttyUSB0 115200&lt;/code&gt; (provided that your pl2303 cable
is at &lt;code&gt;/dev/ttyUSB0&lt;/code&gt;)&lt;/p&gt;</content><category term="blog"></category><category term="raspberrypi"></category><category term="pi"></category><category term="serial"></category><category term="console"></category></entry><entry><title>Serial console access to MikroTik devices</title><link href="http://blog.eulinux.org/2020/03/mikrotik-serial-console.html" rel="alternate"></link><published>2020-03-15T00:00:00+01:00</published><updated>2020-03-15T00:00:00+01:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2020-03-15:/2020/03/mikrotik-serial-console.html</id><content type="html">&lt;h2&gt;RB2011&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Baud rate: 115200
Data bits: 8
Parity: none
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;A standard Cisco/Arista-compatible rj45 console cable should just work™&lt;/p&gt;</content><category term="blog"></category><category term="mikrotik"></category><category term="serial"></category><category term="network"></category></entry><entry><title>Backup mikrotik router configs with rancid</title><link href="http://blog.eulinux.org/2020/02/rancid-mikrotik.html" rel="alternate"></link><published>2020-02-08T00:00:00+01:00</published><updated>2020-02-08T00:00:00+01:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2020-02-08:/2020/02/rancid-mikrotik.html</id><summary type="html">&lt;p&gt;Ok, I've had this running for years now, so this is mostly a 'do not forget' note-to-self.
&lt;a href="https://www.shrubbery.net/rancid/"&gt;Rancid&lt;/a&gt; supports backing up &lt;a href="https://mikrotik.com/"&gt;MikroTik&lt;/a&gt; RouterOS configuration.&lt;/p&gt;
&lt;p&gt;Add a readonly user to your RouterOS device:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;rancid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;huwakui5phiiVahnuecheiri&lt;/span&gt;
#&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;random&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add the user …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ok, I've had this running for years now, so this is mostly a 'do not forget' note-to-self.
&lt;a href="https://www.shrubbery.net/rancid/"&gt;Rancid&lt;/a&gt; supports backing up &lt;a href="https://mikrotik.com/"&gt;MikroTik&lt;/a&gt; RouterOS configuration.&lt;/p&gt;
&lt;p&gt;Add a readonly user to your RouterOS device:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;add&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;read&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;rancid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;huwakui5phiiVahnuecheiri&lt;/span&gt;
#&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;long&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;random&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add the user/password to your &lt;a href="https://www.shrubbery.net/rancid/man/cloginrc.5.html"&gt;.cloginrc&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;add user 10.0.0.1 rancid
add noenable 10.0.0.1 1
add password 10.0.0.1 huwakui5phiiVahnuecheiri
add method 10.0.0.1 ssh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;... and add the router to &lt;a href="https://www.shrubbery.net/rancid/man/router.db.5.html"&gt;router.db&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;10.0.0.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;mikrotik&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="rancid"></category><category term="mikrotik"></category></entry><entry><title>Manipulating yaml data on the CLI</title><link href="http://blog.eulinux.org/2019/10/yaml-cli.html" rel="alternate"></link><published>2019-10-06T00:00:00+02:00</published><updated>2019-10-06T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2019-10-06:/2019/10/yaml-cli.html</id><content type="html">&lt;p&gt;If you have &lt;code&gt;ruby&lt;/code&gt; and &lt;code&gt;jq&lt;/code&gt; installed, it's as easy as adding a function to your &lt;code&gt;~/.bashrc&lt;/code&gt; (or &lt;code&gt;.kshrc&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;yaml2json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ruby&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ryaml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rjson&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="s"&gt;&amp;#39;puts JSON.pretty_generate(YAML.load(ARGF))&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And then &lt;code&gt;yaml2json document.yaml|jq ...&lt;/code&gt;&lt;/p&gt;</content><category term="blog"></category><category term="yaml"></category><category term="ruby"></category><category term="cli"></category></entry><entry><title>Make your scripts better with shellcheck</title><link href="http://blog.eulinux.org/2019/09/shellcheck.html" rel="alternate"></link><published>2019-09-18T00:00:00+02:00</published><updated>2019-09-18T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2019-09-18:/2019/09/shellcheck.html</id><summary type="html">&lt;p&gt;Being a system engineer (or a fan of a UNIX-like OS) would most certainly mean that one is also writing shell
scripts. If this is a daily thing, a pattern has probably emerged in the way the scripts are written, a certain
style is used in all those scripts. This …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Being a system engineer (or a fan of a UNIX-like OS) would most certainly mean that one is also writing shell
scripts. If this is a daily thing, a pattern has probably emerged in the way the scripts are written, a certain
style is used in all those scripts. This does not necessarily mean that the style is good (how to define &lt;em&gt;good&lt;/em&gt;?)
or that the scripts are completely correct and portable.&lt;/p&gt;
&lt;p&gt;Many programming languages have their own style and syntax check tools (the interpreter or compiler itself could
serve as the ultimate validator, but some mistakes in the code might not make the script invalid, and only alter
it's behavior and make it work in unintended ways).&lt;/p&gt;
&lt;p&gt;Luckily, a similar tool &lt;a href="https://www.shellcheck.net"&gt;exists&lt;/a&gt; for shell scripts as well.&lt;/p&gt;
&lt;p&gt;Please use it, it will help you write portable scripts and spot issues that might only happen in odd an inappropriate
moments. Just think about adding an extra space in the wrong place of a full path:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# rm -rf / tmp/bla
         ^^^
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;... or using an undefined variable in a similar statement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;#&lt;span class="w"&gt; &lt;/span&gt;rm&lt;span class="w"&gt; &lt;/span&gt;-rf&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;mypath&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;/*
#&lt;span class="w"&gt;           &lt;/span&gt;^^-&lt;span class="w"&gt; &lt;/span&gt;what&lt;span class="w"&gt; &lt;/span&gt;if&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;is&lt;span class="w"&gt; &lt;/span&gt;undefined?
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;... or using relative paths and launching your script in the wrong directory?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; rm -rf *
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;BTW, &lt;code&gt;shellcheck&lt;/code&gt; is available on OpenBSD as well, as a package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;doas pkg_add shellcheck
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="shell"></category><category term="shellcheck"></category><category term="scripting"></category></entry><entry><title>In search of the perfect browser</title><link href="http://blog.eulinux.org/2018/12/perfect-browser.html" rel="alternate"></link><published>2018-12-03T00:00:00+01:00</published><updated>2018-12-03T00:00:00+01:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2018-12-03:/2018/12/perfect-browser.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Please take this with a grain of salt, this is not a real technical article. Consider it a 'rant about browsers'&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Modern day browsers are, in general, &lt;strikethrough&gt;steaming piles\^W\^W&lt;/strikethrough&gt; almost full operating systems. You can even emulate x86
hardware in the browser (e.g: &lt;a href="https://github.com/asmblah/jemul8"&gt;jemul8&lt;/a&gt;). This is not …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Please take this with a grain of salt, this is not a real technical article. Consider it a 'rant about browsers'&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Modern day browsers are, in general, &lt;strikethrough&gt;steaming piles\^W\^W&lt;/strikethrough&gt; almost full operating systems. You can even emulate x86
hardware in the browser (e.g: &lt;a href="https://github.com/asmblah/jemul8"&gt;jemul8&lt;/a&gt;). This is not completely the web browsers'
'fault', it's more like the WWW lost it's initial meaning (see the
&lt;a href="https://www.w3.org/TR/webarch/#intro"&gt;Architecture of the World Wide Web, Volume One&lt;/a&gt; introduction).&lt;/p&gt;
&lt;p&gt;Disregard the 'steaming pile' above, at least the mainstream browsers out there are some rather advanced pieces
of technology. But as they say, with great complexity comes great responsibility. There are so many aspects that
are quite tricky (if we're talking about security). I'm not even talking about various tracking mechanisms built into
some browsers (this is more about privacy than security though).&lt;/p&gt;
&lt;p&gt;Also, to prevent complexity from getting in the way, one needs a lot of processing power for a pleasant interaction
with the browser.&lt;/p&gt;
&lt;p&gt;Going back to the title: I still didn't find a perfect browser (by 'perfect', I mean something that would suit my
needs, and not frustrate me at the same time).&lt;/p&gt;
&lt;p&gt;Some of the requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;secure&lt;/li&gt;
&lt;li&gt;fast&lt;/li&gt;
&lt;li&gt;reasonable resource usage (doesn't need a octa-core system with 32G of ram, just to open a web page)&lt;/li&gt;
&lt;li&gt;configurable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try running Firefox/Chromium on an old Atom-based single-core netbook. It will work, but makes you want to smash that
poor thing against the wall, if all you need is a quick web search for a 'chili con carne' recipe.&lt;/p&gt;
&lt;p&gt;I've been using &lt;a href="https://iridiumbrowser.de/"&gt;Iridium&lt;/a&gt; for quite a while, but still not completely satisfied with it.&lt;/p&gt;
&lt;p&gt;Of course, there are always things like &lt;a href="http://w3m.sourceforge.net/"&gt;w3m&lt;/a&gt; which is close to obsolete,
last release was somewhere around 2011 (I still use it as a html previewer with mutt), or 
&lt;a href="http://lynx.browser.org/"&gt;lynx&lt;/a&gt; (using it for visiting &lt;a href="https://en.wikipedia.org/wiki/Gopher_(protocol)"&gt;gopher&lt;/a&gt;
'sites'), or &lt;a href="http://links.twibright.com/"&gt;links2&lt;/a&gt; which even has graphics support.&lt;/p&gt;
&lt;p&gt;Recently I've rediscovered &lt;a href="https://fanglingsu.github.io/vimb/"&gt;vimb&lt;/a&gt;, thanks to
&lt;a href="https://old.reddit.com/r/openbsd/comments/a2p2gk/openbsd_desktop_for_minimalists/eb02kap/"&gt;this thread on reddit&lt;/a&gt;.
For sure it is fast, and doesn't use too many resources (with JS off). Can't make a statement about how secure it is
though. As secure as WebKit gets, I assume.&lt;/p&gt;</content><category term="blog"></category><category term="openbsd"></category><category term="browser"></category><category term="vimb"></category><category term="iridium"></category></entry><entry><title>Do you really need a fancy terminal emulator?</title><link href="http://blog.eulinux.org/2018/08/perfect-terminal-emulator.html" rel="alternate"></link><published>2018-08-11T00:00:00+02:00</published><updated>2018-08-11T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2018-08-11:/2018/08/perfect-terminal-emulator.html</id><summary type="html">&lt;p&gt;Over the years I've been using multiple Linux distros, and was always trying new 
terminal emulators. Each of them comes with a bunch of eye-candy features, and
it's too hard to settle on one of them.&lt;/p&gt;
&lt;p&gt;Just try running &lt;strong&gt;&lt;code&gt;pacman -Ss terminal emulator&lt;/code&gt;&lt;/strong&gt; (if you're on
&lt;a href="https://www.archlinux.org/"&gt;Arch&lt;/a&gt; of course. Otherwise …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Over the years I've been using multiple Linux distros, and was always trying new 
terminal emulators. Each of them comes with a bunch of eye-candy features, and
it's too hard to settle on one of them.&lt;/p&gt;
&lt;p&gt;Just try running &lt;strong&gt;&lt;code&gt;pacman -Ss terminal emulator&lt;/code&gt;&lt;/strong&gt; (if you're on
&lt;a href="https://www.archlinux.org/"&gt;Arch&lt;/a&gt; of course. Otherwise use your favourite
package manager.
)
What one should actually do, is ask oneself, "Do I really need a fancy terminal
emulator?"&lt;/p&gt;
&lt;p&gt;After switching to OpenBSD, I settled on &lt;a href="https://man.openbsd.org/xterm"&gt;xterm&lt;/a&gt;.
Now whenever I'm on Linux, I use xterm as well.&lt;/p&gt;
&lt;p&gt;It's light, it's simple, it's in &lt;code&gt;base&lt;/code&gt; in OpenBSD. Since quite a while it also
supports utf8.&lt;/p&gt;
&lt;p&gt;It's easy to configure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nl"&gt;Xresources:&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;font:&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xos4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;terminus&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;medium&lt;/span&gt;&lt;span class="o"&gt;-*-*-*-&lt;/span&gt;&lt;span class="mh"&gt;14&lt;/span&gt;&lt;span class="o"&gt;-*-*-*-*-*-*-*&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;dynamicColors:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;utf8:&lt;/span&gt;&lt;span class="w"&gt;             &lt;/span&gt;&lt;span class="mh"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;eightBitInput:&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;scrollBar:&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;loginShell:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;true&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;background:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;black&lt;/span&gt;
&lt;span class="n"&gt;XTerm&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nl"&gt;foreground:&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;green&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Some additional tips:
Define custom actions for specific key combinations, in this example - zoom in/out&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;xterm*VT100.Translations: #override \
    Ctrl &amp;lt;Key&amp;gt; minus: smaller-vt-font() \n\
    Ctrl &amp;lt;Key&amp;gt; plus: larger-vt-font() \n\
    Ctrl &amp;lt;Key&amp;gt; 0: set-vt-font(d)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Define custom sizes for the VT font:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;! VT Font Menu: Unreadable
xterm*faceSize1: 8
! VT font menu: Tiny
xterm*faceSize2: 10
! VT font menu: Medium
xterm*faceSize3: 12
! VT font menu: Large
xterm*faceSize4: 16
! VT font menu: Huge
xterm*faceSize5: 22
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="openbsd"></category><category term="linux"></category><category term="xterm"></category></entry><entry><title>httpd/relayd behind a reverse proxy on OpenBSD</title><link href="http://blog.eulinux.org/2018/07/httpd-relayd.html" rel="alternate"></link><published>2018-07-30T00:00:00+02:00</published><updated>2018-07-30T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2018-07-30:/2018/07/httpd-relayd.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Tested on: OpenBSD 6.4 - 6.6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I'm moving some of my homelab infrastructure to &lt;a href="https://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt;,
and in the meantime I have to use &lt;a href="https://man.openbsd.org/httpd.8"&gt;httpd(8)&lt;/a&gt; 
behind a reverse proxy.
Issue being: &lt;code&gt;httpd&lt;/code&gt; doesn't support extracting the real IP address from headers 
like &lt;code&gt;X-Forwarded-for&lt;/code&gt;, and you can't really log the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Tested on: OpenBSD 6.4 - 6.6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I'm moving some of my homelab infrastructure to &lt;a href="https://www.openbsd.org/"&gt;OpenBSD&lt;/a&gt;,
and in the meantime I have to use &lt;a href="https://man.openbsd.org/httpd.8"&gt;httpd(8)&lt;/a&gt; 
behind a reverse proxy.
Issue being: &lt;code&gt;httpd&lt;/code&gt; doesn't support extracting the real IP address from headers 
like &lt;code&gt;X-Forwarded-for&lt;/code&gt;, and you can't really log the actual IP of the client.
Granted, I was in control of my reverse-proxy so I could log the info there, but
we can make a nice learning experience out of this 'issue'.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://man.openbsd.org/relayd.8"&gt;relayd(8)&lt;/a&gt; to the rescue!&lt;/p&gt;
&lt;p&gt;Since the &lt;code&gt;httpd&lt;/code&gt;'s log format cannot be changed, we can stick &lt;code&gt;relayd&lt;/code&gt; in front
of it and use it to log the data we need (see
&lt;a href="https://man.openbsd.org/relayd.conf.5"&gt;relayd.conf(5)&lt;/a&gt; for more details).
The &lt;code&gt;match ... log&lt;/code&gt; directives can be used to add additional fields to the log.
In this case I wanted to log the Host, Referer, User agent, and reverse proxy
IP. And since relayd only logs connection details by default, I added th url as
well:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    webhost=&amp;quot;127.0.0.1&amp;quot;
    web_port=&amp;quot;80&amp;quot;
    table &amp;lt;webhosts&amp;gt; {$webhost}

    log state changes
    log connection

    http protocol &amp;quot;httpfilter&amp;quot; {

        # Add custom fields to the log:
        match header log &amp;quot;Host&amp;quot;
        match header log &amp;quot;X-Forwarded-For&amp;quot;
        match header log &amp;quot;User-Agent&amp;quot;
        match url log
        match header log &amp;quot;Referer&amp;quot;

        match request header &amp;quot;Host&amp;quot; value &amp;quot;example.com&amp;quot; forward to &amp;lt;webhosts&amp;gt;
    }

    relay &amp;quot;http&amp;quot; {
        listen on 0.0.0.0 port 80
        protocol &amp;quot;httpfilter&amp;quot;
        forward to &amp;lt;webhosts&amp;gt; port $web_port check tcp interval 60
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;httpd&lt;/code&gt; will of course only see (and log) '127.0.0.1' as the remote host,
although &lt;code&gt;relayd&lt;/code&gt; will happily log everything:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;Aug&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;48&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;puffy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;relayd&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;46936&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;relay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;session&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;27&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;active&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;80&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;done&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;example.com&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="na"&gt;-Forwarded-For&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.10.4.1&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="na"&gt;-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Mozilla&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;5.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;X11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Linux&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;x86_64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AppleWebKit&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;537.36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;KHTML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Gecko&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;67.0.3396.99&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Safari&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;537.36&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;example.com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GET&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;Aug&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;33&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;puffy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;relayd&lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;19347&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;relay&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;http&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;session&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;29&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;active&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;10&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;80&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;done&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;example.com&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="na"&gt;-Forwarded-For&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;181.101&lt;/span&gt;&lt;span class="bp"&gt;.&lt;/span&gt;&lt;span class="nx nx-Member"&gt;XXX.XXX&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="na"&gt;-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Mozilla&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;5.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Macintosh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Intel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Mac&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;OS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;X&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_12_6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;AppleWebKit&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;537.36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;KHTML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;like&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Gecko&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Chrome&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;68.0.3440.75&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Safari&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;537.36&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;example.com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;GET&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In this case &lt;strong&gt;&lt;code&gt;10.10.4.200&lt;/code&gt;&lt;/strong&gt; is the reverse proxy, &lt;strong&gt;&lt;code&gt;10.10.4.1&lt;/code&gt;&lt;/strong&gt; is the local gateway doing hairpin nat for another local network (more about this - maybe later).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Since OpenBSD 6.6 httpd supports a new log format (&lt;code&gt;forwarded&lt;/code&gt;) so relayd is technically not required (if this is it's only purpose).&lt;/p&gt;
&lt;p&gt;So, go to your &lt;a href="https://man.openbsd.org/httpd.conf.5"&gt;httpd.conf(5)&lt;/a&gt; and replace:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;log style common
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;log style forwarded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="openbsd"></category><category term="httpd"></category><category term="relayd"></category></entry><entry><title>Running OpenBSD on a Hetzner.de server</title><link href="http://blog.eulinux.org/2018/07/hetzner-install.html" rel="alternate"></link><published>2018-07-10T00:00:00+02:00</published><updated>2018-07-10T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2018-07-10:/2018/07/hetzner-install.html</id><summary type="html">&lt;p&gt;&lt;em&gt;Disclaimer&lt;/em&gt;: I'm not running any servers at Hetzner currently, and cannot give
you any recommendations over the quality of their services.&lt;/p&gt;
&lt;p&gt;You know you just can't pass those cheap hetzner dedicated servers. I mean,
come on, EUR24/month for your own dedi? Sign me up!&lt;/p&gt;
&lt;p&gt;There's only one problem with …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Disclaimer&lt;/em&gt;: I'm not running any servers at Hetzner currently, and cannot give
you any recommendations over the quality of their services.&lt;/p&gt;
&lt;p&gt;You know you just can't pass those cheap hetzner dedicated servers. I mean,
come on, EUR24/month for your own dedi? Sign me up!&lt;/p&gt;
&lt;p&gt;There's only one problem with Hetzner: you can only choose from some predefined
OSs, and you need to jump through hoops if you want a custom install.&lt;/p&gt;
&lt;p&gt;I wanted to run &lt;a href="https://openbsd.org"&gt;OpenBSD&lt;/a&gt;, and of course there's no OS image
available. Now, there are two options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;request a kvm so you could mount your own .iso file, and do a custom install (but that will require you to talk to support,
and you only get the kvm console for a few hours), or:&lt;/li&gt;
&lt;li&gt;hack it in using the rescue console and qemu ;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First of all, you will need an install image that has the serial console enabled.
On your OpenBSD machine (you're already running OpenBSD, right? ;),
&lt;a href="https://www.openbsd.org/faq/faq4.html#Download"&gt;download&lt;/a&gt; the latest installXX.fs
(minirootXX.fs will do, too). Then, you need to modify &lt;code&gt;boot.conf&lt;/code&gt; inside the install image.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    vnconfig -c vnd0 install63.fs
    mount /dev/vnd0a /mnt/
    echo &amp;quot;stty com0 115200&amp;quot; &amp;gt;&amp;gt; /mnt/etc/boot.conf
    echo &amp;quot;set tty com0&amp;quot; &amp;gt;&amp;gt; /mnt/etc/boot.conf
    umount /mnt/
    vnconfig -u vnd0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sync your modified install63.fs to the server (which is already booted in the rescue console).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;why&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;was&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;needed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;internally&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@rescue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iptables&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;POSTROUTING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MASQUERADE&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@rescue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hdb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hdc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sdb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;install63&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nographic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;mon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;stdio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;At this point, you will be left in the serial console and should see OpenBSD booting.
From here, just follow the standard OpenBSD installation process, or, in case your system
has 2x HDDs/SSDs, follow the &lt;a href="https://www.openbsd.org/faq/faq14.html#softraid"&gt;softraid installation guide&lt;/a&gt;
as well.&lt;/p&gt;
&lt;p&gt;After the installation is done (don't forget about &lt;a href="https://man.openbsd.org/installboot"&gt;installboot(8)&lt;/a&gt;
if you're installing on &lt;a href="https://www.openbsd.org/faq/faq14.html#softraid"&gt;softraid&lt;/a&gt;), you can try and see
if this newly installed system boots:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@rescue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qemu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hdb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sdb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nographic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;mon&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;stdio&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;One last thing you'll have to do is to rename &lt;code&gt;hostname.em0&lt;/code&gt; to something else, depending on the
NIC model available on your server. In my case, I had to:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;    # cd /etc/
    # mv hostname.em0 hostname.re0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Exit qemu, and exit the rescue console. If the NIC configuration is correct, your new system should start
responding to &lt;code&gt;ping&lt;/code&gt; soon enough.&lt;/p&gt;</content><category term="blog"></category><category term="openbsd"></category><category term="qemu"></category></entry><entry><title>Elasticsearch tips #2: modifying and removing index settings</title><link href="http://blog.eulinux.org/2017/10/elasticsearch-tips-2.html" rel="alternate"></link><published>2017-10-23T00:00:00+02:00</published><updated>2017-10-23T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2017-10-23:/2017/10/elasticsearch-tips-2.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Elasticsearch tip #2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: configure an index setting to &lt;code&gt;null&lt;/code&gt;, to use the default&lt;/p&gt;
&lt;p&gt;Quite often you might need to change an elasticsearch' index setting to something else than the default, e.g. to manually control the shard allocation process (allocating specific indices only on specific nodes): &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; curl -XPUT …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Elasticsearch tip #2:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: configure an index setting to &lt;code&gt;null&lt;/code&gt;, to use the default&lt;/p&gt;
&lt;p&gt;Quite often you might need to change an elasticsearch' index setting to something else than the default, e.g. to manually control the shard allocation process (allocating specific indices only on specific nodes): &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; curl -XPUT localhost:9200/indexname/_settings -d &amp;#39;{ &amp;quot;index.routing.allocation.require._ip&amp;quot;: &amp;quot;10.0.0.11,10.0.0.12&amp;quot; }&amp;#39;
{&amp;quot;acknowledged&amp;quot;:true}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;It's not clear how to go about resetting the setting (or, basically, removing it) (See &lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html"&gt;updating index settings&lt;/a&gt;)
There is a related feature, documented in &lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/5.1/cluster-update-settings.html"&gt;Cluster Update Settings&lt;/a&gt;, which actually works for indices, too:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Resetting persistent or transient settings can be done by assigning a null value. If a transient setting is reset, the persistent setting is applied if available. Otherwise Elasticsearch will fallback to the setting defined at the configuration file or, if not existent, to the default value. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It turns out that the feature is indeed there, just not documented yet (see &lt;a href="https://github.com/elastic/elasticsearch/issues/22870"&gt;#22870&lt;/a&gt;).
So, for example, to reset the allocation settings for the same index (see first example):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; curl -XPUT localhost:9200/indexname/_settings -d &amp;#39;{ &amp;quot;index.routing.allocation.require._ip&amp;quot;: null }&amp;#39;
{&amp;quot;acknowledged&amp;quot;:true}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sidenote: this feature stopped working in ElasticSearch 5.4.0, because of an seemingly unrelated change that added an 'IP validator' for several index/cluster settings. I ran into it while upgrading from 5.0.2, and there is a fix for it in 5.4.1 already (I reported the bug to the ES team, see: &lt;a href="https://github.com/elastic/elasticsearch/issues/24709"&gt;#24709&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;What would happen is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;XPUT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9200&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;indexname&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;_settings&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;index.routing.allocation.require._ip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;error&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;root_cause&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;null_pointer_exception&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;reason&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;null&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;null_pointer_exception&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;reason&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;null&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="elasticsearch"></category><category term="tips"></category><category term="linux"></category></entry><entry><title>Ansible: Using conditional role dependencies</title><link href="http://blog.eulinux.org/2016/01/ansible-conditional-role-dependencies.html" rel="alternate"></link><published>2016-01-19T01:10:00+01:00</published><updated>2016-01-19T01:10:00+01:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2016-01-19:/2016/01/ansible-conditional-role-dependencies.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: You &lt;strong&gt;can&lt;/strong&gt; use &lt;code&gt;when:&lt;/code&gt; in &lt;code&gt;${role}/meta/main.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A while ago I started using &lt;a href="http://docs.ansible.com/ansible/index.html"&gt;Ansible&lt;/a&gt; to provision some aspects of my lab and servers.
At some point, for one of the roles being worked on (some &lt;a href="https://elastic.co/"&gt;elasticsearch&lt;/a&gt; mini-cluster in this particular case), a specific role needed to …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: You &lt;strong&gt;can&lt;/strong&gt; use &lt;code&gt;when:&lt;/code&gt; in &lt;code&gt;${role}/meta/main.yml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A while ago I started using &lt;a href="http://docs.ansible.com/ansible/index.html"&gt;Ansible&lt;/a&gt; to provision some aspects of my lab and servers.
At some point, for one of the roles being worked on (some &lt;a href="https://elastic.co/"&gt;elasticsearch&lt;/a&gt; mini-cluster in this particular case), a specific role needed to be applied to some servers, but only when a condition was met.
There are a few ways in which this can be achieved:&lt;/p&gt;
&lt;p&gt;Include your roles for specific hosts only, in site.yml, e.g:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# site.yml&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;configure the elasticsearch cluster&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;elasticsearch_servers&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;elasticsearch&lt;/span&gt;
&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;configure the data indexers on the master node only&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;elasticsearch_masters&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;roles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;es_indexer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The above will work just as intended, but IMHO it's not too elegant, and requires you to define a second &lt;code&gt;elasticsearch_masters&lt;/code&gt; host group.&lt;/p&gt;
&lt;p&gt;Or, use role dependencies, by configuring a &lt;code&gt;meta/main.yml&lt;/code&gt; to the elasticsearch role:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# roles/elasticsearch/meta/main.yml&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;es_indexer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;However, this will apply the es_indexer to all the elasticsearch nodes. With only a small change we can beat it into submission: by using the &lt;code&gt;when&lt;/code&gt; keyword:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# roles/elasticsearch/meta/main.yml&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="nt"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;es_indexer&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;when&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;es_master_node == True&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Just remember to define &lt;code&gt;es_master_node = True&lt;/code&gt; in your &lt;code&gt;host_vars&lt;/code&gt; for the specific nodes (or use some other external variable if you have a dynamic inventory script with an external data source)&lt;/p&gt;</content><category term="blog"></category><category term="ansible"></category><category term="tips"></category><category term="linux"></category></entry><entry><title>Logstash tips #1: Measuring logstash performance</title><link href="http://blog.eulinux.org/2015/10/logstash-tips-1.html" rel="alternate"></link><published>2015-10-17T03:00:00+02:00</published><updated>2015-10-17T03:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2015-10-17:/2015/10/logstash-tips-1.html</id><summary type="html">&lt;p&gt;&lt;a href="/2015/10/elasticsearch-tips-1.html"&gt;Earlier&lt;/a&gt;, I've mentioned that I intend to start a series of short
notes and tips. Today, a new tip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Logstash tip #1: measuring logstash performance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: use the '&lt;a href="https://www.elastic.co/guide/en/logstash/current/plugins-filters-metrics.html"&gt;metrics&lt;/a&gt;' filter to gather metrics about your &lt;a href="https://www.elastic.co/products/logstash"&gt;logstash&lt;/a&gt; instance.&lt;/p&gt;
&lt;p&gt;A while ago I started using logstash for, well, collecting some logs …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="/2015/10/elasticsearch-tips-1.html"&gt;Earlier&lt;/a&gt;, I've mentioned that I intend to start a series of short
notes and tips. Today, a new tip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Logstash tip #1: measuring logstash performance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: use the '&lt;a href="https://www.elastic.co/guide/en/logstash/current/plugins-filters-metrics.html"&gt;metrics&lt;/a&gt;' filter to gather metrics about your &lt;a href="https://www.elastic.co/products/logstash"&gt;logstash&lt;/a&gt; instance.&lt;/p&gt;
&lt;p&gt;A while ago I started using logstash for, well, collecting some logs, and storing them in Elasticsearch.&lt;/p&gt;
&lt;p&gt;Everything works like a charm most of the time, if you've got your filters right...
except for the fact that logstash itself does not provide any insight into how it is performing. How many messages per second are being processed, etc etc.
Of course, you can get that data from Elasticsearch. And that's a good solution most of the time. If it works for you - fine, stop reading :)&lt;/p&gt;
&lt;p&gt;Thing is, in my specific setup I'm only indexing a fraction of the logs to Elasticsearch, everything else gets dropped.&lt;/p&gt;
&lt;p&gt;Enter the &lt;a href="https://www.elastic.co/guide/en/logstash/current/plugins-filters-metrics.html"&gt;logstash metrics filter&lt;/a&gt;.
You can pretty much count anything in logstash using this filter.&lt;/p&gt;
&lt;p&gt;In my logstash pipeline, I'm adding a &lt;code&gt;logtype&lt;/code&gt; field to all my inputs, so let's say the &lt;code&gt;lumberjack&lt;/code&gt; input is configured like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;lumberjack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5043&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ssl_certificate&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/etc/logstash/ssl/logstash-forwarder.crt&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ssl_key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;/etc/logstash/ssl/logstash-forwarder.key&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;add_field&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;logtype&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;application&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This way, all the messages that are received by logstash have a &lt;code&gt;logtype&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;Let's say I want to know how many messages are being received, per logtype. Then I can just do:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;meter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;logtype.%{logtype}&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;add_tag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;logstash_metric&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;flush_interval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Additionally, for the application logs, I want to know how many messages are being processed, per log level (or severity).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;logtype&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;application&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;meter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;
&lt;span class="n"&gt;      &amp;quot;loglevel.%{level}&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;    &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;add_tag&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;logstash_metric&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;flush_interval&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;rates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;[]&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;What this does, is to create a &lt;code&gt;logtype.${logtype}&lt;/code&gt; / &lt;code&gt;loglevel.${loglevel}&lt;/code&gt; metric, with additional fields. E.g:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;logtype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;
&lt;span class="nx"&gt;logtype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rate_1min&lt;/span&gt;
&lt;span class="nx"&gt;logtype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rate_5min&lt;/span&gt;
&lt;span class="nx"&gt;logtype&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rate_15min&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;
&lt;span class="nx"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rate_1min&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="nx"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;
&lt;span class="nx"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rate_1min&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I don't care about the rates, so I can specify that using &lt;code&gt;rates =&amp;gt; []&lt;/code&gt;(no rates will be collected).
At the end, I can write the metrics to a file, to Elasticsearch, etc. In my specific case, I decided to store those metrics in &lt;a href="http://graphite.readthedocs.org/en/latest/"&gt;graphite&lt;/a&gt;, as that's what I've setup for metrics storage:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;logstash_metric&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;graphite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;2003&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;metrics_format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;general.logstash.*&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;include_metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&amp;quot;log.*\.count&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;fields_are_metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you have multiple logstash servers, you might want to replace &lt;code&gt;metrics_format =&amp;gt; "general.logstash.*"&lt;/code&gt; with &lt;code&gt;metrics_format =&amp;gt; "general.logstash.${hostname}.*"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Oh, and if you use graphite, don't forget about configuring your &lt;a href="http://graphite.readthedocs.org/en/latest/config-carbon.html#storage-aggregation-conf"&gt;storage aggregation rules&lt;/a&gt;. By default, the metrics are treated as &lt;code&gt;gauge&lt;/code&gt;, while this here is a &lt;code&gt;counter&lt;/code&gt;.&lt;/p&gt;</content><category term="blog"></category><category term="logstash"></category><category term="graphite"></category><category term="tips"></category><category term="linux"></category></entry><entry><title>Elasticsearch tips #1: deploying Elasticsearch to multi-homed servers</title><link href="http://blog.eulinux.org/2015/10/elasticsearch-tips-1.html" rel="alternate"></link><published>2015-10-06T00:00:00+02:00</published><updated>2015-10-06T00:00:00+02:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2015-10-06:/2015/10/elasticsearch-tips-1.html</id><summary type="html">&lt;p&gt;I figured I should start a series of short notes (can't call them articles)
about random stuff I encounter in my day-to-day job, and which took me some
time to figure out. Here we go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Elasticsearch tip #1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: make use of the &lt;code&gt;network.publish_host&lt;/code&gt; setting when deploying ES …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I figured I should start a series of short notes (can't call them articles)
about random stuff I encounter in my day-to-day job, and which took me some
time to figure out. Here we go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Elasticsearch tip #1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;TL;DR&lt;/em&gt;&lt;/strong&gt;: make use of the &lt;code&gt;network.publish_host&lt;/code&gt; setting when deploying ES to multi-homed servers&lt;/p&gt;
&lt;p&gt;Let's say you're deploying an ES(Elasticsearch) cluster.&lt;/p&gt;
&lt;p&gt;In a production environment It's not uncommon to have multi-homed servers
(that is, with multiple network interfaces connected to different networks/vlans/etc).&lt;/p&gt;
&lt;p&gt;You've installed ES using your package manager of choice, you have setup your elasticsearch.yml.
Multicast is disabled, and you have something like this for your unicast discovery:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: [&amp;quot;server1&amp;quot;, &amp;quot;server2&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Everything looks fine, you start your ES nodes... and they don't see each-other. Just (maybe) some
timeouts in the logs.&lt;/p&gt;
&lt;p&gt;There's no firewall between the nodes, routing is allright, it looks like you can connect
from one node to the other, and &lt;em&gt;vice versa&lt;/em&gt;, but it still won't work...&lt;/p&gt;
&lt;p&gt;This will save your day:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;network.publish_host: this.servers.hostname
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;or you can use an IP as well...&lt;/p&gt;
&lt;p&gt;According to the &lt;a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html"&gt;official documentation at elastic.co&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(edited) The &lt;code&gt;network.publish_host&lt;/code&gt; setting allows to control the host the node will publish itself
within the cluster so other nodes will be able to connect to it. Of course, this can’t be
'0.0.0.0', and by default, it will be the first non loopback address (if possible),
or the local address.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What hapenned is that the first non loopback address might be on a vlan that doesn't allow the nodes
to talk to each other (even if your connectivity tests worked because the default route goes through
a different interface)&lt;/p&gt;</content><category term="blog"></category><category term="elasticsearch"></category><category term="tips"></category><category term="linux"></category></entry><entry><title>My .fluxbox/keys</title><link href="http://blog.eulinux.org/2014/11/my-fluxbox-keys.html" rel="alternate"></link><published>2014-11-11T10:00:00+01:00</published><updated>2014-11-11T10:00:00+01:00</updated><author><name>floyd</name></author><id>tag:blog.eulinux.org,2014-11-11:/2014/11/my-fluxbox-keys.html</id><summary type="html">&lt;p&gt;Just for future reference. If you want - use it, at your own risk ;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# click on the desktop to get menus&lt;/span&gt;
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse1&lt;span class="w"&gt; &lt;/span&gt;:HideMenus
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse2&lt;span class="w"&gt; &lt;/span&gt;:WorkspaceMenu
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse3&lt;span class="w"&gt; &lt;/span&gt;:RootMenu

&lt;span class="c1"&gt;# scroll on the desktop to change workspaces&lt;/span&gt;
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse4&lt;span class="w"&gt; &lt;/span&gt;:PrevWorkspace
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse5&lt;span class="w"&gt; &lt;/span&gt;:NextWorkspace

&lt;span class="c1"&gt;# scroll on the toolbar to change current window …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Just for future reference. If you want - use it, at your own risk ;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# click on the desktop to get menus&lt;/span&gt;
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse1&lt;span class="w"&gt; &lt;/span&gt;:HideMenus
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse2&lt;span class="w"&gt; &lt;/span&gt;:WorkspaceMenu
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse3&lt;span class="w"&gt; &lt;/span&gt;:RootMenu

&lt;span class="c1"&gt;# scroll on the desktop to change workspaces&lt;/span&gt;
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse4&lt;span class="w"&gt; &lt;/span&gt;:PrevWorkspace
OnDesktop&lt;span class="w"&gt; &lt;/span&gt;Mouse5&lt;span class="w"&gt; &lt;/span&gt;:NextWorkspace

&lt;span class="c1"&gt;# scroll on the toolbar to change current window&lt;/span&gt;
OnToolbar&lt;span class="w"&gt; &lt;/span&gt;Mouse4&lt;span class="w"&gt; &lt;/span&gt;:PrevWindow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;groups&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;iconhidden&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no&lt;span class="o"&gt;)&lt;/span&gt;
OnToolbar&lt;span class="w"&gt; &lt;/span&gt;Mouse5&lt;span class="w"&gt; &lt;/span&gt;:NextWindow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;static&lt;span class="w"&gt; &lt;/span&gt;groups&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;iconhidden&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# alt + left/right click to move/resize a window&lt;/span&gt;
OnWindow&lt;span class="w"&gt; &lt;/span&gt;Mod1&lt;span class="w"&gt; &lt;/span&gt;Mouse1&lt;span class="w"&gt; &lt;/span&gt;:MacroCmd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Raise&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Focus&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;StartMoving&lt;span class="o"&gt;}&lt;/span&gt;
OnWindowBorder&lt;span class="w"&gt; &lt;/span&gt;Move1&lt;span class="w"&gt; &lt;/span&gt;:StartMoving

OnWindow&lt;span class="w"&gt; &lt;/span&gt;Mod1&lt;span class="w"&gt; &lt;/span&gt;Mouse3&lt;span class="w"&gt; &lt;/span&gt;:MacroCmd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Raise&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Focus&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;StartResizing&lt;span class="w"&gt; &lt;/span&gt;NearestCorner&lt;span class="o"&gt;}&lt;/span&gt;
OnLeftGrip&lt;span class="w"&gt; &lt;/span&gt;Move1&lt;span class="w"&gt; &lt;/span&gt;:StartResizing&lt;span class="w"&gt; &lt;/span&gt;bottomleft
OnRightGrip&lt;span class="w"&gt; &lt;/span&gt;Move1&lt;span class="w"&gt; &lt;/span&gt;:StartResizing&lt;span class="w"&gt; &lt;/span&gt;bottomright

&lt;span class="c1"&gt;# alt + middle click to lower the window&lt;/span&gt;
OnWindow&lt;span class="w"&gt; &lt;/span&gt;Mod1&lt;span class="w"&gt; &lt;/span&gt;Mouse2&lt;span class="w"&gt; &lt;/span&gt;:Lower

&lt;span class="c1"&gt;# control-click a window&amp;#39;s titlebar and drag to attach windows&lt;/span&gt;
OnTitlebar&lt;span class="w"&gt; &lt;/span&gt;Control&lt;span class="w"&gt; &lt;/span&gt;Mouse1&lt;span class="w"&gt; &lt;/span&gt;:StartTabbing

&lt;span class="c1"&gt;# double click on the titlebar to shade&lt;/span&gt;
OnTitlebar&lt;span class="w"&gt; &lt;/span&gt;Double&lt;span class="w"&gt; &lt;/span&gt;Mouse1&lt;span class="w"&gt; &lt;/span&gt;:Shade

&lt;span class="c1"&gt;# left click on the titlebar to move the window&lt;/span&gt;
OnTitlebar&lt;span class="w"&gt; &lt;/span&gt;Mouse1&lt;span class="w"&gt; &lt;/span&gt;:MacroCmd&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Raise&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;Focus&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;ActivateTab&lt;span class="o"&gt;}&lt;/span&gt;
OnTitlebar&lt;span class="w"&gt; &lt;/span&gt;Move1&lt;span class="w"&gt;  &lt;/span&gt;:StartMoving

&lt;span class="c1"&gt;# middle click on the titlebar to lower&lt;/span&gt;
OnTitlebar&lt;span class="w"&gt; &lt;/span&gt;Mouse2&lt;span class="w"&gt; &lt;/span&gt;:Lower

&lt;span class="c1"&gt;# right click on the titlebar for a menu of options&lt;/span&gt;
OnTitlebar&lt;span class="w"&gt; &lt;/span&gt;Mouse3&lt;span class="w"&gt; &lt;/span&gt;:WindowMenu

&lt;span class="c1"&gt;# alt-tab&lt;/span&gt;
Mod1&lt;span class="w"&gt; &lt;/span&gt;Tab&lt;span class="w"&gt; &lt;/span&gt;:NextWindow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;groups&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;workspace&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;current&lt;span class="o"&gt;])&lt;/span&gt;
Mod1&lt;span class="w"&gt; &lt;/span&gt;Shift&lt;span class="w"&gt; &lt;/span&gt;Tab&lt;span class="w"&gt; &lt;/span&gt;:PrevWindow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;groups&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;workspace&lt;/span&gt;&lt;span class="o"&gt;=[&lt;/span&gt;current&lt;span class="o"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# cycle through tabs in the current window&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;Tab&lt;span class="w"&gt; &lt;/span&gt;:NextTab
Mod4&lt;span class="w"&gt; &lt;/span&gt;Shift&lt;span class="w"&gt; &lt;/span&gt;Tab&lt;span class="w"&gt; &lt;/span&gt;:PrevTab

&lt;span class="c1"&gt;# go to a specific tab in the current window&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Tab&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;

&lt;span class="c1"&gt;# open a terminal&lt;/span&gt;
Mod1&lt;span class="w"&gt; &lt;/span&gt;F1&lt;span class="w"&gt; &lt;/span&gt;:Exec&lt;span class="w"&gt; &lt;/span&gt;x-terminal-emulator

&lt;span class="c1"&gt;# open a dialog to run programs&lt;/span&gt;
Mod1&lt;span class="w"&gt; &lt;/span&gt;F2&lt;span class="w"&gt; &lt;/span&gt;:Exec&lt;span class="w"&gt; &lt;/span&gt;fbrun

&lt;span class="c1"&gt;# volume settings, using common keycodes&lt;/span&gt;
&lt;span class="c1"&gt;# if these don&amp;#39;t work, use xev to find out your real keycodes&lt;/span&gt;
&lt;span class="m"&gt;176&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Exec&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;sset&lt;span class="w"&gt; &lt;/span&gt;Master,0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;+
&lt;span class="m"&gt;174&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Exec&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;sset&lt;span class="w"&gt; &lt;/span&gt;Master,0&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;-
&lt;span class="m"&gt;160&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;:Exec&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;sset&lt;span class="w"&gt; &lt;/span&gt;Master,0&lt;span class="w"&gt; &lt;/span&gt;toggle

&lt;span class="c1"&gt;# current window commands&lt;/span&gt;
Mod1&lt;span class="w"&gt; &lt;/span&gt;F4&lt;span class="w"&gt; &lt;/span&gt;:Close
Mod1&lt;span class="w"&gt; &lt;/span&gt;F5&lt;span class="w"&gt; &lt;/span&gt;:Kill
Mod1&lt;span class="w"&gt; &lt;/span&gt;F9&lt;span class="w"&gt; &lt;/span&gt;:Minimize
Mod1&lt;span class="w"&gt; &lt;/span&gt;F10&lt;span class="w"&gt; &lt;/span&gt;:Maximize
Mod1&lt;span class="w"&gt; &lt;/span&gt;F11&lt;span class="w"&gt; &lt;/span&gt;:Fullscreen

&lt;span class="c1"&gt;# open the window menu&lt;/span&gt;
Mod1&lt;span class="w"&gt; &lt;/span&gt;space&lt;span class="w"&gt; &lt;/span&gt;:WindowMenu

&lt;span class="c1"&gt;# exit fluxbox&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod1&lt;span class="w"&gt; &lt;/span&gt;Delete&lt;span class="w"&gt; &lt;/span&gt;:Exit

&lt;span class="c1"&gt;# change to previous/next workspace&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod1&lt;span class="w"&gt; &lt;/span&gt;Left&lt;span class="w"&gt; &lt;/span&gt;:PrevWorkspace
Control&lt;span class="w"&gt; &lt;/span&gt;Mod1&lt;span class="w"&gt; &lt;/span&gt;Right&lt;span class="w"&gt; &lt;/span&gt;:NextWorkspace

&lt;span class="c1"&gt;# send the current window to previous/next workspace&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;Left&lt;span class="w"&gt; &lt;/span&gt;:SendToPrevWorkspace
Mod4&lt;span class="w"&gt; &lt;/span&gt;Right&lt;span class="w"&gt; &lt;/span&gt;:SendToNextWorkspace

&lt;span class="c1"&gt;# send the current window and follow it to previous/next workspace&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;Left&lt;span class="w"&gt; &lt;/span&gt;:TakeToPrevWorkspace
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;Right&lt;span class="w"&gt; &lt;/span&gt;:TakeToNextWorkspace

&lt;span class="c1"&gt;# change to a specific workspace&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F1&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F2&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F3&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F4&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F5&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F6&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F7&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F8&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F9&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F10&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F11&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;F12&lt;span class="w"&gt; &lt;/span&gt;:Workspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;

&lt;span class="c1"&gt;# send the current window and change to a specific workspace&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F1&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F2&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F3&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F4&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F5&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F6&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F7&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F8&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F9&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F10&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F11&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;
Control&lt;span class="w"&gt; &lt;/span&gt;Mod4&lt;span class="w"&gt; &lt;/span&gt;F12&lt;span class="w"&gt; &lt;/span&gt;:TakeToWorkspace&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;

Mod1&lt;span class="w"&gt; &lt;/span&gt;F2&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;fbrun
Mod4&lt;span class="w"&gt; &lt;/span&gt;m&lt;span class="w"&gt; &lt;/span&gt;:RootMenu
Mod4&lt;span class="w"&gt; &lt;/span&gt;r&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;urxvt
Mod4&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;gnome-terminal
Mod4&lt;span class="w"&gt; &lt;/span&gt;x&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;mousepad
Mod4&lt;span class="w"&gt; &lt;/span&gt;f&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;firefox
Mod4&lt;span class="w"&gt; &lt;/span&gt;t&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;terminator
Mod4&lt;span class="w"&gt; &lt;/span&gt;m&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;mozilla
Mod4&lt;span class="w"&gt; &lt;/span&gt;g&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;gimp
Mod4&lt;span class="w"&gt; &lt;/span&gt;y&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;thunar
Mod1&lt;span class="w"&gt; &lt;/span&gt;F4&lt;span class="w"&gt; &lt;/span&gt;:Close
Mod4&lt;span class="w"&gt; &lt;/span&gt;F1&lt;span class="w"&gt; &lt;/span&gt;:ToggleDecor
Mod4&lt;span class="w"&gt; &lt;/span&gt;F2&lt;span class="w"&gt; &lt;/span&gt;:MaximizeWindow
Mod4&lt;span class="w"&gt; &lt;/span&gt;l&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;gnome-screensaver-command&lt;span class="w"&gt; &lt;/span&gt;-l

Mod4&lt;span class="w"&gt; &lt;/span&gt;k&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/xrandr&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI3&lt;span class="w"&gt; &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;1920x1080&lt;span class="w"&gt; &lt;/span&gt;--pos&lt;span class="w"&gt; &lt;/span&gt;1920x0&lt;span class="w"&gt; &lt;/span&gt;--rotate&lt;span class="w"&gt; &lt;/span&gt;normal&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;LVDS1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;VGA1&lt;span class="w"&gt; &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;1920x1080&lt;span class="w"&gt; &lt;/span&gt;--pos&lt;span class="w"&gt; &lt;/span&gt;0x0&lt;span class="w"&gt; &lt;/span&gt;--rotate&lt;span class="w"&gt; &lt;/span&gt;normal
Mod4&lt;span class="w"&gt; &lt;/span&gt;u&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/xrandr&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;LVDS1&lt;span class="w"&gt; &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;1366x768&lt;span class="w"&gt; &lt;/span&gt;--pos&lt;span class="w"&gt; &lt;/span&gt;0x0&lt;span class="w"&gt; &lt;/span&gt;--rotate&lt;span class="w"&gt; &lt;/span&gt;normal&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;VGA1&lt;span class="w"&gt; &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;1920x1080&lt;span class="w"&gt; &lt;/span&gt;--pos&lt;span class="w"&gt; &lt;/span&gt;1366x0&lt;span class="w"&gt; &lt;/span&gt;--rotate&lt;span class="w"&gt; &lt;/span&gt;normal
Mod4&lt;span class="w"&gt; &lt;/span&gt;i&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/xrandr&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;LVDS1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;VGA1&lt;span class="w"&gt; &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;1920x1080&lt;span class="w"&gt; &lt;/span&gt;--pos&lt;span class="w"&gt; &lt;/span&gt;0x0&lt;span class="w"&gt; &lt;/span&gt;--rotate&lt;span class="w"&gt; &lt;/span&gt;normal
Mod4&lt;span class="w"&gt; &lt;/span&gt;o&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;/usr/local/sbin/dock.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
Mod4&lt;span class="w"&gt; &lt;/span&gt;p&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;/usr/bin/xrandr&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;DP1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI3&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI2&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;HDMI1&lt;span class="w"&gt; &lt;/span&gt;--off&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;LVDS1&lt;span class="w"&gt; &lt;/span&gt;--mode&lt;span class="w"&gt; &lt;/span&gt;1366x768&lt;span class="w"&gt; &lt;/span&gt;--pos&lt;span class="w"&gt; &lt;/span&gt;0x0&lt;span class="w"&gt; &lt;/span&gt;--rotate&lt;span class="w"&gt; &lt;/span&gt;normal&lt;span class="w"&gt; &lt;/span&gt;--output&lt;span class="w"&gt; &lt;/span&gt;VGA1&lt;span class="w"&gt; &lt;/span&gt;--off

None&lt;span class="w"&gt; &lt;/span&gt;XF86AudioLowerVolume&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;%-&lt;span class="w"&gt; &lt;/span&gt;unmute
None&lt;span class="w"&gt; &lt;/span&gt;XF86AudioMute&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;toggle
None&lt;span class="w"&gt; &lt;/span&gt;XF86AudioRaiseVolume&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;%+&lt;span class="w"&gt; &lt;/span&gt;unmute

Mod4&lt;span class="w"&gt; &lt;/span&gt;Up&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;%+&lt;span class="w"&gt; &lt;/span&gt;unmute
Mod4&lt;span class="w"&gt; &lt;/span&gt;Down&lt;span class="w"&gt; &lt;/span&gt;:ExecCommand&lt;span class="w"&gt; &lt;/span&gt;amixer&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Master&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;%-&lt;span class="w"&gt; &lt;/span&gt;unmute
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="blog"></category><category term="fluxbox"></category><category term="tips"></category><category term="linux"></category></entry></feed>