Skip to content

Linux

28 posts with the tag “Linux”

A highly available WireGuard VPN setup

WireGuard Logo

WireGuard is a communication protocol and free and open-source software that implements encrypted virtual private networks (VPNs), and was designed with the goals of ease of use, high speed performance, and low attack surface.

Tinc Logo
Tinc Logo.

I’ve been using it in my home lab setup since about 2020. When, in the end of 2021, it was finally merged into the Linux mainline with release 5.9, I started to replace my former Tinc-VPN setup with it. Tinc-VPN is another great open source VPN solution. Unfortunately, its development has stalled over the last years which motivated me to look for alternatives. In contrast to WireGuard, Tinc runs as a user-space daemon and uses tun / tap devices which adds a significant processing overhead. Like WireGuard, it is also using UDP for tunneling data, but falls back to TCP in situations where direct datagram connectivity is not feasible. Another big advantage of Tinc is its ability to form a mesh of nodes and to route traffic within it when direct P2P connections are not possible due to firewall restrictions. At the same time, this mesh is also used for facilitating direct connections by signaling endpoint addresses of NATed hosts.

Tinc's mesh capability
Tinc's mesh capability.

This mesh functionality made Tinc quite robust against the failure of single nodes as usually we could route traffic via other paths.

To counteract this shortcoming, this blog post will present a highly available WireGuard setup using the Virtual Router Redundancy Protocol (VRRP) as implemented by the keepalived daemon.

That said, it is worth noting that this setup does will not bring back some of the beloved features of Tinc. Both meshing, the peer and and endpoint discovery features of Tinc are currently and will never be supported by WireGuard. Jason A. Donenfeld the author of WireGuard focused the design of WireGuard on simplicity, performance and auditability. Hence advanced features like the ones mentioned will only be available to WireGuard by additional agents / daemons which control and configure WireGuard for you. Examples for such are Tailscale, Netmaker and Netbird.

The setup presented in this post is a so called active / standby configuration consisting of two almost equal configured Linux servers running both WireGuard and the keepalived daemon. As the name suggest only one of those two servers will by actively handling WireGuard tunneling traffic while the other one stands by for the event of a failure or maintenance of the active node.

VRRP Wireguard Setup
VRRP Wireguard Setup.

Before get started some requirements for the setup:

  • 2 Servers running Linux 5.9 or newer.
  • A working Wireguard configuration.
  • A local L2 network segment two which both servers are connected.
  • Upstream connectivity without NATing via gateway connected to the network segment (usually provided by your internet or hosting provider).
  • An unused address to be used as Virtual IP (VIP) which roamed between the two servers by VRRP.

An important point is here the assumption that we are running both servers in the same switched network segment as this is a requirement for VRRP. We are also assuming that the upstream gateway performs no NATing. This guide covers only IPv6 addressing. However all steps can be also adapted or repeated for a dual stack or IPv4-only setup.

Here are some of the specifics for my setup which need to be adapted by you:

  • Server Key (same use by both servers)
    • Private: YIEDx+A2ONo5+uv3mrk/p7ileL3T5QQ8hleQK0IYEEI=
    • Public: XGubrkGtuECdvoykKeUiNMigk2onfLCPfEo9Im+vmx8=
  • Peer Key (In this example we only have a single peer)
    • Private: OIbpWVIVVBOtWfwkmXkFRN7Q/jBdfYtsGt7j97aHx1Q=
    • Public: 3NGl6gTOGs6ai0RE91VmVFgF+N4gw1EBG11KOeiKJAg=
  • Public Server Subnet: 2001:DB8:1::/64
    • Gateway: 2001:DB8:1::1
    • Virtual IP: 2001:DB8:1::2
    • Server A: 2001:DB8:1:::3
    • Server B: 2001:DB8:1::4
  • WireGuard Tunnel Subnet: 2001:DB8:2::1/64
    • Server: 2001:DB8:2::1 (same used by both servers)
    • Peer: 2001:DB8:2::2
  • Interface names
    • Wireguard: wg1
    • Upstream: eno1
  1. Prepare servers

    We start of preparing the two servers by installing WireGuard and keepalived:

    Terminal window
    sudo apt install keepalived wireguard-tools iproute2

    Next we configure a WireGuard interface on both servers using exactly the same configuration file at /etc/wireguard/wg1.conf:

    [Interface]
    Address = 2001:DB8:2::1/64
    PrivateKey = YIEDx+A2ONo5+uv3mrk/p7ileL3T5QQ8hleQK0IYEEI=
    ListenPort = 51800
    [Peer]
    PublicKey = 3NGl6gTOGs6ai0RE91VmVFgF+N4gw1EBG11KOeiKJAg=
    AllowedIPs = 2001:DB8:2::2/128
    PersistentKeepalive = 25

    Similarly, a reciprocal configuration file is needed on the client side which skip here for brevity. Before proceeding, we activate the interface on both servers:

    Terminal window
    systemctl enable --now wg-quick@wg1
    wg show wg1 # Check if interface is up
  2. Configuring Keepalived

    Create a configuration file for keepalived at /etc/keepalived/keepalived.conf

    global_defs {
    enable_script_security
    script_user root
    }
    # Check if the server the WireGuard interface configured
    vrrp_script check_wg {
    script "/usr/bin/wg show wg1"
    user root
    }
    vrrp_instance wg_v6 {
    interface eno1
    virtual_router_id 52
    notify /usr/local/bin/keepalived-wg.sh
    state BACKUP # use BACKUP for Server B
    priority 99 # use 100 for Server B
    virtual_ipaddress {
    2001:DB8:1::1/64
    }
    track_script {
    check_wg
    }
    }
  3. Create a notification script for keepalived at /usr/local/bin/keepalived-wg.sh

    #!/usr/bin/env bash
    TYPE=$1
    NAME=$2
    STATE=$3
    PRIO=$4
    WGIF=wg1
    case ${STATE} in
    MASTER)
    ip link set up dev ${WGIF}
    ;;
    BACKUP|FAULT|STOP|DELETED)
    ip link set down dev ${WGIF}
    ;;
    *)
    echo "unknown state"
    exit 1
    esac

    Now start the keepalived daemon:

    Terminal window
    chmod +x /usr/local/bin/keepalived-wg.sh
    systemctl enable --now keepalived
  4. Testing the fail over

    In our configuration, Server A has a higher VRRP priority and as such will be preferred if both servers are healthy. To test our setup, we simply bring down the WireGuard interface on Server A and observe how the VIP gets moved to Server B. From the WireGuard peers perspective not much changes. In fact no connections will be dropped during the fail-over. Internally, the clients WireGuard interface renegotiate the handshake. However, that step is actually not observable by the user.

    Run the following commands on Server A while alongside test the connectivity from the client side through the tunnel via ping -i0.2 2001:DB8:2::1:

    Terminal window
    # Check that keepalived has moved the VIP to interface eno1
    ip addr show dev eno1
    # Bring down the Wireguard interface
    wg-quick down wg1
    # Keepalived should now have moved the VIP to Server B
    ip addr show dev eno1

In my personal network, I operate a Interior Gateway Protocol (IGP) to dynamically route traffic within and also towards other networks. Common IGPs are OSPF, ISIS or BGP. In my specific case, both Servers A & B run the Bird2 routing daemon with interior and exterior BGP sessions.

So how does the WireGuard HA setup interoperates with my interior routing? Quite well actually. As my notify script (keepalive-wg.sh) will automatically bring up / down the interface, the routes attached to the interface will be picked up by Bird’s direct protocol.

I am also planning to extend my WireGuard agent cunīcu ( /cunicu/cunicu ) to support the synchronization of WireGuard interface configurations between multiple servers.

Surprisingly, the setup works by using Keepalived and does not require any iptables or nftables magic to rewrite source IP addresses. I’ve seen some people mentioning that SNAT / DNAT would be required to convince WireGuard to use the virtual IP instead of the server addresses. However, in my experience this was not necessary.

Another concern has been that the backup Wireguard interface still might attempt to establish a handshake with its peers. This would quite certainly interfere with the handshakes originated by the current master server. However, also this has not been proven to be the case. I assume the fact that our notify script brings down the WireGuard interface on the backup server causes them to cease all communication with its peers.

Gaining Root Access on Netgear Nighthawk Mobile 5G/LTE Routers

This blog posts covers the required steps to gain root access via Telnet on Netgear Nighthawk Mobile 5G/LTE Routers. Its the first post in a small series covering my experiences playing around with this device.

Last month I obtained one of Netgear’s latest mobile 5G routers, the Netgear Nighthawk M5 (model MR5200-100EUS) . Being one of the most expensive consumer 5G routers, I was lucky to get a fairly good second hand deal from eBay.

Netgear Nighthawk M5 mobile 5G/LTE Router
Netgear Nighthawk M5 mobile 5G/LTE Router.

Running a Xilinx hw_server as Docker Container

Dockerized Xilinx hw_server Setup
Dockerized Xilinx hw_server Setup.

This article describes the necessary steps to run a Xilinx hw_server as a Docker container.

Xilinx’s hw_server is a command line utility which handles JTAG communication between a Xilinx FPGA board and usually the Vivado IDE. It can be used to configure the FPGA bitstream, connect to the embedded logic analyzer cores (ILA) or perform debugging of processor cores via GDB and the Xilinx System Debugger (XSDB). The hw_server is usually used when those tasks shall performed remotely as the connection between Vivado or XSDB is established via TCP connection and allows us to run it on a remote system.

Running the hw_server as a Docker container has the benefit that its installation is simplified to starting a Docker container by running:

Terminal window
docker run \
--restart unless-stopped \
--privileged \
--volume /dev/bus/usb:/dev/bus/usb \
--publish 3121:3121 \
--detach \
ghcr.io/stv0g/hw_server:v2021.2

It also allows us to run the hw_server on architectures which are not natively supported by Xilinx such as the commonly used Aarch / ARM64 and ARMv7 architectures found in Raspberry Pis.

This is enabled by Dockers support for running container images for non-native architectures. I am using the aptman/qus Docker image ( /dbhi/qus ) to setup this user-mode emulation. The qemu-user-static (qus) image is a compilation of utilities, examples and references to build and execute OCI images (aka docker images) for foreign architectures using QEMU’s user-mode emulation.

Run the following commands to run the hw_server on a embedded device:

Terminal window
# Install docker
sudo apt-get update && sudo apt-get upgrade
curl -sSL https://get.docker.com | sh
# Start Docker
sudo systemctl enable --now docker
# Enable qemu-user emulation support for running amd64 Docker images
# *Note:* only required if your system arch is not amd64!
docker run --rm --privileged aptman/qus -s -- -p x86_64
# Run the hw_server
docker run --restart unless-stopped --privileged --volume /dev/bus/usb:/dev/bus/usb --publish 3121:3121 --detach ghcr.io/stv0g/hw_server:v2021.2

This setup has been tested with a Raspberry Pi 4 running the new 64-bit Debian Bullseye Raspberry Pi OS.

The pre-built Docker image for the hw_server of Vivado 2021.2 is available via:

/stv0g/xilinx-hw-server-docker (Packages)

Detailed instructions can be found at Codeberg: /stv0g/xilinx-hw-server-docker .

Encrypted credentials for Amazon AWS command line client

In this quick post I will show you how to use the password manager “password-store1 to securely store your credentials used by the Amazon Webservices command line client.

AWS CLI Logo
AWS CLI Logo.

The installation for Mac and Linux system is fairly easy:

Terminal window
pip install awscli

The credentials are stored as key-value pairs inside a PGP-encrypted file. Every time you call the AWS CLI tool, your keys will be decrypted and directly passed to the aws tool.

Use pass to add your keys in the store:

Terminal window
pass edit providers/aws

An editor opens. Use the following format:

User: stv0g
Access-Key: AKB3ASJGBS3GOMXK6KPSQ
Secret-Key: vAAABn/PMAksd235gAs/FSshhr42dg2D4EY3

Add the following snippet to your ~/.bashrc:

Terminal window
function aws {
local PASS=$(pass providers/aws)
local AWS=$(which aws)
# Start original aws executable with short-lived keys
AWS_ACCESS_KEY_ID=$(sed -En 's/^Access-Key: (.*)/\1/p' <<< "$PASS") \
AWS_SECRET_ACCESS_KEY=$(sed -En 's/^Secret-Key: (.*)/\1/p' <<< "$PASS") $AWS $@
}

Then use the cli tool aws as usual:

Terminal window
aws iam list-access-keys { "AccessKeyMetadata": [ { "UserName": "stv0g", ...`
  1. I covered password-store already a few times earlier: Use YubiKey and Password-store for Ansible credentials, Workshop: Security Token.

Use Yubikey and Password-store for Ansible credentials

I spent some time over the last months to improve the security of servers and passwords. In doing so, I started to orchestrate my servers using a configuration management tool called Ansible. This allows me to spin-up fresh servers in a few seconds and to get rid of year-old, polluted and insecure system images.

Ansible loves Yubico
Ansible loves Yubico.

My ‘single password for everything’ has been replaced by a new password policy which enforces individual passwords for every single service. This was easier than I previously expected:

To unlock the ‘paranoid’ level, I additionally purchased a Yubikey Neo token to handle the decryption of my login credentials in tamper-proof hardware. ‘pass’ is just a small shell script to glue several existing Unix tools together: Bash, pwgen, Git, xclip & GnuPG (obeying the Unix philosophy). The passwords are stored in simple text files which are encrypted by PGP and stored in a directory structure which is managed in a Git repository.

Yubikey Neo und Neo-n
Yubikey Neo und Neo-n.

There are already a tons of tutorials which present the tools I describes above. I do not want to repeat all of it. So, this post is dedicated to solve some smaller issues I encountered.

transWhat

Die Telefonvermittelung bei den Simsons
Die Telefonvermittelung bei den Simsons.

transWhat ist ein XMPP Transport, der den WhatsApp Messenger in das Jabber Netzwerk einbindet.

Das Gateway simuliert dabei serverseitig die normale WhatsApp App von Android beziehungsweise iPhone. Der User benötigt nur noch einen normalen XMPP Client wie beispielsweise Adium, Gaijm, IM+ oder Pidgin. Damit ist es nun möglich WhatsApp auf nahezu allen Geräten und Betriebssystemen einzusetzen. Ich kann transWhat sehr in Kombination mit Pidgin auf Desktops und Laptops und mit IM+ auf Tablets empfehlen 😊.

Alle Details, Serverdaten, Logins, Tipps und Tricks findet ihr hier im Wiki.

Aus verschiedenen Gründen werde ich den Code nicht veröffentlichen sondern das Gateway nur als Service anbieten.

Ich habe mich nun doch dazu entschieden den Quelltext freizugeben. Er ist auf Codeberg zu finden: /stv0g/transwhat .

Nach dem Break gibt’s noch ein paar technische Details und Informationen zur Umsetzung.

calcelestial

Planets of the Solar System

/stv0g/calcelestial ist ein kleines Linux-Tool zum Berechnen von Auf- und Untergangszeiten sowie der Position sämtlicher Planeten unseres Sonnensystems.

Es ist der Weiterentwicklung von /stv0g/sun , das ursprünglich als kleines Bash-Skript für meinen Router startete. Mittlerweile ist das Tool zu einem weit umfangreicherem Werkzeug gewachsen, welches nicht mehr nur die Auf- und Untergangszeit der Sonne berechnen kann:

Es sind mit dem Mond, Mars, Neptun, Jupiter, Merkur, Uranus, Saturn, Venus und Pluto eine Menge neuer Planeten dazugekommen. Auch kann nun die Position dieser Himmelskörper zu jedem beliebigen Zeitpunkt oder dem Auf- und Untergang berechnet werden.

Nun bin ich selber kein kleiner Hobby-Astronom, sodass ich diese ganzen Berechnungen aus dem Ärmel schütteln könnte. Stattdessen nutze ich die Bibliothek libnova. libnova benutzt die sehr genauen Algorithmen “Variations Séculaires des Orbites Planétaires” (kurz VSOP-87), die Pierre Pratagnon 1987 entwickelte.

Terminal window
$ calcelestial
Usage:
calcelestial [options]
Options:
-p, --object calc for celestial object: sun, moon, mars, neptune,
jupiter, mercury, uranus, saturn, venus or pluto
-H, --horizon calc rise / set time with twilight: nautic, civil or astronomical
-t, --time calc at given time: YYYY-MM-DD [HH:MM:SS]
-m, --moment calc position at moment of: rise, set, transit
-n, --next use rise, set, transit time of tomorrow
-f, --format output format: see strftime (3) for more details
-a, --lat geographical latitude of observer: -90° to 90°
-o, --lon geographical longitude of oberserver: -180° to 180°
-q, --query query geonames.org for geographical coordinates
-z, --timezone override system timezone
-u, --universal use universial time for parsing and formatting
-h, --help show this help
-v, --version show version
A combination of --lat & --lon or --query is required.
Please report bugs to: post@steffenvogel.de

Die einfachste Variante nutzt das Unix Tool at:

Terminal window
echo ~/bin/enable-lightning | at $(calcelestial -p sun -m set -q Frankfurt -H civil)

Mit folgenden Cronjobs, lässt sich dieses Prinzip auch leicht auf andere Anwendungen übertragen:

0 0 * * * echo 'fnctl stop && fnctl fade -c 000000' | at $(calcelestial -m rise -p sun -q Aachen)
0 0 * * * echo 'fnctl start' | at $(calcelestial -m set -p sun -q Frankfurt)

Mit dem Tool nvram-wakeup, lässt sich so beispielsweise der Rechner jeden Tag 10 Minuten for Sonnenaufgang automatisch starten:

Terminal window
nvram-wakeup -s $(date -d "-10 min $(calcelestial -m rise -p sun -q Berlin)" +%s)

Oder möchtest du deinen Rechner nach Sonnenuntergang automatisch herunterfahren?

Terminal window
shutdown $(date -d +10 min $(calcelestial -m rise -p sun --lat=50.55 --lon=-6.2) +%H:%M)

Die aktuelle Position des Mondes kann beispielsweise so bestimmt werden:

Terminal window
calcelestial -p moon -q Aachen -f "az: §a alt: §h"

Detailiertere Dokumentation findet ihr in der Manpage calcelestial(1).

calcelestial ist wie immer auf Codeberg verfügbar /stv0g/calcelestial .

mountL2P: Mount L2P Shares on Linux

l2p-3d-klein

Vielleicht kennt ihr Sync-my-L2P? Es ist ein kleines Tool, das automatisiert Dateien vom Online Lernportal der RWTH herunterlädt und syncronisieren kann.

Eigentlich eine super Sache! Entgegen meiner ursprünglichen Erwartung ist das Tool auch unter Linux lauffähig. Ich habe mich trotzdem dazu entschieden das ganze etwas anders, aus meiner Sicht deutlich simpler, zu lösen.

Mein Skript nutzt die Möglichkeit einzelne Microsoft Sharepoint Ordner (hier: L2P-Lernräume) via WebDav einzubinden.

Dazu gibt es unter Linux zwei Varianten:

  1. [davfs2](https://savannah.nongnu.org/projects/davfs2 (nutzt FUSE, kompatibel mit mount und fstab)
  2. gvfs (stark in GNOME & Nautilus integriert, einfach)

Die zweite Variante ist für GNOME Nutzer deutlich einfacher, da hier nur eine entsprechende URI in die Adresszeile des Dateimanagers eingegeben werden muss.

Mein Tool hilft euch diese URIs zu finden, indem es sich unter eurem Namen im L2P einloggt und nachsieht in welchen Lernräumen ihr registiert seid.

Das Skript ist auf Codeberg verfügbar: /stv0g/snippets/bash/mount.l2p.sh .

Terminal window
$ mountl2p.sh
usage: mountl2p.sh [-f FORMAT] [-s SEMESTER] [-u L2P_USER] [-p L2P_PASS]
FORMAT is one of 'gvfs' or 'fstab'
SEMESTER is an optional regex to filter the semester
L2P_USER is your L2P account name like 'sv123242'
L2P_PASS is your L2P account password

Um schnell auf die aktuellen Lernräume zugreifen zu können, bietet es sich an diese als Lesezeichen im Dateimanager zu registrieren:

Terminal window
./mountl2p.sh -f gvfs -s "ws12|ss12" -u sv111090 >> ~/.gtk-bookmarks
L2P WebDAV Mount
L2P WebDAV Mount.

Cron Jobs für Sonnenauf- & untergang

Nicht selten kommt es mal vor, dass sich ein Rechner nach astronomischen Zyklen orientiert. Die zur Berechnung der Osterfeiertage häufig verwendete Gaußsche Osterformel basiert so z.T. auf der Mondgleichung.

Unser Problem stellte sich etwas anders dar: Die LED-Flurbeleuchtung in unserem Flur wird durch den Router geregelt und lief bisher in der Regel 24/7. Mit dem hier vorgestellten Programm haben wir es nun geschafft die Laufzeit auf die Nachtstunden zu begrenzen, indem wir die von unserer geografischen Position abhängige Sonnenuntergangszeit nutzen um die Lampen erst bei Dämmerung einzuschalten.

UPDATE: Ich habe nochmal etwas Arbeit in das Tool investiert und es in ein eigenes Projekt ausgelagert. Das neue Tool liefert wesentliche genauere Ergebnisse und mehr Funktionen. Zu finden ist es hier: calcelestial.

Das neue Tool besitzt eine Reihe weiterer nützlicher Funktionen:

Terminal window
$ sun
usage: sun mode [options]
mode is one of: rise, set, noon, daytime, nighttime
following OPTIONS are available
-t, --twilight use special twilight (nautic|civil|astro)
-d, --date calculcate for specified date (eg. 2011-12-25)
-f, --format output format (eg. %H:%M:%S)
-a, --lat geographical latitude (-90° to 90°)
-o, --lon geographical longitude (-180° to 180°)
-q, --query query geonames.org for geographical position
-z, --zone use timezone for output
-h, --help show this help
-v, --version show version
A combination of --lat, --lon or --query is required!

Die einfachste Variante nutzt das Unix Tool at:

Terminal window
echo ~/bin/enable-lightning | at $(sun set -q Frankfurt -t civil)

Mit folgenden Cronjobs, lässt sich dieses Prinzip auch leicht auf andere Anwendungen übertragen:

0 0 * * * echo 'fnctl stop && fnctl fade -c 000000' | at $(sun rise -q Aachen)
0 0 * * * echo 'fnctl start' | at $(sun set -q Frankfurt)

Mit dem Tool nvram-wakeup, lässt sich so beispielsweise der Rechner jeden Tag 10 Minuten for Sonnenaufgang automatisch starten:

Terminal window
nvram-wakeup -s $(date -d "-10min $(sun rise -q Berlin)" +%s)

Oder möchtest du deinen Rechner nach Sonnenuntergang automatisch herunterfahren?

Terminal window
shutdown $(date -d +10min $(src/sun set --lat=50.55 --lon=-6.2) +%H:%M)

HIDeKey

HIDeKey USB Security Token
HIDeKey USB Security Token.

Als Abschlussprojekt und Vorbereitung auf meine Betreuer Tätigkeit für die Mikrocontroller-AG des MMI’s habe ich mich näher mit dem USB-Bus und dem darauf aufbauenden HID-Protokoll befasst.

HIDeKey ist ein kleiner USB-Stick, der als HID-Tastatur vom Rechner erkannt wird und beliebge Zeichenketten und Tastenkombinationen an den Host-Rechner senden kann.

Mein Ziel war es ein kleinen Hardware-Dongle zu entwickeln welcher Passwörter, TANs und Onetime-Tokens direkt an jeden beliebigen Rechner senden kann. Meine Passwörter sind im verschlüsselt EEPROM des Mikrocontrollers gespeichert. Beim Drücken, des Tasters auf dem Stick, wird das Passwort eingegeben.

Als Hardware nutze ich die zuvor vorgestellten USBasp Programmieradapter aus China, deren Firmware ich durch eine eigene ersetzt habe. Mit einem zusätzlichen Taster lässt sich so über ein kleines Menü zwischen 10 User-Passwort-Kombination wählen.

Neue Passwörter können mit einem kleinen Konsolen-Programm direkt über den Rechner einprogrammiert werden.

HIDeKey soll auch zur Generierung von One Time Passwords (OTP) genutzt werden können. Da er sich wie ein gewöhnliche USB-Tastatur verhält, kann er auch unterwegs am Schlüsselbund in Internet-Cafes und Rechner-Pools genutzt werden.

Quelltext und Schaltpläne gibt auf Codeberg: /stv0g/hidekey .

In meinem Wiki ist auch noch etwas Dokumentation gesammelt.

HIDeKey ist wie die meisten meiner Projekte als OpenSource veröffentlicht. Ich freue mich über jede Verbesserung, Erweiterung oder andere Beiträge zu diesem Projekt 😊.

GitHub Migration

Source: https://octodex.github.com

Heute habe ich meine 27 git-Repositories auf Github ( /stv0g ) umgezogen. Ich habe mich entschlossen sie so einer größeren Öffentlichkeit zugänglich zu machen und als zusätzliches Backup auf meinem Server zu spiegeln.

Seit kurzem hat github seine neue API v3 veröffentlicht. Auf dieser aufbauend habe ich ein PHP Script geschrieben, welches meine existierenden Repositories bei github anlegt und migriert.

  1. Das Script in das Wurzelverzeichnis aller Repositories ablegen
  2. github Username und Passwort im Skript anpassen
  3. php github.php

Das Script ist auf Codeberg verfügbar: /stv0g/snippets/php/github.php .

Ein paar weitere Features des Skriptes umfassen::

  • Es wird automatisch ein entsprechende github Remote im Repository hinzugefügt
  • Alle in der Datei gitweb.projects gelisteten Repositories werden als öffentlich markiert
  • Befindet sich im Repository eine Datei description wird deren Inhalt übernommen
  • Per Exclude-Filter können bestimmte Repositories ausgeschlossen werden

transcode

Digital Logic Diagram
Assembler code

Ich sitze im Zug nach Hause. Gerade komme ich von der letzten Vorlesung des zweiten Semesters: Informatik. Eigentlich bin ich auf dem Weg in die Semester-”Ferien”, ständen da nicht für den nächsten Monat noch 4 Klausuren in meinem Kalender 😉.

Informatik, Grundlagen des Digitalrechners. Klingt eigentlich recht trocken. Trotzdem ist es klar mein Favorit unter den Fächern dieses Semesters. Als Ergänzung zur Vorlesung richtete unser Professor einen kleinen Wettbewerb aus. Mein Beitrag zum Students Englightment Award ist ein Compiler Frontend für den GNU Compiler der Atmel AVRs.

Teil der Vorlesung war die Einführung des Mikrocontrollers ATMega8 von Atmel und dessen Programmierung mit Assembler. Dabei lernten wir zuerst die Schaltungstechnischen Grundlagen und die Minimierung von Schaltnetzen. Anschließend sind wir auf den Aufbau der Zentralen Recheneinheit eingegangen (Steuerwerk, ALU).

transcode kompiliert & assembliert ANSI C und Assembler in Maschinencode und umgekehrt. Dabei wird mit Hilfe von Debugging Informationen ein Bezug zwischen Zeilen im C-Code und den Mnemonics hergestellt. Durch Auswählen von Zeilen werden Bezüge direkt durch Hervorhebungen dargestellt. Für die Darstellung des Maschinencodes lässt sich zwischen binär, dezimal & hexadezimaler Form wählen.

volkszaehler.org Zählerbox

Die volkszaehler.org Zählerbox
Die volkszaehler.org Zählerbox.

Das volkszaehler.org Projekt nähert sich mit großen Schritten seiner ersten stabilen Version und damit dem ersten Release.

Ich möchte hier nur einen kurzen Überblick über den aktuellen Stand geben. Du kennst das Projekt noch gar nicht? Weiß nicht was Smart-Meter sind? Da steigst du besser auf unsere Projekt Website ein!

Für die Entwicklung am Projekt habe ich mir eine kleine Hutschienenbox gebaut. Sie eignet sich perfekt für den mobilen Einsatz und zum Testen neuer Firmware und Funktionen. Mal schnell den Verbrauch des eigenen Kühlschranks zu erfassen ist kein Problem. Derzeit ist mein Schreibtisch an die Box angeschlossen und liefert so aktuelle Daten für die Demo Installation des Projektes.

Die Box enthält folgende Komponenten:

  • ~230V Eingang über Kaltgerätestecker (geerdet, max. 10 Ampere)
  • ~230V Ausgang über Schukostecker (geerdet, max. 16 Ampere)
  • Sicherungsautomat (Ein-/Ausschalter)
  • B&G E-Tech DRS-154D S0-Zähler (einphasig, 2000 Impulse/kWh)
  • Udo’s S0-Server (basierend auf Atmel AVR’s & ethersex, 10 Mbit/s Ethernet, TFTP Bootloader)
  • Knopf zum manuellen Triggern von Impulsen
  • externer Anschluss von Zählern

Conway's Game of Life

Conway's Game of Life Screenshot
Conway's Game of Life Screenshot.

Als Übung für meine Informatik Vorlesung an der RWTH Aachen habe ich diese C Implementation von Conways Game of Life geschrieben.

Dieses simple “zero player” Game wird komplett im Terminal ausgeführt. Mit Mausunterstützung und Farben wurden mit libncurses realisiert.

Den Quelltext findet ihr inklusive eines Makefiles auf Codeberg: /stv0g/rwth-info1/src/conway.c .

  • p” pausiert das Spiel
  • q” beendet das Spiel
  • c” leert das Spielfeld
  • Leertaste setzt eine neue Zelle in das aktuelle Feld
  • Pfeiltasten bewegen den Cursor
  • Maus kann zum Bewegen des Cursors genutzt werden
  • 0” fügt ein chaotisches Anfangsmuster ein
  • 1” fügt einen Glider in das Spielfeld ein
  • 2” fügt einen Segler in das Spielfeld ein
  • 3” fügt einen Buffer in das Spielfeld ein
  • +” erhöht die Anzahl der Generationen pro Sekunde (frames per second)
  • -” erniedrigt die Anzahl der Generationen pro Sekunde (frames per second)

fnordlicht VU Meter

Last time, I presented some code for visualizing your power consumption using the Fnordlicht modules. Today, we continue the journey in a similar direction: I’ve written a small C program to control the modules according to the current audio volume.

The software monitors the audio signal of my system (Ubuntu 10.10 with Pulseaudio). So you can dance to everything that can play audio 😄…

Update: As preparation for an upcoming exam, I added a Discrete Fourier Analysis (DFT). Unfortunately, the serial bus is to slow to visualize the audio spectrogram in real time . The bars are colored with their complex phase->hue (HSV) equivalent.

fnordlicht FFT Visualization
fnordlicht FFT Visualization.

The software uses libfn a C-library for controlling fnordlichts and is available at Codeberg: /stv0g/libfn/src/fnvum.c .

Ich benutze PulseAudio um mich in die Soundkarte des Systems einzuklinken. Das Programm tarnt sich als Recording-Tool. Und kann dadurch den kompletten Audio-Output oder nur bestimmte Programme visualisieren. Sogar das Mikrofon kann ich benutzen 😜.

PulseAudio liefert mir einen einfachen PCM Stream (44,1kHz Samplingrate, Mono & 16-Bit signed Integers). Derzeit addiere ich immer nur x Werte dieses Byte Streams und mittele diese Summe dann über einen kurzen Zeitraum.

Geplant ist noch eine FFT-Analyse um die Amplituden verschiedener Frequenzen gemäß der “Ohrkurve”, der Empfindlichkeit des menschlichen Gehörs, gewichten zu können. Der Schritt zur Spektral Darstellung (jedes meiner 10 fnordlichter als VU-Meter für ein bestimmtes Frequenzband) ist dann hoffentlich auch nicht mehr so weit.

Ohrkurve
Ohrkurve.

volkszaehler.org

volkszaehler.org Logo
volkszaehler.org Logo.

volkszaehler.org ist ein freier Smart Meter (hier: intelligenter Stromzähler) im Selbstbau. Die anfallenden Stromprofile bleiben dabei unter der Kontrolle des Nutzers.

Seit dem 1. Januar 2010 müssen Stromversorger ihren Kunden für Neubauten so genannte “intelligente Stromzähler” (Smart Meter) anbieten. Der Kunde soll dadurch seinen Stromverbrauch analysieren und optimieren können.

Die dabei anfallenden Daten (“Stromverbrauchsprofil”) erlauben einen sehr detaillierten Einblick in den Tagesablauf des Nutzers (wann steht er auf? wann geht er in’s Bett? wann kocht er? wie oft verwendet er seine Spülmaschine? verändert sich sein Verhalten? …). Darum sollten die Daten ausschließlich für den Nutzer selbst zur Verfügung stehen - und das geht nur, wenn man sich den Smart Meter selbst baut. Mit einem Materialeinsatz von etwa 100 €, etwas Geschick und Zeit lässt sich das mit Hilfe eines Standard-µC-Moduls aufbauen.

Auf der SIGINT 2010 konnte ich mir den Vortrag von Justin Otherguy über das noch recht junge Projekt anhören und fand anschließen die Gelegenheit mit ihm über das Projekt zu sprechen. Schnell war für mich klar, dass ich hier helfen möchte.

Bisher gibt es nur einen funktionsfähigen Prototypen. In den letzten Wochen habe ich mit ein paar weiteren Entwicklern begonnen den Code des Prototypen neu aufzubauen.

Die Architektur von volkszaehler.org ist dreigeteilt:

  1. Die Controller und Sensor Ebene erfasst mithilfe eines Mikrocontrollers die Daten leitet sie an den Backendserver weiter.
  2. Der Backendserver besteht aus einem PHP-Skript und einer Datenbank. Hier werden die Daten weiter verarbeitet und ausgewertet. Er kommuniziert ausschließlich über eine standardisierte JSON API.
  3. Das Frontend stellt die Daten für den Benutzer übersichtlich dar und ist für die Ausgabe der Analysen verantwortlich.
Systemübersicht volkszaehler.org
Systemübersicht volkszaehler.org.

Diese Darstellung verrät uns auch, dass nur der Stromverbrauch erfasst werden kann. Geplant sind sämtliche Messgrößen (Temperatur, Luftdruck, Luftfeuchtigkeit, Strahlung, Niederschlag, …).

Bisher gibt es noch keine stabile, lauffähige Version des Quellcodes. Im Wiki, der Mailing-Liste und im GitHub Repository ( /volkszaehler/volkszaehler.org ) findet ihr weitere Informationen zu meinem neuen Projekt.

Wir freuen uns über jede Unterstützung 😊. Besonders Entwickler mit PHP und Javascript Kenntnissen wären hilfreich 😉.

Traktor Pro unter Linux

VMWare Logo

Es läuft! Nachdem ich über Google & Co nicht weitergekommen bin, habe ich selber mal etwas experimentiert. Die sonst üblichen Methoden über Wine, Cedega und CrossOver brachten mich leider nicht weiter.

Das Zauberwort lautet “VMWare Workstation”. Erstaunlicherweise ist eine virtualisierte Maschine schnell genug um Traktor akzeptabel nutzen zu könnten. Jedoch muss man bei internen Soundkarten mit einer höheren Latenz rechnen. Mit meinem neuen Audio-Interface konnte ich die Latenz durch ASIO-Treiber und die direkte Anbindung per USB noch deutlich senken. Der Anschluss über sorgt dafür, dass das die Ansteuerung in der virtualisierten Maschine erfolgt. Es ist kein Umweg mehr über das Linux Soundsystem (ALSA) nötig. Es wird nur der Windows Treiber benötigt.

Um das ganze stabil nutzen zu können solltet ihr jedoch schon einen aktuellen Rechner mit ausreichend RAM (> 2GB) und mindestens zwei CPU-Kernen haben. Für den Produktiveinsatz kann ich es nur bedingt empfehlen, da ich zwischenzeitlich ein paar Performance Probleme hatte und die Audio Wiedergabe kurzzeitig aussetzte. Aber diesem Fall kann man natürlich auch mal Windows booten 🫤.

Waveform

USB Audiointerfaces für Linux

Musik ist meine Freizeitbeschäftigung. Mittlerweile höre ich sie eigentlich in jeder Lebenslage. Zuhause, beim Laufen, Fahrrad fahren, auf der Arbeit und in der Bahn. Man könnte fast sagen ich bin süchtig geworden 🫤. Die Qualität der Onboard-Soundkarte meines Dell Latitude ist einfach nur miserabel. Von dem Mikrofon Eingang ganz zu schweigen. Ganz klar hier muss was besseres her.

Vorne weg: ich habe das Terratec PHASE 26 USB und das Cakewalk UA-1G getestet und mich schließlich für das Terratec entschieden. Meine Entscheidung habe ich nicht nach keinem bestimmten Gesichtspunkt getroffen. Hauptsächlich nutze ich das Interface aber zur Wiedergabe. Vielleicht gibt es demnächst auch mal wieder einen Audiobeitrag von mir 😉.

Kriterien waren neben der Linux-Unterstützung ein digitaler Ausgang, ein Mikrofon- und Line-Eingang sowie herausragende Audioqualität. Preislich habe ich mir eine Grenze von 100 € gesetzt.

Tiny DNS & URL aka SDDNS

SDDNS Favicon

Zusammen mit Micha besuchte ich Ende letzten Jahres das U23 des C4 in Köln. Dort habe ich viel über die Techniken des Internets gelernt. Unter anderem ging es hier auch um das Domain Name System, das für die Namensauflösung im Internet verantwortlich ist.

Mittlerweile betreibe ich einen eigenen DNS Server für meine Domains (0l.de, steffenvogel.de, griesm.de & vogel.cc).

Zudem biete ich euch kostenloses DNS Hosting. Gerne übernehme ich auch die DNS Administration eurer Domains. Jedoch könnt ihr sicherlich verstehen, dass ich euch dafür dann nichts garantieren kann.

Mit der Zeit habe ich ein Webinterface für den DNS Server Bind entwickelt auf das nun jeder Zugriff hat. Ihr könnt eigene Subdomains registrieren, Records setzen und URL Weiterleitungen einrichten. Dynamisches DNS wird ebenso unterstützt.

Es ist auch möglich URLs zu verkürzen und so beispielsweise die URL: https://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&msid=100237997621038330776.000468b0a95f89721a96e&ll=18.646245,15.820313&spn=120.933723,198.632813&z=3 auf http://a.0l.de abzukürzen Das ist vergleichbar mit dem Service von TinyURL. Jedoch sind meine URLs dann um 7 Zeichen kürzer 😊. Im Gegensatz TinyURL sind meine URLs auch nur über die Subdomains erreichbar. Eine direkte Unterscheidung zwischen eigenem DNS Record und einer simplen URL Weiterleitung ist also nicht möglich.

Service Wiki/Doku

UNI-TREND UT61E Digital Multimeter

Der Testaufbau
Der Testaufbau.

Seit ein paar Wochen habe ich schon nun mein neues Multimeter: ein UT61E von UNI-TREND. Bisher bin ich rundum zufrieden damit. Gekauft habe ich es über das Internet bei Pinsonne-Elektronik. Lieferung und Bezahlung verlief schnell und problemlos. Den Laden kann ich also nur weiterempfehlen.

Ein besonderes Highlight der neuen Messgeräte ist die RS232 Schnittstelle für die Auswertung am Rechner. Über diese per Optokopler isolierte Schnittstelle ist es möglich in aktuelle Messergebnisse am Rechner auszuwerten und weiter zu verarbeiten.

Leider haben die in China ansässigen Hersteller die Linux-Gemeinde aber mal wieder vergessen. Nach einigen Recherchen und etlichen Stunden später habe ich es dann jedoch geschafft ein kleines Tool für Linux zu entwickeln, welches mir die Messergebnisse im CSV Format liefert. In diesem Format kann ich sie nun in Open Office, MatLab und vielen anderen Programmen öffnen und auswerten.

Als besonderes Gimmick habe ich auch noch ein kleines Script geschrieben, das mit Hilfe gnuplot Graphen der Messergebnisse zeichnet. Diese werden dann 1-2 in der Sekunde aktualisiert. Mit einem Oszilloskop ist das jedoch lange noch nicht vergleichbar. Aber für Langzeit-Messungen durchaus sehr praktisch.

Die Live-Darstellung der Messergebnisse mit gnuplot
Die Live-Darstellung der Messergebnisse mit gnuplot.

Ich bedanke mich bei Henrik Haftmann für die detaillierte Beschreibung des Protokolls, welche mir beim Entwickeln dieses Tools unheimlich geholfen hat.

Update: Ich habe das Datenblatt es verwendeten IC’s gefunden. Es enthält auch eine Spezifikation des serielle Protokolls. Hier geht es zum neuen Eintrag mit Bildern des Chips und der restlichen Platine.

Das Tool sowie das gnuplot Script habe ich hier in einem Archiv zusammengefasst:

Download:dmmut61e-0.01.tar.gz (C++ Quelltext + gnuplot Script)

Die Installation ist sicherlich nicht die einfachste. Aber die nötigen Kenntnisse setzte ich bei dieser Zielgruppe einfach mal voraus 😜.

Anregungen, Patches und Bug Reports sind per Mail immer willkommen.

Hier noch ein kleines Beispiel wie die Daten von meinem Tool ausgegeben werden. Für das Verständnis hilft sicherlich ein Blick in den Quelltext.

1;0.0589;0.0589;0;0.0589;V;AC;Manual
2;0.07184;0.07184;0;0.06537;V;AC;Manual
3;0.12869;0.12869;0;0.0864767;V;AC;Manual
4;0.07876;0.12869;0;0.0845475;V;AC;Manual
5;0.06458;0.12869;0;0.080554;V;AC;Manual
6;0.09626;0.12869;0;0.0831717;V;AC;Manual
7;0.17355;0.17355;0;0.0960829;V;AC;Manual
8;0.17487;0.17487;0;0.105931;V;AC;Manual
9;0.13565;0.17487;0;0.109233;V;AC;Manual
10;0.10726;0.17487;0;0.109036;V;AC;Manual
11;0.16506;0.17487;0;0.114129;V;AC;Manual
12;0.14415;0.17487;0;0.116631;V;AC;Manual
13;0.15238;0.17487;0;0.119381;V;AC;Manual
14;0.17396;0.17487;0;0.123279;V;AC;Manual
15;0.11834;0.17487;0;0.12295;V;AC;Manual
16;0.2117;0.2117;0;0.128497;V;AC;Manual
17;0.18906;0.2117;0;0.132059;V;AC;Manual
18;0.17674;0.2117;0;0.134542;V;AC;Manual
19;0.08354;0.2117;0;0.131857;V;AC;Manual
20;0.053;0.2117;0;0.127915;V;AC;Manual
21;0.0688;0.2117;0;0.1251;V;AC;Manual
22;0.12796;0.2117;0;0.12523;V;AC;Manual
23;0.14954;0.2117;0;0.126287;V;AC;Manual
24;0.17535;0.2117;0;0.128331;V;AC;Manual
25;0.1381;0.2117;0;0.128722;V;AC;Manual
26;0.1588;0.2117;0;0.129878;V;AC;Manual
27;0.13258;0.2117;0;0.129979;V;AC;Manual
28;0.097;0.2117;0;0.128801;V;AC;Manual
29;0.04637;0.2117;0;0.125958;V;AC;Manual
30;0.06749;0.2117;0;0.124009;V;AC;Manual
31;0.09002;0.2117;0;0.122913;V;AC;Manual
32;0.07575;0.2117;0;0.121439;V;AC;Manual
33;0.0711;0.2117;0;0.119914;V;AC;Manual

Radio Beitrag: Swing Jugend (Musik)

Entartete Musik
Entartete Musik.

Für unser derzeitiges Musikthema sollten wir einen Radiobeitrag zum Thema Jazz produzieren. Bastian Hauk und ich entschieden uns erst für den Jazz im dritten Reich. Nach einiger Recherchen spezialisierten wir uns auf die Swing-Jugend. Zeitzeugen zu finden war schwer. Schließlich stießen wir auf den Swing Experten und Zeitzeugen Günter Discher, der früher in Hamburg selbst Teil der Swing Jugend war. Leider haben wir keinen Interview Partner gefunden und mussten so auf vorhandene Interviews auf CDs ausweichen. Insgesamt hat unser Kurs etwa 6 Interviews produziert, die wir nun an andere Schulen schicken wollen. Wenn rechtlich alles in Ordnung ist werden die Beiträge auch von Radio Darmstadt gesendet 😊.

Tanzen Verboten
Tanzen Verboten.

World Smallest Passive Ethernet Tap

Hello folks!

This is my first English blog post. Excuse me for my hopefully not so bad English 😊.

During my reverse engineering on the Terratec Noxon 2 Audio I had to sniff the network traffic between the Noxon and the Internet. First, I just sniffed the wireless traffic with a simple ARP spoofing attack in my switched network. But I couldn’t be sure whether I sniffed the whole traffic or if I just missed some internal traffic in my network.

After some internet research, I decided to build my own passive Ethernet tap to do a MITM (man-in-the-middle) attack.

Passive Ethernet Tap
Passive Ethernet Tap.

Last.fm & Noxon Audio 2

Anlässlich meines 8000. “gescrobbeltetn” Tracks auf www.last.fm habe ich mich entschlossen mal etwas über dieses Social-Music Netzwerk zu berichten.

Mein Last.fm Profil vom 9. Septemer 2008
Mein Last.fm Profil vom 9. Septemer 2008.
Last.fm auf dem Noxon 2 Audio
Last.fm auf dem Noxon 2 Audio.

Die Philosophie und der Aufbau von Last.fm ist in Wikipedia näher beschrieben.

Meistens höre ich die Radio Streams von Last.fm über mein Terratec Noxon 2 Audio. Dieser Hardware Audiostreaming Client bietet standardmäßig keine Möglichkeit das proprietäre Streamingformat von Last.fm wiederzugeben. Dazu ist eigentlich der Last.fm Player nötig. Dieser ist für diverse Plattformen verfügbar (Mac, Linux, iPhone und Windows).

Noxon 2 Audio Interna

Nachdem ich mich im vorherigen Beitrag über die Verwendung des Noxon’s als Last.fm Client ausgelassen habe, werde ich mich diesmal tiefer in die Interna des Streaming Clients wagen.

Genauer geht es um das Ersetzten/Erweitern der vTuner Stations Liste und das Hinzufügen eigener Services in das “My NOXON” beziehungsweise “Podcasts” Menü.

Terratec Noxon 2 Screen
Terratec Noxon 2 Screen.

Dell Latitude D630 ist da!

In den vergangenen Osterferien habe ich jeden Tag um die Ankunft meines neuen Laptops gefiebert. Als er dann sechs Tage verfrüht bei mir auf dem Tisch lag freute ich mich riesig. Hier ein Kompliment an Dell. Diese pessimistische Lieferzeiteinschätzung ist wirklich eine gute Marketing Strategie.

Meine ersten Erfahrungen mit dem D630 unter Debian Etch waren grauenvoll. Anfange lief gar nichts. Erst nach mehreren Stunden konnte ich die wichtigsten Komponenten zum Laufen bringen.

Meine Rettung war die neue LTS (Long Term Support) Version von Ubuntu, Hardy Heron, die fast zeitgleich mit dem Eintreffen meines Laptops veröffentlicht wurde.

Zu Ubuntu gibt es nicht viel zu sagen: Es läuft einfach alles!

Und das nach circa 20 minütiger Installation, ohne weitere Konfiguration.

18 und mehr...

Ja endlich bin ich es auch! Volljährig!

Lange habe ich nun schon darauf hin gefiebert. Schließlich war es doch ein wenig ernüchternd. Meine Führerschein hab schon, bin aber bisher noch nicht alleine gefahren 🙁. Ansonsten hat sich auch nicht viel geändert. Zugegebenermaßen hatte ich das auch nicht erwartet. Bank, Versicherung & Verwandte stehen Schlange…

Nur das Wetter spielt dieses Jahr etwas verrückt. Bei uns schneit es täglich, und das in Hessen während Ostern!

Dafür gibt es diesmal ein fettes Geburtstagsgeschenk:

Dell Latitude D630
Dell Latitude D630.

Nach einigen Recherchen habe ich mich schließlich für einen Dell Latitude D630, und gegen ein Modell der Inspiron Serie, entschieden. Mein Vater besitzt ein ähnliches Modell als Dienst-Notebook. So fiel mir die Entscheidung etwas leichter.

Neue IP für Zyxel Router mit curl

Einige dürften das Problem gut genug kennen: Viele File Hoster begrenzen den Download Traffic einer IP auf wenige hundert Megabytes pro Tag. Um diese Begrenzung zu umgehen bedarf es einer neuen IP. Hier zeigt sich der wohl einzige Vorteil der dynamischen IP Adressen für Privatkunden. Die begrenzte Verfügbarkeit von IP Adressen zwingt die Access Provider die IP Adressen dynamisch aus einem Pool an die Router zu verteilen. Bei einem erzwungenen Reconnect ändert sich die IP Adresse dann mindestens jeden Tag einmal. Diese Dauer ist aber nur nach oben begrenzt. Prinzipiell wäre es möglich seine IP Adresse jede 10 Minuten zu ändern. Oder wenn das Download Limit des File Hosters erreicht wurde. Dazu bedarf es normalerweise ein paar Klicks im Admin Menü des Routers. Für das “Arcor-DSL WLAN-Modem 100” hinter dem sich ein Zyxel Prestige HW660 verbirgt habe ich folgendes Bash Script geschrieben.