EDC Toolkit

Unser Haus und Grundstück sind relativ groß und so wandere ich immer wieder übers Gelände und suche da und dort (Scheune, Büro, Küche, worst of all: Jugendzimmer, argh!) passendes Werkzeug zusammen, wenn mal wieder eine von zahllosen Kleinigkeiten Bastelbedarf hat. Da ich alles (d.h.: ALLES) an Werkzeug besitze, will ich nicht mit Multitools improvisieren wie so ein Anfänger, auch wenn ich – natürlich – seit vielen Jahren das unvermeidliche Leatherman-Tool mein eigen nenne.

Aus dieser kleinen Gürteltasche wurde also ein minimalistisches aber praktikables EDC-Toolkit zum mal eben schnappen und mitnehmen, und als Reisewerkzeug. Sie ist nicht zu prall gefüllt, so dass reichlich Platz ist, um im Eifer des Gefechts noch einmal einen dedizierten Schraubendreher oder Schraubenschlüssel und eine Handvoll Material dazuzustecken.

Hier die genaue Tasche, und hier der selbstkonstruierte Gürtelclip dazu.


Kombizange

Okay, hier ein kontroverser Einstieg, denn obwohl ich die gute Knipex-Kombizange in 145 mm aus Gründen gleich zweimal zur Hand habe, bin ich für das EDC-Toolkit auf eine noch kleinere “Elektronik-Kombizange” in 120 mm von OBI umgestiegen, die nicht nur kleiner, sondern auch um ein Drittel leichter als die Knipex ist. Die Verarbeitung sieht sehr passabel aus, aber es ist längst nicht erwiesen, ob ihre Geometrie mit den gerade mal 2,5 cm langen Backen die Benutzbarkeit nicht zu sehr einschränkt. Der integrierte Seitenschneider ist zumindest 8 mm lang und scheitert nicht gleich am ersten haushaltsüblichen Kabelbinder.

Alternative: Alternativlos.


Phasenprüfer

Wera-Phasenprüfer

Fast schon richtiger Trollbait, der Phasenprüfer von Wera, der in diesem Haushalt aufgrund eines Vorrats geeigneterer Messgeräte sonst kaum Verwendung findet.

Alternative: Ganz weglassen. So ein Phasenprüfer verleitet allein durch seine Existenz dazu, ihn unsachgemäß in nicht passenden Schrauben und als Hebelwerkzeug zu verwenden, oder am Ende gar damit in Steckdosen herumzustochern.


Selbstgedruckte Schraubenlehre

Schraubenlehre für Längen von 5-65 mm und Durchmesser von M2 bis M6, mit Möglichkeit, direkt auch Muttern zu messen.

Ein ausgewachsener Messschieber konnte hier schon allein aus Platzgründen nicht rein, also habe ich längere Zeit hin und her überlegt, ob es vielleicht eine dieser Minischieblehren aus Plastik werden sollte. Vorerst habe ich beschlossen, dass dieses selbstgedruckte Teil für ein paar Cent in vielen Fällen das selbe leistet.

Alternative: 75- oder 100-mm-Messschieber aus Plastik; vielleicht fällt mir ja mal einer im Baumarkt in die Hände.


Selbstgedrucktes Allzweckmesser

Einfaches Messer, bei dem eine Trapezklinge rausgeschoben wird

Das ist ziemlich eigenwillig, aber ich wollte ein flaches und leichtes Messer, ohne Geld für sowas wie ein Spyderco Grasshopper auszugeben, und wollte auch nicht in einer Tasche herumfingern, in der ein unförmiges Opinel mit seinem Sicherheitsdefizit steckt, das man auch nicht gerade geschenkt bekommt. Hier ein wirklich schönes 3D-Modell, dem man deutlich ansieht, dass es durch einige Design-Iterationen gegangen ist, und das ich bereits 4x gedruckt habe.

Alternative: Cuttermesser aus dem 1-Euro-Regal, aber eins von den ganz leichten schmalen.


Multi-Bit Schraubendreher

Der Wiha Stubby 43613 sieht ein klein wenig aus wie ein Scherzartikel, ist natürlich nichts für Arbeiten in der Feinmechanik, aber bei 7 mitgelieferten Doppelbits, davon 6 im Griff untergebracht, kann jedes andere Produkt einpacken, noch dazu zu dem Preis. LTT-Screwdriver: Absurd teuer und viel zu groß, Wera Kraftform Kompakt 27: Zu groß und zu wenig Bits drin.

Drehmoment und Griffigkeit sind perfekt, besser als beim knarzenden und knackenden Wera Kraftform. Da die Bit-Aufnahme für die Doppelbits sehr tief ist, habe ich selbstkonstruierte Distanzhülsen dabei, die in der Bit-Aufnahme untergelegt werden können, um normale Bits aufzunehmen.

Alternative: Wera Kraftform Kompakt 27, aber eigentlich nicht wirklich.


Bit-Ratsche

Bit-Ratsche, bei der zu sehen ist, wie die Bit-Aufnahme nach hinten hohl ist.

Dieser Ausrüstungsgegenstand hat sich zwischen dem Release-Kandidaten und jetzt in die Tasche gemogelt. Zunächst war hier eine Wera Zyklop 8004A mit 1/4″-Vierkant und Bit-Adapter drin (zusammen 154 g), die ich mal zum Geburtstag bekommen hatte. Ersetzt wurde sie durch eine eigens angeschaffte Wera Zyklop Mini 1 8001A. Es handelt sich hier um ein sehr sehr kleines und wirklich spielzeughaftes und dabei aber auch teures Werkzeug, das den Vorteil hat, dass sich die Doppelbits des Wiha Stubby (mit einer Ausnahme) bis zum Anschlag durch die Rückseite der Bit-Aufnahme hindurchstecken lassen.

Alternative: Jede Ratsche mit Bit-Aufnahme oder Bit-Adapter. Auf der andere Seite muss man aber auch bedenken, dass der Preis von 30 Euro sich schnell relativiert, wenn man sieht, was für gruseliges Zeugs es für 10-12 Euro bei Amazon gibt.


100 mm Rollgabelschlüssel

Kleiner Rollgabelschlüssel

Der kleinste Rollgabelschlüssel aus dem Baumarkt ersetzt jeden Schraubenschlüssel bis 13 mm und hat uns auf Reisen bereits allerbeste Dienste geleistet.

Alternative: Leider keine. Die Universalschraubenschlüssel von Wera sind enorm teuer und so unflexibel, dass ich mich frage, wo sie eigentlich ihre Anwendung finden.


1/4″ Spezialbits

Ein Bit-Clip mit 5 Bits

Eine Handvoll Größen, die von den Doppelbits des Wiha Stubby nicht abgedeckt werden, wurden separat eingepackt: Philips PH0 für kleinere Gehäuseschrauben, Torx T30 für dicke M6-Spaxe, mit denen schwere Sachen an der Wand festgedübelt sind, und ein T40, wie ich ihn irgendwo mal als “dekorative” Schraube an einem Möbelstück hatte. Dazu kommen der 4mm Inbus, bei dem das 6mm/4mm-Doppelbit aus dem Wiha Stubby nicht durch die Aufnahme der Wera Zyklop Mini hindurch steckbar ist, sowie deren 1/4″-Vierkantadapter. Hier der selbstkonstruierte Bit-Halter aus PLA.

Alternative: Erstmal reintun, was gebraucht wird und zur Hand ist.


2,5 mm Innensechskant

Ein Inbus-Schlüssel in einem relativ voluminösen Quergriff

Ja nu, für den in den M4-Schrauben meiner überall verstreuten 3D-Druckprojekte populären 2,5er Innensechskant sind 1/4″-Bits viel zu teuer, also bin ich mit einem Standard-Inbusschlüssel mit selbstgedrucktem Quergriff unterwegs.

Alternative: Nackten Inbus einpacken.


Bleistift und Spudger

Bleistift und Spudger, jeweils mit Kappe

Ein IKEA-Bleistift und ein Kunststoff-Hebelwerkzeug, jeweils mit selbstgedruckten Schutzkappen. (Hier die für den Bleistift; meine selbstkonstruierte Spudger-Kappe ist wahrscheinlich zu individuell.)

Alternative: Nach Bedarf variieren


100 cm Gliedermaßstab

Maßstab, zur Veranschaulichung teilweise entfaltet

Die Entscheidung zwischen Gliedermaßstab und einem vorhandenen kompakten Bandmaß fiel hier aufgrund der berechenbareren Performance zugunsten des Maßstabs aus.

Alternative: Kompaktes Bandmaß.


Alternative zur Gürteltasche

Mesh-Bag mit Werkzeug darin

Das Kit lässt sich auch in ein solches Mesh-Bag im Format DIN A6 stopfen und ist dann 140 g leichter.


Stückliste

Tasche mit Clip, ohne die mitgelieferten Metallhaken156 g11 €
OBI Elektronik-Kombizange89 g5 €
Wera Phasenprüfer26 g11 €
Schraubenlehre10 g1 €
Allzweckmesser9 g1 €
Wiha Stubby 4361388 g15 €
Wera Zyklop Mini 1 8001A55 g30 €
100 mm Rollgabelschlüssel48 g5 €
1/4″ Spezialbits mit Clip34 g5 €
2,5 mm Innensechskant mit Griff15 g2 €
Bleistift mit Kappe3 g1 €
Spudger mit Kappe5 g1 €
100 cm Gliedermaßstab44 g2 €
Gesamtpaket582 g90 €
Die gezeigten Teile nach Masse und ca.-Preis (3D-gedruckte Kleinteile mit 1 € angesetzt)

Too good to #0008

rinetd-style circuit level gateway in systemd

This accepts port 465/tcp and forwards all connections to a service running somewhere else on 1194/tcp.

The socket unit accepts the connection on port 465:

# /etc/systemd/system/tcp465-to-tcp1194.socket
[Unit]
Description="openvpn 465/tcp to 1194/tcp (socket)"

[Socket]
ListenStream=465

[Install]
WantedBy=sockets.target

systemd-socket-proxyd connects to the backend:

# /etc/systemd/system/tcp465-to-tcp1194.service
[Unit]
Description="openvpn 465/tcp to 1194/tcp (service)"

[Service]
ExecStart=/lib/systemd/systemd-socket-proxyd 10.12.13.14:1194
User=proxy

(Anyone old enough to remember that this was called a plug-gateway in the TIS Firewall Toolkit?)


Python pip/virtualenv/pipenv micro-HOWTO

Clone project with wacky dependencies:

git clone https://github.com/example/project.git

Install dependencies (from requirements.txt):

pipenv install (-r requirements.txt)

Run:

pipenv run ./script

Template for git commit message

Create the template, I prefer it outside the repository:

(blank line)
(blank line)
foo#1234 is the neverending story I'm constantly working on

Configure the path, relative to the repository root:

git config commit.template ../commit-template-for-foo.txt

“OMG, I see you have committed a manual page…”

…and this is how it’s done, the simplest way possible. I initially heard about this technique from Jan-Piet Mens, a large-scale fiddler unlike me, and have fully committed to it.

Write a Markdown file with a manpage structure and a tiny bit of syntactic legalese at the top. I’ll call mine demo.7.md, but I’ve also gone with having it double as a README.md in the past.

% demo(7) | A demo manual page

# Name

**demo** - A demo manual page

# Synopsis

`demo` (No arguments are supported)

# History

Introduced as an example on a random blog post

# See also

* pandoc(1)

Convert to a manual page markup using pandoc(1) and view the manpage:

pandoc --standalone --to man demo.7.md -o demo.7
man -l demo.7

That’s your quick-and-dirty WYSIWYG manual page.

(Update Sep. 29, 2023: Fixed missing “.7” in final man -l invocation.)

Too good to #0007

Disable the dynamic motd on Ubuntu and everywhere else

This is without messing around in /etc/pam.d or doing things that may be reverted by future updates. Remember to systemctl enable disable-dynamic-motd.timer.

# /etc/systemd/system/disable-dynamic-motd.timer
[Unit]
Description=Disable all the dynamic-motd scriptlets (timer)

[Timer]
OnBootSec=10
OnActiveSec=3600

[Install]
WantedBy=timers.target
# /etc/systemd/system/disable-dynamic-motd.service
[Unit]
Description=Disable all the dynamic-motd scriptlets (service)

[Service]
Type=oneshot
ExecStart=sh -c 'chmod -v -x /etc/update-motd.d/*'

Disable verbose logging on realmd.service

Problem on AD-member Linux client, realmd logs thousands of redundant messages:

Feb 01 11:11:34 kvm-28ca realmd[22302]: client using service: :1.1042
Feb 01 11:11:34 kvm-28ca realmd[22302]: holding daemon: :1.1042
Feb 01 11:11:34 kvm-28ca realmd[22302]: client gone away: :1.1042
Feb 01 11:11:34 kvm-28ca realmd[22302]: released daemon: :1.1042

Solution, disable debug logging in the systemd unit by introducing this drop-in:

# /etc/systemd/system/realmd.service.d/override.conf
[Service]
LogLevelMax=info

Sorting Debian package versions

dpkg –compare-versions is not exactly a secret, but I’ve wrapped a script around it to visualize and better wrap my head around non-straightforward naming schemes:

$ cat test.txt
2.1
2.2~pre01
1.0
2022-01.1~pre03
2.1-bugfix-foo
2.1~bugfix-foo
2.2
2022-01~foo~bar
2022-01
1.0
0
3
2022-01~foo
$ ./dpkg-sort-versions < test.txt
Sorted from lowest (oldest) to highest (latest):
0
1.0
1.0
2.1~bugfix-foo
2.1
2.1-bugfix-foo
2.2~pre01
2.2
3
2022-01~foo~bar
2022-01~foo
2022-01
2022-01.1~pre03

Script is here.

640000 rounds shadow benchmarking

So the requirement over here is, “use SHA512 for /etc/shadow, but with 640000 rounds instead of the default 5000, to slow down brute force attacks”. (Not sure why exactly 640000 though.)

Let’s confirm that this slows down brute force attacks. First create one pure 5000-round hash file, and one pure 640000-round hash file. Note how 640000 rounds hashing takes much longer at this stage already:

$ openssl rand -hex 2 | (time mkpasswd --method=sha512crypt --stdin) | tee shadow-sha512
$6$ZcZ6RoMB5pSad9Ca$alLttTrpP1BezuOued3JrVgv/0tq7mkI5jypP4cZ/smgWF30HuLmtAl.DExd23j3xPLCWc6zWF4eLNLGKLr77.

real    0m0.006s <--
user    0m0.000s
sys     0m0.003s

$ openssl rand -hex 2 | (time mkpasswd --rounds=640000 --method=sha512crypt --stdin) | tee shadow-sha512-640000rounds
$6$rounds=640000$ZBpVIbg3SKT.KerX$hTLaX/OVOWQol5UeVMq2pO1EI2L4nG4WWOIXPhmujq7EqxohLu/dQn3f.TSE8upaPmw/5y1nHrA24Kx2OfCzE/

real    0m0.284s <--
user    0m0.281s
sys     0m0.000s

In hashcat‘s nomenclature, SHA512 with its $6$ prefix is hash type 1800:

1800 | sha512crypt $6$, SHA512 (Unix)

Start cracking the 5000-round hash. --attack-mode 3 means “brute force”:

$ hashcat --status --attack-mode 3 --hash-type 1800 --increment shadow-sha512

The hash rate on this system’s GPU turns out to be about 90000 hashes per second, and finding the 4-character password generated by openssl rand -hex 2 succeeds in about 30 seconds.

Speed.#1.........:    90438 H/s (4.43ms) @ Accel:64 Loops:512 Thr:64 Vec:1

On to the 640000-rounds hash:

$ hashcat --status --attack-mode 3 --hash-type 1800 --increment shadow-sha512-640000rounds

After a very long time grinding the really short password increments, which it obviously isn’t optimized for, hashcat eventually ramps up to around 500 hashes per second.

I stopped the attempt after an hour when the system was approaching 50 degrees on the outer case.

systemd-Timer für Crontab-User

Ich bin wirklich dazu übergangen, mich komplett auf systemd-Timer statt Crontab-Einträge einzulassen, lediglich die Zeitangaben für kalendergebundene Events machen mir dauerhaft zu schaffen. Mir ist ein Rätsel, dass die allwissenden systemd-Entwickler darauf verzichtet haben, eine zusätzliche Konfigurationsmöglichkeit über die bekannten, selbsterklärenden und intuitiv verständlichen Crontab-Spezifikationen zu akzeptieren. Hier also eine Handvoll Beispiele:

WannCrontabOnCalendar
Täglich um Uhr45 13 * * *13:45:00
Alle 5 Minuten*/5 * * * **:00/5:00
Montags, Mittwoch, Donnerstag um Uhr14 9 * * 1,3,5Mon,Wed,Fri 09:14:00
Montag bis Freitag um Uhr0 4 * * 1-5Mon..Fri 04:00:00
Jeden Monatsersten um Uhr0 6 1 * **-*-1 06:00:00
Alle 5 Minuten von 06:00 – 17:55*/5 6-17 * * *06..17:00/5:00
⚠️ Achtung: In der Tabelle sind non-breakable Spaces enthalten. ⚠️
Die Werte sind somit nicht für copy&paste geeignet.

Zum Testen mit systemd-analyze wird die jeweilige Definition mit Anführungszeichen übergeben:

systemd-analyze calendar --iterations=10 'Mon,Wed,Fri 09:14:00'

In der Timer-Unit dürfen dann keine Anführungszeichen stehen, und nein, das ergibt überhaupt keinen Sinn.

[Unit]
Description=Ein kalenderbasierter Timer

[Timer]
OnCalendar=Mon,Wed,Fri 09:14:00

[Install]
WantedBy=timers.target

Alternativ, insbesondere bei hoher Ausführungsfrequenz oder bei Überschneidungsgefahr, benutze ich, wenn ich schon in systemd unterwegs bin, heute gern monotone Timer.

[Unit]
Description=Ein monotoner Timer

[Timer]
OnStartupSec=60
OnUnitInactiveSec=900

[Install]
WantedBy=timers.target

Versuche, hybride Timer mit Elementen aus beiden Timer-Typen zu konfigurieren, haben bei mir keine Fehlermeldungen produziert, aber der OnCalendar-Teil der Konfiguration wurde ignoriert. Das genaue Verhalten scheint nicht definiert zu sein.

WantedBy sollte bei Timern im Systemkontext auf timers.target lauten, da damit die NTP-Synchronisation vorm Start des Timer sichergestellt ist. Im Userkontext (Wallpaperchanger, Zeiterfassung, dies das) steht nur default.target zur Verfügung.


Inb4, warum überhaupt auf systemd-Timer statt crontab einlassen? Ganz einfach, weil systemd-Timer absolut narrensicher zu managen sind:

  • Du willst einen systemd-Timer verteilen/managen/paketieren? Kein Problem. Zwei Dateien nach /etc/systemd/system packen, systemctl daemon-reload, systemctl enable, fertig. Anders als in der Crontab musst du dir keine Meta-Syntax ausdenken, um zu identifizieren, ob der Eintrag schon da ist, und um ihn punktgenau löschen zu können.
  • Du willst einen vorinstallierten Timer anpassen? Ebenfalls kein Problem. Du legst ein Drop-In daneben, in dem du deine neue Timer-Spezifikation hinterlegst, etwa /etc/systemd/system/apt-daily.timer.d/local.conf als Drop-In für /lib/systemd/system/apt-daily.timer.

Grundlagen zu Timern finden sich etwa im Arch-Wiki oder bei Ubuntu Users.

10 Jahre Threema

Schon 2012 war WhatsApp enorm populär und bereits bei so manchem im Ungnade gefallen. Am 12. Dezember betrat dann Threema die Bühne, und ich war natürlich einer der Early Adopter.

Abends gab es eine Team-Weihnachtsfeier in dem Kundenprojekt, in dem ich damals arbeitete. Dort eskalierte die Peer Pressure dann irgendwie derart, dass ich mit 10 oder 20 valide gescannten Threema-Kontakten nach Hause kam. Das Projekt gibts nicht mehr, nicht mal mehr den Kunden von damals, aber die gescanneten Kontakte von damals sind immer noch da.

Threema krankt leider immer noch ein wenig daran, dass es keinen unabhängig von der App funktionsfähigen Desktop-Client gibt, so dass die App bei wirklich hohem Kommunikationsaufkommen etwas unkomfortabel wird. Backup und Restore der Threema-ID sind nach wie vor insofern etwas schwierig, wie man ein paar Handgriffe (PDF) investieren muss um sich auf den Ernstfall vorzubereiten. Ob dieser Aufwand in einem guten oder schlechten Verhältnis zum zu erwartenden Nutzen steht, bleibt jedem selbst überlassen. Meine ursprüngliche ID zumindest wurde bereits über mehrere Handys und Betriebssysteme migriert.

Andere Komfortfunktionen, wie etwa die fehlende Bindung an die Telefonnummer, fallen eindeutig zugunsten der Privatsphäre der Anwender aus. Wenn man möchte, funktioniert der Messenger bis heute anonym nur über die Threema-ID.

Threema gibts aktuell mit 50% Rabatt in den App Stores.

IBM RS/6000 von 1993

Von den Leuten, die uns “STRG”, “ENTF” und “EINFG” gebracht haben, ein Highlight, das sich leider nie durchgesetzt hat: Die GRDST-Taste.

Diese RS/6000 hat den Weg zu mir so um 2000 gefunden, als mein erster Vollzeit-Linuxjob noch ein paar Jahre entfernt war.

Damals kuschelte IBM etwas widerwillig mit Linux und hatte auf AIX 4.3.3 parallel zur Einführung von AIX 5L (das L sollte für die Nähe zu Linux stehen) RPM als additiven Paketmanager eingeführt. Die Liste der damals verfügbaren Pakete kann bei bullfreeware.com bewundert werden (hier ein lokaler Mirror). Ich habe zuletzt noch einige davon installiert, um das Tool zum Benchmarking übersetzen zu können.

Zur 7012 besitze ich auch noch das passende SCSI-CDROM mit der passenden obskuren Blockgröße. Installationsmedien sind aber keine mehr vorhanden. Die Demo-Installation mit User root und Password root muss also für immer halten. Außer AIX ist mir kein Betriebssystem bekannt, das auf dem System nutzbar wäre.

SSH fehlt, aber per Telnet über den wackeligen AUI-Transceiver mit 10 Megabit/s macht das System einen sehr guten und responsiven Eindruck, fast besser als heute manche VMware-Instanz. 😉

Die Towers of Hanoi aus dem BYTE Unix Benchmark führt die RS/6000 mit ca. 1050 Loops pro Sekunde aus. Ein halbwegs aktuelles Vergleichssystem mit Intel-CPU und 3,6 GHz kommt auf ca. 3200000 Loops pro Sekunde.

Divisionen in der folgenden Schleife macht die RS/6000 mit 16500/s (Perl 5.5 vorinstalliert) bzw. 14500/s (Perl 5.8 aus dem RPM); mein moderneres Vergleichssystem kommt auf knapp 7 Millionen/s.

perl -e '$o=time();$s=$o;while(10>$o-$s)
{rand()/(rand()+1);$i++;$n=time();if($n!=$o)
{printf"%i\n",$i;$i=0};$o=$n}'

Softwaretechnisch größtes Highlight dürfte das installierte Java 1.1.8 sein. IPv6 wird zur Konfiguration angeboten, funktioniert aber in dieser aus dem Jahr 1999 stammenden Implementation nicht wirklich zufriedenstellend.

Technische Daten: POWER1-Prozessor mit 50 MHz, 128 MB Arbeitsspeicher, 2 GB Festplatte. Produktionszeitraum 1993-1994. (Mirror vom Datenblatt)

(Dieser Beitrag stand 2014 schon mal an anderer Stelle. Die Benchmarks auf heutigen Systemen wurden aktualisiert und ein lokaler Mirror der Bullfreeware-Liste und des Datenblatts gesichert.)

Too good to #0006

“Sudo on demand” from TGT0003 considered more useful for downgrading privileges on the fly

#!/usr/bin/env bash

want_user=letsencrypt
am_user="$(id -un)"
printf "Running as: %s\n" "${am_user}"
if [[ "${want_user}" != "${am_user}" ]]
then
        printf "Re-executing with sudo.\n"
        exec sudo -u "${want_user}" "${0}"
fi
...

JSON export of all installed packages on Debian/Ubuntu

#!/bin/bash

function dpkg_json(){
    printf "{\n"
    format='"${Package}": { "Version": "${Version}", "Architecture": "${Architecture}", "Status": "${db:Status-Abbrev}" },\n'
    dpkg-query --show --showformat="${format}" | sed '$s/,$//'
    printf "}\n"
}

dpkg_json | jq .

Urlwatch for a new version of a package in the Ubuntu package pool

---
name: "Ubuntu Curtin package (waiting for apt-key fix)"
url: http://archive.ubuntu.com/ubuntu/pool/main/c/curtin/
filter:
  - xpath: //table//td[2]
  - html2text
  - grep: ^curtin.*\.deb$
---

What goes up, must come down. Ask any system administrator.