This is the personal homepage of Daniel Friesel / derf / derfnull (depending on context and nickname availability). Every now and then, I write software and take pictures, which you can find here. There's also some hosted services.
Provides random music genres
CLI password safe
Interface to EFA-based itinerary services
> efa Essen Martinstr Düsseldorf Hbf 14:34 ab Essen Martinstr.: Bstg. 1 Straßenbahn 108 Essen Altenessen Bf Schleife 14:38 an Essen Hauptbahnhof: Bstg. 1 14:47 ab Essen Hauptbahnhof: 2 R-Bahn RE11 (RRX) Düsseldorf Hbf 15:24 an Düsseldorf Hbf: 10
Interface to Deutsche Bahn Wagon Order API
> db-wagenreihung 'Essen Hbf' 723 ▏ G ▕▏ F ▕▏ E ▕▏ D ▕▏ C ▕▏ B ▕▏ A ▕ > 39 38 37 36 35 33 32 31 29 28 27 26 25 23 22 21 >
Interface to HAFAS-based arrival/departure monitors
> hafas-m 'Messegelände, Leipzig' 14:32 STR 16 Lößnig, Leipzig 14:40 STR 16 Sportforum Süd, Leipzig 14:43 ALT 86 S-Bahnhof Messe, Leipzig 14:47 STR 16 Lößnig, Leipzig
Interface to the Deutsche Bahn IRIS arrival/departure monitor
> db-iris 'Dortmund Hbf' 14:38 +16 IC 2027 Passau Hbf 11 14:39 ABR RE11 Kassel-Wilhelmshöhe 8 14:41 RE 57 Winterberg(Westf) 2 └──── RE 57 Brilon Wald 2 14:41 S 5 Hagen Hbf 5 14:42 S 2 Dortmund Hbf 6 14:45 +1 RE 1 Aachen Hbf 16
Interface to URA-based realtime departure monitors
> ura-m Talbot 14:49:41 52 Aachen Bushof 15:04:47 11 Lichtenbusch 15:05:00 52 Eschweiler Bushof 15:18:00 1 Aachen Bushof 15:19:56 11 Hoengen Markt 15:35:00 1 Schevenhütte
Interface to EFA-based departure monitors
> efa-m Dortmund 'Universität S' 08:32 +1 02 445 Dortmund Am Kai 08:35 3 HB1 Dortmund Technologiezentrum 08:36 3 HB1 Dortmund Eichlinghofen H-Bahn 08:38 02 447 Dortmund Bandelstraße 08:39 2 S1 Dortmund Hbf 08:40 01 447 Dortmund Hacheney
vcs-home inspired dotfile manager
> ct a mutt mutt: retrieving package Cloning into 'mutt'... [..] created .muttrc -> /home/derf/packages/mutt/etc/muttrc
Electrocardiograph-like graphical and audible ping
> ekgping ccc.de __________^________^__________^________^______
save and restore environment variables
imlib2 based image viewer
Publish multiple MQTT messages at once
Firmware and Hardware
8x8 LED board with audio-based programmer
Light and power remote control
USB ↔ I²C adapter
These projects are neither developed nor maintained any more. Some do offer basic functionality, though.
Icinga1 Commandline Interface
Project status overview
automated mirrorer for webcomics and image galleries
Create thumbnail index for a set of images
Whitelist remote commands via ssh config
- Ignore apparently useless "ZOB" (central omnibus station) links at most main stations. This decreases the average runtime and also fixes some S-Bahn trains being reported twice in München Hbf.
Result->qos_messages: Skip superseded messages. They're still present in
Result->route_interesting: Filter Hbf suffixes (not just "Hbf"); include .hl.n (czech main station).
To increase flash lifetime and avoid problems with unexpected power cuts, I run all of my embedded Linux systems from a readonly root filesystem. This is a moving target: Depending on the software in use as well as the version and configuration of systemd and userland software, different adjustments may be needed.
I have created a readonly linux reference page containing all tweaks I
know of at the moment, which are mostly tmpfs mounts and
entries. I'll update it when I run by something new.
Preseeding is a handy way of automating Debian installations. With a proper preseed.cfg, a Debian installation can run completely unattended in about 10 minutes, including setup of users, sudo and SSH keys.
For future reference, here are the things I found helpful
custom post-installation commands
d-i preseed/late_command executes arbitrary commands after the installation
is completed. I use this to set up SSH keys and sudo, like so:
in-target mkdir -p /root/.ssh /home/derf/.ssh; \ in-target wget -O /root/.ssh/authorized_keys https://.../keys-root; \ in-target wget -O /home/derf/.ssh/authorized_keys https://.../keys; \ in-target chmod 700 /root/.ssh /home/derf/.ssh; \ in-target chmod 600 /root/.ssh/authorized_keys /home/derf/.ssh/authorized_keys; \ in-target chown -R derf:derf /home/derf/.ssh; \ apt-install sudo; in-target adduser derf sudo
Adding preseed.cfg to virt-install images
--initrd-inject embeds arbitrary files into the root of the installation
image. So, for preseeding, just add
--initrd-inject .../preseed.cfg to your
Adding preseed.cfg to USB images (with UEFI support)
This is a bit more tricky. Basically: Download and unpack ISO, inject preseed.cfg into initrd, refresh md5sums, rebuild ISO and add UEFI support.
The following script should do the job for most amd64 systems.
#!/bin/sh set -e ISO="$1" WD="$(mktemp -d)" 7z x -o$WD $ISO cd $WD gunzip install.amd/initrd.gz cp /tmp/preseed.cfg . echo preseed.cfg | cpio -o -H newc -A -F install.amd/initrd rm preseed.cfg gzip install.amd/initrd find -follow -type f -print0 | xargs --null md5sum > md5sum.txt cd xorriso -as mkisofs -o $ISO -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \ -c isolinux/boot.cat -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 \ -boot-info-table -eltorito-alt-boot -e boot/grub/efi.img -no-emul-boot \ -isohybrid-gpt-basdat $WD
findmnt --raw --noheadings --output options --target SOME_DIRECTORY | grep -qE '(^|,)ro($|,)'
findmntis a handy alternative to
mountwhen writing scripts
- SOME_DIRECTORY does not have to correspond to a mountpoint. If it doesn't, findmnt will traverse its parent directories until it finds the corresponding filesystem / mountpoint.
- a simple
grep rowould also match options like
errors=remount-ro, so we make sure to only match the single
rooption. It must be delimited by commas or the start/end of the option string.
I have a set of maildirs (one for each mailing list / other context) and want to know which of them contains unread mail without firing up my MUA.
Luckily, this is easy to do on the commandline without even looking at mail contents, as there's (mostly?) two kinds of unread mail:
- new and unprocessed mail. These messages are stored in
Maildir/new, so if there's anything in there, it's an unread mail
- new but no longer "Recent" mail. These messages have not been read yet, but
have already been transferred to a MUA using a Read-Write operation, causing
them to be marked as no longer new on the server side. They are stored in
Maildir/curalongside read mail, but do not have the "Seen" (S) flag set.
This is easy to check with zsh globbing:
new/*(N) expands to a non-empty
list if new and unprocessed mail is present, and
cur/*~*,*S*(N) expands to
a non-empty list if old but unread mail is present. Note that it requires
extended_glob zsh option to be set.